✏️ 正在编辑: fusion-frontend-combined.js
路径:
/home/lssfapb/www/wp-content/plugins/fusion-builder/front-end/fusion-frontend-combined.js
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
/* global FusionPageBuilderApp, FusionPageBuilder, FusionPageBuilderElements */ /* eslint no-unused-vars: 0 */ ( function() { // Insert shortcode into post editor window.fusionBuilderInsertIntoEditor = function( shortcode, editorID ) { // jshint ignore:line var editorArea, editor; if ( 'tinymce' === window.SCmoduleContentEditorMode && ( '' === editorID || 'undefined' === typeof editorID ) ) { if ( 'undefined' !== typeof window.tinyMCE ) { // Set active editor editor = FusionPageBuilderApp.shortcodeGeneratorActiveEditor; editor.focus(); if ( 'excerpt' === editor.id ) { FusionPageBuilderApp.fromExcerpt = true; } // Insert shortcode window.tinyMCE.activeEditor.execCommand( 'mceInsertContent', false, shortcode ); window.tinyMCE.activeEditor.execCommand( 'mceCleanup', false ); } } else { if ( null === editorID || '' === editorID || 'undefined' === typeof editorID ) { editorArea = jQuery( window.editorArea ); } else { editorArea = jQuery( '#' + editorID ); } if ( 'excerpt' === editorArea.attr( 'id' ) ) { FusionPageBuilderApp.fromExcerpt = true; } if ( 'undefined' === typeof window.cursorPosition ) { if ( 0 === editorArea.getCursorPosition() ) { editorArea.val( shortcode + editorArea.val() ); } else if ( editorArea.val().length === editorArea.getCursorPosition() ) { editorArea.val( editorArea.val() + shortcode ); } else { editorArea.val( editorArea.val().slice( 0, editorArea.getCursorPosition() ) + shortcode + editorArea.val().slice( editorArea.getCursorPosition() ) ); } } else { editorArea.val( [ editorArea.val().slice( 0, window.cursorPosition ), shortcode, editorArea.val().slice( window.cursorPosition ) ].join( '' ) ); } editorArea.trigger( 'change' ); } if ( false === FusionPageBuilderApp.manuallyAdded ) { FusionPageBuilderApp.shortcodeGeneratorActiveEditor = ''; } }; }( jQuery ) ); function openShortcodeGenerator( trigger ) { // jshint ignore:line // Get editor id from event.trigger. parent.parent var view, viewSettings, editorArea, editorCid; if ( 'object' === typeof trigger && 'undefined' !== typeof trigger[ 0 ].$el ) { trigger = trigger[ 0 ].$el; } editorArea = '#' + trigger.parent().parent().find( '.wp-editor-area' ).attr( 'id' ); editorCid = trigger.closest( '.fusion-builder-module-settings' ).attr( 'data-element-cid' ); window.cursorPosition = 0; window.editorArea = editorArea; // Set shortcode generator flag FusionPageBuilderApp.shortcodeGenerator = true; // Get active editor mode if ( FusionPageBuilderApp.isTinyMceActive() ) { window.SCmoduleContentEditorMode = 'tinymce'; } else { window.SCmoduleContentEditorMode = 'html'; } // Get current cursor position ( for html editor ) if ( 'tinymce' !== window.SCmoduleContentEditorMode ) { window.cursorPosition = jQuery( editorArea ).getCursorPosition(); } viewSettings = { collection: FusionPageBuilderElements, view: this, targetCid: editorCid }, view = new FusionPageBuilder.GeneratorElementsView( viewSettings ); jQuery( view.render().el ).dialog( { title: 'Select Element', draggable: false, modal: true, resizable: false, dialogClass: 'fusion-builder-dialog fusion-builder-large-library-dialog fusion-builder-element-library-dialog', open: function( event, ui ) { // jshint ignore: line window.FusionApp.dialog.resizeDialog(); }, close: function( event, ui ) { // jshint ignore: line view.remove(); } } ); } // Helper function to check the cursor position of text editor content field before the shortcode generator is opened ( function() { jQuery.fn.getCursorPosition = function() { var el = jQuery( this ).get( 0 ), pos = 0, Sel, SelLength; if ( 'selectionStart' in el ) { pos = el.selectionStart; } else if ( 'selection' in document ) { el.focus(); Sel = document.selection.createRange(); SelLength = document.selection.createRange().text.length; Sel.moveStart( 'character', -el.value.length ); pos = Sel.text.length - SelLength; } return pos; }; }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionApp, fusionBuilderText, FusionEvents */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { // Builder Builder History FusionPageBuilder.BuilderHistory = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-front-end-history' ).html() ), className: 'fusion-builder-history-list submenu-trigger-target', tagName: 'ul', /** * Init. * * @since 2.0.0 * @param {Object} data - The data. * @return {void} */ initialize: function() { var data = FusionApp.data; this.fusionCommands = new Array( '[]' ); this.fusionCommandsStates = new Array( '[]' ); // History states this.maxSteps = 25; // Maximum steps allowed/saved this.currStep = 1; // Current Index of step this.allElements = data.postDetails.post_content; this.fusionHistoryState = ''; this.tracking = 'on'; this.trackingPaused = 'off'; this.unsavedStep = 1; // Unsaved steps. // Set initial history step this.fusionCommands[ this.currStep ] = { allElements: data.postDetails.post_content }; this.fusionCommandsStates[ this.currStep ] = fusionBuilderText.empty; this.listenTo( FusionEvents, 'fusion-history-pause-tracking', this.pauseTracking ); this.listenTo( FusionEvents, 'fusion-history-resume-tracking', this.resumeTracking ); this.listenTo( FusionEvents, 'fusion-history-save-step', this.saveHistoryStep ); this.listenTo( FusionEvents, 'fusion-history-turn-on-tracking', this.turnOnTracking ); this.listenTo( FusionEvents, 'fusion-history-turn-off-tracking', this.turnOffTracking ); this.listenTo( FusionEvents, 'fusion-history-go-to-step', this.historyStep ); this.listenTo( FusionEvents, 'fusion-history-clear', this.clearEditor ); this.listenTo( FusionEvents, 'fusion-history-capture-editor', this.captureEditor ); this.listenTo( FusionEvents, 'fusion-history-undo', this.doUndo ); this.listenTo( FusionEvents, 'fusion-history-redo', this.doRedo ); this.listenTo( FusionEvents, 'fusion-app-saved', this.clearEditor ); this.listenTo( FusionEvents, 'fusion-builder-reset', this.resetStates ); this.listenTo( FusionEvents, 'fusion-element-removed', this.resetStates ); }, resetStates: function( cid ) { var self = this; if ( 'object' === typeof this.fusionCommands ) { _.each( this.fusionCommands, function( state, index ) { if ( 'undefined' === typeof cid || ! cid || ( 'param' === state.type && 'undefined' !== typeof state.cid && cid === state.cid ) ) { self.fusionCommands[ index ] = { allElements: state.allElements }; } } ); } }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el.html( this.template( { steps: this.fusionCommandsStates, currentStep: this.currStep } ) ); this.$el.attr( 'aria-expanded', false ); this.$el.find( 'li' ).on( 'click', function( event ) { if ( event ) { event.preventDefault(); } self.historyStep( event ); } ); this.updateUI(); return this; }, /** * Saves a step in the history. * * @since 2.0.0 * @param {string} text - The text to be displayed in the history log. * @return {void} */ saveHistoryStep: function( text, state ) { this.fusionHistoryState = text; this.turnOnTracking(); this.captureEditor( state ); this.turnOffTracking(); }, /** * Captures the editor (used in front-end.js) * * @since 2.0.0 * @return {void} */ captureEditor: function( state ) { if ( 'object' !== typeof state ) { state = {}; } if ( 'undefined' === typeof FusionPageBuilderApp ) { return; } FusionPageBuilderApp.builderToShortcodes(); if ( this.isTrackingOn() && ! this.isTrackingPaused() ) { // If reached limit if ( this.currStep == this.maxSteps ) { // Remove first index this.fusionCommands.shift(); this.fusionCommandsStates.shift(); } else { // Else increment index this.currStep += 1; this.unsavedStep += 1; } // If we are not at the end of the states, we need to wipe those ahead. if ( this.currStep !== this.fusionCommands.length ) { this.fusionCommandsStates.length = this.currStep; this.fusionCommands.length = this.currStep; } // Get content this.allElements = FusionApp.data.postDetails.post_content; // Add all elements as fallback method. state.allElements = this.allElements; // Add editor data to Array this.fusionCommands[ this.currStep ] = state; // Add history state this.fusionCommandsStates[ this.currStep ] = this.fusionHistoryState; FusionApp.contentChange( 'page', 'builder-content' ); // Update buttons this.fusionHistoryState = ''; this.render(); } }, /** * Turn history tracking ON. * * @since 2.0.0 * @return {void} */ turnOnTracking: function() { this.tracking = 'on'; }, /** * Turn history tracking OFF. * * @since 2.0.0 * @return {void} */ turnOffTracking: function() { this.tracking = 'off'; }, /** * Turn history tracking ON. * * @since 2.0.0 * @return {void} */ pauseTracking: function() { this.trackingPaused = 'on'; }, /** * Turn history tracking OFF. * * @since 2.0.0 * @return {void} */ resumeTracking: function() { this.trackingPaused = 'off'; }, canApplyStep: function( historyStep ) { if ( 'object' !== typeof historyStep || 'undefined' === typeof historyStep.type ) { return false; } if ( 'param' === historyStep.type || 'price-param' === historyStep.type || 'pricefooter-param' === historyStep.type || 'pricefeatures-param' === historyStep.type ) { return true; } return false; }, canApplySteps: function( stepIndex ) { var self = this, redo = stepIndex < this.currStep ? false : true, steps = [], canApply = true; if ( ! redo ) { steps = this.fusionCommands.slice( stepIndex + 1, this.currStep + 1 ); } else { steps = this.fusionCommands.slice( this.currStep + 1, stepIndex + 1 ); } _.each( steps, function( step ) { if ( ! self.canApplyStep( step ) ) { canApply = false; } } ); return canApply; }, applySteps: function( stepIndex ) { var self = this, redo = stepIndex < this.currStep ? false : true, steps = []; if ( ! redo ) { steps = this.fusionCommands.slice( stepIndex + 1, this.currStep + 1 ).reverse(); } else { steps = this.fusionCommands.slice( this.currStep + 1, stepIndex + 1 ); } _.each( steps, function( step ) { self.applyStep( step, redo ); } ); }, applyStep: function( historyStep, redo ) { var elementView, params, // eslint-disable-line no-unused-vars columnView; redo = 'undefined' === typeof redo ? false : redo; switch ( historyStep.type ) { case 'param': elementView = window.FusionPageBuilderViewManager.getView( historyStep.cid ); if ( elementView ) { params = elementView.model.get( 'params' ); // eslint-disable-line no-unused-vars // If undo, set new value to step so redo can use it. if ( ! redo ) { elementView.historyUpdateParam( historyStep.param, historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed', historyStep.param, historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, historyStep.param, historyStep.oldValue ); } else { elementView.historyUpdateParam( historyStep.param, historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed', historyStep.param, historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, historyStep.param, historyStep.newValue ); } } break; case 'price-param': elementView = window.FusionPageBuilderViewManager.getView( historyStep.cid ); if ( elementView ) { // If undo, set new value to step so redo can use it. if ( ! redo ) { elementView.updatePricingTablePrice( historyStep.param, historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed', historyStep.param, historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, historyStep.param, historyStep.oldValue ); } else { elementView.updatePricingTablePrice( historyStep.param, historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed', historyStep.param, historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, historyStep.param, historyStep.newValue ); } } break; case 'pricefooter-param': elementView = window.FusionPageBuilderViewManager.getView( historyStep.cid ); if ( elementView ) { // If undo, set new value to step so redo can use it. if ( ! redo ) { elementView.updatePricingTableFooter( historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed', 'footer_content', historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, 'footer_content', historyStep.oldValue ); } else { elementView.updatePricingTableFooter( historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed', 'footer_content', historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, 'footer_content', historyStep.newValue ); } } break; case 'pricefeatures-param': elementView = window.FusionPageBuilderViewManager.getView( historyStep.cid ); if ( elementView ) { // If undo, set new value to step so redo can use it. if ( ! redo ) { elementView.updatePricingTableFeatures( historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed', 'footer_content', historyStep.oldValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, 'feature_rows', historyStep.oldValue ); } else { elementView.updatePricingTableFeatures( historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed', 'footer_content', historyStep.newValue ); FusionEvents.trigger( 'fusion-param-changed-' + historyStep.cid, 'feature_rows', historyStep.newValue ); } } break; case 'add-element': if ( redo ) { FusionPageBuilderApp.collection.add( historyStep.model ); } else { elementView = window.FusionPageBuilderViewManager.getView( historyStep.model.cid ); if ( elementView ) { elementView.removeElement(); } } break; case 'remove-element': if ( redo ) { elementView = window.FusionPageBuilderViewManager.getView( historyStep.model.cid ); if ( elementView ) { elementView.removeElement(); } } else { FusionPageBuilderApp.collection.add( historyStep.model ); } break; case 'move-element': elementView = window.FusionPageBuilderViewManager.getView( historyStep.cid ); // Need to ignore itself. elementView.$el.addClass( 'ignore-me' ); if ( redo ) { columnView = window.FusionPageBuilderViewManager.getView( historyStep.newParent ); if ( elementView && columnView ) { columnView.$el.find( '.fusion-builder-column-content' ).first().find( '> span, > div' ).not( '.ignore-me' ).eq( ( historyStep.newIndex - 1 ) ).after( elementView.$el ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, historyStep.newIndex, historyStep.newParent ); } } else { columnView = window.FusionPageBuilderViewManager.getView( historyStep.oldParent ); if ( elementView && columnView ) { columnView.$el.find( '.fusion-builder-column-content' ).first().find( '> span, > div' ).not( '.ignore-me' ).eq( ( historyStep.oldIndex - 1 ) ).after( elementView.$el ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, historyStep.oldIndex, historyStep.oldParent ); } } elementView.$el.removeClass( 'ignore-me' ); break; } }, updateActiveStyling: function() { FusionApp.builderToolbarView.$el.find( '.fusion-builder-history-list li' ).removeClass( 'fusion-history-active-state' ); FusionApp.builderToolbarView.$el.find( '.fusion-builder-history-list' ).find( '[data-state-id="' + this.currStep + '"]' ).addClass( 'fusion-history-active-state' ); }, fullContentReplace: function( data ) { this.resetStates(); FusionPageBuilderApp.clearBuilderLayout(); FusionPageBuilderApp.$el.find( '.fusion_builder_container' ).remove(); // Try to make the shortcode if the content does not contain them. data = FusionPageBuilderApp.validateContent( data ); // Reset models with new elements FusionPageBuilderApp.createBuilderLayout( data ); }, /** * Undo last step in history. * Saves the undone step so that we may redo later if needed. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ doUndo: function( event ) { var undoData, historyStep = {}; if ( event ) { event.preventDefault(); } // Turn off tracking first, so these actions are not captured if ( this.hasUndo() ) { // If no data or end of stack and nothing to undo // Close opened nested cols to make sure UI works after history change. this.closeNestedCols(); this.turnOffTracking(); // Data to undo historyStep = this.fusionCommands[ this.currStep ]; if ( this.canApplyStep( historyStep ) ) { this.applyStep( historyStep, false ); this.currStep -= 1; } else { this.currStep -= 1; historyStep = this.fusionCommands[ this.currStep ]; undoData = 'object' === typeof historyStep ? historyStep.allElements : false; if ( undoData && '[]' !== undoData ) { this.fullContentReplace( undoData ); } } this.updateActiveStyling(); // TODO: check what this is for. if ( FusionPageBuilderApp.wireframeActive ) { FusionEvents.trigger( 'fusion-undo-state' ); } } }, /** * Redo last step. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ doRedo: function( event ) { var redoData; if ( event ) { event.preventDefault(); } if ( this.hasRedo() ) { // If not at end and nothing to redo // Close opened nested cols to make sure UI works after history change. this.closeNestedCols(); // Turn off tracking, so these actions are not tracked this.turnOffTracking(); // Move index this.currStep += 1; window.historyStep = this.fusionCommands[ this.currStep ]; redoData = 'object' === typeof window.historyStep ? window.historyStep.allElements : false; if ( this.canApplyStep( window.historyStep ) ) { this.applyStep( window.historyStep, true ); } else if ( redoData && '[]' !== redoData ) { this.fullContentReplace( redoData ); } this.updateActiveStyling(); } }, /** * Go to a step. * * @since 2.0.0 * @param {string|number} step - The step. * @param {Object} event - The event. * @return {void} */ historyStep: function( event ) { var step, stepData; if ( event ) { event.preventDefault(); } // Close opened nested cols to make sure UI works after history change. this.closeNestedCols(); step = jQuery( event.currentTarget ).data( 'state-id' ); // Turn off tracking, so these actions are not tracked this.turnOffTracking(); if ( this.canApplySteps( step ) ) { this.applySteps( step ); this.currStep = step; } else { this.currStep = step; stepData = 'object' === typeof this.fusionCommands[ this.currStep ] ? this.fusionCommands[ this.currStep ].allElements : false; if ( stepData && '[]' !== stepData ) { this.fullContentReplace( stepData ); // TODO: Check what this is for. if ( FusionPageBuilderApp.wireframeActive ) { FusionEvents.trigger( 'fusion-undo-state' ); } } } this.updateActiveStyling(); }, /** * Are we currently tracking history? * * @since 2.0.0 * @return {boolean} */ isTrackingOn: function() { return 'on' === this.tracking; }, /** * Is tracking paused currently? * * @since 2.0.0 * @return {boolean} */ isTrackingPaused: function() { return 'on' === this.trackingPaused; }, /** * Log commands in the console as JSON. * * @since 2.0.0 * @return {void} */ logStacks: function() { console.log( JSON.parse( this.fusionCommands ) ); }, /** * Clear the editor. * * @since 2.0.0 * @return {void} */ clearEditor: function() { this.fusionCommands = new Array( '[]' ); this.fusionCommandsStates = new Array( '[]' ); this.currStep = 1; this.unsavedStep = 1; this.fusionHistoryState = ''; this.fusionCommands[ this.currStep ] = { allElements: FusionApp.data.postDetails.post_content }; this.fusionCommandsStates[ this.currStep ] = fusionBuilderText.empty; this.render(); }, /** * Do we have an undo? Checks if the current step is the 1st one. * * @since 2.0.0 * @return {boolean} */ hasUndo: function() { return 1 !== this.currStep; }, /** * Do we have a redo? Checks if a step greater than current one exists. * * @since 2.0.0 * @return {boolean} */ hasRedo: function() { return this.currStep < ( this.fusionCommands.length - 1 ); }, /** * Get the array of steps/fusionCommands. * * @since 2.0.0 * @return {Array} */ getCommands: function() { return this.fusionCommands; }, /** * Update the undo/redo/history buttons. * * @since 2.0.0 * @return {void} */ updateUI: function() { if ( 1 < this.unsavedStep ) { FusionApp.builderToolbarView.$el.find( '#fusion-builder-toolbar-history-menu' ).attr( 'data-has-unsaved', true ); } else { FusionApp.builderToolbarView.$el.find( '#fusion-builder-toolbar-history-menu' ).attr( 'data-has-unsaved', false ); } this.updateActiveStyling(); }, /** * Close nested cols. * * @since 2.2 * @return {void} */ closeNestedCols: function() { var activeNestedCols = FusionPageBuilderApp.$el.find( '.fusion-nested-columns.editing' ).length; if ( activeNestedCols ) { activeNestedCols.find( '.fusion-builder-cancel-row' ).trigger( 'click' ); } } } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionAppConfig, FusionApp, FusionEvents, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { // Builder Toolbar FusionPageBuilder.BuilderToolbar = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-front-end-toolbar' ).html() ), className: 'fusion-toolbar-nav fb', tagName: 'ul', events: { 'click .fusion-builder-clear-layout': 'clearLayout', 'click .fusion-builder-open-library': 'openLibrary', 'click .fusion-builder-save-template': 'openLibrary', 'click #fusion-builder-toolbar-new-post .add-new': 'newPost', 'click .fusion-builder-preferences': 'openPreferences', 'click #fusion-builder-toolbar-history-menu': 'preventDefault', 'click .fusion-preview-only-link': 'generatePreview' }, toggleWireframe: function( event ) { if ( 'undefined' !== typeof event ) { event.preventDefault(); } FusionPageBuilderApp.wireframe.toggleWireframe(); }, initialize: function() { this.builderHistory = new FusionPageBuilder.BuilderHistory(); this.listenTo( FusionEvents, 'fusion-post_title-changed', this.updatePreviewTitle ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.html( this.template() ); this.$el.find( '.fusion-builder-history-container' ).append( this.builderHistory.render().el ); this.moveWireframe(); this.delegateEvents(); return this; }, /** * Due to placement wireframe icon needs moved into shared area. * * @since 2.0.0 * @return {Object} this */ moveWireframe: function() { // Remove existing. FusionApp.toolbarView.$el.find( '.fusion-wireframe-holder' ).remove(); // Copy new to location. FusionApp.toolbarView.$el.find( '.fusion-builder-preview-viewport' ).after( this.$el.find( '.fusion-wireframe-holder' ) ); // Add listener to new location. FusionApp.toolbarView.$el.find( '.fusion-builder-wireframe-toggle' ).on( 'click', this.toggleWireframe ); }, /** * Make sure all the unsaved content is set like on frame refresh, then open page. * * @since 2.0.0 * @param {Object} event - The JS event. * @return {Object} this */ generatePreview: function( event ) { var $element = jQuery( event.currentTarget ); if ( 'undefined' !== typeof event ) { event.preventDefault(); event.stopPropagation(); } if ( $element.attr( 'data-disabled' ) ) { return; } $element.attr( 'data-disabled', true ); // Avada Builder if ( 'undefined' !== typeof FusionPageBuilderApp ) { FusionPageBuilderApp.builderToShortcodes(); } // Fusion Panel if ( this.sidebarView ) { this.setGoogleFonts(); } FusionApp.formPost( FusionApp.getAjaxData( 'fusion_app_preview_only' ), false, '_blank' ); $element.removeAttr( 'data-disabled' ); }, /** * Opens the library. * Calls the LibraryView and then renders it. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ openLibrary: function( event ) { var view, libraryModel = { target: jQuery( event.currentTarget ).data( 'target' ), focus: jQuery( event.currentTarget ).data( 'focus' ) }, viewSettings = { model: libraryModel }; if ( 'undefined' !== typeof event ) { event.preventDefault(); event.stopPropagation(); } if ( jQuery( '.fusion-builder-dialog' ).length && jQuery( '.fusion-builder-dialog' ).is( ':visible' ) ) { FusionApp.multipleDialogsNotice(); return; } view = new FusionPageBuilder.LibraryView( viewSettings ); view.render(); }, /** * Clears the layout. * Calls FusionPageBuilderApp.clearLayout * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ clearLayout: function( event ) { if ( event ) { event.preventDefault(); } FusionApp.confirmationPopup( { title: fusionBuilderText.are_you_sure, content: fusionBuilderText.are_you_sure_you_want_to_delete_this_layout, actions: [ { label: fusionBuilderText.cancel, classes: 'cancel', callback: function() { FusionApp.confirmationPopup( { action: 'hide' } ); } }, { label: fusionBuilderText.remove, classes: 'delete-layout', callback: function() { // Close dialogs. if ( jQuery( '.ui-dialog-content' ).length ) { jQuery( '.ui-dialog-content' ).dialog( 'close' ); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.layout_cleared ); FusionPageBuilderApp.clearLayout( event ); FusionApp.confirmationPopup( { action: 'hide' } ); } } ] } ); }, /** * Create a new draft of specific post type. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ newPost: function( event ) { var postType = jQuery( event.currentTarget ).data( 'post-type' ); if ( event ) { event.preventDefault(); } jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_create_post', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_type: postType } } ) .done( function( response ) { FusionApp.checkLink( event, response.permalink ); } ); }, /** * Renders the FusionPageBuilder.PreferencesView view. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ openPreferences: function( event ) { var view; if ( 'undefined' !== typeof event ) { event.preventDefault(); event.stopPropagation(); } if ( jQuery( '.fusion-builder-dialog' ).length && jQuery( '.fusion-builder-dialog' ).is( ':visible' ) ) { FusionApp.multipleDialogsNotice(); return; } view = new FusionPageBuilder.PreferencesView(); view.render(); }, /** * Prevents default action. * * @param {Object} event - The event. * @return {void} */ preventDefault: function( event ) { event.preventDefault(); }, /** * Updates the text for the title of the page. * * @return {void} */ updatePreviewTitle: function() { this.$el.find( '.fusion-preview-only-link strong' ).html( FusionApp.getPost( 'post_title' ) ); } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { // Builder element model FusionPageBuilder.Element = Backbone.Model.extend( { defaults: { type: 'element' } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.ExtraShortcodes = Backbone.Model.extend( { defaults: { elementCount: 0, shortcodes: {} }, addData: function( content ) { var self = this, shortcodes = self.get( 'shortcodes' ), elementCount = self.get( 'elementCount' ); _.each( content, function( shortcode ) { shortcode.id = elementCount; shortcode.matcher = self.convert( shortcode.shortcode ); shortcodes[ elementCount ] = shortcode; elementCount++; } ); this.set( { elementCount: elementCount } ); this.set( { shortcodes: shortcodes } ); }, addShortcode: function( shortcode, output, tag ) { var self = this, shortcodes = self.get( 'shortcodes' ), elementCount = self.get( 'elementCount' ), originalCount = self.get( 'elementCount' ); shortcodes[ elementCount ] = { shortcode: shortcode, output: output, matcher: self.convert( shortcode ), id: elementCount, tag: tag }; elementCount++; this.set( { elementCount: elementCount } ); this.set( { shortcodes: shortcodes } ); return originalCount; }, byId: function( id ) { var shortcodes = this.get( 'shortcodes' ); return shortcodes[ id ]; }, byShortcode: function( content ) { var shortcodes = this.get( 'shortcodes' ), $matches = _.findWhere( shortcodes, { shortcode: content } ); if ( 'undefined' === typeof $matches ) { content = this.convert( content ); $matches = _.findWhere( shortcodes, { matcher: content } ); } return $matches; }, byOutput: function( content ) { var shortcodes = this.get( 'shortcodes' ); return _.findWhere( shortcodes, { ouput: content } ); }, getAll: function() { return this.get( 'shortcodes' ); }, convert: function( content ) { // Clean up any parts which can be ignored for sake of matching. content = content.replace( / /g, '' ); content = content.replace( /\r?\n|\r/g, '' ); content = content.replace( /(<p[^>]+?>|<p>|<\/p>)/g, '' ); content = content.replace( /(<br[^>]+?>|<br>|<\/br>)/g, '' ); content = content.replace( /\[fusion_text\]\[\/fusion_text\]/g, '' ); return content.trim(); } } ); }( jQuery ) ); ;/* global FusionEvents, FusionApp, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.DynamicValues = Backbone.Model.extend( { defaults: { values: {}, options: {}, orderedParams: false }, getOrderedParams: function() { var params = this.get( 'orderedParams' ), options = this.getOptions(); if ( ! params ) { params = {}; _.each( options, function( object, id ) { var group, groupText; if ( 'object' !== typeof object ) { return; } group = object.group; groupText = group; if ( 'string' !== typeof object.group ) { group = 'other'; groupText = fusionBuilderText.other; } group = group.replace( /\s+/g, '_' ).toLowerCase(); if ( 'object' !== typeof params[ group ] ) { params[ group ] = { label: '', params: {} }; } params[ group ].label = groupText; params[ group ].params[ id ] = object; } ); } return params; }, addData: function( data, options ) { this.set( 'values', data ); this.set( 'options', options ); }, getOptions: function() { var options = this.get( 'options' ); return jQuery.extend( true, {}, options ); }, getOption: function( param ) { var options = this.getOptions(); return 'undefined' !== typeof options[ param ] ? options[ param ] : false; }, getAll: function() { var values = this.get( 'values' ); return jQuery.extend( true, {}, values ); }, getValue: function( args ) { var values = this.getAll(), id = args.data, postId = FusionApp.getDynamicPost( 'post_id' ), idValues = false, match = false; if ( 'undefined' !== typeof values[ postId ] ) { idValues = 'object' === typeof values[ postId ][ id ] ? values[ postId ][ id ] : false; } // No initial match, fetch it. if ( ! idValues ) { return this.fetchValue( id, args ); } // Check each value object with same ID. match = this.findMatch( idValues, args ); // We found a matching object, then return its value. if ( match ) { return match.value; } // No match, fetch. return this.fetchValue( id, args ); }, findMatch: function( idValues, args, idWanted ) { var match = false; idWanted = 'undefined' === typeof idWanted ? false : idWanted; _.each( idValues, function( idValue, idCount ) { var argsMatch = true; // Already found a match, just return early. if ( match ) { return true; } // Value object has no args, then set match and return. if ( 'undefined' === typeof idValue.args ) { match = idWanted ? idCount : idValue; return true; } // We do have args, check that each value matches. if ( 'object' === typeof idValue.args ) { _.each( idValue.args, function( argValue, argId ) { if ( 'undefined' === typeof args[ argId ] || 'before' === argId || 'after' === argId || 'fallback' === argId ) { return true; } if ( args[ argId ] !== argValue ) { argsMatch = false; } } ); if ( argsMatch ) { match = idWanted ? idCount : idValue; } } } ); return match; }, fetchValue: function( id, args ) { var options = this.getOptions(), param = 'object' === typeof options && 'object' === typeof options[ id ] ? options[ id ] : false, callback = param && 'undefined' !== typeof param.callback ? param.callback : false, callbackFunction = callback && 'string' === typeof callback[ 'function' ] ? callback[ 'function' ] : false, callbackExists = callbackFunction && 'function' === typeof FusionApp.callback[ callbackFunction ] ? true : false, callbackAjax = callbackExists && 'undefined' !== typeof callback.ajax ? callback.ajax : false, dynamicPost, value; // If no callback found, use default ajax one. if ( ! callbackExists ) { callbackFunction = 'defaultDynamicCallback'; callbackAjax = true; } if ( ! param ) { this.setValue( args, false ); return false; } // Return default (dummy) value if template post is set as target post. dynamicPost = 'fusion_tb_section' === FusionApp.data.postDetails.post_type || 'post_cards' === FusionApp.data.template_category; if ( true === FusionApp.data.is_singular && dynamicPost && -99 === FusionApp.getDynamicPost( 'post_id' ) && 'undefined' !== typeof param[ 'default' ] ) { return param[ 'default' ]; } // If ajax callback should be run when template is edited. if ( true === FusionApp.data.is_singular && dynamicPost && 'undefined' !== typeof param.ajax_on_template && true === param.ajax_on_template ) { return FusionApp.callback.defaultDynamicCallback( args ); } if ( callbackAjax ) { return FusionApp.callback[ callbackFunction ]( args ); } value = FusionApp.callback[ callbackFunction ]( args ); this.setValue( args, value ); return value; }, setValue: function( args, value ) { var values = this.getAll(), id = args.data, postId = FusionApp.getDynamicPost( 'post_id' ), existing = {}, matchId = false, newData = { args: jQuery.extend( true, {}, args ), value: value }; if ( 'object' !== typeof values[ postId ] ) { values[ postId ] = []; } existing = jQuery.extend( true, {}, values[ postId ][ id ] ); if ( 'object' !== typeof values[ postId ][ id ] ) { values[ postId ][ id ] = []; } else if ( 'function' !== typeof values[ postId ][ id ].push ) { values[ postId ][ id ] = [ existing[ 0 ] ]; } matchId = this.findMatch( values[ postId ][ id ], args, true ); if ( ! matchId ) { values[ postId ][ id ].push( newData ); } else { values[ postId ][ id ][ matchId ] = newData; } this.set( 'values', values ); // ReRender the element. Perhaps via event using id. FusionEvents.trigger( 'fusion-dynamic-data-value', id ); }, removeValue: function( id ) { var values = this.getAll(), postId = FusionApp.getDynamicPost( 'post_id' ); if ( 'object' === typeof values[ postId ][ id ] ) { delete values[ postId ][ id ]; } this.set( 'values', values ); } } ); }( jQuery ) ); ;/* global FusionEvents, FusionPageBuilderApp, fusionAllElements, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.DynamicParams = Backbone.Model.extend( { defaults: { params: {}, elementView: false, listeners: [] }, initialize: function() { this._historyPush = _.debounce( _.bind( this.historyPush, this ), 300 ); }, setData: function( data ) { if ( 'object' === typeof data ) { this.set( 'params', data ); this.setListeners(); } }, getAll: function() { var params = this.get( 'params' ); return jQuery.extend( true, {}, params ); }, setListeners: function() { var params = this.getAll(), self = this; _.each( params, function( param ) { var option = FusionPageBuilderApp.dynamicValues.getOption( param.data ); if ( option && 'object' === typeof option.listeners ) { _.each( option.listeners, function( listenerData, listenerId ) { self.setListener( listenerId, listenerData, param ); } ); } } ); }, setListener: function( id, data, args ) { var location = 'undefined' !== typeof data.location ? data.location : false, self = this, cid = this.cid, listeners = this.get( 'listeners' ); if ( ! location ) { return; } switch ( location ) { case 'postDetails': FusionEvents.on( 'fusion-' + id + '-changed', function() { FusionPageBuilderApp.dynamicValues.removeValue( args.data ); self.getValueAndUpdate( args ); }, cid ); listeners.push( 'fusion-' + id + '-changed' ); self.set( 'listeners', listeners ); break; case 'postMeta': FusionEvents.on( 'fusion-po-' + id + '-changed', function() { FusionPageBuilderApp.dynamicValues.removeValue( args.data ); self.getValueAndUpdate( args ); }, cid ); listeners.push( 'fusion-po-' + id + '-changed' ); self.set( 'listeners', listeners ); break; } }, hasDynamicParam: function( param ) { var params = this.getAll(); if ( 'undefined' !== typeof params[ param ] ) { return true; } return false; }, getParamValue: function( data ) { var value = FusionPageBuilderApp.dynamicValues.getValue( data ), beforeString = 'string' === typeof data.before ? data.before : '', afterString = 'string' === typeof data.after ? data.after : '', fallback = 'undefined' !== typeof data.fallback ? data.fallback : false, hasValue = 'undefined' !== typeof value && null !== value && false !== value && '' !== value, elementView = this.get( 'elementView' ); if ( ! hasValue && fallback ) { return fallback; } if ( ! hasValue ) { return undefined; } if ( 'object' === typeof value && 'function' === typeof value.then ) { value.then( function() { elementView.reRender(); } ); return false; } else if ( 'string' !== typeof value ) { return value; } return beforeString + value + afterString; }, addParam: function( param, data ) { var self = this, params = this.getAll(), options = FusionPageBuilderApp.dynamicValues.getOptions(), option = false; if ( 'object' !== typeof data ) { data = { data: data }; } // // Set default values. _.each( options[ data.data ].fields, function( field, key ) { if ( 'undefined' === typeof data[ key ] ) { if ( 'undefined' !== typeof field[ 'default' ] ) { data[ key ] = field[ 'default' ]; } else if ( 'undefined' !== typeof field.value ) { data[ key ] = field.value; } } } ); params[ param ] = data; option = FusionPageBuilderApp.dynamicValues.getOption( data.data ); if ( option && 'object' === typeof option.listeners ) { _.each( option.listeners, function( listenerData, listenerId ) { self.setListener( listenerId, listenerData, param ); } ); } this.set( 'params', params ); this.saveData(); FusionEvents.trigger( 'fusion-dynamic-data-added', param ); this.getValueAndUpdate( params[ param ] ); }, updateParam: function( param, subParam, value ) { var params = this.getAll(); if ( 'object' === typeof params[ param ] ) { params[ param ][ subParam ] = value; this.set( 'params', params ); FusionEvents.trigger( 'fusion-dynamic-data-updated', param ); this.saveData(); this.getValueAndUpdate( params[ param ] ); } }, getValueAndUpdate: function( args ) { var elementView = this.get( 'elementView' ), valueReturn = FusionPageBuilderApp.dynamicValues.getValue( args, elementView ); if ( 'object' === typeof valueReturn && 'function' === typeof valueReturn.then ) { elementView.addLoadingOverlay(); valueReturn.then( function() { elementView.reRender(); }, function() { elementView.removeLoadingOverlay(); } ); } else { elementView.reRender(); } }, updateListeners: function() { var cid = this.cid; _.each( this.get( 'listeners' ), function( listener ) { FusionEvents.off( listener, null, cid ); } ); this.setListeners(); }, removeParam: function( param ) { var params = this.getAll(), elementView = this.get( 'elementView' ); delete params[ param ]; this.set( 'params', params ); this.updateListeners(); this.saveData(); elementView.reRender(); FusionEvents.trigger( 'fusion-dynamic-data-removed', param ); }, historyPush: function() { var elementView = this.get( 'elementView' ), elementMap = fusionAllElements[ elementView.model.get( 'element_type' ) ]; // TODO: refactor history. FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + fusionBuilderText.dynamic_data ); }, saveData: function() { var elementView = this.get( 'elementView' ), elementParams = elementView.model.get( 'params' ), originalValue = elementParams.dynamic_params; elementParams.dynamic_params = FusionPageBuilderApp.base64Encode( JSON.stringify( this.getAll() ) ); elementView.model.set( 'params', elementParams ); // Make sure that parent is updated, usually done in base view changeParam. if ( 'function' === typeof elementView.forceUpdateParent ) { elementView.forceUpdateParent(); } if ( originalValue !== elementParams.dynamic_params ) { this._historyPush(); } } } ); }( jQuery ) ); ;/* global FusionApp, FusionEvents */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.FormStyles = Backbone.Model.extend( { initialize: function() { this.baseSelector = '.fusion-form.fusion-form-form-wrapper'; this.dynamic_css = {}; this.formData = FusionApp.data.postMeta._fusion; this.buildStyles(); this.listenTo( FusionEvents, 'fusion-form-styles', this.buildStyles ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.buildStyles ); }, addCssProperty: function ( selectors, property, value, important ) { if ( 'object' === typeof selectors ) { selectors = Object.values( selectors ); } if ( 'object' === typeof selectors ) { selectors = selectors.join( ',' ); } if ( 'object' !== typeof this.dynamic_css[ selectors ] ) { this.dynamic_css[ selectors ] = {}; } if ( 'undefined' !== typeof important && important ) { value += ' !important'; } if ( 'undefined' === typeof this.dynamic_css[ selectors ][ property ] || ( 'undefined' !== typeof important && important ) || ! this.dynamic_css[ selectors ][ property ].includes( 'important' ) ) { this.dynamic_css[ selectors ][ property ] = value; } }, isDefault: function( param, subset ) { if ( 'string' === typeof subset ) { return 'undefined' === typeof this.formData[ param ] || 'undefined' === typeof this.formData[ param ][ subset ] || '' === this.formData[ param ][ subset ]; } return 'undefined' === typeof this.formData[ param ] || '' === this.formData[ param ]; }, parseCSS: function () { var css = ''; if ( 'object' !== typeof this.dynamic_css ) { return ''; } _.each( this.dynamic_css, function ( properties, selector ) { if ( 'object' === typeof properties ) { css += selector + '{'; _.each( properties, function ( value, property ) { css += property + ':' + value + ';'; } ); css += '}'; } } ); return css; }, buildStyles: function() { var selectors, css = '', placeholderColor = '', hoverColor = '', borderTop, borderBottom; var textInputs = [ this.baseSelector + ' input[type="date"]', this.baseSelector + ' input[type="datetime-local"]', this.baseSelector + ' input[type="email"]', this.baseSelector + ' input[type="month"]', this.baseSelector + ' input[type="number"]', this.baseSelector + ' input[type="password"]', this.baseSelector + ' input[type="search"]', this.baseSelector + ' input[type="tel"]', this.baseSelector + ' input[type="phone-number"]', this.baseSelector + ' input[type="text"]', this.baseSelector + ' input[type="time"]', this.baseSelector + ' input[type="url"]', this.baseSelector + ' input[type="week"]', this.baseSelector + ' input[type="datetime"]', ]; var uploadInput = this.baseSelector + ' input[type="upload"]'; var rangeInput = this.baseSelector + ' input[type="range"]'; var selectInput = this.baseSelector + ' select'; var textareaInput = this.baseSelector + ' textarea'; var customizableInputs = textInputs.concat( [ selectInput ], [ textareaInput ], [ uploadInput ] ); this.dynamic_css = {}; if ( 'fusion_form' !== FusionApp.getPost( 'post_type' ) ) { return; } // Help tooltips. this.addCssProperty( this.baseSelector + ' .fusion-form-tooltip .fusion-form-tooltip-content', 'color', this.formData['tooltip_text_color'], true); this.addCssProperty( this.baseSelector + ' .fusion-form-tooltip .fusion-form-tooltip-content', 'background-color', this.formData['tooltip_background_color'], true); this.addCssProperty( this.baseSelector + ' .fusion-form-tooltip .fusion-form-tooltip-content', 'border-color', this.formData['tooltip_background_color'], true); // Field margin. if (!this.isDefault('field_margin', 'top')) { this.addCssProperty( this.baseSelector + ' .fusion-form-field', 'margin-top', this.formData['field_margin']['top']); } if (!this.isDefault('field_margin', 'bottom')) { this.addCssProperty( this.baseSelector + ' .fusion-form-field', 'margin-bottom', this.formData['field_margin']['bottom']); } if (!this.isDefault('form_input_height')) { heightInputs = textInputs.concat( [selectInput], [rangeInput] ); this.addCssProperty(heightInputs, 'height', this.formData['form_input_height']); this.addCssProperty( this.baseSelector + ' .fusion-form-input-with-icon > i', 'line-height', this.formData['form_input_height']); } if (!this.isDefault('form_bg_color')) { this.addCssProperty(customizableInputs, 'background-color', this.formData['form_bg_color']); } if ( !this.isDefault( 'form_font_size' ) ) { this.addCssProperty( customizableInputs, 'font-size', this.formData.form_font_size ); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-input-with-icon>i', 'font-size', this.formData.form_font_size ); } if ( '' !== this.formData.form_placeholder_color ) { placeholderColor = this.formData.form_placeholder_color; } else if ( ! this.isDefault( 'form_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.formData.form_text_color ).alpha( 0.5 ).toRgbaString(); } if ( placeholderColor ) { // Regular browser placeholders. selectors = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder', this.baseSelector + ' textarea::placeholder', this.baseSelector + ' select:invalid' ]; this.addCssProperty(selectors, 'color', placeholderColor); } if (!this.isDefault('form_text_color')) { // Select field. this.addCssProperty( this.baseSelector + ' option', 'color', this.formData['form_text_color']); // Upload field. this.addCssProperty( this.baseSelector + ' input.fusion-form-upload-field::placeholder', 'color', this.formData['form_text_color']); // Icon color. this.addCssProperty( this.baseSelector + ' .fusion-form-input-with-icon > i', 'color', this.formData['form_text_color'], true); // Input text color. this.addCssProperty(customizableInputs, 'color', this.formData['form_text_color']); // Select stroke color. this.addCssProperty( this.baseSelector + ' .fusion-select-wrapper .select-arrow path', 'stroke', this.formData['form_text_color'], true ); } if ( !this.isDefault( 'form_label_color' ) ) { this.addCssProperty( this.baseSelector + ' label, ' + this.baseSelector + ' .label', 'color', this.formData.form_label_color ); } if (!this.isDefault('form_border_width', 'top')) { this.addCssProperty(customizableInputs, 'border-top-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['top'], 'px')); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-image-select label', 'border-top-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['top'], 'px')); } if (!this.isDefault('form_border_width', 'bottom')) { this.addCssProperty(customizableInputs, 'border-bottom-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['bottom'], 'px')); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-image-select label', 'border-bottom-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['bottom'], 'px')); } if (!this.isDefault('form_border_width', 'right')) { this.addCssProperty(customizableInputs, 'border-right-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['right'], 'px')); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-image-select label', 'border-right-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['right'], 'px')); if (jQuery( 'body' ).hasClass( 'rtl' )) { this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-input-with-icon > i', 'right', 'calc( 1em + ' + _.fusionGetValueWithUnit( this.formData['form_border_width']['right'], 'px') + ')', true); } else { this.addCssProperty( this.baseSelector + ' .fusion-select-wrapper .select-arrow', 'right', 'calc( 1em + ' + _.fusionGetValueWithUnit( this.formData['form_border_width']['right'], 'px') + ')', true); } } if (!this.isDefault('form_border_width', 'left')) { this.addCssProperty(customizableInputs, 'border-left-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['left'], 'px')); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-image-select label', 'border-left-width', _.fusionGetValueWithUnit( this.formData['form_border_width']['left'], 'px')); if (jQuery( 'body' ).hasClass( 'rtl' )) { this.addCssProperty( this.baseSelector + ' .fusion-select-wrapper .select-arrow', 'left', 'calc( 1em + ' + _.fusionGetValueWithUnit( this.formData['form_border_width']['left'], 'px') + ')', true); } else { this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-input-with-icon > i', 'left', 'calc( 1em + ' + _.fusionGetValueWithUnit( this.formData['form_border_width']['left'], 'px') + ')', true); } } if (!this.isDefault('form_border_width', 'bottom') || !this.isDefault('form_border_width', 'top')) { borderTop = this.isDefault('form_border_width', 'top') ? 'var(--form_border_width-top)' : _.fusionGetValueWithUnit( this.formData['form_border_width']['top'], 'px'); borderBottom = this.isDefault('form_border_width', 'bottom') ? 'var(--form_border_width-bottom)' : _.fusionGetValueWithUnit( this.formData['form_border_width']['bottom'], 'px'); formFontSize = this.isDefault( 'form_font_size' ) ? '1em' : this.formData.form_font_size; this.addCssProperty( this.baseSelector + ' .fusion-form-field:not( .fusion-form-upload-field ) .fusion-form-input-with-icon > i', 'top', 'calc( 50% + (' + borderTop + ' - ' + borderBottom + ' ) / 2 )', true ); this.addCssProperty( this.baseSelector + ' .fusion-form-field.fusion-form-textarea-field .fusion-form-input-with-icon > i', 'top', 'calc( ' + borderTop + ' + ' + formFontSize + ' )', true ); } if (!this.isDefault('form_border_color')) { selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-checkbox label:before', this.baseSelector + ' .fusion-form-field .fusion-form-radio label:before', this.baseSelector + ' .fusion-form-field .fusion-form-image-select label' ]; this.addCssProperty(customizableInputs, 'border-color', this.formData['form_border_color']); this.addCssProperty(selectors, 'border-color', this.formData['form_border_color']); selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-rating-icon' ]; this.addCssProperty(selectors, 'color', this.formData['form_border_color']); // Range input type. this.addCssProperty( this.baseSelector + ' .fusion-form-field input[type=range]::-webkit-slider-runnable-track', 'background', this.formData['form_border_color']); this.addCssProperty( this.baseSelector + ' .fusion-form-field input[type=range]::-moz-range-track', 'background', this.formData['form_border_color']); } if (!this.isDefault('form_focus_border_color')) { hoverColor = jQuery.AWB_Color( this.formData.form_focus_border_color ).alpha( 0.5 ).toRgbaString(); selectors = [ this.baseSelector + ' input:not([type="submit"]):focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus', this.baseSelector + ' .fusion-form-field.focused.fusion-form-upload-field .fusion-form-upload-field', this.baseSelector + ' .fusion-form-field .fusion-form-radio input:checked + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-radio input:hover + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-checkbox input:checked + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-checkbox input:hover + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-image-select .fusion-form-input:checked + label', this.baseSelector + ' .fusion-form-field .fusion-form-image-select .fusion-form-input:hover + label', this.baseSelector + ' .fusion-form-field .fusion-form-checkbox input:focus + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-radio input:focus + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-image-select .fusion-form-input:focus + label', ]; this.addCssProperty(selectors, 'border-color', this.formData['form_focus_border_color']); selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-radio input:hover:not(:checked) + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-checkbox input:hover:not(:checked) + label:before', this.baseSelector + ' .fusion-form-field .fusion-form-image-select .fusion-form-input:hover:not(:checked) + label', this.baseSelector + ' .fusion-form-field .fusion-form-upload-field-container:hover .fusion-form-upload-field', this.baseSelector + ' .fusion-form-field .fusion-form-range-field-container .fusion-form-range-value:hover:not(:focus)', this.baseSelector + ' .fusion-form-field .fusion-form-input:hover:not(:focus)' ]; this.addCssProperty(selectors, 'border-color', hoverColor); selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-input:checked ~ label i', ]; this.addCssProperty(selectors, 'color', this.formData['form_focus_border_color']); selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-input:checked:hover ~ label i', this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-rating-icon:hover i', this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-rating-icon:hover ~ label i', this.baseSelector + ' .fusion-form-field .fusion-form-rating-area .fusion-form-input:hover ~ label i', ]; this.addCssProperty(selectors, 'color', hoverColor); selectors = [ this.baseSelector + ' .fusion-form-field .fusion-form-checkbox input:checked + label:after', this.baseSelector + ' .fusion-form-field .fusion-form-radio input:checked + label:after', ]; this.addCssProperty(selectors, 'background', this.formData['form_focus_border_color']); // Range input type. this.addCssProperty( this.baseSelector + ' .fusion-form-field input[type=range]::-webkit-slider-thumb', 'background', this.formData['form_focus_border_color']); this.addCssProperty( this.baseSelector + ' .fusion-form-field input[type=range]::-moz-range-thumb', 'background', this.formData['form_focus_border_color']); } if (!this.isDefault('form_border_radius')) { this.addCssProperty(customizableInputs, 'border-radius', _.fusionGetValueWithUnit( this.formData['form_border_radius'], 'px')); this.addCssProperty( this.baseSelector + ' .fusion-form-field .fusion-form-image-select label', 'border-radius', _.fusionGetValueWithUnit( this.formData['form_border_radius'], 'px')); } css = this.parseCSS(); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).find( '#fusion-form-style-block' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).find( '#fusion-form-style-block' ).html( css ); return; } jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).append( '<style id="fusion-form-style-block">' + css + '</style>' ); } } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, FusionEvents */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.offCanvasStyles = Backbone.Model.extend( { /** * Off Canvas Live editor preview initialization. * * @since 3.6 * @return {void} */ initialize: function() { const body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ), ocID = body.find( '.awb-off-canvas-wrap' ).attr( 'data-id' ); this.baseSelector = '.awb-off-canvas-wrap#awb-oc-' + ocID; this.dynamic_css = {}; this.options = this.filterOptions(); this.buildStyles(); // Remove saved styles. body.find( '#awb-off-canvas-style-block-' + ocID ).remove(); this.listenTo( FusionEvents, 'awb-off-canvas-styles', this.buildStyles ); this.listenTo( FusionEvents, 'awb-off-canvas-attr', this.buildAttr ); this.listenTo( FusionEvents, 'awb-off-canvas-custom-close-button', this.customCloseButton ); this.listenTo( FusionEvents, 'awb-off-canvas-enter-animation', this.enterAnimation ); this.listenTo( FusionEvents, 'awb-off-canvas-exit-animation', this.exitAnimation ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.buildStyles ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.buildAttr ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.customCloseButton ); }, /** * Array with animations without directions. * * @since 3.6 * @return {void} */ animationsWithoutDirection: [ 'flash', 'rubberBand', 'shake', 'flipinx', 'flipiny', 'lightspeedin', 'flipOutX', 'flipOutY', 'lightSpeedOut' ], /** * Modify options mostly for sliding bar type. * * @since 3.6 * @return {Object} Modified options object. */ filterOptions: function() { const options = FusionApp.data.postMeta._fusion; const filteredOptions = Object.assign( {}, options ); if ( 'sliding-bar' === options.type ) { filteredOptions.type = 'sliding-bar'; filteredOptions.enter_animation = filteredOptions.sb_enter_animation; filteredOptions.enter_animation_speed = filteredOptions.sb_enter_animation_speed; filteredOptions.exit_animation = filteredOptions.sb_exit_animation; filteredOptions.exit_animation_speed = filteredOptions.sb_exit_animation_speed; if ( 'left' === filteredOptions.position || !filteredOptions.position ) { filteredOptions.height = 'full'; filteredOptions.width = options.width || 400; filteredOptions.enter_animation_direction = 'left'; filteredOptions.exit_animation_direction = 'left'; filteredOptions.vertical_position = 'flex-start'; if ( this.isRTL() ) { filteredOptions.horizontal_position = 'flex-end'; } else { filteredOptions.horizontal_position = 'flex-start'; } } if ( 'right' === filteredOptions.position ) { filteredOptions.height = 'full'; filteredOptions.width = options.width || 400; filteredOptions.enter_animation_direction = 'right'; filteredOptions.exit_animation_direction = 'right'; filteredOptions.vertical_position = 'flex-start'; if ( this.isRTL() ) { filteredOptions.horizontal_position = 'flex-start'; } else { filteredOptions.horizontal_position = 'flex-end'; } } if ( 'top' === filteredOptions.position ) { const height = filteredOptions.sb_height || 'auto'; filteredOptions.width = '100vw'; filteredOptions.height = 'custom'; filteredOptions.custom_height = height; filteredOptions.enter_animation_direction = 'down'; filteredOptions.exit_animation_direction = 'up'; filteredOptions.vertical_position = 'flex-start'; filteredOptions.horizontal_position = 'flex-start'; } if ( 'bottom' === filteredOptions.position ) { const height = filteredOptions.sb_height || 'auto'; filteredOptions.width = '100vw'; filteredOptions.height = 'custom'; filteredOptions.custom_height = height; filteredOptions.enter_animation_direction = 'up'; filteredOptions.exit_animation_direction = 'down'; filteredOptions.vertical_position = 'flex-end'; filteredOptions.horizontal_position = 'flex-start'; } return this.parseOptions( filteredOptions ); } return this.parseOptions( options ); }, /** * Merge default options with current options. * To ensure the preview works as same as the front-end. * @since 3.6 * @param {Object} options - The options object. * @return {Object} New options object with default values. */ parseOptions( options ) { const defaults = { // General. 'type': 'popup', 'width': '800', 'width_medium': '', 'width_small': '', 'height': 'fit', 'custom_height': '', 'custom_height_medium': '', 'custom_height_small': '', 'horizontal_position': 'center', 'horizontal_position_medium': '', 'horizontal_position_small': '', 'vertical_position': 'center', 'vertical_position_medium': '', 'vertical_position_small': '', 'content_layout': 'column', 'align_content': 'flex-start', 'valign_content': 'flex-start', 'content_wrap': 'wrap', 'enter_animation': '', 'enter_animation_direction': 'static', 'enter_animation_speed': 0.5, 'exit_animation': '', 'exit_animation_direction': 'static', 'exit_animation_speed': 0.5, 'off_canvas_state': 'closed', 'sb_height': '', 'position': 'left', 'transition': 'overlap', 'sb_enter_animation': 'slideShort', 'sb_enter_animation_speed': 0.5, 'sb_exit_animation': 'slideShort', 'sb_exit_animation_speed': 0.5, // Design. 'background_color': '#ffffff', 'background_image': '', 'background_position': 'left top', 'background_repeat': 'repeat', 'background_size': '', 'background_custom_size': '', 'background_blend_mode': 'none', 'oc_scrollbar': 'default', 'oc_scrollbar_background': '#f2f3f5', 'oc_scrollbar_handle_color': '#65bc7b', 'margin': '', 'padding': '', 'box_shadow': 'no', 'box_shadow_position': '', 'box_shadow_blur': '0', 'box_shadow_spread': '0', 'box_shadow_color': '', 'border_radius': '', 'border_width': '', 'border_color': '', // Overlay. 'overlay': 'yes', 'overlay_z_index': '', 'overlay_close_on_click': 'yes', 'overlay_page_scrollbar': 'yes', 'overlay_background_color': 'rgba(0,0,0,0.8)', 'overlay_background_image': '', 'overlay_background_position': 'left top', 'overlay_background_repeat': 'repeat', 'overlay_background_size': '', 'overlay_background_custom_size': '', 'overlay_background_blend_mode': 'none', // close button. 'close_button': 'yes', 'close_on_esc': 'yes', 'close_button_position': 'right', 'close_button_margin': {}, 'close_button_color': '', 'close_button_color_hover': '', 'close_icon_size': '16', 'close_button_custom_icon': '' }; return Object.assign( defaults, options ); }, /** * Adds CSS property to object. * * @since 3.2 * @param {String} selectors - The CSS selectors. * @param {String} property - The CSS property. * @param {String} value - The CSS property value. * @param {Bool} important - Should have important tag. * @return {void} */ addCssProperty: function ( selectors, property, value, important ) { if ( 'object' === typeof selectors ) { selectors = Object.values( selectors ); } if ( 'object' === typeof selectors ) { selectors = selectors.join( ',' ); } if ( 'object' !== typeof this.dynamic_css[ selectors ] ) { this.dynamic_css[ selectors ] = {}; } if ( 'undefined' !== typeof important && important ) { value += ' !important'; } if ( 'undefined' === typeof this.dynamic_css[ selectors ][ property ] || ( 'undefined' !== typeof important && important ) || ! this.dynamic_css[ selectors ][ property ].includes( 'important' ) ) { this.dynamic_css[ selectors ][ property ] = value; } }, /** * Parses CSS. * * @since 3.2 * @return {String} */ parseCSS: function () { var css = ''; if ( 'object' !== typeof this.dynamic_css ) { return ''; } _.each( this.dynamic_css, function ( properties, selector ) { if ( 'object' === typeof properties ) { css += selector + '{'; _.each( properties, function ( value, property ) { css += property + ':' + value + ';'; } ); css += '}'; } } ); return css; }, /** * Checks if param has got default value or not. * * @since 3.2 * @param {String} param - The param. * @return {Bool} */ isDefault: function( param, subset ) { if ( 'string' === typeof subset ) { return 'undefined' === typeof this.options[ param ] || 'undefined' === typeof this.options[ param ][ subset ] || '' === this.options[ param ][ subset ]; } return 'undefined' === typeof this.options[ param ] || '' === this.options[ param ]; }, /** * Checks if website using RTL language. * * @since 3.6 * @return {Bool} */ isRTL: function () { return jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'rtl' ); }, /** * Get CSS from spacing fields. * used for margin, padding, position, etc. * @since 3.6 * @param {Object} options - The options object. * @param {String} key - options key. * @param {String} prop - CSS property, if empty key will used instead. * @return {String} CSS code. */ getSpacing: function( options, key, prop = '', empty ) { if ( !options[ key ] && 'object' !== typeof options[ key ] ) { return ''; } prop = prop || key; let prefix = ''; if ( 'margin' === prop || 'padding' === prop ) { prefix = prop + '-'; } let css = ''; const keys = [ 'top', 'right', 'bottom', 'left' ]; empty = empty ? '' : 0; keys.forEach( ( k ) => { const v = options[ key ][ k ] || empty; if ( '' !== v ) { css += `${prefix}${k}: ${_.fusionGetValueWithUnit( v )};`; } } ); return css; }, /** * Get CSS code for box shadow. * * @since 3.6 * @param {Object} options - The options object. * @return {String} CSS code. */ getShadow( options ) { if ( 'yes' !== options.box_shadow ) { return ''; } let h = '0', v = '0'; const blur = options.box_shadow_blur || '0', spread = options.box_shadow_spread || '0', color = options.box_shadow_color || ''; if ( options.box_shadow_position && 'object' === typeof options.box_shadow_position ) { h = options.box_shadow_position.horizontal || h; v = options.box_shadow_position.vertical || v; } return `box-shadow:${_.fusionGetValueWithUnit( h )} ${_.fusionGetValueWithUnit( v )} ${_.fusionGetValueWithUnit( blur )} ${_.fusionGetValueWithUnit( spread )} ${color};`; }, /** * Get CSS code for borders including border radius. * * @since 3.6 * @param {Object} options - The options object. * @return {String} CSS code. */ getBorder( options ) { let css = ''; // Border radius. if ( options.border_radius && 'object' === typeof options.border_radius ) { const br = options.border_radius; // ensure preview works when delete value. if ( !br.top_left ) { br.top_left = ''; } if ( !br.top_right ) { br.top_right = ''; } if ( !br.bottom_right ) { br.bottom_right = ''; } if ( !br.bottom_left ) { br.bottom_left = ''; } // loop through border radius. Object.keys( br ).forEach( ( r ) => { const v = br[ r ] || 0; css += `border-${r.replace( '_', '-' )}-radius:${_.fusionGetValueWithUnit( v )};`; } ); } // Border width. if ( options.border_width && 'object' === typeof options.border_width ) { const bw = options.border_width; // ensure preview works when delete value. if ( !bw.top ) { bw.top = ''; } if ( !bw.right ) { bw.right = ''; } if ( !bw.bottom ) { bw.bottom = ''; } if ( !bw.left ) { bw.left = ''; } Object.keys( bw ).forEach( ( b ) => { const v = bw[ b ] || 0; css += `border-${b}-width:${_.fusionGetValueWithUnit( v )};`; } ); } // Border color. if ( options.border_color ) { css += `border-color: ${options.border_color};`; } return css; }, /** * Build CSS style block and add it to the head. * * @since 3.6 * @return {void} CSS code. */ buildStyles: function() { var selectors, media, css = ''; this.dynamic_css = {}; const options = this.filterOptions(); selectors = [ this.baseSelector ]; // remove opacity. this.addCssProperty( selectors, 'opacity', 1, true ); // remove wrapper margin for push transition. this.addCssProperty( [ '#wrapper' ], 'margin-left', '0', true ); this.addCssProperty( [ '#wrapper' ], 'margin-right', '0', true ); // Wrap styles. if ( options.horizontal_position ) { this.addCssProperty( selectors, 'justify-content', options.horizontal_position ); } if ( options.vertical_position ) { this.addCssProperty( selectors, 'align-items', options.vertical_position ); } if ( options.overlay_background_color ) { this.addCssProperty( selectors, 'background-color', options.overlay_background_color ); } if ( options.overlay_background_image && 'yes' === options.overlay ) { let overlayBgImg = options.overlay_background_image; if ( _.isObject( overlayBgImg ) ) { overlayBgImg = overlayBgImg.url; } this.addCssProperty( selectors, 'background-image', `url(${overlayBgImg})` ); if ( options.overlay_background_position ) { this.addCssProperty( selectors, 'background-position', options.overlay_background_position ); } if ( options.overlay_background_repeat ) { this.addCssProperty( selectors, 'background-repeat', options.overlay_background_repeat ); } if ( 'none' !== options.overlay_background_blend_mode ) { this.addCssProperty( selectors, 'background-blend-mode', options.overlay_background_blend_mode ); } if ( options.overlay_background_size ) { if ( 'custom' === options.overlay_background_size ) { const width = options.overlay_background_custom_size && options.overlay_background_custom_size.width ? _.fusionGetValueWithUnit( options.overlay_background_custom_size.width ) : ''; const height = options.overlay_background_custom_size && options.overlay_background_custom_size.height ? _.fusionGetValueWithUnit( options.overlay_background_custom_size.height ) : ''; this.addCssProperty( selectors, 'background-size', `${width} ${height}` ); } else { this.addCssProperty( selectors, 'background-size', options.overlay_background_size ); } } } else { this.addCssProperty( selectors, 'background-image', 'none' ); } // off canvas styles. const offCanvasSelector = this.baseSelector + ' .awb-off-canvas'; selectors = [ offCanvasSelector ]; if ( options.width ) { this.addCssProperty( selectors, 'width', _.fusionGetValueWithUnit( options.width ) ); } if ( 'full' === options.height ) { this.addCssProperty( selectors, 'height', '100vh' ); } else if ( 'custom' === options.height && options.custom_height ) { if ( options.custom_height ) { this.addCssProperty( selectors, 'height', _.fusionGetValueWithUnit( options.custom_height ) ); } } else { this.addCssProperty( selectors, 'height', 'auto' ); } const offCanvasInnerSelector = this.baseSelector + ' .awb-off-canvas-inner'; selectors = [ offCanvasInnerSelector ]; if ( options.background_color ) { this.addCssProperty( selectors, 'background-color', options.background_color ); } if ( options.background_image ) { let bgImg = options.background_image; if ( _.isObject( bgImg ) ) { bgImg = bgImg.url; } this.addCssProperty( selectors, 'background-image', `url(${bgImg})` ); if ( options.background_position ) { this.addCssProperty( selectors, 'background-position', options.background_position ); } if ( options.background_repeat ) { this.addCssProperty( selectors, 'background-repeat', options.background_repeat ); } if ( 'none' !== options.background_blend_mode ) { this.addCssProperty( selectors, 'background-blend-mode', options.background_blend_mode ); } if ( options.background_size ) { if ( 'custom' === options.background_size ) { const width = options.background_custom_size && options.background_custom_size.width ? _.fusionGetValueWithUnit( options.background_custom_size.width ) : ''; const height = options.background_custom_size && options.background_custom_size.height ? _.fusionGetValueWithUnit( options.background_custom_size.height ) : ''; this.addCssProperty( selectors, 'background-size', `${width} ${height}` ); } else { this.addCssProperty( selectors, 'background-size', options.background_size ); } } } else { this.addCssProperty( selectors, 'background-image', 'none' ); } selectors = [ this.baseSelector + ' .off-canvas-content .fusion-builder-live-editor' ]; this.addCssProperty( selectors, 'height', '100%' ); this.addCssProperty( selectors, 'width', '100%' ); // Prepare the container. selectors = [ this.baseSelector + ' .off-canvas-content #fusion_builder_container' ]; this.addCssProperty( selectors, 'height', '100%' ); this.addCssProperty( selectors, 'width', '100%' ); this.addCssProperty( selectors, 'display', 'flex' ); this.addCssProperty( selectors, 'flex-wrap', 'wrap' ); this.addCssProperty( selectors, 'flex-direction', 'column' ); //Flex Alignment options. if ( options.content_layout && 'block' !== options.content_layout ) { this.addCssProperty( selectors, 'flex-direction', options.content_layout ); this.addCssProperty( selectors, 'justify-content', options.align_content ); } if ( options.content_layout && 'block' === options.content_layout ) { this.addCssProperty( selectors, 'display', options.content_layout ); } if ( options.valign_content && 'row' === options.content_layout ) { this.addCssProperty( selectors, 'align-items', options.valign_content ); } if ( options.content_wrap && 'row' === options.content_layout ) { this.addCssProperty( selectors, 'flex-wrap', options.content_wrap ); } if ( 'column' === options.content_layout ) { this.addCssProperty( selectors, 'flex-wrap', 'nowrap' ); } // Fix close button z-index in LE. selectors = [ this.baseSelector + ' .off-canvas-content:hover' ]; this.addCssProperty( selectors, 'z-index', '30' ); // Close button. selectors = [ offCanvasSelector + ' .off-canvas-close' ]; if ( 'no' === options.close_button ) { this.addCssProperty( selectors, 'display', 'none' ); } if ( 'undefined' === typeof options.close_button_margin.top || '' === options.close_button_margin.top ) { this.addCssProperty( selectors, 'margin-top', '20px' ); } if ( 'left' === options.close_button_position ) { this.addCssProperty( selectors, 'right', 'auto' ); this.addCssProperty( selectors, 'left', '0' ); if ( 'undefined' === typeof options.close_button_margin.right || '' === options.close_button_margin.right ) { this.addCssProperty( selectors, 'margin-right', '0' ); } if ( 'undefined' === typeof options.close_button_margin.left || '' === options.close_button_margin.left ) { this.addCssProperty( selectors, 'margin-left', '20px' ); } } else { this.addCssProperty( selectors, 'left', 'auto' ); this.addCssProperty( selectors, 'right', '0' ); if ( 'undefined' === typeof options.close_button_margin.right || '' === options.close_button_margin.right ) { this.addCssProperty( selectors, 'margin-right', '20px' ); } if ( 'undefined' === typeof options.close_button_margin.left || '' === options.close_button_margin.left ) { this.addCssProperty( selectors, 'margin-left', '0' ); } } if ( options.close_button_color ) { this.addCssProperty( selectors, 'color', options.close_button_color ); } if ( options.close_icon_size ) { this.addCssProperty( selectors, 'font-size', options.close_icon_size + 'px' ); } selectors = [ offCanvasSelector + ' .off-canvas-close:hover' ]; if ( options.close_button_color_hover ) { this.addCssProperty( selectors, 'color', options.close_button_color_hover ); } // Hide close button in wire frame mode. selectors = [ '.fusion-builder-ui-wireframe ' + offCanvasSelector + ' .off-canvas-close', offCanvasSelector + '.is-empty .off-canvas-close' ]; this.addCssProperty( selectors, 'display', 'none' ); // custom scrollbar. if ( 'custom' === options.oc_scrollbar ) { selectors = [ offCanvasInnerSelector + ' .off-canvas-content' ]; const scrollbarBg = options.oc_scrollbar_background || '#f2f3f5'; const scrollbarHandleColor = options.oc_scrollbar_handle_color || '#65bc7b'; // Firefox. this.addCssProperty( selectors, 'scrollbar-width', 'thin' ); this.addCssProperty( selectors, 'scrollbar-color', scrollbarHandleColor + ' ' + scrollbarBg ); // Chrome, Safari, Edge. this.addCssProperty( [ offCanvasInnerSelector + ' .off-canvas-content::-webkit-scrollbar' ], 'width', '10px' ); this.addCssProperty( [ offCanvasInnerSelector + ' .off-canvas-content::-webkit-scrollbar-track' ], 'background', scrollbarBg ); this.addCssProperty( [ offCanvasInnerSelector + ' .off-canvas-content::-webkit-scrollbar-thumb' ], 'background', scrollbarHandleColor ); } // hidden scrollbar. if ( 'hidden' === options.oc_scrollbar ) { selectors = [ offCanvasInnerSelector + ' .off-canvas-content' ]; // Firefox. this.addCssProperty( selectors, 'scrollbar-width', 'none' ); // Chrome, Safari, Edge. this.addCssProperty( [ offCanvasInnerSelector + ' .off-canvas-content::-webkit-scrollbar' ], 'display', 'none' ); } css = this.parseCSS(); css += this.getSpacing( options, 'margin' ) ? `${offCanvasSelector} { ${this.getSpacing( options, 'margin' )} }` : ''; css += this.getSpacing( options, 'padding' ) ? `${this.baseSelector} .off-canvas-content { ${this.getSpacing( options, 'padding' )} }` : ''; css += this.getSpacing( options, 'close_button_margin' ) ? `${offCanvasSelector} .off-canvas-close { ${this.getSpacing( options, 'close_button_margin', 'margin', true )} }` : ''; css += this.getShadow( options ) ? `${offCanvasInnerSelector} { ${this.getShadow( options )} }` : ''; css += this.getBorder( options ) ? `${offCanvasInnerSelector} { ${this.getBorder( options )} }` : ''; if ( 'sliding-bar' !== options.type ) { // Horizontal position responsive styles. _.each( [ 'medium', 'small' ], function( size ) { var key = 'horizontal_position_' + size; media = '@media only screen and (max-width:' + FusionApp.settings[ 'visibility_' + size ] + 'px)'; if ( '' === options[ key ] ) { return; } this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector ], 'justify-content', options[ key ] ); css += media + '{' + this.parseCSS() + '}'; }, this ); // vertical position responsive styles. _.each( [ 'medium', 'small' ], function( size ) { var key = 'vertical_position_' + size; media = '@media only screen and (max-width:' + FusionApp.settings[ 'visibility_' + size ] + 'px)'; if ( '' === options[ key ] ) { return; } this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector ], 'align-items', options[ key ] ); css += media + '{' + this.parseCSS() + '}'; }, this ); // Height responsive styles. if ( 'custom' === options.height ) { _.each( [ 'medium', 'small' ], function( size ) { var key = 'custom_height_' + size; media = '@media only screen and (max-width:' + FusionApp.settings[ 'visibility_' + size ] + 'px)'; if ( '' === options[ key ] ) { return; } this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector + ' .awb-off-canvas' ], 'height', _.fusionGetValueWithUnit( options[ key ] ) ); css += media + '{' + this.parseCSS() + '}'; }, this ); } } // Width responsive styles. _.each( [ 'medium', 'small' ], function( size ) { var key = 'width_' + size; media = '@media only screen and (max-width:' + FusionApp.settings[ 'visibility_' + size ] + 'px)'; if ( '' === options[ key ] ) { return; } this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector + ' .awb-off-canvas' ], 'width', _.fusionGetValueWithUnit( options[ key ] ) ); css += media + '{' + this.parseCSS() + '}'; }, this ); // Add attribute to the option. const value = jQuery( '[data-option-id="content_layout"]' ).find( 'input#content_layout' ).val(); jQuery( '[data-option-id="content_layout"]' ).attr( 'data-direction', value ); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).find( '#awb-off-canvas-style-block' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).find( '#awb-off-canvas-style-block' ).html( css ); return; } jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).prepend( '<style id="awb-off-canvas-style-block">' + css + '</style>' ); }, /** * build attributes. * * @since 3.6 * @return {String} CSS code. */ buildAttr: function() { const body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); const options = this.filterOptions(); // Wrap Classes. let wrapClasses = 'awb-off-canvas-wrap awb-show'; if ( '' !== options.css_class ) { wrapClasses += ' ' + options.css_class; } if ( '' !== options.type ) { wrapClasses += ' type-' + options.type; } if ( 'sliding-bar' === options.type ) { if ( !options.position ) { options.position = 'left'; } wrapClasses += ' position-' + options.position; } if ( 'no' === options.overlay ) { wrapClasses += ' overlay-disabled'; } body.find( this.baseSelector ).removeClass().addClass( wrapClasses ); // remove is empty class. body.find( this.baseSelector + ' .awb-off-canvas-inner' ).removeClass( 'hidden-scrollbar' ); if ( 1 < FusionPageBuilderApp.collection.length ) { body.find( this.baseSelector + ' .awb-off-canvas-inner' ).removeClass( 'is-empty' ); } }, /** * Custom close button. * * @since 3.6 * @return {void}. */ customCloseButton: function() { const options = this.filterOptions(); const body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); let closeButton = body.find( '.off-canvas-close' ); if ( ! closeButton.length ) { body.find( '.awb-off-canvas' ).prepend( '<span class="off-canvas-close"></span>' ); closeButton = body.find( '.off-canvas-close' ); } let cls = 'off-canvas-close'; if ( options.close_button_custom_icon ) { cls += ' ' + _.fusionFontAwesome( options.close_button_custom_icon ); } else { cls += ' awb-icon-close'; } closeButton.removeClass().addClass( cls ); }, /** * Capitalize string. * * @since 3.6 * @return {String} The capitalized string. */ capitalize: function ( string ) { return string.charAt( 0 ).toUpperCase() + string.slice( 1 ); }, /** * Enter animation preview. * * @since 3.6 * @param {String} string * @return {void} */ enterAnimation: function() { const body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ), offCanvas = body.find( '.awb-off-canvas' ), options = this.filterOptions(); let animation = options.enter_animation; const animationDirection = options.enter_animation_direction && 'static' !== options.enter_animation_direction ? this.capitalize( options.enter_animation_direction ) : '', animationSpeed = options.enter_animation_speed || 1; if ( animation ) { if ( ! this.animationsWithoutDirection.includes( animation ) ) { animation = animation + 'In' + animationDirection; } offCanvas.addClass( 'fusion-animated ' + animation ); offCanvas.attr( 'data-animation-type', animation ); offCanvas.css( { 'visibility': 'visible', 'animation-duration': animationSpeed + 's' } ); } offCanvas.addClass( 'fusion-animated ' + animation ); offCanvas.on( 'animationend', function() { const el = jQuery( this ); if ( el.attr( 'data-animation-type' ) ) { el.removeClass( 'fusion-animated' ).removeClass( el.attr( 'data-animation-type' ) ).removeAttr( 'data-animation-type' ); } } ); }, /** * Exit animation preview. * * @since 3.6 * @return {void} */ exitAnimation: function() { const body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ), offCanvas = body.find( '.awb-off-canvas' ), options = this.filterOptions(); let animation = options.exit_animation; const animationDirection = options.exit_animation_direction && 'static' !== options.exit_animation_direction ? this.capitalize( options.exit_animation_direction ) : '', animationSpeed = options.enter_animation_speed || 1; if ( animation ) { if ( ! this.animationsWithoutDirection.includes( animation ) ) { animation = animation + 'Out' + animationDirection; } offCanvas.addClass( 'fusion-animated ' + animation ); offCanvas.attr( 'data-animation-type', animation ); offCanvas.css( { 'visibility': 'visible', 'animation-duration': animationSpeed + 's' } ); } offCanvas.addClass( 'fusion-animated ' + animation ); offCanvas.on( 'animationend', function() { const el = jQuery( this ); setTimeout( () => { if ( el.attr( 'data-animation-type' ) ) { el.removeClass( 'fusion-animated' ).removeClass( el.attr( 'data-animation-type' ) ).removeAttr( 'data-animation-type' ); } }, 500 ); } ); } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { // Element collection FusionPageBuilder.Collection = Backbone.Collection.extend( { model: FusionPageBuilder.Element } ); window.FusionPageBuilderElements = new FusionPageBuilder.Collection(); // jshint ignore: line }( jQuery ) ); ;/* global FusionPageBuilderElements, fusionBuilderText, fusionGlobalManager, FusionApp, FusionPageBuilderViewManager, fusionAllElements, FusionPageBuilderApp, FusionEvents */ /* eslint no-empty-function: 0 */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element View FusionPageBuilder.BaseView = window.wp.Backbone.View.extend( { modalDialogMoreView: null, events: { }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { }, /** * Before initial render. * * @since 2.0.0 * @return {void} */ beforeRender: function() { }, /** * Filters render markup. * * @since 2.0.0 * @return null */ filterRender: function( $markup ) { return $markup; }, /** * Runs during render() call. * * @since 2.0.0 * @return null */ onRender: function() { }, /** * Runs during initialize() call. * * @since 2.0.0 * @return null */ onInit: function() { }, /** * Runs just before view is removed. * * @since 2.0.0 * @return null */ beforeRemove: function() { }, /** * Runs just after render on cancel. * * @since 2.0.0 * @return null */ onCancel: function() { }, /** * Runs just after render on cancel. * * @since 3.0.2 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ), self = this; if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( 'undefined' !== typeof this.model.get( 'multi' ) && 'multi_element_parent' === this.model.get( 'multi' ) ) { this.model.children.each( function( child ) { var elementType = child.attributes.element_type, childOptions = fusionAllElements[ elementType ].params, childValues = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( child.attributes.params ) ); self.mapStudioImages( childOptions, childValues ); } ); } if ( 'fusion_form' === elementType && '' !== values.form_post_id ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.forms[ values.form_post_id ] ) { FusionPageBuilderApp.mediaMap.forms[ values.form_post_id ] = true; } } } }, /** * Add studio images to media map. * @param {Object} options * @param {Object} values * @returns void */ mapStudioImages: function( options, values ) { if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. _.each( options, function( option ) { var value; if ( 'upload' === option.type && 'undefined' !== typeof values[ option.param_name ] && '' !== values[ option.param_name ] ) { value = values[ option.param_name ]; if ( 'undefined' === typeof value || 'undefined' === value ) { return; } // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ value ] ) { FusionPageBuilderApp.mediaMap.images[ value ] = true; } // Check if we have an image ID for this param. if ( 'undefined' !== typeof values[ option.param_name + '_id' ] && '' !== values[ option.param_name + '_id' ] ) { if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ value ] ) { FusionPageBuilderApp.mediaMap.images[ value ] = {}; } FusionPageBuilderApp.mediaMap.images[ value ][ option.param_name + '_id' ] = values[ option.param_name + '_id' ]; } } } ); }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-' + this.model.attributes.element_type, this.model.attributes.cid ); }, /** * Triggers responsive typography to recalculate. * * @since 2.0.0 * @return void */ updateResponsiveTypography: function() { document.querySelector( '#fb-preview' ).contentWindow.document.body.dispatchEvent( new Event( 'fusion-force-typography-update', { 'bubbles': true, 'cancelable': true } ) ); }, /** * Re-Renders the view. * * @since 2.0.0 * @param {Object} event - The event triggering the rerender. * @return {void} */ reRender: function( event ) { if ( event && 'object' === typeof event ) { event.preventDefault(); } this.patchView( event ); if ( this.model.get( 'inline_editor' ) && ! this.activeInlineEditing ) { FusionPageBuilderApp.inlineEditorHelpers.liveEditorEvent( this ); this.activeInlineEditing = false; } }, patchView: function() { var self = this, $oldContent = '', $newContent = '', MultiGlobalArgs = {}, diff, heightBeforePatch; if ( 'generated_element' === this.model.get( 'type' ) ) { return; } heightBeforePatch = this.$el.outerHeight(); this.beforePatch(); FusionPageBuilderApp.disableDocumentWrite(); this.renderWireframePreview(); $oldContent = this.getElementContent(); $newContent = $oldContent.clone(); $newContent.html( self.getTemplate() ); // Find the difference diff = FusionPageBuilderApp._diffdom.diff( $oldContent[ 0 ], $newContent[ 0 ] ); // Columns. Skip resizable patching. if ( 'function' === typeof this.patcherFilter ) { diff = this.patcherFilter( diff ); } // Apply the difference. FusionPageBuilderApp._diffdom.apply( $oldContent[ 0 ], diff ); if ( 'fusion_builder_column' !== this.model.get( 'element_type' ) ) { // Handle multiple global elements. MultiGlobalArgs = { currentModel: this.model, handleType: 'changeView', difference: diff }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); } $oldContent.removeClass( 'fusion-loader' ); FusionPageBuilderApp.enableDocumentWrite(); this.afterPatch(); // So equalHeights columns are updated. if ( heightBeforePatch !== this.$el.outerHeight() && 'function' === typeof this._triggerColumn ) { this._triggerColumn(); } }, /** * Filter out DOM before patching. * * @since 2.0.0 * @return {void} */ patcherFilter: function( diffs ) { var filteredDiffs = [], ignoreList = [ 'aria-multiline', 'contenteditable', 'data-inline-fontsize', 'data-medium-editor-index', 'data-medium-editor-element', 'data-medium-focused', 'data-placeholder', 'medium-editor-index', 'role', 'spellcheck' ], skipReInit = false; if ( this.activeInlineEditing ) { _.each( diffs, function( diff ) { if ( 'removeAttribute' === diff.action && -1 !== jQuery.inArray( diff.name, ignoreList ) ) { skipReInit = true; return; } else if ( 'modifyAttribute' === diff.action && -1 !== diff.oldValue.indexOf( 'medium-editor-element' ) && -1 === diff.oldValue.indexOf( 'medium-editor-element' ) ) { diff.newValue = diff.newValue + ' medium-editor-element'; filteredDiffs.push( diff ); skipReInit = true; return; } filteredDiffs.push( diff ); } ); diffs = filteredDiffs; // If we are not just removing/modifying attributes then inline needs recreated. this.activeInlineEditing = skipReInit; this.autoSelectEditor = ! skipReInit; } return diffs; }, /** * Runs before view DOM is patched. * * @since 2.0.0 * @return null */ beforePatch: function() { }, /** * Runs after view DOM is patched. * * @since 2.0.0 * @return null */ afterPatch: function() { // This will trigger a JS event on the preview frame. this._refreshJs(); }, /** * Runs after render to open any newly added inline element settings. * * @since 2.0.0 * @return null */ renderInlineSettings: function() { var newlyAdded; if ( 'undefined' === typeof FusionPageBuilderApp.inlineEditors || ! FusionPageBuilderApp.inlineEditors.shortcodeAdded ) { return; } newlyAdded = this.model.inlineCollection.find( function( model ) { return 'true' == model.get( 'params' ).open_settings; // jshint ignore: line } ); if ( 'undefined' !== typeof newlyAdded ) { newlyAdded.parentView = this; newlyAdded.$target = this.$el.find( '.fusion-disable-editing[data-id="' + newlyAdded.get( 'cid' ) + '"]' ); delete newlyAdded.attributes.params.open_settings; if ( 'undefined' !== typeof FusionApp && 'off' !== FusionApp.preferencesData.open_settings ) { newlyAdded.set( 'added', true ); FusionPageBuilderApp.inlineEditorHelpers.getInlineElementSettings( newlyAdded ); } } }, /** * Get the template. * * @since 2.0.0 * @return {void} */ getTemplate: function() { var atts = this.getTemplateAtts(); if ( 'undefined' !== typeof this.elementTemplate ) { return this.elementTemplate( atts ); } }, /** * Modify template attributes. * * @since 2.0.0 * @return {Object} */ filterTemplateAtts: function( atts ) { return atts; }, /** * Get dynamic values. * * @since 2.0.0 * @return {Object} */ getDynamicAtts: function( atts ) { var self = this; if ( 'undefined' !== typeof this.dynamicParams && this.dynamicParams && ! _.isEmpty( this.dynamicParams.getAll() ) ) { _.each( this.dynamicParams.getAll(), function( data, id ) { var value = self.dynamicParams.getParamValue( data ); if ( 'undefined' !== typeof value && false !== value ) { atts.values[ id ] = value; } } ); } return atts; }, /** * Gets element DOM for patching. * * @since 2.1 * @return {Object} */ getValues: function() { var elementType = this.model.get( 'element_type' ), element = fusionAllElements[ elementType ]; return this.getDynamicAtts( jQuery.extend( true, {}, element.defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ) ); }, /** * Gets element DOM for patching. * * @since 2.0.0 * @return {Object} */ getElementContent: function() { var self = this; switch ( this.model.get( 'type' ) ) { case 'fusion_builder_column': case 'fusion_builder_container': case 'fusion_builder_column_inner': return self.$el; case 'element': if ( 'multi_element_child' !== self.model.get( 'multi' ) ) { return self.$el.find( '.fusion-builder-element-content' ); } return self.$el.find( '.fusion-builder-child-element-content' ); } }, /** * Settings handler. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ settings: function( event ) { var self = this, viewSettings = { model: this.model, collection: this.collection }, customSettingsViewName, modalView, parentView, generated = 'generated_element' === this.model.get( 'type' ), childElementClass = '', dialogTitle = '', resizePopupClass = localStorage.getItem( 'resizePopupClass' ); if ( event ) { event.preventDefault(); } this.onSettingsOpen(); customSettingsViewName = fusionAllElements[ this.model.get( 'element_type' ) ].custom_settings_view_name; // Check for generated element child. if ( 'multi_element_child' === this.model.get( 'multi' ) ) { parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( parentView && 'generated_element' === parentView.model.get( 'type' ) ) { generated = true; viewSettings.model.set( 'type', 'generated_element' ); viewSettings.model.set( 'display', 'dialog' ); } } if ( 'undefined' !== typeof customSettingsViewName && '' !== customSettingsViewName ) { modalView = new FusionPageBuilder[ customSettingsViewName ]( viewSettings ); } else { modalView = new FusionPageBuilder.ElementSettingsView( viewSettings ); } // Activate column spacing. if ( 'fusion_builder_column' === this.model.get( 'element_type' ) || 'fusion_builder_column_inner' === this.model.get( 'element_type' ) ) { this.columnSpacing(); this.paddingDrag(); this.marginDrag(); // Hides column size popup. this.$el.removeClass( 'active' ); this.$el.closest( '.fusion-builder-container' ).removeClass( 'fusion-column-sizer-active' ); } // Activate resize handles. if ( 'fusion_builder_container' === this.model.get( 'element_type' ) ) { this.paddingDrag(); this.marginDrag(); } if ( 'fusion_builder_container' === this.model.get( 'element_type' ) || 'fusion_builder_column' === this.model.get( 'element_type' ) || 'fusion_builder_column_inner' === this.model.get( 'element_type' ) ) { this.$el.addClass( 'fusion-builder-element-edited' ); } childElementClass = 'undefined' !== this.model.get( 'multi' ) && 'multi_element_child' === this.model.get( 'multi' ) ? ' fusion-builder-child-element' : ''; dialogTitle = this.getDialogTitle(); // No need to render if it already is. if ( ! FusionPageBuilderApp.SettingsHelpers.shouldRenderSettings( modalView ) ) { return; } // If we want dialog. if ( 'dialog' === FusionApp.preferencesData.editing_mode || generated ) { jQuery( modalView.render().el ).dialog( { title: dialogTitle, width: FusionApp.dialog.dialogData.width, height: FusionApp.dialog.dialogData.height, position: FusionApp.dialog.dialogData.position, dialogClass: 'fusion-builder-dialog fusion-builder-settings-dialog' + childElementClass, minWidth: 327, type: this.model.get( 'type' ), dragStop: function( event, ui ) { FusionApp.dialog.saveDialogPosition( ui.offset ); }, resizeStart: function() { FusionApp.dialog.addResizingClasses(); }, resizeStop: function( event, ui ) { var $dialog = jQuery( event.target ).closest( '.ui-dialog' ), width = $dialog.find( '.fusion-tabs-menu > li' ).length; if ( width ) { width = 100 * width; } if ( width && ui.size.width > width ) { $dialog.find( '.fusion-tabs-menu' ).addClass( 'show-text' ); } else { $dialog.find( '.fusion-tabs-menu' ).removeClass( 'show-text' ); } FusionApp.dialog.saveDialogSize( ui.size ); if ( 450 > ui.size.width && ! $dialog.hasClass( 'fusion-builder-dialog-narrow' ) ) { $dialog.addClass( 'fusion-builder-dialog-narrow' ); } else if ( 450 <= ui.size.width && $dialog.hasClass( 'fusion-builder-dialog-narrow' ) ) { $dialog.removeClass( 'fusion-builder-dialog-narrow' ); } FusionApp.dialog.removeResizingClasses(); }, open: function( event ) { var $dialogContent = jQuery( event.target ), $dialog = $dialogContent.closest( '.ui-dialog' ), width; // On start can sometimes be laggy/late. FusionApp.dialog.addResizingHoverEvent(); if ( modalView.$el.find( '.has-group-options' ).length ) { $dialog.addClass( 'fusion-builder-group-options' ); } $dialogContent.find( '.fusion-builder-section-name' ).blur(); jQuery( '.ui-dialog' ).not( $dialog ).hide(); jQuery( '.fusion-back-menu-item' ).on( 'click', function() { modalView.openParent(); self.onSettingsClose(); } ); self.modalDialogMoreView = new FusionPageBuilder.modalDialogMore( { model: self.model } ); // We need to render context submenu on open. FusionPageBuilderApp.SettingsHelpers.renderDialogMoreOptions( modalView ); if ( null !== resizePopupClass ) { jQuery( 'body' ).addClass( resizePopupClass ); self.modalDialogMoreView.resizePopup( resizePopupClass ); } jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'fusion-dialog-ui-active' ); if ( 450 > $dialog.width() && ! $dialog.hasClass( 'fusion-builder-dialog-narrow' ) ) { $dialog.addClass( 'fusion-builder-dialog-narrow' ); } else if ( 450 <= $dialog.width() && $dialog.hasClass( 'fusion-builder-dialog-narrow' ) ) { $dialog.removeClass( 'fusion-builder-dialog-narrow' ); } // Check if dialog is positioned outside of viewport and reposition it if needed. if ( FusionApp.dialog.maybeRepositionDialog( $dialog ) ) { FusionApp.dialog.saveDialogPosition( $dialog.offset() ); } width = $dialog.find( '.fusion-tabs-menu > li' ).length; if ( width ) { width = 100 * width; } if ( width && $dialog.width() > width ) { $dialog.find( '.fusion-tabs-menu' ).addClass( 'show-text' ); } }, dragStart: function( event ) { // Used to close any open drop-downs in TinyMce. jQuery( event.target ).trigger( 'click' ); }, beforeClose: function( event ) { FusionApp.dialogCloseResets( modalView ); self.modalDialogMoreView = null; modalView.saveSettings( event ); FusionEvents.trigger( 'fusion-content-changed' ); } } ); } else { // Adding into sidebar view instead. modalView.model.set( 'title', dialogTitle ); modalView.model.set( 'display', 'sidebar' ); FusionApp.sidebarView.renderElementSettings( modalView ); } }, getDialogTitle: function() { var dialogTitle = fusionAllElements[ this.model.get( 'element_type' ) ].name, params; if ( 'multi_element_child' === this.model.get( 'multi' ) ) { params = jQuery.extend( true, {}, this.model.get( 'params' ) ); dialogTitle = 'Item'; if ( 'undefined' !== typeof params.title && params.title.length ) { dialogTitle = params.title; } else if ( 'undefined' !== typeof params.title_front && params.title_front.length ) { dialogTitle = params.title_front; } else if ( 'undefined' !== typeof params.name && params.name.length ) { dialogTitle = params.name; } else if ( 'undefined' !== typeof params.image && params.image.length ) { dialogTitle = params.image; // If contains backslash, retrieve only last part. if ( -1 !== dialogTitle.indexOf( '/' ) && -1 === dialogTitle.indexOf( '[' ) ) { dialogTitle = dialogTitle.split( '/' ); dialogTitle = dialogTitle.slice( -1 )[ 0 ]; } } else if ( 'image' === this.model.attributes.element_name && 'undefined' !== typeof params.element_content && params.element_content.length ) { dialogTitle = params.element_content; // If contains backslash, retrieve only last part. if ( -1 !== dialogTitle.indexOf( '/' ) && -1 === dialogTitle.indexOf( '[' ) ) { dialogTitle = dialogTitle.split( '/' ); dialogTitle = dialogTitle.slice( -1 )[ 0 ]; } } else if ( 'undefined' !== typeof params.video && params.video.length ) { dialogTitle = params.video; } else if ( 'undefined' !== typeof params.element_content && params.element_content.length ) { dialogTitle = params.element_content; } // Remove HTML tags but keep quotation marks etc. dialogTitle = jQuery( '<div/>' ).html( dialogTitle ).text(); dialogTitle = jQuery( '<div/>' ).html( dialogTitle ).text(); dialogTitle = ( dialogTitle && 15 < dialogTitle.length ) ? dialogTitle.substring( 0, 15 ) + '...' : dialogTitle; dialogTitle = _.fusionUcFirst( dialogTitle ); } return dialogTitle; }, /** * Generate wireframe preview. * * @since 2.0.0 * @return {void} */ renderWireframePreview: function() { var elementType = this.model.get( 'element_type' ), viewSettings, params, emptySectionText, self = this; // Skip wireframe rendering unless required. if ( ! FusionPageBuilderApp.wireframeActive ) { return; } // Change empty section desc depending on bg image param. if ( 'fusion_builder_container' === elementType ) { params = this.model.get( 'params' ); emptySectionText = fusionBuilderText.empty_section; if ( '' !== params.background_image ) { emptySectionText = fusionBuilderText.empty_section_with_bg; } this.$el.find( '.fusion-builder-empty-section' ).html( emptySectionText ); } // If child element is changed we need to reRender parent. if ( this.model.get( 'parent' ) && ( 'true' === this.model.get( 'child_element' ) || true === this.model.get( 'child_element' ) ) ) { self = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); elementType = self.model.get( 'element_type' ); } if ( 'undefined' !== typeof fusionAllElements[ elementType ].preview || 'element' === self.model.get( 'type' ) ) { if ( 'undefined' === typeof self.previewView || ! self.previewView ) { viewSettings = { model: self.model, collection: FusionPageBuilderElements, dynamicParams: self.dynamicParams }; self.previewView = new FusionPageBuilder.ElementPreviewView( viewSettings ); } self.$el.find( '.fusion-builder-module-preview' ).html( self.previewView.render().el ); } }, /** * Extendable function for when settings is opened. * * @since 2.0.0 * @return {void} */ onSettingsOpen: function() { }, /** * Extendable function for when settings is closed. * * @since 2.0.0 * @return {void} */ onSettingsClose: function() { var $dialog = jQuery( '.ui-dialog:not( .fusion-video-dialog ):not( .fusion-builder-preferences-dialog )' ).first(); // If there are opened dialogs which are resizable. if ( 0 < $dialog.length && ! jQuery( 'body' ).hasClass( 'fusion-settings-dialog-large' ) ) { // Change it's size. jQuery( $dialog ).css( 'width', FusionApp.dialog.dialogData.width + 'px' ); jQuery( $dialog ).css( 'height', FusionApp.dialog.dialogData.height + 'px' ); // Reposition it. jQuery( $dialog ).position( { my: FusionApp.dialog.dialogData.position.my, at: FusionApp.dialog.dialogData.position.at, of: window } ); } }, /** * Renders the content. * * @since 2.0.0 * @return {void} */ renderContent: function() { }, /** * Adds loading overlay while ajax is performing. * * @since 2.0.0 * @return {void} */ addLoadingOverlay: function() { var contentType = 'element', $elementContent; if ( _.isObject( this.model.attributes ) ) { if ( 'fusion_builder_container' === this.model.attributes.element_type ) { contentType = 'container'; } else if ( 'fusion_builder_column' === this.model.attributes.element_type ) { contentType = 'columns'; } } $elementContent = this.$el.find( '.fusion-builder-' + contentType + '-content' ); if ( ! $elementContent.hasClass( 'fusion-loader' ) ) { $elementContent.addClass( 'fusion-loader' ); $elementContent.append( '<span class="fusion-builder-loader"></span>' ); } }, /** * Removes loading overlay after ajax is done. * * @since 3.5 * @return {void} */ removeLoadingOverlay: function() { var contentType = 'element', $elementContent; if ( _.isObject( this.model.attributes ) ) { if ( 'fusion_builder_container' === this.model.attributes.element_type ) { contentType = 'container'; } else if ( 'fusion_builder_column' === this.model.attributes.element_type ) { contentType = 'columns'; } } $elementContent = this.$el.find( '.fusion-builder-' + contentType + '-content' ); if ( $elementContent.hasClass( 'fusion-loader' ) ) { $elementContent.removeClass( 'fusion-loader' ); $elementContent.find( '.fusion-builder-loader' ).remove(); } }, /** * Removes an element. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeElement: function( event ) { var parentCid = this.model.get( 'parent' ); if ( event ) { event.preventDefault(); FusionEvents.trigger( 'fusion-content-changed' ); } // Remove element view FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); // Destroy element model this.model.destroy(); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); // Update column trigger. this.triggerColumn( parentCid ); // Destroy dyamic param model. if ( this.dynamicParam ) { this.dynamicParam.destroy(); } this.remove(); }, /** * Opens the library. Builds the settings for this view * and then calls FusionPageBuilder.LibraryView and renders it. * * @since 2.0.0 * @param {Object} event - The js event. * @return {void} */ openLibrary: function( event ) { var view, libraryModel = { target: jQuery( event.currentTarget ).data( 'target' ), focus: jQuery( event.currentTarget ).data( 'focus' ), element_cid: this.model.get( 'cid' ), element_name: 'undefined' !== typeof this.model.get( 'admin_label' ) && '' !== this.model.get( 'admin_label' ) ? this.model.get( 'admin_label' ) : '' }, viewSettings = { model: libraryModel }; if ( event ) { event.preventDefault(); event.stopPropagation(); FusionPageBuilderApp.sizesHide( event ); } view = new FusionPageBuilder.LibraryView( viewSettings ); view.render(); // Make sure to close any context menus which may be open. FusionPageBuilderApp.removeContextMenu(); }, /** * Disable external links. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ disableLink: function( event ) { if ( ! jQuery( event.target ).closest( '.fusion-builder-module-controls-container' ).length && 'lightbox' !== jQuery( event.currentTarget ).attr( 'target' ) ) { event.preventDefault(); if ( FusionApp.modifierActive && ! jQuery( event.target ).parent().hasClass( 'fusion-lightbox' ) ) { FusionApp.checkLink( event ); } } }, /** * Creates droppable zone and makes element draggable. * * @since 2.0.0 * @return {void} */ droppableElement: function() { var self = this, $el = this.$el, cid = this.model.get( 'cid' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); if ( ! $el ) { return; } if ( 'undefined' === typeof this.elementTarget || ! this.elementTarget.length ) { this.elementTarget = this.$el.find( '.fusion-element-target' ); } $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-live-editable, .fusion-builder-live-child-element:not( [data-fusion-no-dragging] ), .variations select', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-element-helper ' + $classes + '" data-cid="' + cid + '"><span class="' + fusionAllElements[ self.model.get( 'element_type' ) ].icon + '"></span></div>' ); }, start: function() { $body.addClass( 'fusion-element-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); $el.prev( '.fusion-builder-live-element' ).find( '.target-after' ).addClass( 'target-disabled' ); }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-element-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); FusionPageBuilderApp.$el.find( '.target-disabled' ).removeClass( 'target-disabled' ); } } ); this.elementTarget.droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-live-element, .fusion_builder_row_inner', drop: function( event, ui ) { var parentCid = jQuery( event.target ).closest( '.fusion-builder-column' ).data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( parentCid ), elementCid = ui.draggable.data( 'cid' ), elementView = FusionPageBuilderViewManager.getView( elementCid ), MultiGlobalArgs, newIndex; // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $el.after( ui.draggable ); } else { $el.before( ui.draggable ); } newIndex = ui.draggable.parent().children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, parentCid ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.moved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); columnView._equalHeights(); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableElement(); } }, /** * Destroy or disable the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableElement: function() { var $el = this.$el; // If its been init, just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'disable' ); } // If its been init, just disable. if ( 'undefined' !== typeof this.elementTarget && this.elementTarget.length && 'undefined' !== typeof this.elementTarget.droppable( 'instance' ) ) { this.elementTarget.droppable( 'disable' ); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableElement: function() { var $el = this.$el; // If they have been init, then just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) && 'undefined' !== typeof this.elementTarget && this.elementTarget.length && 'undefined' !== typeof this.elementTarget.droppable( 'instance' ) ) { $el.draggable( 'enable' ); this.elementTarget.droppable( 'enable' ); } else { // No sign of init, then need to call it. this.droppableElement(); } }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.renderWireframePreview(); this.disableDroppableElement(); } else { this.enableDroppableElement(); } }, /** * Gets edit label. * * @since 2.0.0 * @return {string} */ getEditLabel: function() { var editLabel = fusionBuilderText.element_settings, elementType = this.model.get( 'element_type' ); if ( 'undefined' !== typeof fusionAllElements[ elementType ] ) { editLabel = fusionBuilderText.custom_element_settings; editLabel = editLabel.replace( '%s', fusionAllElements[ elementType ].name ); } return editLabel; }, /** * Simple prevent default function. * * @since 2.0.0 * @param {Object} event - Click event object. * @return {void} */ preventDefault: function( event ) { event.preventDefault(); }, /** * Update element settings on drag (columns and containers). * * @since 2.0.0 * @param {string} selector - Selector of option. * @param {string} value - Value to update to. * @return {void} */ updateDragSettings: function( selector, value ) { var $option = jQuery( '[data-element-cid="' + this.model.get( 'cid' ) + '"] ' + selector ), $elementSettings, $section; if ( $option.length ) { $elementSettings = $option.closest( '.fusion_builder_module_settings' ); if ( ! $elementSettings.find( '.fusion-tabs-menu a[href="#design"]' ).parent().hasClass( 'current' ) ) { $elementSettings.find( '.fusion-tabs-menu a[href="#design"]' ).parent().trigger( 'click' ); } $section = $elementSettings.find( '.fusion-tabs-menu a[href="#design"]' ).closest( '.fusion-sidebar-section, .ui-dialog-content' ); $section.scrollTop( $option.position().top + $section.scrollTop() ); $option.val( value ).trigger( 'change' ); } }, baseInit: function() { var elementType = this.model.get( 'element_type' ); this.initialValue = {}; this.logHistory = {}; if ( 'string' === typeof elementType && -1 === jQuery.inArray( elementType, FusionPageBuilderApp.inlineElements ) ) { this.listenTo( FusionEvents, 'fusion-global-update-' + elementType, this.updateDefault ); this.listenTo( FusionEvents, 'fusion-extra-update-' + elementType, this.updateExtra ); } this.initDynamicParams(); }, initDynamicParams: function() { var self = this, params = this.model.get( 'params' ), dynamicData = params.dynamic_params; this.dynamicParams = new FusionPageBuilder.DynamicParams( { elementView: this } ); if ( 'string' === typeof params.dynamic_params && '' !== params.dynamic_params ) { try { if ( FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( dynamicData ) ) === dynamicData ) { dynamicData = FusionPageBuilderApp.base64Decode( dynamicData ); dynamicData = _.unescape( dynamicData ); dynamicData = JSON.parse( dynamicData ); } self.dynamicParams.setData( dynamicData ); } catch ( error ) { console.log( error ); // jshint ignore:line } } }, /** * Check for element ajax callbacks and run them. * * @since 2.0.0 * @return {void} */ triggerAjaxCallbacks: function( skip ) { var self = this, AjaxCallbacks = {}, args = { skip: 'undefined' === typeof skip ? false : skip }; if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].has_ajax ) { // Collect callbacks. Do not fire the same action twice. _.each( fusionAllElements[ this.model.get( 'element_type' ) ].has_ajax, function( callback ) { AjaxCallbacks = {}; AjaxCallbacks[ callback.action ] = {}; AjaxCallbacks[ callback.action ][ 'function' ] = callback[ 'function' ]; AjaxCallbacks[ callback.action ].param_name = callback.param_name; AjaxCallbacks[ callback.action ].action = callback.action; } ); // Trigger ajax callbacks to populate query_data attribute _.each( AjaxCallbacks, function( callback ) { FusionApp.callback[ callback[ 'function' ] ]( callback.param_name, self.model.attributes.params[ callback.param_name ], self.model.attributes, args, self.model.get( 'cid' ), callback.action, self.model, self ); } ); } }, updateExtra: function() { this.reRender(); }, updateDefault: function( param, value ) { var modelData = jQuery.extend( this.model.attributes, {} ), reRender = true, callbackFunction = false, params = this.model.get( 'params' ); // Only re-render if actually using default. if ( ( 'undefined' === typeof params[ param ] || '' === params[ param ] || 'default' === params[ param ] ) && ! this.dynamicParams.hasDynamicParam( param ) ) { callbackFunction = FusionPageBuilderApp.getCallbackFunction( modelData, param, value, this, true ); if ( false !== callbackFunction && 'function' === typeof FusionApp.callback[ callbackFunction[ 'function' ] ] ) { reRender = this.doCallbackFunction( callbackFunction, false, param, value, modelData, true ); } if ( reRender ) { this.reRender(); } } }, historyUpdateParam: function( param, value ) { var modelData = jQuery.extend( this.model.attributes, {} ), reRender = true, callbackFunction = false; this.changeParam( param, value, false, true ); callbackFunction = FusionPageBuilderApp.getCallbackFunction( modelData, param, value, this, true ); if ( false !== callbackFunction && 'function' === typeof FusionApp.callback[ callbackFunction[ 'function' ] ] ) { reRender = this.doCallbackFunction( callbackFunction, false, param, value, modelData, true ); } if ( reRender ) { this.reRender(); } }, updateParam: function( param, value, event ) { var modelData = jQuery.extend( this.model.attributes, {} ), reRender = true, callbackFunction = FusionPageBuilderApp.getCallbackFunction( modelData, param, value, this ); if ( false !== callbackFunction && 'function' === typeof FusionApp.callback[ callbackFunction[ 'function' ] ] ) { reRender = this.doCallbackFunction( callbackFunction, event, param, value, modelData ); } else { this.changeParam( param, value ); } return reRender; }, setInitialValue: function( param ) { if ( 'undefined' !== typeof this.initialValue && 'undefined' === typeof this.initialValue[ param ] && 'undefined' !== typeof param ) { this.initialValue[ param ] = 'undefined' !== typeof this.model.get( 'params' )[ param ] ? this.model.get( 'params' )[ param ] : ''; } }, logChangeEvent: function( param, value, label ) { this.logHistory._param = this.logHistory._param || {}; if ( ! ( param in this.logHistory._param ) ) { this.logHistory._param[ param ] = _.debounce( _.bind( function( param, value, label ) { var state = { type: 'param', param: param, newValue: value, cid: this.model.get( 'cid' ) }, elementMap = fusionAllElements[ this.model.get( 'element_type' ) ], paramObject = elementMap.params[ param ], paramTitle = 'object' === typeof paramObject ? paramObject.heading : param; if ( 'undefined' !== typeof label ) { paramTitle = label; } else if ( 'object' !== typeof paramObject && jQuery( '.multi-builder-dimension #' + param ).length ) { paramObject = elementMap.params[ jQuery( '.multi-builder-dimension #' + param ).closest( '.multi-builder-dimension' ).attr( 'id' ) ]; if ( 'object' === typeof paramObject && 'string' === typeof paramObject.heading ) { paramTitle = paramObject.heading; } } else if ( 'object' !== typeof paramObject && jQuery( '.font_family #' + param ).length ) { paramObject = elementMap.params[ jQuery( '.font_family #' + param ).closest( '.fusion-builder-option' ).attr( 'data-option-id' ) ]; if ( 'object' === typeof paramObject && 'string' === typeof paramObject.heading ) { paramTitle = paramObject.heading; } } else if ( 'object' !== typeof paramObject && jQuery( '.typography [name="' + param + '"]' ).length ) { paramObject = elementMap.params[ jQuery( '.typography [name="' + param + '"]' ).closest( '.fusion-builder-option' ).attr( 'data-option-id' ) ]; if ( 'object' === typeof paramObject && 'string' === typeof paramObject.heading ) { paramTitle = paramObject.heading; } } state.oldValue = this.initialValue[ param ]; delete this.initialValue[ param ]; this.model.trigger( 'change' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + paramTitle, state ); }, this ), 500 ); } this.logHistory._param[ param ]( param, value, label ); }, changeParam: function( param, value, label, silent ) { var parentView; if ( ! silent && ! this.model.get( 'inlineElement' ) ) { this.setInitialValue( param ); this.model.attributes.params[ param ] = value; // Update parent after param has been changed. if ( 'multi_element_child' === this.model.get( 'multi' ) ) { parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( parentView && 'function' === typeof parentView.updateElementContent ) { parentView.updateElementContent(); } } this.logChangeEvent( param, value, label ); } else { this.model.attributes.params[ param ] = value; } }, /** * Gets callback function for option change. * * @since 2.0.0 * @return {void} */ doCallbackFunction: function( callbackFunction, event, paramName, paramValue, modelData, skipChange ) { var reRender = true, returnData; callbackFunction.args = 'undefined' === typeof callbackFunction.args ? {} : callbackFunction.args; callbackFunction.ajax = 'undefined' === typeof callbackFunction.ajax ? false : callbackFunction.ajax; callbackFunction.action = 'undefined' === typeof callbackFunction.action ? false : callbackFunction.action; skipChange = 'undefined' === typeof skipChange ? false : skipChange; // If skip is set then param will not be changed. callbackFunction.args.skip = skipChange; // If ajax trigger via debounce, else do it here and retun data. if ( callbackFunction.ajax ) { reRender = false; this.addLoadingOverlay(); this._triggerCallback( event, callbackFunction, paramName, paramValue, modelData.cid, modelData ); } else { returnData = FusionApp.callback[ callbackFunction[ 'function' ] ]( paramName, paramValue, callbackFunction.args, this ); } if ( 'undefined' !== typeof returnData && 'undefined' !== typeof returnData.render ) { reRender = returnData.render; } return reRender; }, /** * Triggers a callback function. * * @since 2.0.0 * @param {Object} event - The event. * @param {string|Object} callbackFunction - The callback function. * @return {void} */ triggerCallback: function( event, callbackFunction, paramName, paramValue, cid, modelData ) { if ( 'undefined' === typeof cid && 'undefined' !== typeof callbackFunction.cid ) { cid = callbackFunction.cid; } if ( 'undefined' === typeof modelData ) { modelData = jQuery.extend( this.model.attributes, {} ); } // This is added due to the new elements causing max call stack. Not sure why but it shouldn't be necessary in any case. if ( 'undefined' !== typeof modelData ) { delete modelData.view; } if ( 'fusion_do_shortcode' !== callbackFunction[ 'function' ] ) { FusionApp.callback[ callbackFunction[ 'function' ] ]( paramName, paramValue, modelData, callbackFunction.args, cid, callbackFunction.action, this.model, this ); } else { FusionApp.callback[ callbackFunction[ 'function' ] ]( cid, callbackFunction.content, callbackFunction.parent ); } }, addCssProperty: function ( selectors, property, value, important ) { if ( 'object' === typeof selectors ) { selectors = Object.values( selectors ); } if ( 'object' === typeof selectors ) { selectors = selectors.join( ',' ); } if ( 'object' !== typeof this.dynamic_css[ selectors ] ) { this.dynamic_css[ selectors ] = {}; } if ( 'undefined' !== typeof important && important ) { value += ' !important'; } if ( 'undefined' === typeof this.dynamic_css[ selectors ][ property ] || ( 'undefined' !== typeof important && important ) || ! this.dynamic_css[ selectors ][ property ].includes( 'important' ) ) { this.dynamic_css[ selectors ][ property ] = value; } }, isDefault: function( param ) { return this.values[ param ] === fusionAllElements[ this.model.get( 'element_type' ) ].defaults[ param ]; }, parseCSS: function () { var css = ''; if ( 'object' !== typeof this.dynamic_css ) { return ''; } _.each( this.dynamic_css, function ( properties, selector ) { if ( 'object' === typeof properties ) { css += selector + '{'; _.each( properties, function ( value, property ) { css += property + ':' + value + ';'; } ); css += '}'; } } ); return css; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, FusionPageBuilderApp, FusionApp, FusionEvents, fusionBuilderText */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Row View FusionPageBuilder.BaseRowView = window.wp.Backbone.View.extend( { /** * On init for both regular and nested columns. * * @since 3.0 * @return null */ baseRowInit: function() { this._updateResponsiveColumnsOrder = _.debounce( this.updateResponsiveColumnsOrder, 100 ); }, reRender: function() { this.render( true ); }, /** * Calculate virtual rows. * * @since 2.0.0 * @return {null} */ createVirtualRows: function() { var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'parent' ) ); // If we are flex, no need for virtual rows. if ( 'function' === typeof container.isFlex && container.isFlex() ) { return; } this.updateVirtualRows(); this.assignColumn(); }, /** * Set the initial column data to the model. * * @since 2.0.0 * @return {void} */ updateVirtualRows: function() { var rows = {}, column = {}, columns = [], count = 0, index = 0, oldRows = this.model.get( 'rows' ), columnWidth; this.model.children.each( function( child ) { column = {}; columnWidth = child.attributes.params.type; if ( ! columnWidth ) { columnWidth = '1_1'; } columnWidth = columnWidth.split( '_' ); columnWidth = columnWidth[ 0 ] / columnWidth[ 1 ]; count += columnWidth; if ( 1 < count ) { index += 1; count = columnWidth; } column = { cid: child.attributes.cid }; if ( 'undefined' === typeof rows[ index ] ) { rows[ index ] = [ column ]; } else { rows[ index ].push( column ); } columns[ child.attributes.cid ] = index; } ); this.model.set( 'columns', columns ); this.model.set( 'rows', rows ); if ( 'object' === typeof oldRows ) { this.model.set( 'oldRows', oldRows ); } }, /** * Change the column in the model. * * @since 2.0.0 * @param {Object} column - The column view. * @return {void} */ assignColumn: function() { var columnParams, self = this, oldRows = this.model.get( 'oldRows' ), updatedCols = false, emptySpacing = true; // Reset first, last positions this.model.children.each( function( column ) { columnParams = jQuery.extend( true, {}, column.get( 'params' ) ); columnParams.first = false; columnParams.last = false; column.set( 'params', columnParams ); } ); // Loop over virtual rows _.each( this.model.get( 'rows' ), function( row, rowIndex ) { var total = row.length, lastIndex = total - 1, rowSame = true, previousSpacing = ''; // Loop over columns inside virtual row _.each( row, function( col, colIndex ) { var columnFirst = false, columnLast = false, model = self.model.children.find( function( model ) { return model.get( 'cid' ) == col.cid; // jshint ignore: line } ), params = jQuery.extend( true, {}, model.get( 'params' ) ), spacing, weightedSpacing; // First index if ( 0 === colIndex ) { columnFirst = true; } if ( lastIndex === colIndex ) { columnLast = true; } params.first = columnFirst; params.last = columnLast; // Check if we need legacy column spacing set. if ( 'undefined' !== typeof params.spacing && FusionPageBuilderApp.loaded ) { spacing = params.spacing; if ( 'yes' === spacing ) { spacing = '4%'; } else if ( 'no' === spacing ) { spacing = '0px'; } if ( ! params.last && '0px' !== spacing && 0 !== spacing && '0' !== spacing ) { emptySpacing = false; } weightedSpacing = self.getWeightedSpacing( spacing, params, total ); // Only set params if both are unset. if ( 'undefined' === typeof params.spacing_left && 'undefined' === typeof params.spacing_right ) { // Use what is set as right spacing. if ( ! params.last ) { params.spacing_right = weightedSpacing; } // Check right spacing of previous column. if ( '' !== previousSpacing ) { params.spacing_left = self.getWeightedSpacing( previousSpacing, params, total ); } } previousSpacing = spacing; } else { emptySpacing = false; } model.set( 'params', params ); // Check if col is same as before. if ( rowSame ) { if ( 'object' !== typeof oldRows || 'undefined' === typeof oldRows[ rowIndex ] || 'undefined' === typeof oldRows[ rowIndex ][ colIndex ] || oldRows[ rowIndex ][ colIndex ].cid !== col.cid ) { rowSame = false; } } } ); if ( ! rowSame && FusionPageBuilderApp.loaded ) { if ( false === updatedCols ) { updatedCols = []; } _.each( row, function( col ) { updatedCols.push( col.cid ); } ); } } ); this.model.set( 'emptySpacing', emptySpacing ); this.model.set( 'updatedCols', updatedCols ); }, getVirtualRowByCID: function( cid ) { var rows = this.model.get( 'rows' ), columns = this.model.get( 'columns' ), index = columns[ cid ], row = rows[ index ]; return row; }, /** * First render, work out legacy column map only once. * * @since 2.0.0 * @return {Object} this */ legacyColumns: function() { var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'parent' ) ), emptySpacing = false, nestedRows = {}; // If we are not in need of legacy conversion then skip. if ( ! container || ! container.needsLegacyConversion() ) { return; } // Create map of row to get correct spacing. this.updateVirtualRows(); this.assignColumn(); if ( ! this.nestedRow ) { // This row is all empty spacing. emptySpacing = this.model.get( 'emptySpacing' ); // Run through same process for nested rows. this.$el.find( '.fusion-builder-row-inner' ).each( function() { var nestedRowCid = jQuery( this ).attr( 'data-cid' ), nestedView = FusionPageBuilderViewManager.getView( nestedRowCid ); // Store for later looping if necessary. nestedRows[ nestedRowCid ] = nestedView; // Update legacy maps and nested column styles. nestedView.legacyColumns(); // If nested row is not empty spacing, parent row shouldn't be also. if ( false === nestedView.model.get( 'emptySpacing' ) ) { emptySpacing = false; } } ); // If its empty spacing and all nested rows also, we will set spacing on container and re-render. if ( emptySpacing ) { // Set the spacing on container. container = FusionPageBuilderApp.getParentContainer( this.model.get( 'parent' ) ); if ( container ) { container.setEmptySpacing(); } // If we have nested rows, update them visually. if ( 'object' === typeof nestedRows && ! _.isEmpty( nestedRows ) ) { _.each( nestedRows, function( nestedRow ) { nestedRow.recalculateMargins(); } ); } // Update parent row visually. this.recalculateMargins(); } } // Update visual appearance for direct children columns. this.model.children.each( function( child ) { var view = FusionPageBuilderViewManager.getView( child.attributes.cid ); view.setArgs(); view.validateArgs(); view.setExtraArgs(); view.setColumnMapData(); view.setResponsiveColumnStyles(); view.$el.find( '.fusion-column-responsive-styles' ).last().html( view.responsiveStyles ); } ); // Set param on container to stop it rerunning. if ( container && 'function' === typeof container.setType ) { container.setType(); } }, getHalfSpacing: function( value ) { var unitlessSpacing = parseFloat( value ), unitlessHalf = unitlessSpacing / 2; return value.replace( unitlessSpacing, unitlessHalf ); }, validateColumnWidth: function( columnSize ) { var fractions; if ( 'undefined' === typeof columnSize ) { columnSize = '1_3'; } // Fractional value. if ( -1 !== columnSize.indexOf( '_' ) ) { fractions = columnSize.split( '_' ); return parseFloat( fractions[ 0 ] ) / parseFloat( fractions[ 1 ] ); } // Greater than one, assume percentage and divide by 100. if ( 1 < parseFloat( columnSize ) ) { return parseFloat( columnSize ) / 100; } return columnSize; }, getWeightedSpacing: function( value, params, total ) { var width = parseFloat( this.validateColumnWidth( params.type ) ), unitlessSpacing = parseFloat( value ), unitlessWeighted; total = 'undefined' === typeof total || false === total ? false : parseInt( total ); if ( false !== total && 3 > total ) { unitlessWeighted = unitlessSpacing * width; } else { unitlessWeighted = unitlessSpacing / 2; } return value.replace( unitlessSpacing, unitlessWeighted ); }, updateColumnsPreview: function() { var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'parent' ) ), updatedCols = this.model.get( 'updatedCols' ), self = this; // Update flex column preview here. if ( 'function' === typeof container.isFlex && container.isFlex() ) { return; } if ( true === FusionPageBuilderApp.loaded ) { this.model.children.each( function( child ) { var view, singleRow, columnRow; if ( false === updatedCols || _.contains( updatedCols, child.attributes.cid ) ) { view = FusionPageBuilderViewManager.getView( child.attributes.cid ); singleRow = self.getVirtualRowByCID( view.model.get( 'cid' ) ); columnRow = []; // Update first/last classes view.$el.removeClass( 'fusion-column-last' ); view.$el.removeClass( 'fusion-column-first' ); if ( true === view.model.attributes.params.last ) { view.$el.addClass( 'fusion-column-last' ); } if ( true === view.model.attributes.params.first ) { view.$el.addClass( 'fusion-column-first' ); } // Update column spacing. _.each( singleRow, function( cid ) { var model, value; cid = cid.cid; model = self.collection.find( function( model ) { return model.get( 'cid' ) == cid; // jshint ignore: line } ); value = model.attributes.params.spacing; columnRow.push( value ); } ); view.columnSpacingPreview( columnRow ); } } ); } }, /** * Sets the row data. * * @since 2.0.0 * @return {void} */ setRowData: function() { this.createVirtualRows(); this.updateColumnsPreview(); }, setSingleRowData: function( cid ) { var row = this.getVirtualRowByCID( cid ), view; _.each( row, function( column ) { view = FusionPageBuilderViewManager.getView( column.cid ); view.reRender(); } ); }, /** * Mode change for container. * * @since 3.0 * @return {void} */ modeChange: function() { this.setRowData(); this.reRender( true ); this.reRenderColumns(); // Refresh nested rows if they exist. if ( ! this.nestedRow ) { this.reRenderNestedRows(); } }, /** * Mode change for container. * * @since 3.0 * @return {void} */ updateInnerStyles: function() { this.setRowData(); this.reRender( true ); if ( this.nestedRow ) { this.appendChildren( false ); } this.model.children.each( function( child ) { var cid = child.attributes.cid; var column = FusionPageBuilderViewManager.getView( cid ); if ( column ) { column.updateInnerStyles(); } } ); // Refresh nested rows if they exist. if ( ! this.nestedRow ) { this.$el.find( '.fusion_builder_row_inner' ).each( function( ) { var cid = jQuery( this ).attr( 'data-cid' ), row = FusionPageBuilderViewManager.getView( cid ); if ( row ) { row.updateInnerStyles(); } } ); } this.delegateChildEvents(); }, /** * Re-render the nested rows. * * @since 3.0 * @return {void} */ reRenderNestedRows: function() { this.$el.find( '.fusion_builder_row_inner' ).each( function( ) { var cid = jQuery( this ).attr( 'data-cid' ), row = FusionPageBuilderViewManager.getView( cid ); if ( 'object' === typeof row ) { row.modeChange(); row.appendChildren(); } } ); }, /** * Re-render columns * * @since 3.0 * @return {void} */ reRenderColumns: function() { var cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); if ( view ) { view.reRender(); } } ); }, /** * Updates columns' order params. * @return {void} */ updateResponsiveColumnsOrder: function( draggedColumn, columns, targetColumnCID, insertAfterTargetColumn ) { var viewportSize = FusionApp.getPreviewWindowSize(), draggedColumnCID = parseInt( draggedColumn.data( 'cid' ) ), draggedColumnOrder = parseInt( draggedColumn.css( 'order' ) ), columnsArray = [], index = 0, columnView; if ( 'large' === viewportSize ) { return; } jQuery( columns ).each( function( scopedIndex, column ) { // TODO: handle case when multiple columns have same order set. if ( draggedColumnCID !== jQuery( column ).data( 'cid' ) ) { columnsArray.push( [ parseInt( jQuery( column ).data( 'cid' ) ), parseInt( jQuery( column ).css( 'order' ) ) ] ); } } ); // Sort columns by CSS order. columnsArray.sort( function( col1, col2 ) { return col1[ 1 ] - col2[ 1 ]; } ); // Find index (position) of target column. for ( index = 0; index < columnsArray.length; index++ ) { if ( targetColumnCID === columnsArray[ index ][ 0 ] ) { break; } } // In case we're inserting before target column. if ( ! insertAfterTargetColumn ) { index--; } // Insert dragged column in it's place. Note that index is position in 'splice' context (not array index). columnsArray.splice( index + 1, 0, [ draggedColumnCID, draggedColumnOrder ] ); // Index is not longer relevant, using it just as iterator. for ( index = 0; index < columnsArray.length; index++ ) { // Get column view by CID. columnView = FusionPageBuilderViewManager.getView( columnsArray[ index ][ 0 ] ); // Update order param and value. columnView.model.attributes.params[ 'order_' + viewportSize ] = index; columnView.values[ 'order_' + viewportSize ] = index; // Update column's responsive styles. columnView.setResponsiveColumnStyles(); columnView.$el.find( '.fusion-column-responsive-styles' ).last().html( columnView.responsiveStyles ); // Update EO panel if opened. if ( jQuery( '.fusion-builder-module-settings[data-element-cid="' + columnsArray[ index ][ 0 ] + '"' ) ) { FusionEvents.trigger( 'fusion-param-changed-' + columnView.model.get( 'cid' ), 'order_' + viewportSize, index ); } } // Trigger change and add history event. FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.column + ' order changed' ); } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionBuilderText, fusionAllElements, cssua, FusionPageBuilderViewManager, FusionPageBuilderApp, FusionEvents, fusionSettings */ /* eslint no-unused-vars: 0 */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Nested Column View FusionPageBuilder.BaseColumnView = FusionPageBuilder.BaseView.extend( { /** * On init for both regular and nested columns. * * @since 3.0 * @return null */ baseColumnInit: function() { this.model.children = new FusionPageBuilder.Collection(); this.listenTo( FusionEvents, 'fusion-param-changed-' + this.model.get( 'cid' ), this.onOptionChange ); this.listenTo( this.model.children, 'add', this.addChildView ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); // Responsive control updates on resize. this.listenTo( FusionEvents, 'fusion-preview-viewport-update', this.onPreviewResize ); this._triggerCallback = _.debounce( _.bind( this.triggerCallback, this ), 200 ); this._toolTipHide = _.debounce( _.bind( this.toolTipHide, this ), 500 ); this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); this._equalHeights = _.debounce( _.bind( this.equalHeights, this ), 300 ); this.deprecatedParams(); // Hold the DOM elements for resizables. this.marginResize = {}; this.paddingResize = {}; }, /** * Runs before view DOM is patched. * * @since 2.0.0 * @return null */ beforePatch: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.$el.find( '.fusion-builder-column-content' ).removeClass( 'ui-sortable' ); } }, /** * Runs after view DOM is patched. * * @since 2.0.0 * @return null */ afterPatch: function() { var self = this; if ( 'undefined' !== typeof this.model.attributes.selectors ) { if ( this.model.get( 'dragging' ) ) { this.model.attributes.selectors.style += ';display: none;'; this.model.attributes.selectors[ 'class' ] += ' ignore-me-column'; } this.$el.removeAttr( 'data-animationType' ); this.$el.removeAttr( 'data-animationDuration' ); this.$el.removeAttr( 'data-animationOffset' ); this.setElementAttributes( this.$el, this.model.attributes.selectors ); } if ( this.forceAppendChildren ) { this.appendChildren(); this.forceAppendChildren = false; } setTimeout( function() { self.droppableColumn(); }, 300 ); this._refreshJs(); if ( FusionPageBuilderApp.wireframeActive ) { this.$el.find( '.fusion-builder-column-content' ).addClass( 'ui-sortable' ); } }, /** * Delegates multiple child elements. * * @since 2.0.0 * @return {void} */ delegateChildEvents: function() { var cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); view.delegateEvents(); // Re init for elements. if ( 'function' === typeof view.droppableElement ) { view.droppableElement(); } // Re init for nested row. if ( 'function' === typeof view.droppableColumn ) { view.droppableColumn(); } // Multi elements if ( 'undefined' !== typeof view.model.get( 'multi' ) && 'multi_element_parent' === view.model.get( 'multi' ) ) { view.delegateChildEvents(); view.sortableChildren(); } } ); }, updateInnerStyles: function() { this.setArgs(); this.validateArgs(); this.setExtraArgs(); this.setColumnMapData(); this.setResponsiveColumnStyles(); this.$el.find( '.fusion-column-responsive-styles' ).last().html( this.responsiveStyles ); this.delegateChildEvents(); }, /** * Updates now deprecated params and adds BC checks. * * @since 2.1 * @return {void} */ deprecatedParams: function() { var params = this.model.get( 'params' ), alphaBackgroundColor = 1, radiaDirectionsNew = { 'bottom': 'center bottom', 'bottom center': 'center bottom', 'left': 'left center', 'right': 'right center', 'top': 'center top', 'center': 'center center', 'center left': 'left center' }, borderSize; // Correct radial direction params. if ( 'undefined' !== typeof params.radial_direction && ( params.radial_direction in radiaDirectionsNew ) ) { params.radial_direction = radiaDirectionsNew[ params.radial_direction ]; } // No align self set but ignore equal heights is on. if ( 'undefined' === typeof params.align_self && 'undefined' !== typeof params.min_height && 'none' === params.min_height ) { params.align_self = 'flex-start'; } // No align content set, but legacy center_content is on. if ( 'undefined' === typeof params.align_content && 'undefined' !== typeof params.center_content && 'yes' === params.center_content ) { params.align_content = 'center'; } // Border sizes. if ( ( 'undefined' === typeof params.border_sizes_top || 'undefined' === typeof params.border_sizes_bottom || 'undefined' === typeof params.border_sizes_left || 'undefined' === typeof params.border_sizes_right ) && 'string' === typeof params.border_size ) { switch ( params.border_position ) { case 'all': borderSize = _.fusionGetValueWithUnit( params.border_size ); params.border_sizes_top = borderSize; params.border_sizes_bottom = borderSize; params.border_sizes_left = borderSize; params.border_sizes_right = borderSize; break; default: params[ 'border_sizes_' + params.border_position ] = _.fusionGetValueWithUnit( params.border_size ); } delete params.border_size; } this.model.set( 'params', params ); }, /** * Handle margin adjustments on drag. * * @since 2.0.0 * @return {void} */ marginDrag: function() { var $el = this.$el, self = this, directions = { top: 's', bottom: 's' }, parentWidth = 'fusion_builder_column_inner' === this.model.get( 'type' ) ? $el.closest( '.fusion-builder-row-container-inner' ).width() : $el.closest( '.fusion-row' ).width(), isFlex = false, $spacers = this.$el.find( '> .fusion-column-wrapper > .fusion-column-spacers, > .fusion-column-margins' ); // If flex we also use left and right. if ( 'undefined' !== typeof this.isFlex && true === this.isFlex ) { directions = { top: 's', bottom: 's', left: 'e', right: 'w' }; isFlex = true; } // If class is set, do not init again. if ( this.$el.hasClass( 'resizable-active' ) ) { return; } // Single post card, margin is not used. if ( 'fusion_builder_column_inner' !== this.model.get( 'type' ) && 'post_cards' === FusionApp.data.fusion_element_type ) { return; } _.each( directions, function( handle, direction ) { var optionKey = FusionApp.getResponsiveOptionKey( 'top' === direction || 'bottom' === direction ? 'margin_' + direction : 'spacing_' + direction, self.isFlex ), actualDimension = self.values[ optionKey ], percentSpacing = false; // No value, use half column spacing (not upsized). if ( ! actualDimension || '' === actualDimension ) { if ( isFlex && ( 'top' === direction || 'bottom' === direction ) && self.values[ 'margin_' + direction ] ) { actualDimension = self.values[ 'margin_' + direction ]; } else { actualDimension = self.getHalfSpacing(); } } // Check if using a percentage. percentSpacing = -1 !== actualDimension.indexOf( '%' ); // If percentage, get the actual px dimension. if ( percentSpacing ) { actualDimension = ( parentWidth / 100 ) * parseFloat( actualDimension ); } // Overlap checks. if ( 'bottom' === direction ) { if ( 20 > parseInt( actualDimension, 10 ) ) { $spacers.find( '.fusion-column-margin-bottom, .fusion-column-padding-bottom' ).addClass( 'fusion-overlap' ); } else { $spacers.find( '.fusion-column-margin-bottom, .fusion-column-padding-bottom' ).removeClass( 'fusion-overlap' ); } } // Find element and display it. self.marginResize[ direction ] = $spacers.find( '.fusion-column-margin-' + direction ); self.marginResize[ direction ].css( 'display', 'block' ); // Set initial width or height. if ( 'left' === direction || 'right' === direction ) { self.marginResize[ direction ].width( actualDimension ); } else { self.marginResize[ direction ].height( actualDimension ); } // Init resizable. self.marginResize[ direction ].resizable( { handles: handle, minHeight: 0, minWidth: 0, grid: ( percentSpacing ) ? [ parentWidth / 1000, 10 ] : '', resize: function( event, ui ) { var optionKey = FusionApp.getResponsiveOptionKey( 'top' === direction || 'bottom' === direction ? 'margin_' + direction : 'spacing_' + direction, self.isFlex ), percentSpacing = 'undefined' !== typeof self.values[ optionKey ] ? -1 !== self.values[ optionKey ].indexOf( '%' ) : false, $resizer = jQuery( ui.element ), value = 'top' === direction || 'bottom' === direction ? ui.size.height : ui.size.width; // If nothing is set and left and right, check row column spacing if ( '' === self.values[ optionKey ] && ( 'left' === direction || 'right' === direction ) ) { percentSpacing = -1 !== self.getHalfSpacing().indexOf( '%' ); } // Active class to prevent multiple inits. $resizer.closest( '.fusion-builder-column:not( .resizable-active )' ).addClass( 'resizable-active' ); // Work out value. value = 0 > value ? 0 : value; value = value + 'px'; if ( percentSpacing ) { value = 0 === parseFloat( value ) ? '0%' : ( Math.round( parseFloat( parseFloat( value ) / ( parentWidth / 1000 ) ) ) / 10 ) + '%'; } // Bottom margin overlap if ( 'bottom' === direction ) { if ( 20 > ui.size.height ) { $resizer.addClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-padding-bottom' ).addClass( 'fusion-overlap' ); } else { $resizer.removeClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-padding-bottom' ).removeClass( 'fusion-overlap' ); } } // Display tooltip. $resizer.find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).addClass( 'active' ); $resizer.find( '.fusion-spacing-tooltip' ).text( value ); // Update open settings modal. self.updateDragSettings( '#' + optionKey, value ); }, stop: function( event, ui ) { var $resizer = jQuery( ui.element ); $resizer.closest( '.fusion-builder-column' ).removeClass( 'resizable-active' ); $resizer.find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).removeClass( 'active' ); // Delete all spacing resizable within because parent width has changed. if ( $resizer.find( '.fusion-builder-column-inner' ).find( '.fusion-element-spacing .ui-resizable' ).length ) { $resizer.closest( '.fusion-builder-column-inner' ).find( '.fusion-element-spacing .ui-resizable' ).resizable( 'destroy' ); } } } ); } ); }, /** * Handle padding adjustments on drag. * * @since 2.0.0 * @return {void} */ paddingDrag: function() { var $el = this.$el, self = this, directions = { top: 's', right: 'w', bottom: 's', left: 'e' }, percentSpacing = false, parentWidth = $el.find( '> .fusion-column-wrapper' ).first().width(), $spacers = this.$el.find( '> .fusion-column-wrapper > .fusion-column-spacers, > .fusion-column-margins' ), valueAllowed = ( parentWidth / 100 ), isFlex = false, value, actualDimension; if ( this.$el.hasClass( 'resizable-active' ) ) { return; } if ( 'undefined' !== typeof this.isFlex && true === this.isFlex ) { isFlex = true; } _.each( directions, function( handle, direction ) { var optionKey = FusionApp.getResponsiveOptionKey( 'padding_' + direction, isFlex ), actualDimension = self.values[ optionKey ] || self.values[ 'padding_' + direction ], percentSpacing = false; if ( ! isFlex && ! actualDimension ) { actualDimension = '0px'; } // Check if using a percentage. percentSpacing = 'undefined' !== typeof actualDimension ? -1 !== actualDimension.indexOf( '%' ) : false; if ( percentSpacing ) { // Get actual dimension and set. actualDimension = ( parentWidth / 100 ) * parseFloat( actualDimension ); } if ( 'bottom' !== direction && ( isFlex || 'top' === direction ) ) { if ( 20 > parseInt( actualDimension, 10 ) ) { $spacers.find( '.fusion-column-margin-' + direction + ', .fusion-column-padding-' + direction ).addClass( 'fusion-overlap' ); } else { $spacers.find( '.fusion-column-margin-' + direction + ', .fusion-column-padding-' + direction ).removeClass( 'fusion-overlap' ); } } self.paddingResize[ direction ] = $spacers.find( '.fusion-column-padding-' + direction ); self.paddingResize[ direction ].css( 'display', 'block' ); if ( 'top' === direction || 'bottom' === direction ) { self.paddingResize[ direction ].height( actualDimension ); } else { self.paddingResize[ direction ].width( actualDimension ); } self.paddingResize[ direction ].resizable( { handles: handle, minHeight: 0, minWidth: 0, resize: function( event, ui ) { var optionKey = FusionApp.getResponsiveOptionKey( 'padding_' + direction, isFlex ), actualDimension = self.values[ optionKey ], dimension = 'top' === direction || 'bottom' === direction ? 'height' : 'width', $resizer = jQuery( ui.element ); // Recheck in case unit is changed in the modal. percentSpacing = 'undefined' !== typeof actualDimension ? -1 !== actualDimension.indexOf( '%' ) : false; // Force to grid amount. if ( percentSpacing ) { ui.size[ dimension ] = Math.round( ui.size[ dimension ] / valueAllowed ) * valueAllowed; } $resizer.closest( '.fusion-builder-column' ).addClass( 'resizable-active' ); // Change format of value. value = ui.size[ dimension ]; value = 0 > value ? 0 : value; value = value + 'px'; if ( percentSpacing ) { value = 0 === parseFloat( value ) ? '0%' : Math.round( parseFloat( parseFloat( value ) / ( parentWidth / 100 ) ) ) + '%'; } // Overlaps top left, right. if ( 'top' === direction ) { if ( 20 > ui.size.height ) { $resizer.addClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-margin-top' ).addClass( 'fusion-overlap' ); } else { $resizer.removeClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-margin-top' ).removeClass( 'fusion-overlap' ); } } else if ( 'right' === direction ) { if ( 20 > ui.size.width && ( isFlex || 20 > $spacers.find( '.fusion-column-spacing .fusion-spacing-value' ).width() ) ) { $resizer.addClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-spacing, .fusion-column-margin-right' ).addClass( 'fusion-overlap' ); } else { $resizer.removeClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-spacing, .fusion-column-margin-right' ).removeClass( 'fusion-overlap' ); } } else if ( 'left' === direction && isFlex ) { if ( 20 > ui.size.width ) { $resizer.addClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-margin-left' ).addClass( 'fusion-overlap' ); } else { $resizer.removeClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-margin-left' ).removeClass( 'fusion-overlap' ); } } // Set values. $resizer.find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).addClass( 'active' ); $resizer.find( '.fusion-spacing-tooltip' ).text( value ); // Update open modal. self.updateDragSettings( '#' + optionKey, value ); }, stop: function( event, ui ) { var $resizer = jQuery( ui.element ); $resizer.closest( '.fusion-builder-column' ).removeClass( 'resizable-active' ); $resizer.find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).removeClass( 'active' ); // Delete all spacing resizable within because parent width has changed. if ( $resizer.find( '.fusion-builder-column-inner' ).find( '.fusion-element-spacing .ui-resizable' ).length ) { $resizer.closest( '.fusion-builder-column-inner' ).find( '.fusion-element-spacing .ui-resizable' ).resizable( 'destroy' ); } } } ); } ); }, /** * Destroy column's resizables. * * @since 2.0.0 * @return {void} */ destroyResizable: function() { this.destroySpacingResizable(); this.destroyMarginResizable(); this.destroyPaddingResizable(); }, /** * Destroy column's spacing resizable. * * @since 2.0.0 * @return {void} */ destroySpacingResizable: function() { var $columnSpacer; $columnSpacer = this.$el.find( '> .fusion-column-spacing .fusion-spacing-value' ); if ( $columnSpacer.hasClass( 'ui-resizable' ) ) { $columnSpacer.resizable( 'destroy' ); $columnSpacer.hide(); this.columnSpacer = false; } }, /** * Destroy column's margin resizable. * * @since 2.0.0 * @return {void} */ destroyMarginResizable: function() { _.each( this.marginResize, function( $marginResize ) { if ( $marginResize.length && $marginResize.hasClass( 'ui-resizable' ) && -1 !== $marginResize.attr( 'class' ).indexOf( 'fusion-column-margin-' ) ) { $marginResize.resizable( 'destroy' ); $marginResize.hide(); } } ); }, /** * Destroy column's padding resizable. * * @since 2.0.0 * @return {void} */ destroyPaddingResizable: function() { _.each( this.paddingResize, function( $paddingResize ) { if ( $paddingResize.length && $paddingResize.hasClass( 'ui-resizable' ) && -1 !== $paddingResize.attr( 'class' ).indexOf( 'fusion-column-padding-' ) ) { $paddingResize.resizable( 'destroy' ); $paddingResize.hide(); } } ); }, /** * Changes the column spacing. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ columnSpacing: function( event ) { var percentSpacing = false, $el = this.$el, self = this, $spacers = this.$el.find( '> .fusion-column-wrapper > .fusion-column-spacers' ), marginDirection = FusionPageBuilderApp.$el.hasClass( 'rtl' ) ? 'left' : 'right', parentWidth, marginRight, container, columnSpacing, existingSpacing, modelSpacing, $columnSpacer, maxWidth, rightPadding, rightOverlap; // We don't need column spacing when flex container is used. if ( 'undefined' !== typeof this.isFlex && true === this.isFlex ) { return; } $columnSpacer = this.$el.find( '> .fusion-column-spacing .fusion-spacing-value' ); if ( event && 'event' !== event ) { event.preventDefault(); } // If responsive mode and columns are 1/1 hide and return. if ( jQuery( '#fb-preview' ).width() < FusionApp.settings.content_break_point && FusionApp.settings.responsive ) { $columnSpacer.hide(); return; } $columnSpacer.show(); // If this is the last column in a virtual row, then no handles. if ( this.$el.hasClass( 'fusion-column-last' ) ) { return; } // No resizer for fallback method. if ( 'yes' === this.model.attributes.params.spacing || 'no' === this.model.attributes.params.spacing ) { return; } existingSpacing = this.model.attributes.params.spacing; if ( 'undefined' === typeof existingSpacing || '' === existingSpacing ) { existingSpacing = '4%'; } if ( 'no' === existingSpacing ) { existingSpacing = '0'; } // Already created spacer and not %, no need to continue. if ( this.columnSpacer && -1 === existingSpacing.indexOf( '%' ) ) { return; } // Get the container width. container = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'fusion_builder_column_inner' === this.model.get( 'type' ) ) { parentWidth = container.$el.find( '.fusion-builder-row-container-inner' ).width(); } else { parentWidth = container.$el.find( '.fusion-row' ).width(); } // Already created spacer, % is being used and width is the same, no need to continue. if ( this.columnSpacer && parentWidth === this.parentWidth ) { return; } // Store parent width to compare. this.parentWidth = parentWidth; // Get the column right margin. In real usage use the model attribute. columnSpacing = existingSpacing; marginRight = existingSpacing; // Set column spacing width. if ( -1 !== existingSpacing.indexOf( '%' ) ) { percentSpacing = true; marginRight = parseFloat( marginRight ) / 100.0; columnSpacing = marginRight * parentWidth; } // Set max width spacing. maxWidth = parentWidth - 100; // Destroy in case it's already active if ( $columnSpacer.hasClass( 'ui-resizable' ) ) { $columnSpacer.resizable( 'destroy' ); } $columnSpacer.width( columnSpacing ); $columnSpacer.resizable( { handles: FusionPageBuilderApp.$el.hasClass( 'rtl' ) ? 'w' : 'e', minWidth: 0, maxWidth: maxWidth, grid: ( percentSpacing ) ? [ parentWidth / 100, 10 ] : '', create: function() { if ( 0 === $el.find( '> .fusion-column-spacing .fusion-spacing-value' ).width() ) { $el.find( '> .fusion-column-spacing' ).addClass( 'empty' ); } else if ( $el.find( '> .fusion-column-spacing.empty' ).length ) { $el.find( '> .fusion-column-spacing' ).removeClass( 'empty' ); } }, resize: function( event, ui ) { ui.size.width = 0 > ui.size.width ? 0 : ui.size.width; if ( 0 === modelSpacing ) { $el.find( '> .fusion-column-spacing' ).addClass( 'empty' ); } else if ( $el.find( '> .fusion-column-spacing.empty' ).length ) { $el.find( '> .fusion-column-spacing' ).removeClass( 'empty' ); } modelSpacing = ui.size.width + 'px'; if ( percentSpacing ) { modelSpacing = Math.round( parseFloat( ui.size.width / ( parentWidth / 100 ) ) ) + '%'; } $el.css( 'margin-' + marginDirection, modelSpacing ); // Update open modal. if ( jQuery( '[data-element-cid="' + self.model.get( 'cid' ) + '"]' ).length ) { jQuery( '[data-element-cid="' + self.model.get( 'cid' ) + '"] [data-option-id="spacing"] #spacing' ).val( modelSpacing ).trigger( 'change' ); } $el.find( '> .fusion-column-spacing .fusion-spacing-tooltip, > .fusion-column-spacing' ).addClass( 'active' ); $el.find( '> .fusion-column-spacing .fusion-spacing-tooltip' ).text( modelSpacing ); $el.addClass( 'active-drag' ); self._toolTipHide(); // Right padding overlap. if ( 20 > ui.size.width && 20 > $spacers.find( '.fusion-column-padding-' + marginDirection ).width() ) { jQuery( ui.element ).parent().addClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-padding-' + marginDirection ).addClass( 'fusion-overlap' ); } else { jQuery( ui.element ).parent().removeClass( 'fusion-overlap' ); $spacers.find( '.fusion-column-padding-' + marginDirection ).removeClass( 'fusion-overlap' ); } }, stop: function( event, ui ) { // jshint ignore: line $el.removeClass( 'active-drag' ); } } ); rightPadding = 'undefined' === typeof this.model.attributes.params.padding_right || '' === this.model.attributes.params.padding_right ? '0px' : this.model.attributes.params.padding_right; rightOverlap = ( 20 > parseInt( rightPadding, 10 ) && ( '0%' === rightPadding || -1 === rightPadding.indexOf( '%' ) ) && ( 20 > parseInt( columnSpacing, 10 ) ) ) ? 'fusion-overlap' : ''; if ( '' !== rightOverlap ) { $spacers.find( '.fusion-column-padding-right' ).addClass( 'fusion-overlap' ); $el.find( '> .fusion-column-spacing' ).addClass( 'fusion-overlap' ); } else { $spacers.find( '.fusion-column-padding-right' ).removeClass( 'fusion-overlap' ); $el.find( '> .fusion-column-spacing' ).removeClass( 'fusion-overlap' ); } // Column spacer created this.columnSpacer = true; }, /** * Changes the size of a column. * * @since 2.0.0 * @param {Object} event - The event triggering the change in size. * @return {void} */ sizeSelect: function( event ) { var columnSize, fractionSize, container = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), viewport = jQuery( '#fb-preview' ).attr( 'data-viewport' ), index = [ 'desktop', 'tablet', 'mobile' ].findIndex( function ( vp ) { return viewport.includes( vp ); } ), widthKeys = [ 'type', 'type_medium', 'type_small' ]; if ( event ) { event.preventDefault(); } columnSize = jQuery( event.target ).data( 'column-size' ); // Check if there's a setings view and verifify if it's the one corresponding to this element. if ( FusionPageBuilderApp.SettingsHelpers.openSettingsView && FusionPageBuilderApp.SettingsHelpers.openSettingsView.model.cid === this.model.cid ) { if ( FusionPageBuilderApp.SettingsHelpers.openSettingsView.tabsRendered.design ) { return jQuery( FusionPageBuilderApp.SettingsHelpers.openSettingsView.$el .find( '.ui-button[data-value="' + columnSize + '"]' )[ index ] ) .trigger( 'click' ); } jQuery( FusionPageBuilderApp.SettingsHelpers.openSettingsView.$el .find( '.width-value' )[ index ] ).val( columnSize ); } // Update model. this.model.attributes.params[ widthKeys[ index ] ] = columnSize; this.$el.find( '.column-sizes' ).hide(); this.$el.removeClass( 'active' ); this.$el.attr( 'data-column-size', columnSize ); fractionSize = columnSize.replace( '_', '/' ); // Necessary for re-sizing then cloning. this.reRender(); container.setRowData(); if ( 'fusion_builder_column_inner' !== this.model.get( 'type' ) ) { this.renderSectionSeps(); } this.$el.find( '.column-sizes .column-size' ).removeClass( 'active-size' ); this.$el.find( '.column-size-' + columnSize ).addClass( 'active-size' ); this.$el.closest( '.fusion-builder-container' ).removeClass( 'fusion-column-sizer-active' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-column-resized', this.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-column-resized' ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.resized_column + ' ' + fractionSize ); }, /** * Checks if the value is in pixels. * * @since 2.0.0 * @param {string} value - The value we want to check. * @return {boolean} */ pxCheck: function( value ) { if ( 'undefined' === typeof value ) { return false; } // If 0, then consider valid. if ( '0' === value || 0 === value ) { return true; } return ( -1 !== value.indexOf( 'px' ) ) ? true : false; }, /** * Checks if the value is using %. * * @since 2.0.0 * @param {string} value - The value we want to check. * @return {boolean} */ percentageCheck: function( value ) { if ( 'undefined' === typeof value ) { return false; } // If 0, then consider valid. if ( '0' === value || 0 === value ) { return true; } return ( -1 !== value.indexOf( '%' ) ) ? true : false; }, /** * Adds 2 values. * * @since 2.0.0 * @param {string|number|double} a - The 1st value. * @param {string|number|double} b - The 2nd value. * @return {number} */ addValues: function( a, b ) { return parseFloat( a ) + parseFloat( b ); }, /** * Add a module. * * @since 2.0.0 * @param {Object} event - The event triggering the module addition. * @return {void} */ addModule: function( event ) { var view, viewSettings, closestParent; if ( event ) { event.preventDefault(); event.stopPropagation(); FusionPageBuilderApp.sizesHide( event ); } FusionPageBuilderApp.parentColumnId = this.model.get( 'cid' ); viewSettings = { model: this.model, collection: this.collection, view: this, attributes: { 'data-parent_cid': this.model.get( 'cid' ) } }; if ( ! jQuery( event.currentTarget ).closest( '.fusion-builder-empty-column' ).length && ! FusionPageBuilderApp.wireframeActive ) { closestParent = jQuery( event.currentTarget ).closest( '.fusion-builder-live-element' ); if ( closestParent.length ) { viewSettings.targetElement = closestParent; } else { viewSettings.targetElement = jQuery( event.currentTarget ).closest( '.fusion-builder-nested-element' ); } } view = new FusionPageBuilder.ElementLibraryView( viewSettings ); jQuery( view.render().el ).dialog( { title: 'Select Element', draggable: false, modal: true, resizable: false, dialogClass: 'fusion-builder-dialog fusion-builder-large-library-dialog fusion-builder-element-library-dialog', resizeStart: function( event, ui ) { FusionApp.dialog.addResizingClasses(); }, resizeStop: function( event, ui ) { FusionApp.dialog.removeResizingClasses(); }, open: function( event, ui ) { // jshint ignore: line FusionApp.dialog.resizeDialog(); // On start can sometimes be laggy/late. FusionApp.dialog.addResizingHoverEvent(); }, close: function( event, ui ) { // jshint ignore: line view.remove(); } } ); }, /** * Get dynamic values. * * @since 2.0.0 * @return {Object} */ getDynamicAtts: function( values ) { var self = this; if ( 'undefined' !== typeof this.dynamicParams && this.dynamicParams && ! _.isEmpty( this.dynamicParams.getAll() ) ) { _.each( this.dynamicParams.getAll(), function( data, id ) { var value = self.dynamicParams.getParamValue( data ); if ( 'undefined' !== typeof value && false !== value ) { values[ id ] = value; } } ); } return values; }, /** * Get the template. * * @since 2.0.0 * @return {void} */ getTemplate: function() { var atts = this.getTemplateAtts(); return this.template( atts ); }, setArgs: function() { var params = jQuery.extend( true, {}, this.model.get( 'params' ) ), values; // Make sure initial width is correctly inherited. if ( 'undefined' === typeof params.type ) { params.type = this.model.attributes.params.type; } if ( fusionAllElements[ this.model.get( 'type' ) ] ) { values = jQuery.extend( true, {}, fusionAllElements[ this.model.get( 'type' ) ].defaults, _.fusionCleanParameters( params ) ); } // If no blend mode is defined, check if we should set to overlay. if ( 'undefined' === typeof params.background_blend_mode && '' !== params.background_color && 1 > values.alpha_background_color && 0 !== values.alpha_background_color && '' !== params.background_image ) { values.background_blend_mode = 'overlay'; } // If padding (combined all 4) is not set in params, then use individual variables. if ( 'undefined' === typeof params.padding ) { values = _.fusionGetPadding( values ); } this.values = this.getDynamicAtts( values ); }, validateArgs: function() { var borderRadius; // Alpha related checks. this.values.alpha_background_color = jQuery.AWB_Color( this.values.background_color ).alpha(); this.values.alpha_gradient_start_color = jQuery.AWB_Color( this.values.gradient_start_color ).alpha(); this.values.alpha_gradient_end_color = jQuery.AWB_Color( this.values.gradient_end_color ).alpha(); if ( '' !== this.values.margin_bottom ) { this.values.margin_bottom = _.fusionGetValueWithUnit( this.values.margin_bottom ); } if ( '' !== this.values.margin_top ) { this.values.margin_top = _.fusionGetValueWithUnit( this.values.margin_top ); } if ( this.values.border_size ) { this.values.border_size = _.fusionValidateAttrValue( this.values.border_size, 'px' ); } if ( '' !== this.values.padding ) { this.values.padding = _.fusionGetValueWithUnit( this.values.padding ); } if ( '' !== this.values.border_sizes_top ) { this.values.border_sizes_top = _.fusionGetValueWithUnit( this.values.border_sizes_top ); } if ( '' !== this.values.border_sizes_bottom ) { this.values.border_sizes_bottom = _.fusionGetValueWithUnit( this.values.border_sizes_bottom ); } if ( '' !== this.values.border_sizes_top ) { this.values.border_sizes_left = _.fusionGetValueWithUnit( this.values.border_sizes_left ); } if ( '' !== this.values.border_sizes_top ) { this.values.border_sizes_right = _.fusionGetValueWithUnit( this.values.border_sizes_right ); } // Border radius validation. this.values.border_radius_top_left = this.values.border_radius_top_left ? _.fusionGetValueWithUnit( this.values.border_radius_top_left ) : '0px'; this.values.border_radius_top_right = this.values.border_radius_top_right ? _.fusionGetValueWithUnit( this.values.border_radius_top_right ) : '0px'; this.values.border_radius_bottom_left = this.values.border_radius_bottom_left ? _.fusionGetValueWithUnit( this.values.border_radius_bottom_left ) : '0px'; this.values.border_radius_bottom_right = this.values.border_radius_bottom_right ? _.fusionGetValueWithUnit( this.values.border_radius_bottom_right ) : '0px'; borderRadius = this.values.border_radius_top_left + ' ' + this.values.border_radius_top_right + ' ' + this.values.border_radius_bottom_right + ' ' + this.values.border_radius_bottom_left; this.values.border_radius = '0px 0px 0px 0px' === borderRadius ? '' : borderRadius; this.values.border_position = 'all' !== this.values.border_position ? '-' + this.values.border_position : ''; }, validatePercentageMargin: function( value, columnSize, values ) { value = 'undefined' === typeof value ? '' : value; columnSize = 'undefined' === typeof columnSize ? 1 : columnSize; values = 'undefined' === typeof values ? this.values : values; // If value is in percentage and not calc, make it relative to container. if ( 0 < parseFloat( columnSize ) && -1 !== value.indexOf( '%' ) && -1 === value.indexOf( 'calc' ) ) { // If all are in % just work it out. if ( -1 !== values.column_spacing.indexOf( '%' ) && -1 === values.column_spacing.indexOf( 'calc' ) ) { return ( parseFloat( value ) / parseFloat( columnSize ) / 100 * ( 100 - parseFloat( values.column_spacing ) ) ) + '%'; } // Not all % then we need to use calc. return 'calc( ' + ( parseFloat( value ) / parseFloat( columnSize ) / 100 ) + ' * calc( 100% - ' + values.column_spacing + ' ) )'; } return value; }, setExtraArgs: function() { var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'parent' ) ), containerParams, containerValues; this.values.flex = false; this.values.column_spacing = '4%'; this.values.flex_align_items = 'flex-start'; if ( 'object' === typeof container ) { containerParams = _.fusionCleanParameters( container.model.get( 'params' ) ); containerValues = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, containerParams ); this.values.flex = 'flex' === containerValues.type; this.values.column_spacing = containerValues.flex_column_spacing; this.values.flex_align_items = containerValues.flex_align_items; } this.values.column_counter = this.model.get( 'cid' ); this.values.hover_or_link = ( 'none' !== this.values.hover_type && '' !== this.values.hover_type ) || '' !== this.values.link; this.values.shortcode_classname = 'fusion_builder_column' === this.model.get( 'type' ) ? 'fusion-builder-live-column' : 'fusion-builder-live-nested-column'; // Store for later use. this.isFlex = this.values.flex; }, setColumnMapData: function() { var self = this, containerSpacingOffset, unitlessSpacing, unitlessHalf, halfSpacing, emptyOffset, container, currentRow, containerRows, spacings, total, lastIndex, model, columnSpacing, widthKey, spacingLeftKey, spacingRightKey, extras; // If we are flex, we do not have a column map. if ( this.values.flex ) { this.setColumnSize(); extras = jQuery.extend( true, {}, fusionAllElements.fusion_builder_column.extras ); // Medium inherit from large or validate if set. if ( '' === this.values.type_medium || 0 === parseFloat( this.values.type_medium ) ) { this.values.type_medium = 'inherit_from_large' === extras.col_width_medium ? this.values.column_size : 1; } else { this.values.type_medium = this.validateColumnSize( this.values.type_medium ); } // Small default to 1 or validate if set. if ( '' === this.values.type_small || 0 === parseFloat( this.values.type_small ) ) { this.values.type_small = 'inherit_from_large' === extras.col_width_small ? this.values.column_size : 1; } else { this.values.type_small = this.validateColumnSize( this.values.type_small ); } // Full width medium, inherit from large if set. if ( 1 !== parseInt( this.values.type_medium ) ) { if ( '' === this.values.spacing_left_medium ) { this.values.spacing_left_medium = this.values.spacing_left; } if ( '' === this.values.spacing_right_medium ) { this.values.spacing_right_medium = this.values.spacing_right; } } // Full width small, inherit from medium or large if set. if ( 1 !== parseInt( this.values.type_small ) ) { if ( '' === this.values.spacing_left_small ) { this.values.spacing_left_small = '' !== this.values.spacing_left_medium ? this.values.spacing_left_medium : this.values.spacing_left; } if ( '' === this.values.spacing_right_small ) { this.values.spacing_right_small = '' !== this.values.spacing_right_medium ? this.values.spacing_right_medium : this.values.spacing_right; } } // Half the spacing on container. halfSpacing = this.getHalfSpacing(); // Validate left and right margins that are set. _.each( [ 'large', 'medium', 'small' ], function( width ) { // Need to calc for each because column width may be different and that changes things. widthKey = 'large' === width ? 'column_size' : 'type_' + width; emptyOffset = self.validatePercentageMargin( halfSpacing, self.values[ widthKey ] ); // We have a value, validate it, else we use the empty offset. spacingLeftKey = 'large' === width ? 'spacing_left' : 'spacing_left_' + width; if ( '' !== self.values[ spacingLeftKey ] ) { self.values[ 'upsized_' + spacingLeftKey ] = self.validatePercentageMargin( self.values[ spacingLeftKey ], self.values[ widthKey ] ); } else { self.values[ 'upsized_' + spacingLeftKey ] = emptyOffset; } spacingRightKey = 'large' === width ? 'spacing_right' : 'spacing_right_' + width; if ( '' !== self.values[ spacingRightKey ] ) { self.values[ 'upsized_' + spacingRightKey ] = self.validatePercentageMargin( self.values[ spacingRightKey ], self.values[ widthKey ] ); } else { self.values[ 'upsized_' + spacingRightKey ] = emptyOffset; } } ); return; } container = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); containerRows = container.model.get( 'rows' ); currentRow = container.getVirtualRowByCID( this.model.get( 'cid' ) ); if ( 'yes' === this.values.spacing || '' === this.values.spacing ) { this.values.spacing = '4%'; } else if ( 'no' === this.values.spacing ) { this.values.spacing = '0px'; } this.values.spacing = _.fusionGetValueWithUnit( this.values.spacing ); this.values.widthOffset = ''; this.values.currentRowNumberOfColumns = false; function fallbackCheck( value ) { return ( 'yes' === value || 'no' === value ); } // Pop off the last because it can't have spacing. if ( 'undefined' !== typeof currentRow ) { // currentRow = currentRow.slice( 0, -1 ); this.values.currentRowNumberOfColumns = currentRow.length + 1; } this.values.fallback = false; if ( 'object' === typeof currentRow ) { this.values.fallback = currentRow.every( fallbackCheck ); } this.setColumnSize(); // Nested column check if ( 'object' === typeof currentRow ) { spacings = []; total = currentRow.length; lastIndex = total - 1; _.each( currentRow, function( column, index ) { if ( lastIndex !== index ) { model = container.model.children.find( function( model ) { return model.get( 'cid' ) == column.cid; // jshint ignore: line } ); columnSpacing = model.attributes.params.spacing; columnSpacing = ( 'undefined' === typeof columnSpacing || '' === columnSpacing ) ? '4%' : columnSpacing; spacings.push( columnSpacing ); } if ( 1 === total ) { spacings.push( '' ); } } ); spacings = spacings.join( ' + ' ); // If no fallback make sure to replace mixed values. if ( ! this.values.fallback ) { spacings = spacings.replace( /yes/g, '4%' ).replace( /no/g, '0%' ); } this.values.widthOffset = '( ( ' + spacings + ' ) * ' + this.values.column_size + ' ) '; } this.setSpacingStyling(); }, getHalfSpacing: function () { var unitlessSpacing = parseFloat( this.values.column_spacing ), unitlessHalf = unitlessSpacing / 2; return this.values.column_spacing.replace( unitlessSpacing, unitlessHalf ); }, setColumnSize: function() { var sizeClass; // Column size value switch ( this.values.type ) { case '1_1': sizeClass = 'fusion-one-full'; break; case '1_4': sizeClass = 'fusion-one-fourth'; break; case '3_4': sizeClass = 'fusion-three-fourth'; break; case '1_2': sizeClass = 'fusion-one-half'; break; case '1_3': sizeClass = 'fusion-one-third'; break; case '2_3': sizeClass = 'fusion-two-third'; break; case '1_5': sizeClass = 'fusion-one-fifth'; break; case '2_5': sizeClass = 'fusion-two-fifth'; break; case '3_5': sizeClass = 'fusion-three-fifth'; break; case '4_5': sizeClass = 'fusion-four-fifth'; break; case '5_6': sizeClass = 'fusion-five-sixth'; break; case '1_6': sizeClass = 'fusion-one-sixth'; break; } this.values.column_size = this.validateColumnSize( this.values.type ); this.values.size_class = sizeClass; }, validateColumnSize: function( columnSize ) { var fractions; if ( 'undefined' === typeof columnSize ) { columnSize = '1_3'; } // Fractional value. if ( -1 !== columnSize.indexOf( '_' ) ) { fractions = columnSize.split( '_' ); return parseFloat( fractions[ 0 ] ) / parseFloat( fractions[ 1 ] ); } // Greater than one, assume percentage and divide by 100. if ( 1 < parseFloat( columnSize ) ) { return parseFloat( columnSize ) / 100; } return columnSize; }, setSpacingStyling: function() { var spacingDirection, width = ( this.values.column_size * 100 ) + '%', mapOldSpacing = { 0.1666: '13.3333%', 0.8333: '82.6666%', 0.2: '16.8%', 0.4: '37.6%', 0.6: '58.4%', 0.8: '79.2%', 0.25: '22%', 0.75: '74%', 0.3333: '30.6666%', 0.6666: '65.3333%', 0.5: '48%', 1: '100%' }; this.values.column_spacing_style = ''; this.values.spacing_classes = ''; if ( 0 === parseFloat( this.values.spacing ) ) { this.values.spacing_classes = 'fusion-spacing-no'; } if ( ! this.values.last && ! ( this.values.fallback && '0px' === this.values.spacing ) ) { spacingDirection = 'right'; if ( FusionPageBuilderApp.$el.hasClass( 'rtl' ) ) { spacingDirection = 'left'; } if ( ! this.values.fallback ) { this.values.column_spacing_style = 'width:' + width + ';width:calc(' + width + ' - ' + this.values.widthOffset + ');margin-' + spacingDirection + ': ' + this.values.spacing + ';'; } else { this.values.column_spacing_style = 'width:' + mapOldSpacing[ this.values.column_size ] + '; margin-' + spacingDirection + ': ' + this.values.spacing + ';'; } } else if ( 'undefined' !== typeof this.values.currentRowNumberOfColumns && 1 < this.values.currentRowNumberOfColumns ) { if ( ! this.values.fallback ) { this.values.column_spacing_style = 'width:' + width + ';width:calc(' + width + ' - ' + this.values.widthOffset + ');'; } else if ( '0px' !== this.values.spacing && 'undefined' !== typeof mapOldSpacing[ this.values.column_size ] ) { this.values.column_spacing_style = 'width:' + mapOldSpacing[ this.values.column_size ] + ';'; } else { this.values.column_spacing_style = 'width:' + width + ';'; } } else if ( 'undefined' === typeof this.values.currentRowNumberOfColumns && 'undefined' !== mapOldSpacing[ this.values.column_size ] ) { this.values.column_spacing_style = 'width:' + mapOldSpacing[ this.values.column_size ] + ';'; } }, setSharedStyles: function() { this.setBackgroundColorStyle(); this.setBackgroundImage(); this.setBorderStyle(); this.setBorderRadiusStyle(); this.setOverflowStyle(); this.setBoxShadowStyle(); this.setWrapperStyleBg(); }, setBackgroundColorStyle: function() { this.values.background_color_style = ''; if ( '' !== this.values.background_color && ( '' === this.values.background_image || 0 !== this.values.alpha_background_color ) ) { this.values.background_color_style = 'background-color:' + this.values.background_color + ';'; } }, setBackgroundImage: function() { this.values.background_image_style = ''; if ( '' !== this.values.background_image ) { this.values.background_image_style += 'background-image: url(\'' + this.values.background_image + '\');'; } if ( '' !== _.getGradientString( this.values, 'column' ) ) { this.values.background_image_style += 'background-image:' + _.getGradientString( this.values, 'column' ) + ';'; } if ( '' !== this.values.background_position ) { this.values.background_image_style += 'background-position:' + this.values.background_position + ';'; } if ( 'none' !== this.values.background_blend_mode ) { this.values.background_image_style += 'background-blend-mode: ' + this.values.background_blend_mode + ';'; } if ( '' !== this.values.background_repeat ) { this.values.background_image_style += 'background-repeat:' + this.values.background_repeat + ';'; if ( 'no-repeat' === this.values.background_repeat ) { this.values.background_image_style += '-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;'; } } }, setBorderStyle: function() { var border = { 'top': 0, 'bottom': 0, 'right': 0, 'left': 0 }; this.values.border_full_style = ''; if ( '' === this.values.border_sizes_top && '' === this.values.border_sizes_bottom && '' === this.values.border_sizes_left && '' === this.values.border_sizes_right ) { // Backwards-compatibility. if ( '' !== this.values.border_color && '' !== this.values.border_size && '' !== this.values.border_style ) { this.values.border_full_style = 'border' + this.values.border_position + ':' + this.values.border_size + ' ' + this.values.border_style + ' ' + this.values.border_color + ';'; } } else { // Border-sizes. if ( '' !== this.values.border_sizes_top && 'undefined' !== typeof this.values.border_sizes_top ) { border.top = this.values.border_sizes_top; } if ( '' !== this.values.border_sizes_bottom && 'undefined' !== typeof this.values.border_sizes_bottom ) { border.bottom = this.values.border_sizes_bottom; } if ( '' !== this.values.border_sizes_left && 'undefined' !== typeof this.values.border_sizes_left ) { border.left = this.values.border_sizes_left; } if ( '' !== this.values.border_sizes_right && 'undefined' !== typeof this.values.border_sizes_right ) { border.right = this.values.border_sizes_right; } // Border-styles. if ( '' !== this.values.border_color ) { this.values.border_full_style += 'border-width: ' + border.top + ' ' + border.right + ' ' + border.bottom + ' ' + border.left + ';'; this.values.border_full_style += 'border-color:' + this.values.border_color + ';'; // Border-style. if ( '' !== this.values.border_style ) { this.values.border_full_style += 'border-style:' + this.values.border_style + ';'; } } } }, setBorderRadiusStyle: function() { this.values.border_radius_style = ''; if ( '' !== this.values.border_radius ) { this.values.border_radius_style = 'border-radius:' + this.values.border_radius + ';overflow:hidden;'; } if ( '' !== this.values.border_radius && '' === this.values.overflow ) { this.values.border_radius_style += 'overflow:hidden;'; } }, setOverflowStyle: function() { this.values.overflow_style = ''; if ( '' !== this.values.overflow ) { this.values.overflow_style = 'overflow:' + this.values.overflow + ';'; } }, setBoxShadowStyle: function() { this.values.box_shadow_styles = ''; if ( 'yes' === this.values.box_shadow ) { this.values.box_shadow_styles = 'box-shadow:' + _.fusionGetBoxShadowStyle( this.values ).trim() + ';'; } }, setWrapperStyleBg: function() { this.values.wrapper_style_bg = ''; // Background color. if ( this.values.hover_or_link ) { this.values.wrapper_style_bg += this.values.background_color_style; } // Background image. if ( ! cssua.ua.edge || this.values.hover_or_link ) { this.values.wrapper_style_bg += this.values.background_image_style; } // Border. if ( 'liftup' === this.values.hover_type && '' !== this.values.border_full_style ) { this.values.wrapper_style_bg += this.values.border_full_style; } // Border radius. if ( '' !== this.values.border_radius_style ) { this.values.wrapper_style_bg += this.values.border_radius_style; } // Box shadow. if ( 'liftup' === this.values.hover_type && '' !== this.values.box_shadow_styles ) { this.values.wrapper_style_bg += this.values.box_shadow_styles; } }, setResponsiveColumnStyles: function() { var self = this, extras = jQuery.extend( true, {}, fusionAllElements.fusion_builder_column.extras ); this.responsiveStyles = ''; if ( ! this.values.flex ) { return; } _.each( [ 'large', 'medium', 'small' ], function( size ) { var columnStyles = '', wireframeColumnStyles = '', columnWrapperStyles = '', hoverWrapperStyles = '', uiWrapperStyles = '', dragStyles = '', widthKey, paddingKey, keyBase, orderKey, spacingKey; // Width. widthKey = 'large' === size ? 'column_size' : 'type_' + size; if ( '' !== self.values[ widthKey ] && 'auto' !== self.values[ widthKey ] && 0 < parseFloat( self.values[ widthKey ] ) ) { columnStyles += 'width:' + ( parseFloat( self.values[ widthKey ] ) * 100 ) + '%;'; wireframeColumnStyles += 'width:' + ( ( parseFloat( self.values[ widthKey ] ) * 100 ) - 3 ) + '%;'; } else if ( 'auto' === self.values[ widthKey ] ) { columnStyles += 'width: auto;'; wireframeColumnStyles += 'width: 97%;'; } // Order. orderKey = 'large' === size ? 'order' : 'order_' + size; if ( '' !== self.values[ orderKey ] ) { columnStyles += 'order : ' + parseInt( self.values[ orderKey ] ) + ';'; } _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Padding. paddingKey = 'large' === size ? 'padding_' + direction : 'padding_' + direction + '_' + size; if ( '' !== self.values[ paddingKey ] ) { columnWrapperStyles += 'padding-' + direction + ' : ' + self.values[ paddingKey ] + ' !important;'; } // Margin. keyBase = 'left' === direction || 'right' === direction ? 'upsized_spacing' : 'margin'; spacingKey = 'large' === size ? keyBase + '_' + direction : keyBase + '_' + direction + '_' + size; if ( '' !== self.values[ spacingKey ] ) { if ( 'margin' === keyBase ) { columnStyles += 'margin-' + direction + ' : ' + self.values[ spacingKey ] + ';'; } else { columnWrapperStyles += 'margin-' + direction + ' : ' + self.values[ spacingKey ] + ';'; } if ( self.values.hover_or_link && 'margin' !== keyBase ) { hoverWrapperStyles += 'margin-' + direction + ':' + self.values[ spacingKey ] + ';'; } if ( 'left' === direction ) { uiWrapperStyles += direction + ':' + self.values[ spacingKey ] + ';'; } if ( 'left' === direction || 'right' === direction ) { dragStyles += direction + ':' + self.values[ spacingKey ] + ';'; } } } ); if ( '' === columnStyles && '' === columnWrapperStyles ) { return; } // Wrap CSS selectors if ( '' !== columnStyles ) { columnStyles = '.fusion-body .' + self.values.shortcode_classname + '-' + self.values.column_counter + '{' + columnStyles + '}'; } if ( '' != wireframeColumnStyles ) { wireframeColumnStyles = '.fusion-body.fusion-builder-ui-wireframe .' + self.values.shortcode_classname + '-' + self.values.column_counter + '{' + wireframeColumnStyles + '}'; } if ( '' !== columnWrapperStyles ) { columnWrapperStyles = '.' + self.values.shortcode_classname + '-' + self.values.column_counter + ' > .fusion-column-wrapper {' + columnWrapperStyles + '}'; } if ( '' !== hoverWrapperStyles ) { hoverWrapperStyles = '.fusion-flex-container .fusion-row .' + self.values.shortcode_classname + '-' + self.values.column_counter + ' > .fusion-column-inner-bg {' + hoverWrapperStyles + '}'; } if ( '' !== uiWrapperStyles ) { uiWrapperStyles = '.fusion-body:not(.fusion-builder-ui-wireframe) .fusion-flex-container .fusion-row .' + self.values.shortcode_classname + '-' + self.values.column_counter + ' > .fusion-builder-module-controls-type-column {' + uiWrapperStyles + '}'; } if ( '' !== dragStyles ) { dragStyles = '.fusion-flex-container .fusion-row .' + self.values.shortcode_classname + '-' + self.values.column_counter + '.fusion-being-dragged:after, .fusion-builder-live .fusion-flex-container .fusion-nested-columns.editing .' + self.values.shortcode_classname + '-' + self.values.column_counter + ':hover:after {' + dragStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { self.responsiveStyles += columnStyles + wireframeColumnStyles + columnWrapperStyles + hoverWrapperStyles + uiWrapperStyles + dragStyles; } else { // Medium and Small size screen styles. self.responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + columnStyles + wireframeColumnStyles + columnWrapperStyles + hoverWrapperStyles + uiWrapperStyles + dragStyles + '}'; } } ); }, buildAttr: function() { var attr = { 'class': 'fusion-layout-column ' + this.model.get( 'type' ) + ' ' + this.values.shortcode_classname + '-' + this.values.column_counter + ' fusion-builder-column-live-' + this.values.column_counter, 'style': '' }; // Flexbox column. if ( this.values.flex ) { attr[ 'class' ] += ' fusion-flex-column'; // Alignment of column vertically. if ( 'auto' !== this.values.align_self ) { attr[ 'class' ] += ' fusion-flex-align-self-' + this.values.align_self; } } else { if ( '' !== this.values.type && this.values.type.includes( '_ ' ) ) { attr[ 'class' ] += ' ' + this.model.get( 'type' ) + '_' + this.values.type; attr[ 'class' ] += ' ' + this.values.type; } // Class for the specific size of column. if ( '' !== this.values.size_class ) { attr[ 'class' ] += ' ' + this.values.size_class; } // First column. if ( this.values.first ) { attr[ 'class' ] += ' fusion-column-first'; } // Last column. if ( this.values.last ) { attr[ 'class' ] += ' fusion-column-last'; } // Special calcs for spacing. if ( '' !== this.values.spacing_classes ) { attr[ 'class' ] += this.values.spacing_classes; } // Column spacing style, margin and width. if ( '' !== this.values.column_spacing_style ) { attr.style += this.values.column_spacing_style; } // Top margin. if ( '' !== this.values.margin_top ) { attr.style += 'margin-top:' + this.values.margin_top + ';'; } // Bottom margin. if ( '' !== this.values.margin_bottom ) { attr.style += 'margin-bottom:' + this.values.margin_bottom + ';'; } } // Custom CSS class. if ( '' !== this.values[ 'class' ] ) { attr[ 'class' ] += ' ' + this.values[ 'class' ]; } // Min height for newly created columns by the converter. if ( 'none' === this.values.min_height ) { attr[ 'class' ] += ' fusion-column-no-min-height'; } // Visibility classes. attr = _.fusionVisibilityAtts( this.values.hide_on_mobile, attr ); attr[ 'class' ] += _.fusionGetStickyClass( this.values.sticky_display ); // Hover type or link. if ( this.values.hover_or_link ) { attr[ 'class' ] += ' fusion-column-inner-bg-wrapper'; } // TODO: check why it is looking at animation type/class. if ( this.values.hover_or_link && '' !== this.values.animation_type && 'liftup' === this.values.hover_type ) { attr[ 'class' ] += ' fusion-column-hover-type-liftup'; } // Lift up and border. if ( 'liftup' === this.values.hover_type && '' !== this.values.border_style ) { attr[ 'class' ] += ' fusion-column-liftup-border'; } attr = _.fusionAnimations( this.values, attr ); if ( '' !== this.values.id ) { attr.id = this.values.id; } return attr; }, buildWrapperAttr: function() { var attr = { 'class': 'fusion-column-wrapper fusion-column-wrapper-live-' + this.values.column_counter, 'style': '' }; // Check if we have a hover, markup is different so need extra. if ( ! this.values.hover_or_link ) { // $bg_color_fix . '" ' . $lazy_bg attr.style += this.values.wrapper_style_bg; if ( cssua.ua.edge ) { attr.style += 'background-color:transparent;'; } } // Image URL for empty dimension calculations. attr[ 'data-bg-url' ] = this.values.background_image; if ( ! this.values.hover_or_link ) { attr.style += this.values.background_color_style; } // Border. if ( '' !== this.values.border_full_style ) { attr.style += this.values.border_full_style; } // Border radius. if ( '' !== this.values.border_radius_style ) { attr.style += this.values.border_radius_style; } // Overflow. if ( '' !== this.values.overflow_style ) { attr.style += this.values.overflow_style; } // Box shadow. if ( 'liftup' !== this.values.hover_type && '' !== this.values.box_shadow_styles ) { attr.style += this.values.box_shadow_styles; attr[ 'class' ] += ' fusion-column-has-shadow'; // Move this to appropriate. } // Padding. if ( '' !== this.values.padding ) { attr.style += 'padding: ' + this.values.padding + ';'; } // Flex. if ( this.values.flex ) { if ( '' !== this.values.align_content ) { attr[ 'class' ] += ' fusion-flex-justify-content-' + this.values.align_content; attr[ 'class' ] += ' fusion-content-layout-' + this.values.content_layout; if ( 'row' === this.values.content_layout && 'flex-start' !== this.values.valign_content ) { attr[ 'class' ] += ' fusion-flex-align-items-' + this.values.valign_content; } if ( 'wrap' !== this.values.content_wrap ) { attr[ 'class' ] += ' fusion-content-' + this.values.content_wrap; } } } return attr; }, buildIeExtraAttr: function() { var attr = { 'class': 'fusion-column-wrapper', 'style': 'content:\'\';z-index:-1;position:absolute;top:0;right:0;bottom:0;left:0;' }; // Border radius. if ( '' !== this.values.border_radius_style ) { this.values.wrapper_style_bg += this.values.border_radius_style; } if ( '' !== this.values.background_image_style ) { attr.style += this.values.background_image_style; if ( '' !== this.values.background_color && 1 === this.values.alpha_background_color ) { attr.style += 'background-color:' + this.values.background_color + ';'; } } // Box shadow. if ( 'liftup' !== this.values.hover_type && '' !== this.values.box_shadow_styles ) { attr[ 'class' ] += ' fusion-column-has-shadow'; } return attr; }, buildHoverWrapperAttr: function() { var attr = { 'class': 'fusion-column-inner-bg hover-type-' + this.values.hover_type, 'style': '' }; if ( ( 'zoomin' === this.values.hover_type || 'zoomout' === this.values.hover_type || '' !== this.values.link ) && '' !== this.values.border_radius_style ) { attr.style += 'overflow:hidden;' + this.values.border_radius_style + ';'; } return attr; }, buildAnchorAttr: function() { var attr = {}; attr[ 'class' ] = 'fusion-column-anchor'; if ( '' !== this.values.link ) { attr.href = this.values.link; } if ( '_blank' === this.values.target ) { attr.rel = 'noopener noreferrer'; attr.target = '_blank'; } else if ( 'lightbox' === this.values.target ) { attr[ 'data-rel' ] = 'iLightbox'; } if ( '' !== this.values.link_description ) { attr[ 'aria-label' ] = this.values.link_description; } return attr; }, buildHoverInnerWrapperAttr: function() { var attr = { 'class': 'fusion-column-inner-bg-image', 'style': '' }; // Background style. if ( '' !== this.values.wrapper_style_bg ) { attr.style += this.values.wrapper_style_bg; } return attr; }, builderIeSpanAttr: function() { var attr = { 'class': 'fusion-column-inner-bg-image' }; if ( '' !== this.values.background_image_style ) { attr.style += this.values.background_image_style; if ( '' !== this.values.background_color && 1 === this.values.alpha_background_color ) { attr.style += 'background-color:' + this.values.background_color + ';'; } } return attr; }, /** * Fires when preview are is resized. * * @since 3.0 * @return {void} */ onPreviewResize: function() { // Update size indicator in toolbar. this.updateSizeIndicators(); if ( ! FusionPageBuilderApp.getParentContainer( this ).isFlex() ) { return; } // Update margin and padding indicators if we are editing this. if ( this.$el.hasClass( 'fusion-builder-element-edited' ) ) { this.updateBoxModelIndicators(); } }, /** * Updates column sizes controls. * * @since 3.0 * @return {void} */ updateSizeIndicators: function() { var columnSize = this.getVisibleWidth(); this.$el.find( '.column-sizes .column-size' ).removeClass( 'active-size' ); if ( columnSize.includes( '_' ) ) { this.$el.find( '.column-size-' + columnSize ).addClass( 'active-size' ); } this.$el.find( '.fusion-column-size-label' ).text( columnSize.replace( '_', '/' ) ); }, /** * Updates column sizes controls. * * @since 3.0 * @return {void} */ updateBoxModelIndicators: function() { this.destroyMarginResizable(); this.destroyPaddingResizable(); this.marginDrag(); this.paddingDrag(); }, /** * Parses width to readable string. * * @since 3.0 * @param {String} width * @return {String} */ parseWidthLabel: function( width ) { if ( 'undefined' === typeof width ) { width = '1_1'; } if ( 'auto' === width ) { return 'auto'; } if ( ! width.includes( '_' ) ) { return width.split( '.' )[ 0 ] + '%'; } return width; }, /** * Returns visible column width. * * @since 3.0 * @return {String} */ getVisibleWidth: function() { var param, defaultVal, previewFrame, legacyBreakpoint; // Legacy support. if ( ! FusionPageBuilderApp.getParentContainer( this ).isFlex() ) { previewFrame = jQuery( '#fb-preview' )[ 0 ]; legacyBreakpoint = getComputedStyle( previewFrame.contentDocument.documentElement ).getPropertyValue( '--content_break_point' ); if ( legacyBreakpoint && legacyBreakpoint >= previewFrame.offsetWidth ) { return '1_1'; } return this.model.attributes.params.type; } param = FusionApp.getResponsiveOptionKey( 'type', true ); // Default for medium and small sizes. if ( 'type' !== param && ! this.model.attributes.params[ param ] ) { // Return large value. defaultVal = fusionAllElements.fusion_builder_column.extras[ 'col_width_' + param.replace( 'type_', '' ) ]; if ( 'inherit_from_large' === defaultVal ) { return this.parseWidthLabel( this.model.attributes.params.type ); } return '1_1'; } return this.parseWidthLabel( this.model.attributes.params[ param ] ); }, getTemplateAtts: function() { var styleSelector, data = {}; this.setArgs(); this.responsiveStyles = ''; this.styles = ''; this.validateArgs(); this.setExtraArgs(); this.setColumnMapData(); // Sets styles which are used on multiple elements. this.setSharedStyles(); // Sets styles for responsive options. if ( this.values.flex ) { this.setResponsiveColumnStyles(); } // Lift up and border radius we need to apply radius to lift up markup. if ( this.values.hover_or_link && '' !== this.values.border_radius_style && 'liftup' === this.values.hover_type ) { this.styles += '.fusion-builder-column-' + this.values.column_counter + ' .hover-type-liftup:before{' + this.values.border_radius_style + ';}'; } // Get the filter style if ( 'fusion_builder_column' === this.model.get( 'type' ) ) { styleSelector = '.fusion-builder-column-live-' + this.model.get( 'cid' ); } else { styleSelector = { regular: '.fusion-builder-column .fusion-column-wrapper-live-' + this.model.get( 'cid' ), hover: '.fusion-builder-column:hover .fusion-column-wrapper-live-' + this.model.get( 'cid' ) }; } data.ieExtra = ! this.values.flex && cssua.ua.edge && this.values.hover_or_link ? this.buildIeExtraAttr() : false; data.ieSpanExtra = this.values.hover_or_link && '' !== this.values.background_color_style && cssua.ua.edge ? this.builderIeSpanAttr() : false; data.wrapperAttr = this.buildWrapperAttr(); data.center_content = this.values.center_content; data.hoverWrapperAttr = this.buildHoverWrapperAttr(); data.anchorAttr = this.buildAnchorAttr(); data.hoverInnerWrapperAttr = this.buildHoverInnerWrapperAttr(); data.styles = this.styles; data.filterStyle = _.fusionGetFilterStyleElem( this.values, styleSelector, this.model.get( 'cid' ) ); data.nestedClass = 'fusion_builder_column_inner' === this.model.get( 'type' ) ? ' fusion-nested-column-content' : ''; data.cid = this.model.get( 'cid' ); data.hoverOrLink = this.values.hover_or_link; data.layout = this.getVisibleWidth().replace( '_', '/' ); data.isFlex = ( 'undefined' !== typeof this.values.flex ) ? this.values.flex : false; data.responsiveStyles = 'undefined' !== typeof this.responsiveStyles ? this.responsiveStyles : ''; data.isGlobal = ( 'undefined' !== typeof this.values.fusion_global ) ? 'yes' : 'no'; data.hideMargin = 'fusion_builder_column_inner' !== this.model.get( 'type' ) && 'post_cards' === FusionApp.data.fusion_element_type; // Main wrapper is the actual view. this.model.set( 'selectors', this.buildAttr() ); return data; }, /** * Toggles the 'active' class. * * @since 2.0.0 * @param {Object} event - The event triggering the class toggling. * @return {void} */ sizesShow: function( event ) { var parentContainer = this.$el.closest( '.fusion-builder-container' ), sizesPopover = this.$el.find( '.column-sizes' ), columnOffsetTop = 0, html, header, headerBottom, conditional; if ( event ) { event.preventDefault(); event.stopPropagation(); } sizesPopover.removeClass( 'fusion-expand-to-bottom' ); // This needs to be the way it is setup, as nested cols could trigger sizing on several cols at once. if ( ! this.$el.hasClass( 'active' ) ) { this.$el.addClass( 'active' ); parentContainer.addClass( 'fusion-column-sizer-active' ); columnOffsetTop = this.$el.offset().top; html = this.$el.closest( 'html' ); conditional = false; if ( html.children( 'body' ).hasClass( 'fusion-top-header' ) ) { if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).length ) { sizesPopover.on( 'mouseenter', function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', 'auto' ); if ( 'fixed' === jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'position' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '-1' ); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).find( '.tfs-slider[data-parallax="1"]' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', 'auto' ); } } } ); sizesPopover.on( 'mouseleave', function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', '' ); } ); } header = html.find( '.fusion-header-wrapper' ); headerBottom = 0; if ( header.length ) { headerBottom = header.offset().top + header.outerHeight(); } conditional = 106 > columnOffsetTop - headerBottom; } if ( 54 > columnOffsetTop - 121 || conditional || sizesPopover.parents( '.fusion-fullwidth' ).hasClass( 'bg-parallax-parent' ) ) { sizesPopover.addClass( 'fusion-expand-to-bottom' ); } } else { this.$el.removeClass( 'active' ); parentContainer.removeClass( 'fusion-column-sizer-active' ); sizesPopover.off( 'mouseover' ).off( 'mouseleave' ); } }, /** * Toggle class to show content in bottom * * @since 2.0.0 * @return {void} */ offsetClass: function() { if ( 100 > this.$el.offset().top ) { this.$el.addClass( 'fusion-content-bottom' ); } else if ( 100 < this.$el.offset().top && this.$el.hasClass( 'fusion-content-bottom' ) ) { this.$el.removeClass( 'fusion-content-bottom' ); } }, /** * Column spacing dimensions version. * * @since 2.0.0 * @return {void} */ fallbackColumnSpacing: function( $placeholder, allNo ) { var columnSize = '100%', fullcolumnSize = columnSize, existingSpacing = '0%', columnWidth = this.model.attributes.params.type, spacingDirection; if ( 'yes' === this.model.attributes.params.spacing ) { existingSpacing = '4%'; } columnWidth = this.model.attributes.params.type; switch ( columnWidth ) { case '1_1': columnSize = '100%'; fullcolumnSize = '100%'; break; case '1_4': columnSize = '22%'; fullcolumnSize = '25%'; break; case '3_4': columnSize = '74%'; fullcolumnSize = '75%'; break; case '1_2': columnSize = '48%'; fullcolumnSize = '50%'; break; case '1_3': columnSize = '30.6666%'; fullcolumnSize = '33.3333%'; break; case '2_3': columnSize = '65.3333%'; fullcolumnSize = '66.6666%'; break; case '1_5': columnSize = '16.8%'; fullcolumnSize = '20%'; break; case '2_5': columnSize = '37.6%'; fullcolumnSize = '40%'; break; case '3_5': columnSize = '58.4%'; fullcolumnSize = '60%'; break; case '4_5': columnSize = '79.2%'; fullcolumnSize = '80%'; break; case '5_6': columnSize = '82.6666%'; fullcolumnSize = '83.3333%'; break; case '1_6': columnSize = '13.3333%'; fullcolumnSize = '16.6666%'; break; } if ( '4%' !== existingSpacing && ( ! this.model.attributes.params.last || allNo ) ) { columnSize = fullcolumnSize; } this.$el.css( 'width', columnSize ); $placeholder.css( 'width', columnSize ); spacingDirection = 'right'; if ( FusionPageBuilderApp.$el.hasClass( 'rtl' ) ) { spacingDirection = 'left'; } $placeholder.css( 'margin-' + spacingDirection, existingSpacing ); this.$el.css( 'margin-' + spacingDirection, existingSpacing ); }, /** * Column spacing dimensions version. * * @since 2.0.0 * @return {void} */ dimensionColumnSpacing: function( columnRow, columnWidth, $placeholder ) { var decimalWidth, check, spacingWidth, existingSpacing, spacings = [], spacingDirection; // Remove last from calcs. columnRow.pop(); columnWidth = columnWidth[ 0 ] / columnWidth[ 1 ]; decimalWidth = columnWidth; if ( 'object' === typeof columnRow ) { check = columnRow.every( this.pxCheck ); if ( check ) { spacingWidth = ( columnRow.reduce( this.addValues, 0 ) * decimalWidth ) + 'px'; this.$el.css( 'width', 'calc( ' + ( columnWidth * 100 ) + '% - ' + spacingWidth + ' )' ); $placeholder.css( 'width', 'calc( ' + ( columnWidth * 100 ) + '% - ' + spacingWidth + ' )' ); } else if ( columnRow.every( this.percentageCheck ) ) { columnWidth = ( columnWidth * 100 ) - ( columnRow.reduce( this.addValues, 0 ) * decimalWidth ); this.$el.css( 'width', columnWidth + '%' ); $placeholder.css( 'width', columnWidth + '%' ); } else { _.each( columnRow, function( space ) { space = ( 'undefined' === typeof space || '' === space ) ? '4%' : space; spacings.push( space ); } ); spacingWidth = spacings.join( ' + ' ); this.$el.css( 'width', 'calc( ' + ( columnWidth * 100 ) + '% - ( ( ' + spacingWidth + ' ) * ' + decimalWidth + ' )' ); $placeholder.css( 'width', 'calc( ' + ( columnWidth * 100 ) + '% - ( ( ' + spacingWidth + ' ) * ' + decimalWidth + ' )' ); } } existingSpacing = this.model.attributes.params.spacing; if ( 'undefined' === typeof this.model.attributes.params.spacing || 'yes' === this.model.attributes.params.spacing || '' === this.model.attributes.params.spacing ) { existingSpacing = '4%'; } if ( 'no' === this.model.attributes.params.spacing ) { existingSpacing = '0'; } spacingDirection = 'right'; if ( FusionPageBuilderApp.$el.hasClass( 'rtl' ) ) { spacingDirection = 'left'; } $placeholder.css( 'margin-' + spacingDirection, existingSpacing ); this.$el.css( 'margin-' + spacingDirection, existingSpacing ); }, /** * Check if value is valid for column spacing. * * @since 2.0.0 * @return {void} */ validColumnSpacing: function( value ) { if ( 'yes' !== value && 'no' !== value && ! ( /\d/ ).test( value ) && '' !== value ) { return false; } return true; }, /** * Filter out DOM before patching. * * @since 2.0.0 * @return {void} */ patcherFilter: function( diff ) { var filteredDiff = [], self = this; _.each( diff, function( info ) { if ( 'removeElement' === info.action ) { if ( 'undefined' !== typeof info.element.attributes[ 'class' ] && ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-column-content-centered' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-builder-column-content' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-column-wrapper' ) ) ) { self.forceAppendChildren = true; filteredDiff.push( info ); } else if ( 'undefined' !== typeof info.element.attributes[ 'class' ] && ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-spacing-value' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-element-spacing' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-builder-live-element' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion_builder_row_inner' ) ) ) { // ignore } else { filteredDiff.push( info ); } } else if ( 'addElement' === info.action ) { if ( 'undefined' !== typeof info.element.attributes[ 'class' ] && ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-column-content-centered' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-builder-column-content' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-column-wrapper' ) ) ) { self.forceAppendChildren = true; filteredDiff.push( info ); } else if ( 'undefined' !== typeof info.element.attributes[ 'class' ] && ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-spacing-value' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-element-spacing' ) ) ) { // ignore } else { filteredDiff.push( info ); } } else { filteredDiff.push( info ); } } ); return filteredDiff; }, /** * Adds a delay to the change trigger to accomodate equal-heights implementation. * * @since 2.0.0 * @param {number|string} cid - The CID of the element. * @return {void} */ equalHeights: function( cid ) { cid = 'undefined' === typeof cid ? this.model.attributes.cid : cid; setTimeout( function() { jQuery( document ).trigger( 'fusion-content-changed', cid ); jQuery( window ).trigger( 'fusion-content-changed', cid ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-content-changed', cid ); }, 300 ); }, /** * Removes the 'active' class. * * @since 2.0.0 * @return {void} */ toolTipHide: function() { this.$el.find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).removeClass( 'active' ); }, /** * Resize spacer on window resize event. * * @since 2.0.0 * @return {void} */ resizeSpacer: function() { if ( this.columnSpacer ) { this.columnSpacing(); } }, /** * Preview column-spacing changes. * * @since 2.0.0 * @param {Object} columnRow - The row. * @return {void} */ columnSpacingPreview: function( columnRow ) { var columnWidth = 'undefined' !== typeof this.model.attributes.params.type ? this.model.attributes.params.type.split( '_' ) : [ '1', '1' ], fallback = true, origValue, $placeholder = jQuery( '.fusion-builder-column-placeholder[data-cid="' + this.model.get( 'cid' ) + '"]' ), allNo = true; _.each( columnRow, function( value, index ) { origValue = value; value = ( 'yes' === value ) ? '4%' : value; value = ( 'no' === value ) ? '0' : value; fallback = fallback && origValue !== value; allNo = allNo && 0 === parseInt( value, 10 ); columnRow[ index ] = value; } ); if ( ! fallback ) { this.dimensionColumnSpacing( columnRow, columnWidth, $placeholder ); } else { this.fallbackColumnSpacing( $placeholder, allNo ); } }, /** * Gets the column content. * Alias of getColumnContent method. * * @since 2.0.0 * @return {string} */ getContent: function() { return this.getColumnContent(); }, /** * Sets the attributes of an element. * * @since 2.0.0 * @param {Object} element - The element we're updating. * @param {Object} attributes - The attributes we're setting/updating. * @return {void} */ setElementAttributes: function( element, attributes ) { var self = this; element.removeClass( this.currentClasses ); if ( 'object' === typeof attributes && element.length ) { _.each( attributes, function( values, attribute ) { if ( 'class' === attribute ) { self.currentClasses = values; element.addClass( values ); } else if ( 'id' === attribute ) { element.attr( 'id', values ); } else if ( 'style' === attribute ) { element.attr( 'style', values ); } else if ( -1 !== attribute.indexOf( 'data' ) ) { attribute = attribute.replace( /_/g, '-' ); element.attr( attribute, values ); } } ); } } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, FusionApp, fusionGlobalManager, fusionBuilderText, FusionPageBuilderApp, FusionPageBuilderElements, FusionEvents, fusionAllElements */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Column View FusionPageBuilder.ColumnView = FusionPageBuilder.BaseColumnView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-column-template' ).html() ), events: { 'click .fusion-builder-column-settings:not(.fusion-builder-column-inner .fusion-builder-column-setting)': 'settings', 'click .fusion-builder-column-size:not(.fusion-builder-column-inner .fusion-builder-column-size)': 'sizesShow', 'hover .fusion-builder-column-content': 'offsetClass', 'click .column-size:not(.fusion-builder-column-inner .column-size)': 'sizeSelect', 'click .fusion-builder-add-element:not(.fusion-builder-column-inner .fusion-builder-add-element)': 'addModule', 'click .fusion-builder-column-remove:not(.fusion-builder-column-inner .fusion-builder-column-remove)': 'removeColumn', 'click .fusion-builder-column-clone:not(.fusion-builder-column-inner .fusion-builder-column-clone)': 'cloneColumn', 'click .fusion-builder-column-save:not(.fusion-builder-column-inner .fusion-builder-column-save)': 'openLibrary', 'click .fusion-builder-column-drag:not(.fusion-builder-column-inner .fusion-builder-column-drag)': 'preventDefault' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { var params = this.model.get( 'params' ), spacing = '' !== params.spacing ? spacing : '4%'; this.renderedYet = false; this.columnSpacer = false; this.forceAppendChildren = false; this.listenTo( FusionEvents, 'fusion-view-update-fusion_builder_column', this.reRender ); this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.attr( 'id', 'fusion-column-' + this.model.get( 'cid' ) ); this.$el.attr( 'data-column-size', this.model.attributes.params.type ); this.$el.attr( 'data-column-spacing', spacing ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-column' ).addClass( 'fusion-global-column' ); } this.currentClasses = ''; this.baseColumnInit(); this.baseInit(); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this, data = this.getTemplateAtts(), columnSize = ''; this.$el.html( this.template( data ) ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Add active column size CSS class columnSize = this.model.attributes.params.type; // TODO Check size and update class according. this.updateSizeIndicators(); this.appendChildren(); setTimeout( function() { self.droppableColumn(); self.sortableElements(); self.disableSortableElements(); }, 100 ); // Don't refresh on first render. if ( this.renderedYet ) { this._refreshJs(); } this.renderedYet = true; return this; }, droppableColumn: function() { var self = this, $el = this.$el, cid, $droppables, $body; if ( ! $el ) { return; } cid = this.model.get( 'cid' ); $droppables = $el.find( '.fusion-column-target' ); $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-builder-live-element, .fusion_builder_row_inner', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ), style = ''; if ( $el.css( 'margin-top' ) ) { style = 'style="transform: translateY(' + $el.css( 'margin-top' ) + ');"'; } return jQuery( '<div><div class="fusion-column-helper ' + $classes + '" data-cid="' + cid + '"' + style + '><span class="fusiona-column"></span></div></div>' ); }, start: function() { $body.addClass( 'fusion-column-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); if ( 'large' !== FusionApp.getPreviewWindowSize() ) { $body.addClass( 'fusion-column-dragging-responsive-mode' ); $el.closest( '.fusion-builder-container' ).addClass( 'fusion-has-active-drop-targets' ); } }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-column-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); if ( 'large' !== FusionApp.getPreviewWindowSize() ) { $el.closest( '.fusion-builder-container' ).removeClass( 'fusion-has-active-drop-targets' ); $body.removeClass( 'fusion-column-dragging-responsive-mode' ); } } } ); $droppables.droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-column', drop: function( event, ui ) { var destinationRow, columnCid = ui.draggable.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCid ), originalCid = columnView.model.get( 'parent' ), $target = $el, parentCid = $target.closest( '.fusion-builder-row' ).data( 'cid' ), originalView, newIndex; if ( 'large' !== FusionApp.getPreviewWindowSize() && 'undefined' !== typeof self.isFlex && true === self.isFlex ) { // Update columns' order. FusionPageBuilderViewManager.getView( self.model.get( 'parent' ) )._updateResponsiveColumnsOrder( ui.draggable, $target.closest( '.fusion-builder-row' ).children( '.fusion-builder-column' ), parseInt( jQuery( event.target ).closest( '.fusion-builder-column' ).data( 'cid' ) ), jQuery( event.target ).hasClass( 'target-after' ) ); return; } // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $target.after( ui.draggable ); } else { $target.before( ui.draggable ); } destinationRow = FusionPageBuilderViewManager.getView( parentCid ); newIndex = ui.draggable.parent().children( '.fusion-builder-column' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( columnView.model, newIndex, parentCid ); // Update destination row which is this current one. destinationRow.setRowData(); // If destination row and original row are different, update original as well. if ( parentCid !== originalCid ) { originalView = FusionPageBuilderViewManager.getView( originalCid ); originalView.setRowData(); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.column + ' order changed' ); setTimeout( function() { // If different container type we re-render so that it corrects for new situation. if ( 'object' !== typeof originalView || FusionPageBuilderApp.sameContainerTypes( originalView.model.get( 'parent' ), destinationRow.model.get( 'parent' ) ) ) { columnView.droppableColumn(); } else { FusionEvents.trigger( 'fusion-close-settings-' + columnView.model.get( 'cid' ) ); columnView.reRender(); } }, 300 ); } } ); $el.find( '.fusion-element-target-column' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-live-element, .fusion_builder_row_inner', drop: function( event, ui ) { var elementView = FusionPageBuilderViewManager.getView( ui.draggable.data( 'cid' ) ), newIndex, MultiGlobalArgs; // Move the actual html. $el.find( '.fusion-builder-column-content:not(.fusion_builder_row_inner .fusion-builder-column-content ):not( .fusion-nested-column-content )' ).append( ui.draggable ); newIndex = ui.draggable.parent().children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, self.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.moved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); self._equalHeights(); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableColumn(); } }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {string} paramName - The name of the parameter that changed. * @param {mixed} paramValue - The value of the option that changed. * @param {Object} event - The event triggering the option change. * @return {void} */ onOptionChange: function( paramName, paramValue, event ) { var rowView, parentCID = this.model.get( 'parent' ), cid = this.model.get( 'cid' ), dimensionType = _.find( [ 'spacing_', 'margin_', 'padding_' ], function( type ) { return paramName.includes( type ); } ), reInitDraggables = false, view = {}, values = {}, alphaBackgroundColor = 1; // Reverted to history step or user entered value manually. if ( 'undefined' === typeof event || ( 'undefined' !== typeof event && ( 'change' !== event.type || ( 'change' === event.type && 'undefined' !== typeof event.srcElement ) ) ) ) { reInitDraggables = true; } if ( 'spacing' === paramName ) { this.model.attributes.params[ paramName ] = paramValue; // Only update preview if it a valid unit. if ( this.validColumnSpacing( paramValue ) ) { rowView = FusionPageBuilderViewManager.getView( parentCID ); rowView.setSingleRowData( cid ); } if ( true === reInitDraggables ) { if ( 'yes' === paramValue || 'no' === paramValue ) { this.destroySpacingResizable(); } else { this.columnSpacer = false; this.columnSpacing(); } } } if ( dimensionType ) { this.model.attributes.params[ paramName ] = paramValue; if ( true === reInitDraggables ) { if ( 'padding_' === dimensionType ) { this.destroyPaddingResizable(); this.paddingDrag(); } else { this.destroyMarginResizable(); this.marginDrag(); } } } if ( 'padding' === paramName ) { if ( -1 === jQuery( event.target ).attr( 'name' ).indexOf( '_' ) ) { this.model.attributes.params[ paramName ] = paramValue; this.renderSectionSeps( event ); this._refreshJs(); } } if ( 'padding_left' === paramName || 'padding_right' === paramName ) { this.renderSectionSeps( event ); } if ( [ 'border_size', 'border_color', 'border_style', 'border_position' ].includes( paramName ) ) { this.model.attributes.params[ paramName ] = paramValue; } }, /** * Render the section separators. * * @since 2.0.0 * @return {void} */ renderSectionSeps: function() { var elements = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( elements, function( element ) { if ( 'fusion_section_separator' === element.model.get( 'element_type' ) ) { element.reRender(); } } ); }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_builder_column', this.model.attributes.cid ); }, /** * Changes the border styles for the element. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ borderStyle: function( event ) { var borderSize = this.model.attributes.params.border_size + 'px', borderColor = this.model.attributes.params.border_color, borderStyle = this.model.attributes.params.border_style, borderPosition = this.model.attributes.params.border_position, positions = [ 'top', 'right', 'bottom', 'left' ], self = this, $target = ( 'lift_up' === this.model.attributes.params.hover_type ) ? self.$el.find( '.fusion-column-wrapper, .fusion-column-inner-bg-image' ) : self.$el.find( '.fusion-column-wrapper' ); if ( event ) { event.preventDefault(); } self.$el.find( '.fusion-column-wrapper, .fusion-column-inner-bg-image' ).css( 'border', '' ); if ( 'all' === borderPosition ) { _.each( positions, function( position ) { $target.css( 'border-' + position, borderSize + ' ' + borderStyle + ' ' + borderColor ); } ); } else { _.each( positions, function( position ) { if ( position === borderPosition ) { $target.css( 'border-' + position, borderSize + ' ' + borderStyle + ' ' + borderColor ); } else { $target.css( 'border-' + position, 'none' ); } } ); } }, /** * Clones a column. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ cloneColumn: function( event ) { var columnAttributes = jQuery.extend( true, {}, this.model.attributes ), $thisColumn, container; if ( event ) { event.preventDefault(); } columnAttributes.created = 'manually'; columnAttributes.cid = FusionPageBuilderViewManager.generateCid(); columnAttributes.targetElement = this.$el; columnAttributes.cloned = true; columnAttributes.at_index = FusionPageBuilderApp.getCollectionIndex( this.$el ); FusionPageBuilderApp.collection.add( columnAttributes ); // Parse column elements $thisColumn = this.$el; $thisColumn.find( '.fusion-builder-live-element:not(.fusion-builder-column-inner .fusion-builder-live-element), .fusion-builder-nested-element' ).each( function() { var $thisModule, moduleCID, module, elementAttributes, $thisInnerRow, innerRowCID, innerRowView; // Standard element if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { $thisModule = jQuery( this ); moduleCID = 'undefined' === typeof $thisModule.data( 'cid' ) ? $thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisModule.data( 'cid' ); // Get model from collection by cid module = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == moduleCID; // jshint ignore: line } ); // Clone model attritubes elementAttributes = jQuery.extend( true, {}, module.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.parent = columnAttributes.cid; elementAttributes.from = 'fusion_builder_column'; // Don't need target element, position is defined from order. delete elementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( elementAttributes ); // Inner row/nested element } else if ( jQuery( this ).hasClass( 'fusion_builder_row_inner' ) ) { $thisInnerRow = jQuery( this ); innerRowCID = 'undefined' === typeof $thisInnerRow.data( 'cid' ) ? $thisInnerRow.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisInnerRow.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( innerRowCID ); // Clone inner row if ( 'undefined' !== typeof innerRowView ) { innerRowView.cloneNestedRow( 'clone', columnAttributes.cid ); } } } ); // If column is cloned manually if ( event ) { FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned + ' ' + fusionBuilderText.column ); container = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); container.createVirtualRows(); container.updateColumnsPreview(); FusionEvents.trigger( 'fusion-content-changed' ); } this._refreshJs(); }, /** * Append the column's children to its content. * * @since 2.0.0 * @return {void} */ appendChildren: function() { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( '.fusion-builder-column-content:not(.fusion_builder_row_inner .fusion-builder-column-content ):not( .fusion-nested-column-content )' ).append( view.$el ); } ); this.delegateChildEvents(); }, /** * Gets the column contents. * * @since 2.0.0 * @param {Object} $thisColumn - The jQuery object of the element. * @return {string} */ getColumnContent: function() { var shortcode = '', columnParams = {}, self = this, plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false, metaValue = 'undefined' !== typeof FusionApp.data.postMeta._fusion.studio_replace_params ? FusionApp.data.postMeta._fusion.studio_replace_params : '', elementType = this.model.get( 'element_type' ), ColumnAttributesCheck; // If studio active. if ( false !== plugins && true === plugins.awb_studio && 'undefined' !== elementType && 'yes' === metaValue ) { // remove BC param. if ( 'undefined' !== typeof fusionAllElements[ elementType ].defaults.padding ) { delete fusionAllElements[ elementType ].defaults.padding; } this.model.set( 'params', jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ) ); } _.each( this.model.get( 'params' ), function( value, name ) { columnParams[ name ] = ( 'undefined' === value || 'undefined' === typeof value ) ? '' : value; } ); // Legacy support for new column options ColumnAttributesCheck = { min_height: '', last: 'no', hover_type: 'none', link: '', border_position: 'all' }; _.each( ColumnAttributesCheck, function( value, name ) { if ( 'undefined' === typeof columnParams[ name ] ) { columnParams[ name ] = value; } } ); this.beforeGenerateShortcode(); // Build column shortcode shortcode += '[fusion_builder_column type="' + this.model.attributes.params.type + '"'; _.each( columnParams, function( value, name ) { shortcode += ' ' + name + '="' + FusionPageBuilderApp.getParamValue( name, value, self.model ) + '"'; } ); shortcode += ']'; // Find elements inside this column this.$el.find( '.fusion-builder-live-element:not(.fusion-builder-column-inner .fusion-builder-live-element), .fusion-builder-nested-element' ).each( function() { var $thisRowInner; // Find standard elements if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { shortcode += FusionPageBuilderApp.generateElementShortcode( jQuery( this ), false ); // Find inner rows } else { $thisRowInner = FusionPageBuilderViewManager.getView( jQuery( this ).data( 'cid' ) ); if ( 'undefined' !== typeof $thisRowInner ) { shortcode += $thisRowInner.getInnerRowContent(); } } } ); shortcode += '[/fusion_builder_column]'; return shortcode; }, /** * Removes a column. * * @since 2.0.0 * @param {Object} event - The event triggering the column removal. * @return {void} */ removeColumn: function( event ) { var elements, rowView, parentCID = this.model.get( 'parent' ); if ( event ) { event.preventDefault(); } elements = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( elements, function( element ) { if ( 'fusion_builder_row' === element.model.get( 'type' ) || 'fusion_builder_row_inner' === element.model.get( 'type' ) ) { element.removeRow(); } else { element.removeElement(); } } ); FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this._equalHeights( parentCID ); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); // If the column is deleted manually if ( event ) { // Update preview for spacing. rowView = FusionPageBuilderViewManager.getView( parentCID ); rowView.setRowData(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionBuilderText.column ); FusionEvents.trigger( 'fusion-content-changed' ); rowView.$el.find( '.fusion-builder-module-controls-container a' ).trigger( 'mouseleave' ); } }, /** * Adds a child view. * * @since 2.0.0 * @param {Object} element - The element. * @return {void} */ addChildView: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements, attributes: { 'data-cid': element.get( 'cid' ) } }, containerSuffix = ':not(.fusion_builder_row_inner .fusion-builder-column-content)'; if ( 'undefined' !== typeof element.get( 'multi' ) && 'multi_element_parent' === element.get( 'multi' ) ) { if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { view = new FusionPageBuilder[ element.get( 'element_type' ) ]( viewSettings ); } else { view = new FusionPageBuilder.ParentElementView( viewSettings ); } } else if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { view = new FusionPageBuilder[ element.get( 'element_type' ) ]( viewSettings ); } else if ( 'fusion_builder_row_inner' === element.get( 'element_type' ) ) { view = new FusionPageBuilder.InnerRowView( viewSettings ); } else { view = new FusionPageBuilder.ElementView( viewSettings ); } // Add new view to manager. FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( 'undefined' !== typeof this.model && 'fusion_builder_column_inner' === this.model.get( 'type' ) ) { containerSuffix = ''; } if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'targetElement' ).after( view.render().el ); } else { element.get( 'targetElement' ).before( view.render().el ); } } else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { if ( 'fusion_widget' === view.model.get( 'element_type' ) ) { // eslint-disable-next-line vars-on-top var renderedView = view.render(); renderedView.$el.find( 'script' ).remove(); this.$el.find( '.fusion-builder-column-content' + containerSuffix ).append( renderedView.el ); } else { this.$el.find( '.fusion-builder-column-content' + containerSuffix ).append( view.render().el ); } } else { this.$el.find( '.fusion-builder-column-content' + containerSuffix ).find( '.fusion-builder-empty-column' ).first().after( view.render().el ); } // Check if we should open the settings or not. if ( 'off' !== window.FusionApp.preferencesData.open_settings && 'undefined' !== typeof element.get( 'added' ) ) { if ( 'fusion_builder_row_inner' === element.get( 'type' ) ) { if ( ! jQuery( 'body' ).hasClass( 'fusion-builder-ui-wireframe' ) ) { view.editRow(); } } else { view.settings(); } } }, /** * Get the save label. * * @since 2.0.0 * @return {string} */ getSaveLabel: function() { return fusionBuilderText.save_column; }, /** * Returns the 'columns' string. * * @since 2.0.0 * @return {string} */ getCategory: function() { return 'columns'; }, /** * Column spacing dimensions version. * * @since 2.0.0 * @return {void} */ fallbackColumnSpacing: function( $placeholder, allNo ) { var columnSize = '100%', fullcolumnSize = columnSize, existingSpacing = '0%', columnWidth = this.model.attributes.params.type; if ( 'yes' === this.model.attributes.params.spacing ) { existingSpacing = '4%'; } columnWidth = this.model.attributes.params.type; switch ( columnWidth ) { case '1_1': columnSize = '100%'; fullcolumnSize = '100%'; break; case '1_4': columnSize = '22%'; fullcolumnSize = '25%'; break; case '3_4': columnSize = '74%'; fullcolumnSize = '75%'; break; case '1_2': columnSize = '48%'; fullcolumnSize = '50%'; break; case '1_3': columnSize = '30.6666%'; fullcolumnSize = '33.3333%'; break; case '2_3': columnSize = '65.3333%'; fullcolumnSize = '66.6666%'; break; case '1_5': columnSize = '16.8%'; fullcolumnSize = '20%'; break; case '2_5': columnSize = '37.6%'; fullcolumnSize = '40%'; break; case '3_5': columnSize = '58.4%'; fullcolumnSize = '60%'; break; case '4_5': columnSize = '79.2%'; fullcolumnSize = '80%'; break; case '5_6': columnSize = '82.6666%'; fullcolumnSize = '83.3333%'; break; case '1_6': columnSize = '13.3333%'; fullcolumnSize = '16.6666%'; break; } if ( '4%' !== existingSpacing && ( ! this.model.attributes.params.last || allNo ) ) { columnSize = fullcolumnSize; } this.$el.css( 'width', columnSize ); $placeholder.css( 'width', columnSize ); $placeholder.css( 'margin-right', existingSpacing ); this.$el.css( 'margin-right', existingSpacing ); }, scrollHighlight: function( scroll ) { var self = this, $trigger = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-one-page-text-link' ), $el = this.$el; scroll = 'undefined' === typeof scroll ? true : scroll; setTimeout( function() { if ( scroll && $trigger.length && 'function' === typeof $trigger.fusion_scroll_to_anchor_target ) { $trigger.attr( 'href', '#fusion-column-' + self.model.get( 'cid' ) ).fusion_scroll_to_anchor_target( 15 ); } $el.find( '> .fusion-column-wrapper' ).addClass( 'fusion-active-highlight' ); setTimeout( function() { $el.find( '> .fusion-column-wrapper' ).removeClass( 'fusion-active-highlight' ); }, 6000 ); }, 10 ); }, /** * Destroy the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableColumn: function() { var $el = this.$el, $droppables = $el.find( '.fusion-column-target' ); if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'destroy' ); } if ( 'undefined' !== typeof $droppables.droppable( 'instance' ) ) { $droppables.droppable( 'destroy' ); } if ( 'undefined' !== typeof $el.find( '.fusion-element-target-column' ).droppable( 'instance' ) ) { $el.find( '.fusion-element-target-column' ).droppable( 'destroy' ); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableColumn: function() { this.droppableColumn(); }, /** * Checks if column layout type is block. * * @since 3.0.0 * @return {Boolean} */ isBlockLayout: function() { return this.values && 'block' === this.values.content_layout; }, /** * Initialize element sortable. * * @since 2.0.0 * @return {void} */ sortableElements: function() { var self = this; this.$el.find( '.fusion-builder-column-content' ).sortable( { items: '.fusion-builder-live-element:not(.fusion_builder_row_inner .fusion-builder-live-element), .fusion_builder_row_inner', connectWith: '.fusion-builder-column-content', cancel: '.fusion-builder-settings, .fusion-builder-clone, .fusion-builder-row-clone, .fusion-builder-remove, .fusion-builder-add-element, .fusion-builder-insert-column, .fusion-builder-save-module-dialog, .fusion-builder-row-remove, .fusion-builder-save-inner-row-dialog-button, .fusion_builder_row_inner .fusion-builder-row-content', tolerance: 'pointer', appendTo: FusionPageBuilderApp.$el, helper: 'clone', disabled: ! FusionPageBuilderApp.wireframeActive, over: function( event ) { self.onSortOver( event ); }, update: function( event, ui ) { self.onSortUpdate( event, ui ); }, stop: function( event, ui ) { self.onSortStop( event, ui ); } } ); } } ); } ); }( jQuery ) ); ;/* global FusionApp, cssua, FusionPageBuilderApp, FusionPageBuilderViewManager, fusionAllElements, fusionBuilderText, FusionEvents, FusionPageBuilderElements */ /* jshint -W020 */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Container View FusionPageBuilder.ContainerView = FusionPageBuilder.BaseView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-container-template' ).html() ), className: function() { var classes = 'fusion-builder-container fusion-builder-data-cid', values = _.fusionCleanParameters( jQuery.extend( true, {}, this.model.get( 'params' ) ) ); if ( 'yes' === values.hundred_percent_height_scroll && 'yes' === values.hundred_percent_height ) { classes += ' scrolling-helper'; } if ( this.isFlex ) { classes += ' fusion-builder-flex-container'; } // Absolute container. if ( 'undefined' !== typeof values.absolute && 'on' === values.absolute ) { classes += ' fusion-builder-absolute-container-wrapper'; } return classes; }, events: { 'click .fusion-builder-container-settings': 'settings', 'click .fusion-builder-container-remove': 'removeContainer', 'click .fusion-builder-container-clone': 'cloneContainer', 'click .fusion-builder-container-add': 'addContainer', 'click .fusion-builder-container-save': 'openLibrary', 'paste .fusion-builder-section-name': 'renameContainer', 'keydown .fusion-builder-section-name': 'renameContainer', 'click .fusion-builder-toggle': 'toggleContainer', 'click .fusion-builder-publish-tooltip': 'publish', 'click .fusion-builder-unglobal-tooltip': 'unglobalize', 'click .fusion-builder-container-drag': 'preventDefault' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { var cid = this.model.get( 'cid' ), el = this.$el; el.attr( 'data-cid', cid ); el.attr( 'id', 'fusion-container-' + cid ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-container' ).addClass( 'fusion-global-container' ); } this.listenTo( FusionEvents, 'fusion-view-update-fusion_builder_container', this.reRender ); this.listenTo( FusionEvents, 'fusion-param-changed-' + this.model.get( 'cid' ), this.onOptionChange ); // Responsive control updates on resize. this.listenTo( FusionEvents, 'fusion-preview-viewport-update', this.onPreviewResize ); this._triggerCallback = _.debounce( _.bind( this.triggerCallback, this ), 200 ); this.model.children = new FusionPageBuilder.Collection(); this.listenTo( this.model.children, 'add', this.addChildView ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); this.renderedYet = FusionPageBuilderApp.loaded; this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); this._triggerScrollUpdate = _.debounce( _.bind( this.triggerScrollUpdate, this ), 300 ); this._reInitSticky = _.debounce( _.bind( this.reInitSticky, this ), 300 ); this._updateInnerStyles = _.debounce( _.bind( this.updateInnerStyles, this ), 500 ); this.typingTimer; // jshint ignore:line this.doneTypingInterval = 800; this.scrollingSections = false; this.settingsControlsOffset = 0; this.width = el.width(); el.on( 'mouseenter', _.bind( this.setSettingsControlsOffset, this ) ); this.correctStackingContextForFilters(); this.deprecatedParams(); this.baseInit(); this.reInitDraggables = false; }, /** * Set correct top offset for the container setting controls. * * @since 2.0 * @param {boolean} forced - Whether to force an update and bypass checks. * @return {void} */ setSettingsControlsOffset: function( forced ) { var offset = 15, customOffset; if ( ( 'undefined' !== typeof forced || 0 === this.settingsControlsOffset || this.width !== this.$el.width() ) && ( 'undefined' !== typeof window.frames[ 0 ].getStickyHeaderHeight || 'undefined' !== typeof window.frames[ 0 ].fusionGetStickyOffset ) ) { // if we have sticky enabled, get its height. if ( 'off' !== FusionApp.preferencesData.sticky_header && 'on' !== this.values.sticky ) { // If we have a custom header, use function to retrieve lowest point. if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-tb-header' ).length && 'function' === typeof window.frames[ 0 ].fusionGetStickyOffset ) { customOffset = window.frames[ 0 ].fusionGetStickyOffset(); if ( customOffset ) { offset += customOffset; } } else if ( 'undefined' !== typeof window.frames[ 0 ].getStickyHeaderHeight ) { offset += window.frames[ 0 ].getStickyHeaderHeight( true ); } } this.settingsControlsOffset = offset + 'px'; this.width = this.$el.width(); this.$el.find( '.fusion-builder-module-controls-container-wrapper .fusion-builder-module-controls-type-container' ).css( 'top', this.settingsControlsOffset ); } if ( this.$el.find( '.fusion-builder-empty-container' ).is( ':visible' ) ) { this.$el.find( '.fusion-builder-module-controls-container-wrapper .fusion-builder-module-controls-type-container' ).css( 'margin-top', '8.5px' ); } else { this.$el.find( '.fusion-builder-module-controls-container-wrapper .fusion-builder-module-controls-type-container' ).css( 'margin-top', '' ); } }, /** * Corrects the stacking context if filters are used, to make all elements accessible. * * @since 2.2 * @return {void} */ correctStackingContextForFilters: function() { var parent = this.$el; this.$el.on( 'mouseenter', '.fusion-fullwidth', function() { if ( 'none' !== jQuery( this ).css( 'filter' ) ) { parent.addClass( 'fusion-has-filters' ); } } ); this.$el.on( 'mouseleave', '.fusion-fullwidth', function() { if ( ! parent.hasClass( 'fusion-container-editing-child' ) ) { parent.removeClass( 'fusion-has-filters' ); } } ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this, data = this.getTemplateAtts(); this.$el.html( this.template( data ) ); this.appendChildren(); if ( this.renderedYet ) { this._refreshJs(); // Trigger equal height columns js jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-option-change-equal_height_columns', this.model.attributes.cid ); } if ( 'undefined' !== typeof this.model.attributes.params.admin_toggled && 'yes' === this.model.attributes.params.admin_toggled ) { this.$el.addClass( 'fusion-builder-section-folded' ); this.$el.find( '.fusion-builder-toggle > span' ).toggleClass( 'fusiona-caret-up' ).toggleClass( 'fusiona-caret-down' ); } this.onRender(); this.renderedYet = true; setTimeout( function() { self.droppableContainer(); }, 100 ); this._triggerScrollUpdate(); return this; }, /** * Adds drop zones for continers and makes container draggable. * * @since 2.0.0 * @return {void} */ droppableContainer: function() { var $el = this.$el, cid = this.model.get( 'cid' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); if ( ! $el ) { return; } $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-builder-column', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-container-helper ' + $classes + '" data-cid="' + cid + '"><span class="fusiona-container"></span></div>' ); }, start: function() { $body.addClass( 'fusion-container-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); // Add a class to hide the unnecessary target after. if ( $el.prev( '.fusion-builder-container' ).length ) { $el.prev( '.fusion-builder-container' ).addClass( 'hide-target-after' ); } if ( $el.prev( '.fusion-fusion-builder-next-pager' ).length ) { $el.prev( '.fusion-fusion-builder-next-page' ).addClass( 'hide-target-after' ); } }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-container-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); FusionPageBuilderApp.$el.find( '.hide-target-after' ).removeClass( 'hide-target-after' ); } } ); $el.find( '.fusion-container-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-container, .fusion-builder-next-page, .fusion-checkout-form', drop: function( event, ui ) { // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $el.after( ui.draggable ); } else { $el.before( ui.draggable ); } FusionEvents.trigger( 'fusion-content-changed' ); FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.full_width_section + ' order changed' ); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableContainer: function() { var $el = this.$el; if ( 'undefined' !== typeof $el.draggable( 'instance' ) && 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.draggable( 'enable' ); $el.find( '.fusion-container-target' ).droppable( 'enable' ); } else { // No sign of init, then need to call it. this.droppableContainer(); } }, /** * Destroy or disable the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableContainer: function() { var $el = this.$el; // If its been init, just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'disable' ); } // If its been init, just disable. if ( 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.find( '.fusion-container-target' ).droppable( 'disable' ); } }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } else { this.enableDroppableContainer(); } }, /** * Get the template. * * @since 2.0.0 * @return {void} */ getTemplate: function() { var atts = this.getTemplateAtts(); return this.template( atts ); }, /** * Remove deprecated params. * * @since 2.0.0 * @return {void} */ deprecatedParams: function() { var params = this.model.get( 'params' ), defaults = fusionAllElements.fusion_builder_container.defaults, values = jQuery.extend( true, {}, defaults, params ), alphaBackgroundColor = 1, radiaDirectionsNew = { 'bottom': 'center bottom', 'bottom center': 'center bottom', 'left': 'left center', 'right': 'right center', 'top': 'center top', 'center': 'center center', 'center left': 'left center' }; params = _.fusionContainerMapDeprecatedArgs( params ); // If no blend mode is defined, check if we should set to overlay. if ( 'undefined' === typeof params.background_blend_mode && '' !== values.background_color ) { alphaBackgroundColor = jQuery.AWB_Color( values.background_color ).alpha(); if ( 1 > alphaBackgroundColor && 0 !== alphaBackgroundColor && ( '' !== params.background_image || '' !== params.video_bg ) ) { params.background_blend_mode = 'overlay'; } } // Check if we have an old border-size. If we do, then we need to migrate it to the new options // and delete the old param. if ( 'undefined' !== typeof params.border_size ) { if ( '' !== params.border_size ) { params.border_sizes_top = parseInt( params.border_size ) + 'px'; params.border_sizes_bottom = parseInt( params.border_size ) + 'px'; params.border_sizes_left = '0px'; params.border_sizes_right = '0px'; } delete params.border_size; } // Correct radial direction params. if ( 'undefined' !== typeof params.radial_direction && ( params.radial_direction in radiaDirectionsNew ) ) { params.radial_direction = radiaDirectionsNew[ values.radial_direction ]; } // No column align, but equal heights is on, set to stretch. if ( 'undefined' === typeof params.flex_align_items && 'undefined' !== typeof params.equal_height_columns && 'yes' === params.equal_height_columns ) { params.flex_align_items = 'stretch'; } // No align content, but it is 100% height and centered. if ( 'undefined' === typeof params.align_content && 'undefined' !== typeof params.hundred_percent_height && 'yes' === params.hundred_percent_height && 'undefined' !== typeof params.hundred_percent_height_center_content && 'yes' === params.hundred_percent_height_center_content ) { params.align_content = 'center'; } // If legacy mode is off, remove param, causes it to run migration and then setType is called. if ( ( 'undefined' === typeof params.type || 'flex' !== params.type ) && 'undefined' !== typeof fusionAllElements.fusion_builder_container.extras.container_legacy_support && ( 0 === fusionAllElements.fusion_builder_container.extras.container_legacy_support || '0' === fusionAllElements.fusion_builder_container.extras.container_legacy_support || false === fusionAllElements.fusion_builder_container.extras.container_legacy_support ) ) { delete params.type; } this.model.set( 'params', params ); }, /** * Set type to ensure migration does not run on front-end. * * @since 3.0 * @return {Void} */ setType: function() { var params = this.model.get( 'params' ), defaults = fusionAllElements.fusion_builder_container.defaults; if ( 'undefined' === typeof params.type ) { params.type = defaults.type; } this.model.set( 'params', params ); }, /** * Get dynamic values. * * @since 2.0.0 * @return {Object} */ getDynamicAtts: function( values ) { var self = this; if ( 'undefined' !== typeof this.dynamicParams && this.dynamicParams && ! _.isEmpty( this.dynamicParams.getAll() ) ) { _.each( this.dynamicParams.getAll(), function( data, id ) { var value = self.dynamicParams.getParamValue( data ); if ( 'undefined' !== typeof value && false !== value ) { values[ id ] = value; } } ); } return values; }, setValues: function() { var element = fusionAllElements[ this.model.get( 'element_type' ) ], defaults = fusionAllElements.fusion_builder_container.defaults, params = jQuery.extend( true, {}, this.model.get( 'params' ) ), extras = {}, values = {}; extras = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.extras ); // If 100 page template. if ( FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && 'undefined' !== typeof extras.container_padding_100 ) { defaults.padding_top = extras.container_padding_100.top; defaults.padding_right = extras.container_padding_100.right; defaults.padding_bottom = extras.container_padding_100.bottom; defaults.padding_left = extras.container_padding_100.left; } else if ( ! FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && 'undefined' !== typeof extras.container_padding_default ) { defaults.padding_top = extras.container_padding_default.top; defaults.padding_right = extras.container_padding_default.right; defaults.padding_bottom = extras.container_padding_default.bottom; defaults.padding_left = extras.container_padding_default.left; } params = _.fusionCleanParameters( params ); // Set values & extras if ( element && 'undefined' !== typeof element.defaults ) { values = jQuery.extend( true, {}, defaults, params ); } // Default value is an array, so we need to convert it to string. if ( Array.isArray( values.absolute_devices ) ) { values.absolute_devices = values.absolute_devices.join( ',' ); } values = this.getDynamicAtts( values ); this.defaults = defaults; this.values = values; this.params = params; if ( 'on' === this.values.sticky ) { this.values.background_parallax = 'none'; this.values.fade = 'no'; } }, /** * Set extra args. * * @since 2.0.0 * @return {void} */ setExtraValues: function() { this.values.alpha_background_color = jQuery.AWB_Color( this.values.background_color ).alpha(); }, contentStyle: function() { var self = this, contentStyle = ''; if ( 'yes' === this.values.hundred_percent_height && 'yes' === this.values.hundred_percent_height_center_content ) { // Get correct container padding. jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, padding ) { var paddingName = 'padding_' + padding; // Add padding to style. if ( '' !== self.values[ paddingName ] ) { contentStyle += 'padding-' + padding + ':' + _.fusionGetValueWithUnit( self.values[ paddingName ] ) + ';'; } } ); } return contentStyle; }, /** * Sets container video data args. * * @access public * @since 3.0 * @return void */ setContainerVideoData: function() { // If no blend mode is defined, check if we should set to overlay. if ( 'undefined' !== typeof this.values.background_blend_mode && 1 > this.values.alpha_background_color && 0 !== this.values.alpha_background_color && ! this.is_gradient_color && ( this.background_image || this.values.video_bg ) ) { this.values.background_blend_mode = 'overlay'; } this.values.video_bg = false; if ( this.values.video_mp4 || this.values.video_webm || this.values.video_ogv || this.values.video_url ) { this.values.video_bg = true; } }, parallaxAttr: function() { var attr = {}, bgColorAlpha = jQuery.AWB_Color( this.values.background_color ).alpha(); attr[ 'class' ] = 'fusion-bg-parallax'; attr[ 'data-bg-align' ] = this.values.background_position; attr[ 'data-direction' ] = this.values.background_parallax; attr[ 'data-mute' ] = 'mute' === this.values.video_mute ? 'true' : 'false'; attr[ 'data-opacity' ] = this.values.opacity; attr[ 'data-velocity' ] = this.values.parallax_speed * -1; attr[ 'data-mobile-enabled' ] = 'yes' === this.values.enable_mobile ? 'true' : 'false'; attr[ 'data-break_parents' ] = this.values.break_parents; attr[ 'data-bg-image' ] = this.values.background_image; attr[ 'data-bg-repeat' ] = this.values.background_repeat && 'no-repeat' !== this.values.background_repeat ? 'true' : 'false'; if ( 0 !== bgColorAlpha ) { attr[ 'data-bg-color' ] = this.values.background_color; } if ( 'none' !== this.values.background_blend_mode ) { attr[ 'data-blend-mode' ] = this.values.background_blend_mode; } if ( this.values.is_gradient_color ) { attr[ 'data-bg-gradient-type' ] = this.values.gradient_type; attr[ 'data-bg-gradient-angle' ] = this.values.linear_angle; attr[ 'data-bg-gradient-start-color' ] = this.values.gradient_start_color; attr[ 'data-bg-gradient-start-position' ] = this.values.gradient_start_position; attr[ 'data-bg-gradient-end-color' ] = this.values.gradient_end_color; attr[ 'data-bg-gradient-end-position' ] = this.values.gradient_end_position; attr[ 'data-bg-radial-direction' ] = this.values.radial_direction; } attr[ 'data-bg-height' ] = this.values.data_bg_height; attr[ 'data-bg-width' ] = this.values.data_bg_width; return attr; }, isFlex: function() { return this.values && 'flex' === this.values.type; }, attr: function() { var attr = { 'class': 'fusion-fullwidth fullwidth-box fusion-builder-row-live-' + this.model.get( 'cid' ), 'style': '', 'id': '' }, self = this; // Background. if ( '' !== this.values.background_color && ! ( 'yes' === this.values.fade && '' !== this.values.background_image && false === this.values.video_bg ) ) { attr.style += 'background-color: ' + this.values.background_color + ';'; } if ( '' !== this.values.background_image && 'yes' !== this.values.fade ) { attr.style += 'background-image: url(\'' + this.values.background_image + '\');'; } if ( '' !== _.getGradientString( this.values, 'main_bg' ) ) { attr.style += 'background-image: ' + _.getGradientString( this.values, 'main_bg' ) + ';'; } if ( '' !== this.values.background_position ) { attr.style += 'background-position: ' + this.values.background_position + ';'; } if ( '' !== this.values.background_repeat ) { attr.style += 'background-repeat: ' + this.values.background_repeat + ';'; } if ( 'none' !== this.values.background_blend_mode ) { attr.style += 'background-blend-mode: ' + this.values.background_blend_mode + ';'; } // Add box-shadow styles. if ( 'yes' === this.values.box_shadow ) { attr.style += 'box-shadow:' + _.fusionGetBoxShadowStyle( this.values ).replace( ';', '' ) + ' !important;'; } if ( ! this.isFlex() ) { // Get correct container padding. jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, padding ) { var paddingName = 'padding_' + padding; // Add padding to style. if ( '' !== self.values[ paddingName ] ) { attr.style += 'padding-' + padding + ':' + _.fusionGetValueWithUnit( self.values[ paddingName ] ) + ';'; } } ); // Margin; for separator conversion only. if ( '' !== this.values.margin_bottom ) { attr.style += 'margin-bottom: ' + _.fusionGetValueWithUnit( this.values.margin_bottom ) + ';'; } if ( '' !== this.values.margin_top ) { attr.style += 'margin-top: ' + _.fusionGetValueWithUnit( this.values.margin_top ) + ';'; } } // Border. if ( 'undefined' === typeof this.values.border_sizes_top || '' === this.values.border_sizes_top ) { this.values.border_sizes_top = 0; } if ( 'undefined' === typeof this.values.border_sizes_bottom || '' === this.values.border_sizes_bottom ) { this.values.border_sizes_bottom = 0; } if ( 'undefined' === typeof this.values.border_sizes_left || '' === this.values.border_sizes_left ) { this.values.border_sizes_left = 0; } if ( 'undefined' === typeof this.values.border_sizes_right || '' === this.values.border_sizes_right ) { this.values.border_sizes_right = 0; } attr.style += 'border-top:' + _.fusionGetValueWithUnit( this.values.border_sizes_top ) + ' ' + this.values.border_style + ' ' + this.values.border_color + ';'; attr.style += 'border-bottom:' + _.fusionGetValueWithUnit( this.values.border_sizes_bottom ) + ' ' + this.values.border_style + ' ' + this.values.border_color + ';'; attr.style += 'border-left:' + _.fusionGetValueWithUnit( this.values.border_sizes_left ) + ' ' + this.values.border_style + ' ' + this.values.border_color + ';'; attr.style += 'border-right:' + _.fusionGetValueWithUnit( this.values.border_sizes_right ) + ' ' + this.values.border_style + ' ' + this.values.border_color + ';'; if ( '' !== this.values.background_image && false === this.values.video_bg ) { if ( 'no-repeat' === this.values.background_repeat ) { attr.style += '-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;'; } } if ( this.isFlex() ) { attr[ 'class' ] += ' fusion-flex-container'; if ( 'stretch' !== this.values.align_content ) { attr[ 'class' ] += ' fusion-flex-align-content-' + this.values.align_content; } } if ( this.values.video_bg ) { attr[ 'class' ] += ' video-background'; } if ( cssua.ua.edge && 1 > this.values.alpha_background_color ) { attr[ 'class' ] += ' fusion-ie-mode'; } // Fading Background. if ( 'yes' === this.values.fade && '' !== this.values.background_image && false === this.values.video_bg ) { attr[ 'class' ] += ' faded-background'; } // Parallax. if ( false === this.values.video_bg && '' !== this.values.background_image ) { // Parallax css class+ if ( '' !== this.values.background_parallax ) { attr[ 'class' ] += ' fusion-parallax-' + this.values.background_parallax; } if ( 'fixed' === this.values.background_parallax ) { attr.style += 'background-attachment:' + this.values.background_parallax + ';'; } } // Custom CSS class+ if ( '' !== this.values[ 'class' ] ) { attr[ 'class' ] += ' ' + this.values[ 'class' ]; } attr[ 'class' ] += ( 'yes' === this.values.hundred_percent ) ? ' hundred-percent-fullwidth' : ' nonhundred-percent-fullwidth'; attr[ 'class' ] += ( 'yes' === this.values.hundred_percent_height_scroll && 'yes' === this.values.hundred_percent_height ) ? ' fusion-scrolling-section-edit' : ''; attr[ 'class' ] += ( 'yes' === this.values.hundred_percent_height ) ? ' non-hundred-percent-height-scrolling' : ''; attr[ 'class' ] += ( 'yes' === this.values.hundred_percent_height && 'yes' !== this.values.hundred_percent_height_center_content ) ? ' hundred-percent-height' : ''; attr[ 'class' ] += ( 'yes' === this.values.hundred_percent_height && 'yes' === this.values.hundred_percent_height_center_content ) ? ' hundred-percent-height-center-content' : ''; // Equal column height. if ( 'yes' === this.values.equal_height_columns && ! this.isFlex() ) { attr[ 'class' ] += ' fusion-equal-height-columns'; } // Hundred percent height and centered content, if added to centerContentClass then the padding makes the container too large. if ( 'yes' === this.values.hundred_percent_height && 'yes' === this.values.hundred_percent_height_center_content ) { attr[ 'class' ] += ' hundred-percent-height non-hundred-percent-height-scrolling'; } // Visibility classes. attr[ 'class' ] = _.fusionVisibilityAtts( this.values.hide_on_mobile, attr[ 'class' ] ); // Animations. attr = _.fusionAnimations( this.values, attr ); // Custom CSS ID. if ( '' !== this.values.id ) { attr.id = this.values.id; } if ( '' !== this.values.menu_anchor ) { attr.id += ' ' + this.values.menu_anchor; } // Sticky container. if ( 'on' === this.values.sticky ) { attr[ 'class' ] += ' fusion-sticky-container'; if ( '' !== this.values.sticky_transition_offset && 0 !== this.values.sticky_transition_offset ) { attr[ 'data-transition-offset' ] = parseFloat( this.values.sticky_transition_offset ); } if ( '' !== this.values.sticky_offset && 0 !== this.values.sticky_offset ) { attr[ 'data-sticky-offset' ] = this.values.sticky_offset; } if ( '' !== this.values.scroll_offset && 0 !== this.values.scroll_offset ) { attr[ 'data-scroll-offset' ] = parseFloat( this.values.scroll_offset ); } if ( '' !== this.values.sticky_devices ) { if ( 'string' === typeof this.values.sticky_devices ) { this.values.sticky_devices = this.values.sticky_devices.split( ',' ); } _.each( this.values.sticky_devices, function( stickyDevice ) { attr[ 'data-sticky-' + stickyDevice.replace( /\s/g, '' ) ] = true; } ); } } // z-index. if ( 'undefined' !== typeof this.values.z_index && '' !== this.values.z_index ) { attr[ 'class' ] += ' fusion-custom-z-index'; } // Absolute container. if ( 'undefined' !== typeof this.values.absolute && 'on' === this.values.absolute ) { attr[ 'class' ] += ' fusion-absolute-container'; if ( 'undefined' !== typeof this.values.absolute_devices && '' !== this.values.absolute_devices ) { _.each( this.values.absolute_devices.split( ',' ), function( absoluteDevice ) { attr[ 'class' ] += ' fusion-absolute-position-' + absoluteDevice; } ); } } return attr; }, createVideoBackground: function() { var videoBackground = '', overlayStyle = '', cid = this.model.get( 'cid' ), videoAttributes, videoPreviewImageStyle, videoUrl, videoSrc, loop; // Videos. if ( 'undefined' !== typeof this.values.video_mp4 && '' !== this.values.video_mp4 ) { videoSrc += '<source src="' + this.values.video_mp4 + '" type="video/mp4">'; } if ( 'undefined' !== typeof this.values.video_webm && '' !== this.values.video_webm ) { videoSrc += '<source src="' + this.values.video_webm + '" type="video/webm">'; } if ( 'undefined' !== typeof this.values.video_ogv && '' !== this.values.video_ogv ) { videoSrc += '<source src="' + this.values.video_ogv + '" type="video/ogg">'; } if ( '' !== this.values.video_url ) { videoUrl = _.fusionGetVideoProvider( this.values.video_url ), loop = ( 'yes' === this.values.video_loop ? 1 : 0 ); if ( 'youtube' === videoUrl.type ) { videoBackground += '<div style=\'opacity:0;\' class=\'fusion-background-video-wrapper\' id=\'video-' + cid + '\' data-youtube-video-id=\'' + videoUrl.id + '\' data-mute=\'' + this.values.video_mute + '\' data-loop=\'' + loop + '\' data-loop-adjustment=\'' + this.values.video_loop_refinement + '\' data-video-aspect-ratio=\'' + this.values.video_aspect_ratio + '\'><div class=\'fusion-container-video-bg\' id=\'video-' + cid + '-inner\'></div></div>'; } else if ( 'vimeo' === videoUrl.type ) { videoBackground += '<div id="video-' + cid + '" data-vimeo-video-id="' + videoUrl.id + '" data-mute="' + this.values.video_mute + '" data-video-aspect-ratio="' + this.values.video_aspect_ratio + ' }}" style="visibility:hidden;"><iframe id="video-iframe-' + cid + '" src="//player.vimeo.com/video/' + videoUrl.id + '?api=1&player_id=video-iframe-' + cid + '&html5=1&autopause=0&autoplay=1&badge=0&byline=0&loop=' + loop + '&title=0" frameborder="0"></iframe></div>'; } } else { videoAttributes = 'preload="auto" autoplay playsinline'; if ( 'yes' === this.values.video_loop ) { videoAttributes += ' loop'; } if ( 'yes' === this.values.video_mute ) { videoAttributes += ' muted'; } // Video Preview Image. if ( '' !== this.values.video_preview_image ) { videoPreviewImageStyle = 'background-image: url(\'' + this.values.video_preview_image + '\');'; videoBackground += '<div class="fullwidth-video-image" style="' + videoPreviewImageStyle + '"></div>'; } videoBackground += '<div class="fullwidth-video"><video ' + videoAttributes + '>' + videoSrc + '</video></div>'; } // Video Overlay. if ( '' !== _.getGradientString( this.values ) ) { overlayStyle += 'background-image:' + _.getGradientString( this.values ) + ';'; } if ( '' !== this.values.background_color && 1 > jQuery.AWB_Color( this.values.background_color ).alpha() ) { overlayStyle += 'background-color:' + this.values.background_color + ';'; } if ( '' !== overlayStyle ) { videoBackground += '<div class="fullwidth-overlay" style="' + overlayStyle + '"></div>'; } return videoBackground; }, fadingBackgroundAttr: function() { var attr = { class: 'fullwidth-faded' }; // Fading Background. if ( 'yes' === this.values.fade && '' !== this.values.background_image && false === this.values.video_bg ) { if ( this.values.background_parallax ) { attr.style += 'background-attachment:' + this.values.background_parallax + ';'; } if ( this.values.background_color ) { attr.style += 'background-color:' + this.values.background_color + ';'; } if ( this.values.background_image ) { attr.style += 'background-image: url(' + this.values.background_image + ');'; } if ( '' !== _.getGradientString( this.values, 'fade' ) ) { attr.style += 'background-image: ' + _.getGradientString( this.values, 'fade' ) + ';'; } if ( this.values.background_position ) { attr.style += 'background-position:' + this.values.background_position + ';'; } if ( this.values.background_repeat ) { attr.style += 'background-repeat:' + this.values.background_repeat + ';'; } if ( 'none' !== this.values.background_blend_mode ) { attr.style += 'background-blend-mode: ' + this.values.background_blend_mode + ';'; } if ( 'no-repeat' === this.values.background_repeat ) { attr.style += '-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;'; } } return attr; }, styleBlock: function() { var styleBlock = '', cid = this.model.get( 'cid' ), stylePrefix = '.fusion-fullwidth.fusion-builder-row-live-' + cid + ' .fusion-builder-element-content', linkExclusionSelectors = ' a:not(.fusion-button):not(.fusion-builder-module-control):not(.fusion-social-network-icon):not(.fb-icon-element):not(.fusion-countdown-link):not(.fusion-rollover-link):not(.fusion-rollover-gallery):not(.add_to_cart_button):not(.show_details_button):not(.product_type_external):not(.fusion-quick-view):not(.fusion-rollover-title-link):not(.fusion-breadcrumb-link)'; if ( 'undefined' !== typeof this.params.link_color && '' !== this.params.link_color ) { styleBlock += stylePrefix + linkExclusionSelectors + ', '; styleBlock += stylePrefix + linkExclusionSelectors + ':before, '; styleBlock += stylePrefix + linkExclusionSelectors + ':after '; styleBlock += '{color: ' + this.params.link_color + ';}'; } if ( 'undefined' !== typeof this.params.link_hover_color && '' !== this.params.link_hover_color ) { styleBlock += stylePrefix + linkExclusionSelectors + ':hover, ' + stylePrefix + linkExclusionSelectors + ':hover:before, ' + stylePrefix + linkExclusionSelectors + ':hover:after {color: ' + this.params.link_hover_color + ';}'; styleBlock += stylePrefix + ' .pagination a.inactive:hover, ' + stylePrefix + ' .fusion-filters .fusion-filter.fusion-active a {border-color: ' + this.params.link_hover_color + ';}'; styleBlock += stylePrefix + ' .pagination .current {border-color: ' + this.params.link_hover_color + '; background-color: ' + this.params.link_hover_color + ';}'; styleBlock += stylePrefix + ' .fusion-filters .fusion-filter.fusion-active a, ' + stylePrefix + ' .fusion-date-and-formats .fusion-format-box, ' + stylePrefix + ' .fusion-popover, ' + stylePrefix + ' .tooltip-shortcode {color: ' + this.params.link_hover_color + ';}'; styleBlock += '#wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .menu li.current_page_ancestor > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .menu li.current_page_ancestor > a:before, #wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .current-menu-item > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .current-menu-item > a:before, #wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .current_page_item > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .fusion-vertical-menu-widget .current_page_item > a:before {color: ' + this.params.link_hover_color + ';}'; styleBlock += '#wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .menu li.current_page_ancestor > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .menu li.current_page_ancestor > a:before, #wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .current-menu-item > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .current-menu-item > a:before, #wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .current_page_item > a, #wrapper ' + stylePrefix + ' .fusion-widget-area .widget_nav_menu .current_page_item > a:before {color: ' + this.params.link_hover_color + ';}'; styleBlock += '#wrapper ' + stylePrefix + ' .fusion-vertical-menu-widget .menu li.current_page_item > a { border-right-color:' + this.params.link_hover_color + ';border-left-color:' + this.params.link_hover_color + ';}'; styleBlock += '#wrapper ' + stylePrefix + ' .fusion-widget-area .tagcloud a:hover { color: #fff; background-color: ' + this.params.link_hover_color + ';border-color: ' + this.params.link_hover_color + ';}'; styleBlock += '#main ' + stylePrefix + ' .post .blog-shortcode-post-title a:hover {color: ' + this.params.link_hover_color + ';}'; } if ( 'undefined' !== typeof this.values.z_index && '' !== this.values.z_index ) { styleBlock += '.fusion-fullwidth.fusion-builder-row-live-' + cid + ' {z-index: ' + parseInt( this.values.z_index ) + ' !important; }'; } if ( 'undefined' !== typeof this.values.overflow && '' !== this.values.overflow ) { styleBlock += '.fusion-fullwidth.fusion-builder-row-live-' + cid + ' {overflow: ' + this.values.overflow + ' }'; } if ( 'on' === this.values.sticky ) { if ( '' !== this.values.sticky_background_color ) { styleBlock += '.fusion-fullwidth.fusion-builder-row-live-' + cid + '.fusion-sticky-transition { background-color:' + this.values.sticky_background_color + ' !important; }'; } if ( '' !== this.values.sticky_height ) { styleBlock += '.fusion-fullwidth.fusion-builder-row-live-' + cid + '.fusion-sticky-transition { min-height:' + this.values.sticky_height + ' !important; }'; } } if ( '' !== styleBlock ) { styleBlock = '<style type="text/css">' + styleBlock + '</style>'; } return styleBlock + _.fusionGetFilterStyleElem( this.values, '.fusion-builder-row-live-' + cid, cid ); }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = {}; this.setValues(); this.setExtraValues(); this.setContainerVideoData(); if ( this.isFlex() ) { this.setResponsiveContainerStyles(); } // Remove old parallax bg. if ( this.$el.find( '.fusion-bg-parallax' ).length ) { if ( 'undefined' !== typeof this.$el.find( '.fusion-bg-parallax' ).data( 'parallax-index' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow._fusionImageParallaxImages.splice( this.$el.find( '.fusion-bg-parallax' ).data( 'parallax-index' ), 1 ); } this.$el.find( '.fusion-bg-parallax' ).remove(); this.$el.find( '.parallax-inner' ).remove(); } templateAttributes.values = this.values; templateAttributes.attr = this.attr(); templateAttributes.parallax = this.parallaxAttr(); templateAttributes.createVideoBackground = _.bind( this.createVideoBackground, this ); templateAttributes.fadingBackground = this.fadingBackgroundAttr(); templateAttributes.styleBlock = this.styleBlock(); templateAttributes.admin_label = ( '' !== this.values.admin_label ) ? _.unescape( this.values.admin_label ) : fusionBuilderText.full_width_section; templateAttributes.topOverlap = ( 20 > parseInt( this.values.padding_top, 10 ) && ( '0%' === this.values.padding_top || -1 === this.values.padding_top.indexOf( '%' ) ) ) ? 'fusion-overlap' : ''; templateAttributes.bottomOverlap = ( 20 > parseInt( this.values.margin_bottom, 10 ) && ( '0%' === this.values.margin_bottom || -1 === this.values.margin_bottom.indexOf( '%' ) ) ) ? 'fusion-overlap' : ''; templateAttributes.isFlex = this.isFlex(); templateAttributes.isGlobal = ( 'undefined' !== typeof this.values.fusion_global ) ? 'yes' : 'no'; templateAttributes.cid = this.model.get( 'cid' ); templateAttributes.status = this.values.status; templateAttributes.container_tag = this.values.container_tag; templateAttributes.responsiveStyles = this.responsiveStyles || ''; templateAttributes.scrollPosition = ( 'right' === FusionApp.settings.header_position || jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'scroll-navigation-left' : 'scroll-navigation-right'; templateAttributes.contentStyle = this.contentStyle(); return templateAttributes; }, triggerScrollUpdate: function() { setTimeout( function() { FusionPageBuilderApp.scrollingContainers(); }, 100 ); }, beforePatch: function() { if ( this.$el.find( '.fusion-bg-parallax' ).length ) { if ( 'object' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow._fusionImageParallaxImages && 'undefined' !== typeof this.$el.find( '.fusion-bg-parallax' ).attr( 'data-parallax-index' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow._fusionImageParallaxImages.splice( this.$el.find( '.fusion-bg-parallax' ).attr( 'data-parallax-index' ), 1 ); } } }, /** * Runs after view DOM is patched. * * @since 2.0.0 * @return null */ afterPatch: function() { var self = this; this.appendChildren(); // Using non debounced version for smoothness. this.refreshJs(); this._triggerScrollUpdate(); setTimeout( function() { self.droppableContainer(); }, 100 ); if ( 'yes' === this.model.attributes.params.hundred_percent_height && 'yes' === this.model.attributes.params.hundred_percent_height_scroll ) { this.$el.addClass( 'scrolling-helper' ); } else { this.$el.removeClass( 'scrolling-helper' ); } this.setSettingsControlsOffset( true ); this._reInitSticky(); if ( this.reInitDraggables ) { this.updateDragHandles(); } }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function( cid ) { cid = 'undefined' === typeof cid ? this.model.attributes.cid : cid; jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_builder_container', cid ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-reinit-carousels', cid ); }, /** * Adds a container. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addContainer: function( event ) { var elementID, defaultParams, params, value, newContainer; if ( event ) { event.preventDefault(); FusionPageBuilderApp.newContainerAdded = true; } elementID = FusionPageBuilderViewManager.generateCid(); defaultParams = fusionAllElements.fusion_builder_container.params; params = {}; // Process default options for shortcode. _.each( defaultParams, function( param ) { value = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; params[ param.param_name ] = value; if ( 'dimension' === param.type && _.isObject( param.value ) ) { _.each( param.value, function( val, name ) { params[ name ] = val; } ); } } ); this.collection.add( [ { type: 'fusion_builder_container', added: 'manually', element_type: 'fusion_builder_container', cid: elementID, params: params, view: this, created: 'auto' } ] ); // Make sure to add row to new container not current one. newContainer = FusionPageBuilderViewManager.getView( elementID ); newContainer.addRow(); FusionPageBuilderApp.scrollingContainers(); }, /** * Adds a row. * * @since 2.0.0 * @return {void} */ addRow: function() { this.collection.add( [ { type: 'fusion_builder_row', element_type: 'fusion_builder_row', added: 'manually', cid: FusionPageBuilderViewManager.generateCid(), parent: this.model.get( 'cid' ), view: this, element_content: '' } ] ); }, /** * Removes the container. * * @since 2.0.0 * @param {Object} event - The event. * @param {boolean|undefined} skip - Should we skip this? * @return {void} */ removeContainer: function( event, skip ) { var rows; if ( event ) { event.preventDefault(); } rows = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( rows, function( row ) { if ( 'fusion_builder_row' === row.model.get( 'type' ) ) { row.removeRow(); } } ); FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); this.remove(); // If its the last container add empty page view. if ( 1 > FusionPageBuilderViewManager.countElementsByType( 'fusion_builder_container' ) && 'undefined' === typeof skip ) { FusionPageBuilderApp.blankPage = true; FusionPageBuilderApp.clearBuilderLayout( true ); } if ( event ) { FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted_section ); FusionEvents.trigger( 'fusion-content-changed' ); } }, /** * Clones a container. * * @since 2.0.0 * @param {Object} event - The evemt. * @return {void} */ cloneContainer: function( event ) { var containerAttributes, $thisContainer; if ( event ) { event.preventDefault(); } containerAttributes = jQuery.extend( true, {}, this.model.attributes ); containerAttributes.cid = FusionPageBuilderViewManager.generateCid(); containerAttributes.created = 'manually'; containerAttributes.view = this; FusionPageBuilderApp.collection.add( containerAttributes ); $thisContainer = this.$el; // Parse rows $thisContainer.find( '.fusion-builder-row-container:not(.fusion_builder_row_inner .fusion-builder-row-container)' ).each( function() { var thisRow = jQuery( this ), rowCID = thisRow.data( 'cid' ), rowView, // Get model from collection by cid. row = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == rowCID; // jshint ignore: line } ), // Clone row. rowAttributes = jQuery.extend( true, {}, row.attributes ); rowAttributes.created = 'manually'; rowAttributes.cid = FusionPageBuilderViewManager.generateCid(); rowAttributes.parent = containerAttributes.cid; FusionPageBuilderApp.collection.add( rowAttributes ); // Make sure spacing is calculated. rowView = FusionPageBuilderViewManager.getView( rowAttributes.cid ); // Parse columns thisRow.find( '.fusion-builder-column-outer' ).each( function() { // Parse column elements var thisColumn = jQuery( this ), $columnCID = thisColumn.data( 'cid' ), // Get model from collection by cid column = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == $columnCID; // jshint ignore: line } ), // Clone column columnAttributes = jQuery.extend( true, {}, column.attributes ); columnAttributes.created = 'manually'; columnAttributes.cid = FusionPageBuilderViewManager.generateCid(); columnAttributes.parent = rowAttributes.cid; columnAttributes.from = 'fusion_builder_container'; columnAttributes.cloned = true; // Don't need target element, position is defined from order. delete columnAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( columnAttributes ); // Find column elements thisColumn.find( '.fusion-builder-column-content:not( .fusion-nested-column-content )' ).children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).each( function() { var thisElement, elementCID, element, elementAttributes, thisInnerRow, InnerRowCID, innerRowView; // Regular element if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { thisElement = jQuery( this ); elementCID = thisElement.data( 'cid' ); // Get model from collection by cid element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == elementCID; // jshint ignore: line } ); // Clone model attritubes elementAttributes = jQuery.extend( true, {}, element.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.parent = columnAttributes.cid; elementAttributes.from = 'fusion_builder_container'; // Don't need target element, position is defined from order. delete elementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( elementAttributes ); // Inner row element } else if ( jQuery( this ).hasClass( 'fusion_builder_row_inner' ) ) { thisInnerRow = jQuery( this ); InnerRowCID = thisInnerRow.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( InnerRowCID ); // Clone inner row if ( 'undefined' !== typeof innerRowView ) { innerRowView.cloneNestedRow( '', columnAttributes.cid ); } } } ); } ); // Update spacing for columns. rowView.setRowData(); } ); FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned_section ); FusionEvents.trigger( 'fusion-content-changed' ); this._refreshJs( containerAttributes.cid ); }, /** * Adds a child view. * * @param {Object} element - The element model. * @return {void} */ addChildView: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements }; view = new FusionPageBuilder.RowView( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( this.$el.find( '.fusion-builder-container-content' ).length ) { this.$el.find( '.fusion-builder-container-content' ).append( view.render().el ); } else { this.$el.find( '> .fusion-builder-add-element' ).hide().end().append( view.render().el ); } // Add parent view to inner rows that have been converted from shortcodes if ( 'manually' === element.get( 'created' ) && 'row_inner' === element.get( 'element_type' ) ) { element.set( 'view', FusionPageBuilderViewManager.getView( element.get( 'parent' ) ), { silent: true } ); } }, /** * Appends model children. * * @since 2.0.0 * @return {void} */ appendChildren: function() { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( '.fusion-builder-container-content' ).append( view.$el ); view.delegateEvents(); view.delegateChildEvents(); view.droppableColumn(); } ); }, /** * Triggers event to reinit sticky container properties. * * @since 3.0 * @return {void} */ reInitSticky: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-reinit-sticky', this.model.attributes.cid ); }, /** * Set empty spacing for legacy and re-render. * * @since 3.0.0 * @return {void} */ setEmptySpacing: function() { var params = this.model.get( 'params' ); params.flex_column_spacing = '0px'; this.model.set( 'params', params ); }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {string} paramName - The name of the parameter that changed. * @param {mixed} paramValue - The value of the option that changed. * @param {Object} event - The event triggering the option change. * @return {void} */ onOptionChange: function( paramName, paramValue, event ) { var reInitDraggables = false, dimensionType = _.find( [ 'spacing_', 'margin_', 'padding_' ], function( type ) { return paramName.includes( type ); } ); // Reverted to history step or user entered value manually. if ( 'undefined' === typeof event || ( 'undefined' !== typeof event && ( 'change' !== event.type || ( 'change' === event.type && 'undefined' !== typeof event.srcElement ) ) ) ) { reInitDraggables = true; } if ( dimensionType ) { this.model.attributes.params[ paramName ] = paramValue; if ( true === reInitDraggables ) { if ( 'padding_' === dimensionType ) { this.destroyPaddingResizable(); this.paddingDrag(); } else { this.destroyMarginResizable(); this.marginDrag(); } } } switch ( paramName ) { case 'admin_label': this.model.attributes.params[ paramName ] = paramValue.replace( /[[\]]+/g, '' ); break; // Changing between legacy and flex. case 'type': this.model.attributes.params[ paramName ] = paramValue; this.values.type = paramValue; this.reRenderRows(); this.updateResponsiveSetup(); break; // Sticky options. case 'sticky': case 'sticky_devices': case 'sticky_height': case 'sticky_offset': case 'sticky_transition_offset': case 'scroll_offset': this._reInitSticky(); break; // Changing options which alter row if in flex mode. case 'flex_column_spacing': this._updateInnerStyles(); break; case 'absolute': if ( 'on' === paramValue && ! this.$el.hasClass( 'fusion-builder-absolute-container-wrapper' ) ) { this.$el.addClass( 'fusion-builder-absolute-container-wrapper' ); } else if ( 'off' === paramValue && this.$el.hasClass( 'fusion-builder-absolute-container-wrapper' ) ) { this.$el.removeClass( 'fusion-builder-absolute-container-wrapper' ); } break; } }, /** * Re-renders the rows. * * @since 3.0 * @return {void} */ reRenderRows: function() { var rows = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); // TODO: check this for performance. Ideally we just update params, not re-render row. _.each( rows, function( row ) { row.modeChange(); } ); }, /** * Updates the styles inside container. * * @since 3.0 * @return {void} */ updateInnerStyles: function() { var rows = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( rows, function( row ) { row.updateInnerStyles(); } ); }, /** * Updates responsive setup. * * @since 3.0 * @return {void} */ updateResponsiveSetup: function() { var $settings = jQuery( '.fusion_builder_module_settings' ); this.isFlex() ? $settings.addClass( 'has-flex' ) : $settings.removeClass( 'has-flex' ); }, /** * Gets the contents of the container. * * @since 2.0.0 * @return {string} */ getContent: function() { var shortcode = ''; shortcode += FusionPageBuilderApp.generateElementShortcode( this.$el, true ); this.$el.find( '.fusion_builder_row' ).each( function() { var $thisRow = jQuery( this ); shortcode += '[fusion_builder_row]'; $thisRow.find( '.fusion-builder-column-outer' ).each( function() { var $thisColumn = jQuery( this ), columnCID = $thisColumn.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent(); } ); shortcode += '[/fusion_builder_row]'; } ); shortcode += '[/fusion_builder_container]'; return shortcode; }, /** * Get the save label. * * @since 2.0.0 * @return {string} */ getSaveLabel: function() { return fusionBuilderText.save_section; }, /** * Returns the 'sections' string. * * @since 2.0.0 * @return {string} */ getCategory: function() { return 'sections'; }, /** * Handle margin adjustments on drag. * * @since 2.0.0 * @return {void} */ marginDrag: function() { var $el = this.$el, self = this, directions = { top: 's', bottom: 's' }, parentWidth = $el.closest( '.fusion-row, .fusion-builder-live-editor' ).width(); if ( this.$el.hasClass( 'active' ) ) { return; } _.each( directions, function( handle, direction ) { var optionKey = FusionApp.getResponsiveOptionKey( 'margin_' + direction, self.isFlex() ), actualDimension = self.values[ optionKey ] || self.values[ 'margin_' + direction ], percentSpacing = false; percentSpacing = actualDimension && actualDimension.includes( '%' ); if ( percentSpacing ) { // Get actual dimension and set. actualDimension = ( parentWidth / 100 ) * parseFloat( actualDimension ); $el.find( '.fusion-container-margin-' + direction ).css( 'height', actualDimension ); if ( 'bottom' === direction && 20 > actualDimension ) { $el.find( '.fusion-container-margin-bottom, .fusion-container-padding-bottom' ).addClass( 'fusion-overlap' ); } } $el.find( '.fusion-container-margin-' + direction ).css( 'display', 'block' ); $el.find( '.fusion-container-margin-' + direction ).height( actualDimension ); $el.find( '.fusion-container-margin-' + direction ).resizable( { handles: handle, minHeight: 0, minWidth: 0, grid: ( percentSpacing ) ? [ parentWidth / 100, 10 ] : '', create: function() { if ( 'bottom' === direction ) { if ( 20 > parseInt( actualDimension, 10 ) && ! percentSpacing ) { $el.find( '.fusion-container-margin-bottom, .fusion-container-padding-bottom' ).addClass( 'fusion-overlap' ); } else { $el.find( '.fusion-container-margin-bottom, .fusion-container-padding-bottom' ).removeClass( 'fusion-overlap' ); } } }, resize: function( event, ui ) { var optionKey = FusionApp.getResponsiveOptionKey( 'margin_' + direction, self.isFlex() ), actualDimension = self.values[ optionKey ] || 0, percentSpacing = false, value = 'top' === direction || 'bottom' === direction ? ui.size.height : ui.size.width; jQuery( ui.element ).addClass( 'active' ); // Recheck in case unit is changed in the modal. percentSpacing = actualDimension && actualDimension.includes( '%' ); jQuery( ui.element ).closest( '.fusion-builder-container' ).addClass( 'active' ); value = 0 > value ? 0 : value; value = value + 'px'; if ( percentSpacing ) { value = 0 === parseFloat( value ) ? '0%' : Math.round( parseFloat( parseFloat( value ) / ( parentWidth / 100 ) ) ) + '%'; } // Bottom margin overlap if ( 'bottom' === direction ) { if ( 20 > ui.size.height ) { jQuery( ui.element ).addClass( 'fusion-overlap' ); $el.find( '.fusion-container-padding-bottom' ).addClass( 'fusion-overlap' ); } else { jQuery( ui.element ).removeClass( 'fusion-overlap' ); $el.find( '.fusion-container-padding-bottom' ).removeClass( 'fusion-overlap' ); } } // Legacy update. if ( ! self.isFlex() ) { $el.find( '.fusion-fullwidth' ).css( 'margin-' + direction, value ); } jQuery( ui.element ).find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).addClass( 'active' ); jQuery( ui.element ).find( '.fusion-spacing-tooltip' ).text( value ); // Update open modal. self.updateDragSettings( '#' + optionKey, value ); }, stop: function( event, ui ) { jQuery( ui.element ).removeClass( 'active' ); jQuery( ui.element ).closest( '.fusion-builder-container' ).removeClass( 'active' ); // Delete all spacing resizable within because parent width has changed. if ( jQuery( ui.element ).closest( '.fusion-builder-container' ).find( '.fusion-column-spacing .ui-resizable' ).length ) { jQuery( ui.element ).closest( '.fusion-builder-container' ).find( '.fusion-column-spacing .ui-resizable' ).resizable( 'destroy' ); } } } ); } ); }, /** * Checks if the container needs to run through legacy conversion. * * @since 3.0.0 * @return {boolean} */ needsLegacyConversion: function() { var params = this.model.get( 'params' ); return 'undefined' === typeof params.type; }, /** * Handle padding adjustments on drag. * * @since 2.0.0 * @return {void} */ paddingDrag: function() { var $el = this.$el, self = this, directions = { top: 's', right: 'w', bottom: 's', left: 'e' }, parentWidth = $el.closest( '.fusion-row, .fusion-builder-live-editor' ).width(), defaults, extras; if ( this.$el.hasClass( 'active' ) ) { return; } defaults = fusionAllElements.fusion_builder_container.defaults; extras = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.extras ); // If 100 page template. if ( FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && 'undefined' !== typeof extras.container_padding_100 ) { defaults.padding_right = extras.container_padding_100.right; defaults.padding_left = extras.container_padding_100.left; } _.each( directions, function( handle, direction ) { var optionKey = FusionApp.getResponsiveOptionKey( 'padding_' + direction, self.isFlex() ), actualDimension = self.values[ optionKey ] || self.values[ 'padding_' + direction ], percentSpacing = false; if ( ! actualDimension ) { actualDimension = defaults[ optionKey ] || 0; } // Check if using a percentage. percentSpacing = actualDimension && actualDimension.includes( '%' ); if ( percentSpacing ) { // Get actual dimension and set. actualDimension = ( parentWidth / 100 ) * parseFloat( actualDimension ); if ( 'top' === direction || 'bottom' === direction ) { $el.find( '.fusion-container-padding-' + direction ).css( 'height', actualDimension ); } else { $el.find( '.fusion-container-padding-' + direction ).css( 'width', actualDimension ); } if ( 'top' === direction && 20 > actualDimension ) { $el.find( '.fusion-container-margin-top, .fusion-container-padding-top' ).addClass( 'fusion-overlap' ); } } $el.find( '.fusion-container-padding-' + direction ).css( 'display', 'block' ); if ( 'top' === direction || 'bottom' === direction ) { $el.find( '.fusion-container-padding-' + direction ).height( actualDimension ); } else { $el.find( '.fusion-container-padding-' + direction ).width( actualDimension ); } $el.find( '.fusion-container-padding-' + direction ).resizable( { handles: handle, minHeight: 0, minWidth: 0, create: function() { if ( 'top' === direction ) { if ( 20 > parseInt( actualDimension, 10 ) && ! percentSpacing ) { $el.find( '.fusion-container-margin-top, .fusion-container-padding-top' ).addClass( 'fusion-overlap' ); } else { $el.find( '.fusion-container-margin-top, .fusion-container-padding-top' ).removeClass( 'fusion-overlap' ); } } }, resize: function( event, ui ) { var optionKey = FusionApp.getResponsiveOptionKey( 'padding_' + direction, self.isFlex() ), actualDimension = self.values[ optionKey ], percentSpacing = false, value = 'top' === direction || 'bottom' === direction ? ui.size.height : ui.size.width; percentSpacing = actualDimension && actualDimension.includes( '%' ); jQuery( ui.element ).addClass( 'active' ); jQuery( ui.element ).closest( '.fusion-builder-container' ).addClass( 'active' ); value = 0 > value ? 0 : value; value = value + 'px'; if ( percentSpacing ) { value = 0 === parseFloat( value ) ? '0%' : Math.round( parseFloat( parseFloat( value ) / ( parentWidth / 100 ) ) ) + '%'; } // Top padding overlap if ( 'top' === direction ) { if ( 20 > ui.size.height ) { jQuery( ui.element ).addClass( 'fusion-overlap' ); $el.find( '.fusion-container-margin-top' ).addClass( 'fusion-overlap' ); } else { jQuery( ui.element ).removeClass( 'fusion-overlap' ); $el.find( '.fusion-container-margin-top' ).removeClass( 'fusion-overlap' ); } } // Set values and width. $el.find( '.fusion-fullwidth' ).css( 'padding-' + direction, value ); jQuery( ui.element ).find( '.fusion-spacing-tooltip, .fusion-column-spacing' ).addClass( 'active' ); jQuery( ui.element ).find( '.fusion-spacing-tooltip' ).text( value ); // Update open modal. self.updateDragSettings( '#' + optionKey, value ); }, stop: function( event, ui ) { jQuery( ui.element ).removeClass( 'active' ); jQuery( ui.element ).closest( '.fusion-builder-container' ).removeClass( 'active' ); // Delete all spacing resizable within because parent width has changed. if ( jQuery( ui.element ).closest( '.fusion-builder-container' ).find( '.fusion-column-spacing .ui-resizable' ).length ) { jQuery( ui.element ).closest( '.fusion-builder-container' ).find( '.fusion-column-spacing .ui-resizable' ).resizable( 'destroy' ); } } } ); } ); }, /** * Destroy container resizable. * * @since 2.0.0 * @return {void} */ destroyResizable: function() { this.destroyMarginResizable(); this.destroyPaddingResizable(); }, /** * Destroy container margin resizable. * * @since 2.0.0 * @return {void} */ destroyMarginResizable: function() { var $containerSpacer = this.$el.find( '.fusion-container-margin-top, .fusion-container-margin-bottom' ); jQuery.each( $containerSpacer, function( index, spacer ) { if ( jQuery( spacer ).hasClass( 'ui-resizable' ) ) { jQuery( spacer ).resizable( 'destroy' ); jQuery( spacer ).hide(); } } ); }, /** * Destroy container padding resizable. * * @since 2.0.0 * @return {void} */ destroyPaddingResizable: function() { var $containerSpacer = this.$el.find( '.fusion-container-padding-top, .fusion-container-padding-right, .fusion-container-padding-bottom, .fusion-container-padding-left' ); jQuery.each( $containerSpacer, function( index, spacer ) { if ( jQuery( spacer ).hasClass( 'ui-resizable' ) ) { jQuery( spacer ).resizable( 'destroy' ); jQuery( spacer ).hide(); } } ); }, /** * Filter out DOM before patching. * * @since 2.0.0 * @return {void} */ patcherFilter: function( diff ) { var filteredDiff = [], self = this; self.reInitDraggables = false; _.each( diff, function( info ) { if ( 'removeElement' === info.action ) { if ( 'undefined' !== typeof info.element.attributes && 'undefined' !== typeof info.element.attributes[ 'class' ] && -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-fullwidth' ) ) { self.reInitDraggables = true; filteredDiff.push( info ); } else if ( 'undefined' !== typeof info.element.attributes && 'undefined' !== typeof info.element.attributes[ 'class' ] && -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-container-spacing' ) ) { // Ignore. } else { filteredDiff.push( info ); } } else if ( 'addElement' === info.action ) { if ( 'undefined' !== typeof info.element.attributes && 'undefined' !== typeof info.element.attributes[ 'class' ] && -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-container-spacing' ) ) { // Ignore. } else { filteredDiff.push( info ); } } else { filteredDiff.push( info ); } } ); return filteredDiff; }, /** * Handle container name edit in wireframe mode. * * @since 2.0.0 * @return {void} */ renameContainer: function( event ) { // Detect "enter" key var code, model, input, fusionHistoryState; code = event.keyCode || event.which; if ( 13 == code ) { // jshint ignore:line event.preventDefault(); this.$el.find( '.fusion-builder-section-name' ).blur(); return false; } fusionHistoryState = fusionBuilderText.edited + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element; model = this.model; input = this.$el.find( '.fusion-builder-section-name' ); clearTimeout( this.typingTimer ); this.typingTimer = setTimeout( function() { model.attributes.params.admin_label = input.val().replace( /[[\]]+/g, '' ); FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionHistoryState ); }, this.doneTypingInterval ); }, /** * Handle container toggle in wireframe mode. * * @since 2.0.0 * @return {void} */ toggleContainer: function( event ) { var thisEl = jQuery( event.currentTarget ), fusionHistoryState; if ( event ) { event.preventDefault(); } this.$el.toggleClass( 'fusion-builder-section-folded' ); thisEl.find( 'span' ).toggleClass( 'fusiona-caret-up' ).toggleClass( 'fusiona-caret-down' ); if ( this.$el.hasClass( 'fusion-builder-section-folded' ) ) { this.model.attributes.params.admin_toggled = 'yes'; } else { this.model.attributes.params.admin_toggled = 'no'; } fusionHistoryState = fusionBuilderText.edited + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element; FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionHistoryState ); }, scrollHighlight: function() { var $trigger = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-one-page-text-link' ), $el = this.$el; setTimeout( function() { if ( $trigger.length && 'function' === typeof $trigger.fusion_scroll_to_anchor_target ) { $trigger.attr( 'href', '#fusion-container-' + this.model.get( 'cid' ) ).fusion_scroll_to_anchor_target( 15 ); } $el.find( '> .fusion-column-wrapper' ).addClass( 'fusion-active-highlight' ); setTimeout( function() { $el.find( '> .fusion-column-wrapper' ).removeClass( 'fusion-active-highlight' ); }, 6000 ); }, 10 ); }, publish: function( event ) { var cid = jQuery( event.currentTarget ).data( 'cid' ), view = FusionPageBuilderViewManager.getView( cid ), params = view.model.get( 'params' ); FusionApp.confirmationPopup( { title: fusionBuilderText.container_publish, content: fusionBuilderText.are_you_sure_you_want_to_publish, actions: [ { label: fusionBuilderText.no, classes: 'no', callback: function() { FusionApp.confirmationPopup( { action: 'hide' } ); } }, { label: fusionBuilderText.yes, classes: 'yes', callback: function() { params.status = 'published'; view.model.set( 'params', params ); view.$el.find( 'a[data-cid="' + cid + '"].fusion-builder-publish-tooltip' ).remove(); FusionEvents.trigger( 'fusion-history-turn-on-tracking' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.container_published ); FusionEvents.trigger( 'fusion-content-changed' ); FusionApp.confirmationPopup( { action: 'hide' } ); } } ] } ); }, unglobalize: function( event ) { var cid = jQuery( event.currentTarget ).data( 'cid' ), view = FusionPageBuilderViewManager.getView( cid ), params = view.model.get( 'params' ); event.preventDefault(); FusionApp.confirmationPopup( { title: fusionBuilderText.remove_global, content: fusionBuilderText.are_you_sure_you_want_to_remove_global, actions: [ { label: fusionBuilderText.no, classes: 'no', callback: function() { FusionApp.confirmationPopup( { action: 'hide' } ); } }, { label: fusionBuilderText.yes, classes: 'yes', callback: function() { // Remove global attributes. delete params.fusion_global; view.model.set( 'params', params ); view.$el.removeClass( 'fusion-global-container fusion-global-column fusion-global-nested-row fusion-global-element fusion-global-parent-element' ); view.$el.find( 'a[data-cid="' + cid + '"].fusion-builder-unglobal-tooltip' ).remove(); view.$el.removeAttr( 'fusion-global-layout' ); FusionEvents.trigger( 'fusion-history-turn-on-tracking' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.removed_global ); FusionEvents.trigger( 'fusion-content-changed' ); FusionApp.confirmationPopup( { action: 'hide' } ); } } ] } ); }, /** * Fires when preview are is resized. * * @since 3.0 * @return {void} */ onPreviewResize: function() { if ( ! this.isFlex() ) { return; } if ( this.$el.hasClass( 'fusion-builder-element-edited' ) ) { this.updateDragHandles(); } }, setResponsiveContainerStyles: function() { var self = this, extras = jQuery.extend( true, {}, fusionAllElements.fusion_builder_column.extras ), minHeightKey; this.responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var containerStyles = '', paddingKey, spacingKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Padding. paddingKey = 'padding_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== self.values[ paddingKey ] ) { containerStyles += 'padding-' + direction + ' : ' + _.fusionGetValueWithUnit( self.values[ paddingKey ] ) + ' !important;'; } if ( 'left' === direction || 'right' === direction ) { return; } // Margin. spacingKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== self.values[ spacingKey ] ) { containerStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( self.values[ spacingKey ] ) + ';'; } } ); // Minimum height. if ( 'min' === self.values.hundred_percent_height ) { minHeightKey = 'large' === size ? 'min_height' : 'min_height_' + size; if ( '' !== self.values[ minHeightKey ] ) { if ( -1 !== self.values[ minHeightKey ].indexOf( '%' ) ) { self.values[ minHeightKey ] = self.values[ minHeightKey ].replace( '%', 'vh' ); } containerStyles += 'min-height:' + _.fusionGetValueWithUnit( self.values[ minHeightKey ] ) + ';'; } } if ( '' === containerStyles ) { return; } // Wrap CSS selectors if ( '' !== containerStyles ) { containerStyles = '.fusion-body:not(.fusion-builder-ui-wireframe) #fusion-container-' + self.model.get( 'cid' ) + ' > .fusion-fullwidth {' + containerStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { self.responsiveStyles += containerStyles; } else { // Medium and Small size screen styles. self.responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + containerStyles + '}'; } } ); }, /** * Updates column sizes controls. * * @since 3.0 * @return {void} */ updateDragHandles: function() { this.destroyResizable(); this.marginDrag(); this.paddingDrag(); }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.video_mp4 ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.videos[ values.video_mp4 ] ) { FusionPageBuilderApp.mediaMap.videos[ values.video_mp4 ] = true; } } } } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Container View FusionPageBuilder.StudioImportModalView = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-studio-import-modal' ).html() ), className: 'fusion-builder-studio-import-modal', events: { 'click .awb-admin-modal-corner-close': 'closeModal' }, /** * Renders the view. * * @since 3.5.0 * @return {Object} this */ render: function() { this.$el.html( this.template() ); return this; }, /** * Updates modal status. * * @since 3.5.0 * @param {String} status - New status text. * @return {void} */ updateStatus: function( status ) { this.$el.find( '.awb-admin-modal-status-bar .awb-admin-modal-status-bar-label' ).html( status ); }, /** * Updates modal progress. * * @since 3.5.0 * @param {Object} avadaMedia - Avada Media object, all things we need to import. * @param {String} currentImportKey - Object key which is currently being imported. * @return {void} */ updateProgressBar: function( avadaMedia, currentImportKey ) { var mediaKeys = Object.keys( avadaMedia ), progress = ( mediaKeys.indexOf( currentImportKey ) + 1 ) / mediaKeys.length; this.$el.find( '.awb-admin-modal-status-bar .awb-admin-modal-status-bar-progress-bar' ).css( 'width', ( 100 * progress ) + '%' ); }, /** * Remove the view. * * @since 3.5.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ closeModal: function( event ) { if ( event ) { event.preventDefault(); } this.remove(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionPageBuilderViewManager, fusionBuilderText, fusionAllElements, FusionEvents */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Container View FusionPageBuilder.ContextMenuView = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-context-menu' ).html() ), className: 'fusion-builder-context-menu', events: { 'click [data-action="edit"]': 'editTrigger', 'click [data-action="save"]': 'saveTrigger', 'click [data-action="clone"]': 'cloneTrigger', 'click [data-action="remove"]': 'removeTrigger', 'click [data-action="copy"]': 'copy', 'click [data-action="paste-before"]': 'pasteBefore', 'click [data-action="paste-after"]': 'pasteAfter', 'click [data-action="paste-start"]': 'pasteStart', 'click [data-action="paste-end"]': 'pasteEnd' }, /** * Initialize the builder sidebar. * * @since 2.0.0 * @return {void} */ initialize: function() { this.copyData = { data: { type: false, content: false } }; this.getCopy(); this.elWidth = 130; this.elHeight = 257; }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var leftOffset = this.model.event.pageX, topOffset = this.model.event.pageY; this.$el.html( this.template( jQuery.extend( true, this.copyData, this.model.parent.attributes ) ) ); if ( this.model.event.pageX + this.elWidth > jQuery( '#fb-preview' ).width() ) { leftOffset = jQuery( '#fb-preview' ).width() - this.elWidth; } if ( this.model.event.pageY + this.elHeight > jQuery( jQuery( '#fb-preview' )[ 0 ].contentWindow.document ).height() ) { topOffset = jQuery( jQuery( '#fb-preview' )[ 0 ].contentWindow.document ).height() - this.elHeight; } this.$el.css( { top: ( topOffset ) + 'px', left: ( leftOffset ) + 'px' } ); return this; }, /** * Trigger edit on relavent element. * * @since 2.0.0 */ editTrigger: function( event ) { if ( 'fusion_builder_row_inner' === this.model.parent.attributes.element_type ) { if ( FusionPageBuilderApp.wireframeActive ) { this.model.parentView.editNestedColumn( event ); } else { this.model.parentView.editRow( event ); } } else { this.model.parentView.settings( event ); } }, /** * Trigger save on relavent element. * * @since 2.0.0 */ saveTrigger: function( event ) { this.model.parentView.openLibrary( event ); }, /** * Trigger clone on relavent element. * * @since 2.0.0 */ cloneTrigger: function( event ) { switch ( this.model.parent.attributes.element_type ) { case 'fusion_builder_container': this.model.parentView.cloneContainer( event ); break; case 'fusion_builder_column_inner': case 'fusion_builder_column': this.model.parentView.cloneColumn( event ); break; case 'fusion_builder_row_inner': this.model.parentView.cloneNestedRow( event ); break; default: this.model.parentView.cloneElement( event ); break; } }, /** * Trigger remove on relavent element. * * @since 2.0.0 */ removeTrigger: function( event ) { switch ( this.model.parent.attributes.element_type ) { case 'fusion_builder_container': this.model.parentView.removeContainer( event ); break; case 'fusion_builder_column_inner': case 'fusion_builder_column': this.model.parentView.removeColumn( event ); break; case 'fusion_builder_row_inner': this.model.parentView.removeRow( event ); break; default: this.model.parentView.removeElement( event ); break; } }, /** * Copy the element. * * @since 2.0.0 */ copy: function() { var type = this.model.parent.attributes.element_type, content = this.model.parentView.getContent(), $temp = jQuery( '<textarea>' ), data; // Copy to actual clipboard, handy for pasting. jQuery( 'body' ).append( $temp ); $temp.val( content ).select(); document.execCommand( 'copy' ); $temp.remove(); data = { type: type, content: content }; this.storeCopy( data ); }, /** * Stored copy data. * * @since 2.0.0 * @return {void} */ storeCopy: function( data ) { if ( 'undefined' !== typeof Storage ) { localStorage.setItem( 'fusionCopyContent', data.content ); localStorage.setItem( 'fusionCopyType', data.type ); this.getCopy(); } }, /** * Get stored data. * * @since 2.0.0 * @return {void} */ getCopy: function() { if ( 'undefined' !== typeof Storage ) { if ( localStorage.getItem( 'fusionCopyContent' ) ) { this.copyData.data.content = localStorage.getItem( 'fusionCopyContent' ); this.copyData.data.type = localStorage.getItem( 'fusionCopyType' ); } } }, /** * Paste after element. * * @since 2.0.0 */ pasteAfter: function() { this.paste( 'after' ); }, /** * Paste before element. * * @since 2.0.0 */ pasteBefore: function() { this.paste( 'before' ); }, /** * Paste child to start. * * @since 2.0.0 */ pasteStart: function() { this.paste( 'start' ); }, /** * Paste child to end. * * @since 2.0.0 */ pasteEnd: function() { this.paste( 'end' ); }, /** * Paste after element. * * @since 2.0.0 */ paste: function( position ) { var data = this.copyData.data, type = data.type, content = data.content, elType = FusionPageBuilderApp.getElementType( type ), target = false, parentId, parentView, rowView; if ( 'after' === position || 'before' === position ) { parentId = this.model.parent.attributes.parent; target = this.model.parentView.$el; // If container, the parentId is self. if ( 'fusion_builder_container' === this.model.parent.attributes.type ) { parentId = this.model.parent.attributes.cid; FusionPageBuilderApp.targetContainerCID = this.model.parent.attributes.cid; } } else { parentId = this.model.parent.attributes.cid; target = false; // If this is a container and we are inserting a column, the parent is actually the row. if ( 'fusion_builder_container' === this.model.parent.attributes.type ) { parentId = this.model.parentView.$el.find( '.fusion-builder-row-container' ).first().data( 'cid' ); } } FusionPageBuilderApp.shortcodesToBuilder( content, parentId, false, false, target, position ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.pasted + ' ' + fusionAllElements[ type ].name + ' ' + fusionBuilderText.element ); FusionEvents.trigger( 'fusion-content-changed' ); // If its a column, get the parent column and update. if ( 'fusion_builder_column' === type || 'fusion_builder_column_inner' === type ) { rowView = FusionPageBuilderViewManager.getView( parentId ); if ( rowView ) { rowView.createVirtualRows(); rowView.updateColumnsPreview(); } } // If its a child element, the parent need to re-render. if ( 'child_element' === elType ) { if ( 'after' === position || 'before' === position ) { parentView = FusionPageBuilderViewManager.getView( parentId ); parentView.render(); } else { this.model.parentView.render(); } } // If its an element the column needs rebuilt. if ( 'element' === elType || 'parent_element' === elType ) { parentView = FusionPageBuilderViewManager.getView( parentId ); if ( parentView ) { parentView._equalHeights( parentView.model.attributes.parent ); } } // Handle multiple global elements. window.fusionGlobalManager.handleMultiGlobal( { currentModel: this.model.parentView.model, handleType: 'save', attributes: this.model.parentView.model } ); }, /** * Remove context meny.. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeMenu: function( event ) { if ( event ) { event.preventDefault(); } // Remove reference in builder app. FusionPageBuilderApp.contextMenuView = false; this.remove(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionAllElements, FusionEvents, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Container View FusionPageBuilder.ContextMenuInlineView = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-context-menu-inline' ).html() ), className: 'fusion-builder-context-menu fusion-builder-inline-context-menu', events: { 'click [data-action="edit"]': 'editShortcodeInline', 'click [data-action="remove-node"]': 'removeNode', 'click [data-action="remove-style"]': 'removeStyle' }, /** * Initialize inline context menu. * * @since 2.0.0 * @return {void} */ initialize: function() { this.elWidth = 105; this.elHeight = 36; }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var leftOffset = this.model.event.pageX, topOffset = this.model.event.pageY, $element = this.model.$target.find( ' > *' ), elementOffset = $element.offset(), self = this; topOffset = elementOffset.top - this.elHeight - 20; leftOffset = elementOffset.left + ( ( $element.width() - this.elWidth ) / 2 ); this.$el.html( this.template( this.model.attributes ) ); this.$el.css( { top: ( topOffset ) + 'px', left: ( leftOffset ) + 'px' } ); setTimeout( function() { self.$el.addClass( 'fusion-builder-inline-context-menu-loaded' ); }, 50 ); return this; }, /** * Edit a shortcode within this element content. * * @since 2.0.0 * @param {Object} event - The event triggering the callback. * @return {void} */ editShortcodeInline: function( event ) { if ( event ) { event.preventDefault(); } FusionPageBuilderApp.inlineEditorHelpers.getInlineElementSettings( this.model ); }, /** * Remove entire node. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeNode: function( event ) { var $editor, content, param, params = this.model.parentView.model.get( 'params' ), editorInstance; if ( event ) { event.preventDefault(); } $editor = this.model.$target.closest( '.fusion-live-editable' ); this.model.$target.remove(); editorInstance = FusionPageBuilderApp.inlineEditors.getEditor( $editor.data( 'medium-editor-editor-index' ) ); if ( 'undefined' !== typeof editorInstance ) { content = editorInstance.getContent(); } else { content = $editor.html(); } param = $editor.data( 'param' ), // Fix for inline font family style. content = content.replace( /"/g, '\'' ); // Adds in any inline shortcodes. content = FusionPageBuilderApp.htmlToShortcode( content, this.model.parentView.model.get( 'cid' ) ); params[ param ] = content; this.model.parentView.model.set( 'params', params ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); }, /** * Remove styling only. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeStyle: function( event ) { if ( event ) { event.preventDefault(); } FusionPageBuilderApp.inlineEditorHelpers.removeStyle( this.model ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); }, /** * Remove context meny.. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeMenu: function( event ) { if ( event ) { event.preventDefault(); } // Remove reference in builder app. FusionPageBuilderApp.contextMenuView = false; this.remove(); } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, FusionEvents, fusionAllElements, FusionPageBuilderViewManager, fusionGlobalManager, fusionBuilderText, FusionPageBuilderElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element View FusionPageBuilder.ElementView = FusionPageBuilder.BaseView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-element-template' ).html() ), className: 'fusion-builder-live-element fusion-builder-data-cid', events: { 'click .fusion-builder-remove': 'removeElement', 'click .fusion-builder-clone': 'cloneElement', 'click .fusion-builder-settings': 'settings', 'click .fusion-builder-container-save': 'openLibrary', 'click .fusion-builder-element-save': 'openLibrary', 'click .fusion-builder-element-content a:not(.fusion-lightbox):not(.rs_error_message_button)': 'disableLink', 'click .fusion-builder-element-drag': 'preventDefault', 'click .fusion-tb-source': 'openDynamicSourcePO' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { var elementType, inlineElements = [ 'fusion_button', 'fusion_fontawesome', 'fusion_imageframe', 'fusion_text' ]; this.model.inlineCollection = new FusionPageBuilder.Collection(); elementType = this.model.get( 'element_type' ); this.renderedYet = FusionPageBuilderApp.reRenderElements; // If triggering a view update. this.listenTo( FusionEvents, 'fusion-view-update', this.reRender ); this.listenTo( FusionEvents, 'fusion-view-update-' + this.model.get( 'cid' ), this.reRender ); // If there is a template. if ( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).length ) { this.model.set( 'noTemplate', false ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).html() ); } else { this.model.set( 'noTemplate', true ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_shortcode-shortcode' ).html() ); } this.model.set( 'editLabel', this.getEditLabel() ); this.elementIsCloning = false; this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.attr( 'data-type', elementType ); if ( 'undefined' !== typeof fusionAllElements[ elementType ].components_per_template && 1 === fusionAllElements[ elementType ].components_per_template ) { this.$el.attr( 'data-cloning-disabled', 1 ); } if ( -1 !== jQuery.inArray( elementType, inlineElements ) ) { this.$el.addClass( 'fusion-builder-live-element-inline' ); } if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-element' ).addClass( 'fusion-global-element' ); } // JQuery trigger. this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); // Make sure the ajax callbacks are not repeated. this._triggerCallback = _.debounce( _.bind( this.triggerCallback, this ), 200 ); this._updateResponsiveTypography = _.debounce( _.bind( this.updateResponsiveTypography, this ), 200 ); // Undo/redo functionality. this._triggerColumn = _.debounce( _.bind( this.triggerColumn, this ), 300 ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); // Check if query_data is not set and element has callback. this.needsQuery(); this.baseInit(); this.onInit(); // If inlne editing with overrides. this.activeInlineEditing = false; this.autoSelectEditor = false; this.model.set( 'inlineEditors', [] ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; FusionPageBuilderApp.disableDocumentWrite(); this.beforeRender(); this.$el.html( this.template( this.model.attributes ) ); this.renderContent(); if ( this.renderedYet ) { this._refreshJs(); // Update column trigger. this.triggerColumn(); setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-typography-reset', self.model.get( 'cid' ) ); if ( 800 > jQuery( '#fb-preview' ).width() ) { self._updateResponsiveTypography(); } }, 100 ); } this.onRender(); this.needsGoogle(); this.renderedYet = true; FusionPageBuilderApp.enableDocumentWrite(); setTimeout( function() { self.droppableElement(); if ( ! self.activeInlineEditing ) { FusionPageBuilderApp.inlineEditorHelpers.liveEditorEvent( self ); self.activeInlineEditing = false; } if ( FusionPageBuilderApp.inlineEditorHelpers.inlineEditorAllowed( self.model.get( 'element_type' ) ) ) { self.renderInlineSettings(); } }, 100 ); return this; }, /** * Re-Renders the view. * * @since 2.0.0 * @param {Object} event - The event triggering the rerender. * @param {string} param - Param being changed if any. * @return {void} */ reRender: function( event ) { var self = this, element = fusionAllElements[ this.model.get( 'element_type' ) ]; if ( event && 'object' === typeof event ) { event.preventDefault(); } // If element has query callback and no data yet, then fire. if ( 'undefined' !== typeof element.callback && 'undefined' === typeof this.model.get( 'query_data' ) ) { this.triggerQuery( element.callback ); return; } // Neither of above, then just patchView. this.patchView( event ); setTimeout( function() { self.droppableElement(); if ( ! self.activeInlineEditing ) { FusionPageBuilderApp.inlineEditorHelpers.liveEditorEvent( self ); } self.activeInlineEditing = false; }, 100 ); }, /** * Determines if the element is part of a flex column or not. * * @since 2.0.0 * @return {void} */ flexDisplay: function() { var container = FusionPageBuilderApp.getParentContainer( this ), column = FusionPageBuilderApp.getParentColumn( this ), params = {}, columnBlock = false; if ( column ) { params = column.model.get( 'params' ); columnBlock = 'undefined' !== typeof params.content_layout && 'block' === params.content_layout; } return container && container.isFlex() && ! columnBlock; }, /** * Triggers extra query when needed. * * @since 2.0.0 * @return {void} */ needsQuery: function() { var element = fusionAllElements[ this.model.get( 'element_type' ) ], callbackFunction; // Check for callback set. if ( 'undefined' !== typeof element.callback && 'undefined' === typeof this.model.get( 'query_data' ) && 'undefined' === typeof this.model.get( 'markup' ) ) { callbackFunction = element.callback; this.triggerQuery( callbackFunction ); } // Check for element without template and set shortcode for render function. if ( this.model.get( 'noTemplate' ) && 'undefined' === typeof this.model.get( 'markup' ) ) { this.model.set( 'shortcode', FusionPageBuilderApp.generateElementShortcode( this.$el ) ); } }, triggerQuery: function( callbackFunction ) { callbackFunction.args = 'undefined' === typeof callbackFunction.args ? '' : callbackFunction.args; callbackFunction.ajax = 'undefined' === typeof callbackFunction.ajax ? false : callbackFunction.ajax; callbackFunction.action = 'undefined' === typeof callbackFunction.action ? false : callbackFunction.action; callbackFunction.cid = this.model.get( 'cid' ); // If ajax trigger via debounce, else do it here and retun data. if ( callbackFunction.ajax ) { if ( 'generated_element' !== this.model.get( 'type' ) ) { FusionPageBuilderApp.shortcodeAjax = true; } this._triggerCallback( false, callbackFunction ); } }, /** * Check if element needs a google font loaded. * * @since 2.0.0 * @return {void} */ needsGoogle: function() { var variant = ':regular', $fontNodes = this.$el.find( '[data-fusion-google-font]' ), script, scriptID; if ( $fontNodes.length ) { $fontNodes.each( function() { var family = jQuery( this ).attr( 'data-fusion-google-font' ); family = family.replace( /"/g, '"' ); script = family; script += ( variant ) ? variant : ''; scriptID = script.replace( /:/g, '' ).replace( /"/g, '' ).replace( /'/g, '' ).replace( / /g, '' ).replace( /,/, '' ); if ( ! jQuery( 'head' ).find( '#' + scriptID ).length ) { jQuery( 'head' ).first().append( '<script id="' + scriptID + '">WebFont.load({google:{families:["' + script + '"]},context:FusionApp.previewWindow,active: function(){ jQuery( window ).trigger( "fusion-font-loaded"); },});</script>' ); } } ); } }, /** * Triggers for columns. * * @since 2.0.0 * @param {Object} parent The parent object. * @return {void} */ triggerColumn: function( parent ) { var parentCid = 'undefined' === typeof parent ? this.model.attributes.parent : parent; setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-content-changed', parentCid ); }, 300 ); }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var element = fusionAllElements[ this.model.get( 'element_type' ) ], templateAttributes = jQuery.extend( true, {}, this.model.attributes ), params = jQuery.extend( true, {}, this.model.get( 'params' ) ), values = {}, extras = {}; // Set values & extras if ( element && 'undefined' !== typeof element.defaults ) { values = jQuery.extend( true, {}, element.defaults, _.fusionCleanParameters( params ) ); if ( 'undefined' !== typeof element.extras ) { extras = jQuery.extend( true, {}, element.extras ); } } templateAttributes.values = values; templateAttributes.extras = extras; templateAttributes = this.getDynamicAtts( templateAttributes ); templateAttributes = this.filterTemplateAtts( templateAttributes ); return templateAttributes; }, /** * Render the content. * * @since 2.0.0 * @return {void} */ renderContent: function() { var $elementContent = this.$el.find( '.fusion-builder-element-content' ), element = fusionAllElements[ this.model.get( 'element_type' ) ], self = this, markup; // Render wireframe template self.renderWireframePreview(); // If needs query add loader and either trigger or check where triggered. if ( 'undefined' !== typeof element.callback && 'undefined' === typeof this.model.get( 'query_data' ) && true === element.callback.ajax ) { // If this is first render, use markup if it exists. if ( ! this.renderedYet && 'undefined' !== typeof this.model.get( 'markup' ) ) { markup = this.model.get( 'markup' ); $elementContent.html( markup.output + '<div class="fusion-clearfix"></div>' ); return; } this.addLoadingOverlay(); this.triggerQuery( element.callback ); return; } // Otherwise use element template $elementContent.html( self.getTemplate() ); }, /** * Removes an element. * * @since 2.0.0 * @param {Object} event The event triggering the element removal. * @return {void} */ removeElement: function( event, isAutomated ) { var parentCid = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCid; // jshint ignore: line } ), colView, MultiGlobalArgs; if ( event ) { event.preventDefault(); colView = FusionPageBuilderViewManager.getView( parentCid ); colView.$el.find( '.fusion-builder-module-controls-container a' ).trigger( 'mouseleave' ); FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); } // Hook to allow custom actions. this.beforeRemove(); // Removes scripts which have been moved to body. FusionApp.deleteScripts( this.model.get( 'cid' ) ); // Remove live editors. FusionPageBuilderApp.inlineEditorHelpers.removeLiveEditors( this ); // Remove element view FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); // Destroy element model this.model.destroy(); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); // Update column trigger. this.triggerColumn( parentCid ); this.remove(); if ( parentModel.children.length && 'undefined' === typeof isAutomated ) { // Handle multiple global elements. MultiGlobalArgs = { currentModel: parentModel.children.models[ 0 ], handleType: 'save', attributes: parentModel.children.models[ 0 ].attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); } }, /** * Opens dynamic source PO. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} * */ openDynamicSourcePO: function( event ) { // eslint-disable-line no-unused-vars if ( 'undefined' !== typeof FusionApp.sidebarView ) { FusionApp.sidebarView.openOption( 'dynamic_content_preview_type', 'po' ); } }, /** * Clones an element. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} * */ cloneElement: function( event ) { var elementAttributes, currentModel, MultiGlobalArgs; if ( event ) { event.preventDefault(); } if ( ( 'undefined' !== typeof this.$el.data( 'cloning-disabled' ) && 1 === this.$el.data( 'cloning-disabled' ) ) || true === this.elementIsCloning ) { return; } this.elementIsCloning = true; elementAttributes = jQuery.extend( true, {}, this.model.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.targetElement = this.$el; elementAttributes.at_index = FusionPageBuilderApp.getCollectionIndex( this.$el ); if ( 'undefined' !== elementAttributes.from ) { delete elementAttributes.from; } currentModel = FusionPageBuilderApp.collection.add( elementAttributes ); this.elementIsCloning = false; // Handle multiple global elements. MultiGlobalArgs = { currentModel: currentModel, handleType: 'save', attributes: currentModel.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); if ( event ) { FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); } // Update column trigger. this.triggerColumn(); }, /** * Get the content. * * @since 2.0.0 * @return {string} */ getContent: function() { return FusionPageBuilderApp.generateElementShortcode( this.$el, false ); }, /** * Get the placeholder. * * @since 2.0.0 * @return {string} */ getPlaceholder: function() { var label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; var icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; var placeholder = _.template( '<div class="fusion-builder-placeholder-preview"><i class="<%= icon %>" aria-hidden="true"></i> <%= label %></div>' ); return placeholder( { icon: icon, label: label } ); }, /** * Get component placeholder. * * @since 2.0.0 * @return {string} */ getComponentPlaceholder: function() { var placeholder = jQuery( this.getPlaceholder() ).append( '<span class="fusion-tb-source-separator"> - </span><a href="#" class="fusion-tb-source">' + fusionBuilderText.dynamic_source + '</a>' ); return placeholder[ 0 ].outerHTML; } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionEvents, FusionPageBuilderApp, fusionGlobalManager, fusionBuilderText, fusionAllElements, FusionPageBuilderViewManager, fusionMultiElements, FusionPageBuilderElements */ /* eslint no-unused-vars: 0 */ /* eslint guard-for-in: 0 */ /* eslint no-undef: 0 */ /* eslint no-empty-function: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element View FusionPageBuilder.ParentElementView = FusionPageBuilder.BaseView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-element-parent-template' ).html() ), className: 'fusion-builder-live-element fusion-builder-data-cid', events: { 'click .fusion-builder-remove': 'removeElement', 'click .fusion-builder-clone': 'cloneElement', 'click .fusion-builder-settings': 'settings', 'click .fusion-builder-add-child': 'addChildElement', 'click .fusion-builder-element-save': 'openLibrary', 'click a': 'disableLink', 'click .fusion-builder-element-drag': 'preventDefault' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.model.children = new FusionPageBuilder.Collection(); this.listenTo( this.model.children, 'add', this.addChildView ); this.emptyPlaceholderText = 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ] ? fusionBuilderText.empty_parent.replace( '%s', fusionAllElements[ this.model.get( 'element_type' ) ].name ) : ''; // If triggering a view update. this.listenTo( FusionEvents, 'fusion-view-update', this.reRender ); this.listenTo( FusionEvents, 'fusion-view-update-' + this.model.get( 'cid' ), this.reRender ); this.listenTo( FusionEvents, 'fusion-view-update-' + this.model.get( 'element_type' ), this.reRender ); this._triggerCallback = _.debounce( _.bind( this.triggerCallback, this ), 200 ); // If there is a template. if ( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).length ) { this.model.set( 'noTemplate', false ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).html() ); } else { this.model.set( 'noTemplate', true ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_shortcode-shortcode' ).html() ); } this.elementIsCloning = false; this.mouseDown = false; this.fetchIds = []; this.childIds = []; this.updateGallery = false; this.model.set( 'editLabel', this.getEditLabel() ); this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.attr( 'data-type', this.model.get( 'element_type' ) ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-parent-element' ).addClass( 'fusion-global-parent-element' ); } this.baseInit(); // JQuery trigger. this.renderedYet = FusionPageBuilderApp.reRenderElements; this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); this.model.set( 'sortable', 'undefined' === typeof fusionAllElements[ this.model.get( 'element_type' ) ].sortable ? true : fusionAllElements[ this.model.get( 'element_type' ) ].sortable ); this.onInit(); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function( event ) { var self = this; this.$el.html( this.template( this.model.attributes ) ); this.renderContent(); // If from ajax, do not regenerate children. if ( 'string' !== typeof event && 'ajax' !== event ) { this.generateChildElements(); } // If no template, no need for sortable children call. if ( ! this.model.get( 'noTemplate' ) ) { setTimeout( function() { self.sortableChildren(); }, 100 ); } // Don't refresh on first render. if ( this.renderedYet ) { this._refreshJs(); } this.onRender(); this.renderedYet = true; setTimeout( function() { self.droppableElement(); }, 100 ); return this; }, /** * Make children sortable. * This is executed from the render() function. * * @since 2.0.0 * @return {void} */ sortableChildren: function() { var self = this, $container = self.$el.find( '.fusion-child-element' ); if ( false === this.model.get( 'sortable' ) ) { return; } $container.on( 'mousedown', function( event ) { if ( ! jQuery( event.originalEvent.target ).hasClass( 'fusion-live-editable' ) ) { self.mouseDown = true; } } ); $container.on( 'mousemove', function() { if ( self.mouseDown ) { $container.css( { overflow: 'auto' } ); } } ); $container.on( 'mouseup', function() { self.mouseDown = false; $container.css( { overflow: '' } ); } ); this.$el.find( '.fusion-builder-element-content' ).sortable( { items: '.fusion-builder-live-child-element', tolerance: 'pointer', appendTo: $container, containment: $container, cursor: 'grabbing', cancel: '.fusion-live-editable', zIndex: 99999999, helper: 'clone', scroll: false, revert: 100, start: function() { FusionPageBuilderApp.$el.addClass( 'fusion-builder-dragging' ); $container.addClass( 'fusion-parent-sortable' ); }, update: function( event, ui ) { var MultiGlobalArgs, elementView = FusionPageBuilderViewManager.getView( ui.item.data( 'cid' ) ), newIndex = ui.item.parent().children( '.fusion-builder-live-child-element' ).index( ui.item ); self.updateElementContent(); // Update collection FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, self.model.get( 'cid' ) ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.moved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: self.model, handleType: 'save', attributes: self.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); }, stop: function() { self.mouseDown = false; $container.css( { overflow: '' } ); $container.removeClass( 'fusion-parent-sortable' ); FusionPageBuilderApp.$el.removeClass( 'fusion-builder-dragging' ); } } ); }, /** * Updates the element contents. * * @since 2.0.0 * @return {void} */ updateElementContent: function() { var content = '', children; if ( this.model.get( 'noTemplate' ) ) { children = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( children, function( child ) { content += child.getContent(); } ); } else { this.$el.find( '.fusion-builder-live-child-element' ).each( function() { var $thisEl = jQuery( this ); content += FusionPageBuilderApp.generateElementShortcode( $thisEl, false ); } ); } this.model.attributes.params.element_content = content; }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = jQuery.extend( true, {}, this.model.attributes ), params = jQuery.extend( true, {}, this.model.get( 'params' ) ), values = {}, extras = {}, element = fusionAllElements[ this.model.get( 'element_type' ) ]; if ( 'undefined' !== typeof this.elementTemplate ) { // Get element values. if ( element && 'undefined' !== typeof element.defaults ) { values = jQuery.extend( true, {}, element.defaults, _.fusionCleanParameters( params ) ); // Get element extras. if ( 'undefined' !== typeof element.extras ) { extras = jQuery.extend( true, {}, element.extras ); } } templateAttributes.values = values; templateAttributes.extras = extras; templateAttributes.thisModel = this.model; templateAttributes = this.getDynamicAtts( templateAttributes ); templateAttributes = this.filterTemplateAtts( templateAttributes ); return templateAttributes; } }, /** * Renders the content. * * @since 2.0.0 * @return {void} */ renderContent: function() { if ( 'undefined' !== typeof this.elementTemplate ) { this.$el.find( '.fusion-builder-element-content' ).html( this.getTemplate() ); } // Render wireframe template this.renderWireframePreview(); }, /** * Removes children. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeChildren: function( event ) { var children = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); if ( event ) { event.preventDefault(); } _.each( children, function( child ) { child.removeElement( '', 'Automated' ); } ); }, /** * Removes an element. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeElement: function( event, isAutomated ) { var parentCid = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCid; // jshint ignore: line } ), MultiGlobalArgs, colView; if ( event ) { event.preventDefault(); colView = FusionPageBuilderViewManager.getView( parentCid ); colView.$el.find( '.fusion-builder-module-controls-container a' ).trigger( 'mouseleave' ); } // Hook to allow custom actions. this.beforeRemove(); // Remove children elements this.removeChildren(); // Remove element view FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); // Destroy element model this.model.destroy(); this.remove(); // If element is removed manually if ( event ) { FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); } if ( parentModel.children.length && 'undefined' === typeof isAutomated ) { // Handle multiple global elements. MultiGlobalArgs = { currentModel: parentModel.children.models[ 0 ], handleType: 'save', attributes: parentModel.children.models[ 0 ].attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); } }, /** * Clones an element. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ cloneElement: function( event ) { var elementAttributes, currentModel, MultiGlobalArgs; if ( event ) { event.preventDefault(); } if ( true === this.elementIsCloning ) { return; } this.elementIsCloning = true; elementAttributes = jQuery.extend( true, {}, this.model.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.targetElement = this.$el; if ( 'undefined' !== elementAttributes.from ) { delete elementAttributes.from; } currentModel = FusionPageBuilderApp.collection.add( elementAttributes ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); this.elementIsCloning = false; // Handle multiple global elements. MultiGlobalArgs = { currentModel: currentModel, handleType: 'save', attributes: currentModel.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); if ( event ) { FusionEvents.trigger( 'fusion-content-changed' ); } }, noTemplateAjaxUpdate: function() { this.updateElementContent(); FusionApp.callback.fusion_do_shortcode( this.model.get( 'cid' ), this.getContent() ); }, /** * Generates the child elements. * * @since 2.0.0 * @param {boolean|undefined} fixSettingsLvl - Whether we want to fix the settings levels or not. * Use true (bool) for yes. undefined has the same effect as false. * @return {void} */ generateChildElements: function( fixSettingsLvl ) { var thisEl = this, parentAtts = this.model.get( 'params' ), content = this.model.attributes.params.element_content, shortcodeTags = jQuery.map( fusionMultiElements, function( val, i ) { // jshint ignore: line return val; } ).join( '|' ), regExp = window.wp.shortcode.regexp( shortcodeTags ), innerRegExp = FusionPageBuilderApp.regExpShortcode( shortcodeTags ), last = false, matches = 'undefined' !== typeof content ? content.match( regExp ) : false, modules = {}; // Make sure we don't just keep adding. this.removeChildren(); thisEl.model.children.reset( null ); if ( ! content ) { return; } _.each( matches, function( shortcode, index ) { var shortcodeElement = shortcode.match( innerRegExp ), shortcodeName = shortcodeElement[ 2 ], shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '', shortcodeContent = shortcodeElement[ 5 ], moduleCID = FusionPageBuilderViewManager.generateCid(), // jshint ignore: line prefixedAttributes = { params: ( {} ) }, tagName = 'div', // Check if shortcode allows generator allowGenerator = 'undefined' !== typeof fusionAllElements[ shortcodeName ].allow_generator ? fusionAllElements[ shortcodeName ].allow_generator : '', moduleSettings, key, prefixedKey, dependencyOption, dependencyOptionValue, moduleContent, markupContent; if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].tag_name ) { tagName = fusionAllElements[ shortcodeName ].tag_name; } // If last child. last = index + 1 === matches.length; moduleSettings = { type: 'element', element_type: shortcodeName, cid: FusionPageBuilderViewManager.generateCid(), view: thisEl, created: 'auto', multi: 'multi_element_child', child_element: 'true', allow_generator: allowGenerator, inline_editor: FusionPageBuilderApp.inlineEditorHelpers.inlineEditorAllowed( shortcodeName ), params: {}, parent: thisEl.model.get( 'cid' ), tag_name: tagName, last: last }; // Get markup from map if set. Add further checks here so only necessary elements do this check. if ( -1 === shortcodeName.indexOf( 'fusion_builder_' ) ) { markupContent = FusionPageBuilderApp.extraShortcodes.byShortcode( shortcodeElement[ 0 ] ); if ( 'undefined' !== typeof markupContent ) { moduleSettings.markup = markupContent; } else { moduleSettings.shortcode = shortcodeElement[ 0 ]; } } if ( _.isObject( shortcodeAttributes.named ) ) { for ( key in shortcodeAttributes.named ) { prefixedKey = key; prefixedAttributes.params[ prefixedKey ] = shortcodeAttributes.named[ key ]; } moduleSettings = _.extend( moduleSettings, prefixedAttributes ); } // TODO: check if needed. Commented out for FB item 420. // if ( ! shortcodesInContent ) { moduleSettings.params.element_content = shortcodeContent; // }. // Checks if map has set selectors. If so needs to be set prior to render. if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].selectors ) { moduleSettings.selectors = jQuery.extend( true, {}, fusionAllElements[ shortcodeName ].selectors ); } // Set module settings for modules with dependency options if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].option_dependency ) { dependencyOption = fusionAllElements[ shortcodeName ].option_dependency; dependencyOptionValue = prefixedAttributes.params[ dependencyOption ]; moduleContent = prefixedAttributes.params.element_content; prefixedAttributes.params[ dependencyOptionValue ] = moduleContent; } // Fix for deprecated 'settings_lvl' attribute if ( true === fixSettingsLvl ) { if ( 'fusion_content_box' === moduleType ) { // jshint ignore: line // Reset values that are inherited from parent moduleSettings.params.iconcolor = ''; moduleSettings.params.backgroundcolor = ''; moduleSettings.params.circlecolor = ''; moduleSettings.params.circlebordercolor = ''; moduleSettings.params.circlebordersize = ''; moduleSettings.params.outercirclebordercolor = ''; moduleSettings.params.outercirclebordersize = ''; // Set values from parent element moduleSettings.params.animation_type = parentAtts.animation_type; moduleSettings.params.animation_direction = parentAtts.animation_direction; moduleSettings.params.animation_speed = parentAtts.animation_speed; moduleSettings.params.link_target = parentAtts.link_target; } } modules[ moduleSettings.cid ] = moduleSettings; } ); this.onGenerateChildElements( modules ); // Add child elements to children collection. _.each( modules, function( moduleSettings ) { thisEl.model.children.add( [ moduleSettings ] ); } ); }, /** * Extendable function for when child elements get generated. * * @since 2.0.0 * @param {Object} modules An object of modules that are not a view yet. * @return {void} */ onGenerateChildElements: function( modules ) { }, /** * Adds a child element. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addChildElement: function( event, predefinedParams ) { var params = {}, defaultParams, value, moduleSettings, allowGenerator, childElement, newModel, MultiGlobalArgs, tagName = 'div'; if ( event ) { event.preventDefault(); } childElement = fusionMultiElements[ this.model.get( 'element_type' ) ]; defaultParams = predefinedParams ? predefinedParams : fusionAllElements[ childElement ].params; allowGenerator = ( 'undefined' !== typeof fusionAllElements[ childElement ].allow_generator ) ? fusionAllElements[ childElement ].allow_generator : ''; // Process default parameters from shortcode _.each( defaultParams, function( param ) { value = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; params[ param.param_name ] = value; } ); if ( 'undefined' !== typeof fusionAllElements[ childElement ].tag_name ) { tagName = fusionAllElements[ childElement ].tag_name; } moduleSettings = { type: 'element', element_type: childElement, cid: FusionPageBuilderViewManager.generateCid(), view: this, created: 'manually', multi: 'multi_element_child', child_element: 'true', params: params, allow_generator: allowGenerator, inline_editor: FusionPageBuilderApp.inlineEditorHelpers.inlineEditorAllowed( childElement ), parent: this.model.get( 'cid' ), tag_name: tagName, last: true }; // Checks if map has set selectors. If so needs to be set prior to render. if ( 'undefined' !== typeof fusionAllElements[ childElement ].selectors ) { moduleSettings.selectors = jQuery.extend( true, {}, fusionAllElements[ childElement ].selectors ); } if ( 'undefined' !== typeof event && null !== event && jQuery( event.currentTarget ).closest( '.fusion-builder-live-child-element' ).length && ! FusionPageBuilderApp.wireframeActive ) { moduleSettings.targetElement = jQuery( event.currentTarget ).closest( '.fusion-builder-live-child-element' ); } newModel = this.model.children.add( [ moduleSettings ] ); if ( this.model.get( 'noTemplate' ) ) { this.noTemplateAjaxUpdate(); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added + ' ' + fusionAllElements[ childElement ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: newModel[ 0 ], handleType: 'changeOption' }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); this.childViewAdded(); }, afterPatch: function() { var self = this; this.generateChildElements(); setTimeout( function() { self.droppableElement(); }, 100 ); }, /** * Adds a child view. * * @since 2.0.0 * @param {Object} child - The child element's model. * @return {void} */ addChildView: function( child ) { var view, viewSettings = { model: child, collection: FusionPageBuilderElements }; if ( 'undefined' !== typeof FusionPageBuilder[ child.get( 'element_type' ) ] ) { view = new FusionPageBuilder[ child.get( 'element_type' ) ]( viewSettings ); } else { view = new FusionPageBuilder.ChildElementView( viewSettings ); } FusionPageBuilderViewManager.addView( child.get( 'cid' ), view ); if ( 'undefined' !== typeof child.get( 'targetElement' ) ) { if ( 'undefined' === typeof child.get( 'targetElementPosition' ) || 'after' === child.get( 'targetElementPosition' ) ) { child.get( 'targetElement' ).after( view.render().el ); } else { child.get( 'targetElement' ).before( view.render().el ); } } else if ( 'undefined' === typeof child.get( 'targetElementPosition' ) || 'end' === child.get( 'targetElementPosition' ) ) { this.$el.find( '.fusion-child-element' ).append( view.render().el ); } else { this.$el.find( '.fusion-child-element' ).prepend( view.render().el ); } // Check for extra contents and append to correct location. this.appendContents( view ); this.updateElementContent(); }, /** * Fired when child view is added. * * @since 2.0.0 * @return {void} */ childViewAdded: function() { }, /** * Fired when child view is removed. * * @since 2.0.0 * @return {void} */ childViewRemoved: function() { }, /** * Fired when child view is cloned. * * @since 2.0.0 * @return {void} */ childViewCloned: function() { }, /** * Appends content to the view. * * @since 2.0.0 * @param {Object} view - The view. * @return {void} */ appendContents: function( view ) { var self = this, extraAppend = view.model.get( 'extraAppend' ), contents, selector, existing; if ( 'undefined' !== typeof extraAppend ) { contents = extraAppend.contents; selector = extraAppend.selector; existing = extraAppend.existing; if ( 'object' === typeof extraAppend.existing ) { _.each( extraAppend.existing, function( old, index ) { self.$el.find( selector ).remove( old ); self.$el.find( selector ).append( contents[ index ] ); } ); return; } this.$el.find( selector ).remove( existing ); this.$el.find( selector ).append( contents ); } }, /** * Delegates multiple child elements. * * @since 2.0.0 * @return {void} */ delegateChildEvents: function() { var cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); view.delegateEvents(); } ); }, /** * Sets the content and re-renders. * * @since 2.0.0 * @param {string} content - The content. * @return {void} */ setContent: function( content ) { this.model.attributes.params.element_content = content; this.reRender(); }, /** * Gets the content. * * @since 2.0.0 * @return {void} */ getContent: function() { return FusionPageBuilderApp.generateElementShortcode( this.$el, false ); }, /** * Append children. * * @since 2.0.0 * @return {void} */ appendChildren: function( target ) { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( target ).append( view.$el ); view.reRender(); } ); this.delegateChildEvents(); } } ); } ); }( jQuery ) ); ;/* global FusionEvents, FusionPageBuilderApp, FusionPageBuilderViewManager, fusionGlobalManager, fusionBuilderText, fusionAllElements, FusionPageBuilderElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element View FusionPageBuilder.ChildElementView = FusionPageBuilder.BaseView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-child-element-template' ).html() ), className: 'fusion-builder-live-child-element fusion-builder-data-cid', tagName: function() { return this.model.get( 'tag_name' ); }, events: { 'click .fusion-builder-remove-child': 'removeElement', 'click .fusion-builder-clone-child': 'cloneElement', 'click .fusion-builder-settings-child': 'settings', 'click a': 'disableLink' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { var parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; // jshint ignore:line } ); this.model.inlineCollection = new FusionPageBuilder.Collection(); this._triggerCallback = _.debounce( _.bind( this.triggerCallback, this ), 200 ); // If triggering a view update. this.listenTo( FusionEvents, 'fusion-child-view-update', this.reRender ); this.listenTo( FusionEvents, 'fusion-view-update-' + this.model.get( 'cid' ), this.reRender ); this.listenTo( FusionEvents, 'fusion-view-update-' + this.model.get( 'element_type' ), this.reRender ); // If there is a template. if ( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).length ) { this.model.set( 'noTemplate', false ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-' + this.model.attributes.element_type + '-shortcode' ).html() ); } else { this.model.set( 'noTemplate', true ); this.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_shortcode-shortcode' ).html() ); } this.elementIsCloning = false; this.model.set( 'editLabel', this.getEditLabel() ); // JQuery trigger. this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.attr( 'data-parent-cid', this.model.get( 'parent' ) ); this.$el.attr( 'data-element-type', this.model.get( 'element_type' ) ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-child-element' ).addClass( 'fusion-global-child-element' ); } this.model.set( 'show_ui', 'undefined' === typeof fusionAllElements[ this.model.get( 'element_type' ) ].show_ui ? true : fusionAllElements[ this.model.get( 'element_type' ) ].show_ui ); if ( ! parentModel.get( 'sortable' ) ) { this.$el.attr( 'data-fusion-no-dragging', true ); } this.model.set( 'sortable', parentModel.get( 'sortable' ) ); this.baseInit(); this.onInit(); // If inlne editing with overrides. this.activeInlineEditing = false; this.autoSelectEditor = false; this.model.set( 'inlineEditors', [] ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el.html( this.template( this.model.attributes ) ); this.renderContent(); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } if ( 'undefined' !== typeof this.model.attributes.extraAppend ) { this.updateExtraContents(); } this.$el.find( '.fusion-builder-module-controls-container' ).on( 'mouseenter mouseleave', _.bind( this.changeParentContainerControlsZindex, this ) ); this.onRender(); this._refreshJs(); setTimeout( function() { if ( ! self.activeInlineEditing ) { FusionPageBuilderApp.inlineEditorHelpers.liveEditorEvent( self ); self.activeInlineEditing = false; } if ( FusionPageBuilderApp.inlineEditorHelpers.inlineEditorAllowed( self.model.get( 'element_type' ) ) ) { self.renderInlineSettings(); } }, 100 ); return this; }, afterPatch: function() { this._refreshJs(); }, /** * Changes the z-index on the controls wrapper of the parent container. * * @since 2.0.0 * @return {void} */ changeParentContainerControlsZindex: function( event ) { if ( 'mouseenter' === event.type ) { this.$el.closest( '.fusion-builder-container' ).find( '.fusion-builder-module-controls-container-wrapper' ).css( 'z-index', '0' ); } else { this.$el.closest( '.fusion-builder-container' ).find( '.fusion-builder-module-controls-container-wrapper' ).removeAttr( 'style' ); } }, /** * Updates extra elements by replacing their contents. * * @since 2.0.0 * @return {void} */ updateExtraContents: function() { var self = this, extraAppend = this.model.get( 'extraAppend' ), contents = extraAppend.contents, existing = extraAppend.existing; if ( 'object' === typeof extraAppend.existing ) { _.each( existing, function( old, index ) { self.updateSingleExtraContent( old, contents[ index ] ); } ); } else { this.updateSingleExtraContent( existing, contents ); } if ( 'undefined' !== typeof this.model.attributes.extraAppend.trigger ) { this.$el.find( 'a[id="' + this.model.attributes.extraAppend.trigger.replace( '#', '' ) + '"]' ).closest( 'li' ).trigger( 'click' ); } }, updateSingleExtraContent: function( existing, contents ) { if ( this.$el.closest( '.fusion-builder-live-element' ).find( existing ).length ) { this.$el.closest( '.fusion-builder-live-element' ).find( existing ).replaceWith( FusionPageBuilderApp.renderContent( contents, this.model.get( 'cid' ), this.model.get( 'parent' ) ) ); } }, /** * Removes extra elements by removing their contents. * * @since 2.0.0 * @return {void} */ removeExtraContents: function() { var $parentEl = this.$el.closest( '.fusion-builder-live-element' ), $existing, targetId, $sibling; // Find and remove extra content. if ( 'undefined' !== typeof this.model.attributes.extraAppend && 'undefined' !== typeof this.model.attributes.extraAppend.existing ) { $existing = $parentEl.find( this.model.attributes.extraAppend.existing ); // If tabs element and this tab is active, make another tab active. if ( $existing.hasClass( 'active' ) && 'fusion_tab' === this.model.get( 'element_type' ) ) { $sibling = $existing.siblings().first(); if ( $sibling.length ) { $sibling.addClass( 'active in' ); targetId = $sibling.attr( 'id' ); $parentEl.find( '[href="#' + targetId + '"]' ).closest( '.fusion-builder-live-child-element' ).addClass( 'active' ); } } $existing.remove(); } }, /** * Sets the attributes of an element. * * @since 2.0.0 * @param {Object} element - The element we're updating. * @param {Object} attributes - The attributes we're setting/updating. * @return {void} */ setElementAttributes: function( element, attributes ) { var dataVar; if ( 'object' === typeof attributes && element.length ) { _.each( attributes, function( values, attribute ) { if ( 'class' === attribute ) { element.attr( 'class', values ); } else if ( 'id' === attribute ) { element.attr( 'id', values ); } else if ( 'style' === attribute ) { element.attr( 'style', values ); } else if ( -1 !== attribute.indexOf( 'data' ) ) { dataVar = attribute.replace( 'data-', '' ); if ( element.data( dataVar ) ) { element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( element ); element.data( dataVar, values ); } attribute = attribute.replace( /_/g, '-' ); element.attr( attribute, values ); } } ); } }, /** * Renders the content. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = jQuery.extend( true, {}, this.model.attributes ), params = jQuery.extend( true, {}, this.model.get( 'params' ) ), values = {}, extras = {}, element = fusionAllElements[ this.model.get( 'element_type' ) ], parent = this.model.get( 'parent' ), parentValues = {}, parentModel, parentElementContent = ''; // Use appropriate template. if ( 'undefined' !== typeof this.elementTemplate ) { // Get parent values. parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; // jshint ignore:line } ); if ( parentModel && 'undefined' !== typeof fusionAllElements[ parentModel.get( 'element_type' ) ] ) { parentValues = jQuery.extend( true, {}, fusionAllElements[ parentModel.get( 'element_type' ) ].defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); } // Get element values. if ( element && 'undefined' !== typeof element.defaults ) { // No need to inherit parent's element_content. if ( 'undefined' !== typeof parentValues.element_content ) { parentElementContent = parentValues.element_content; delete parentValues.element_content; } values = jQuery.extend( true, {}, element.defaults, parentValues, _.fusionCleanParameters( params ) ); parentValues.element_content = parentElementContent; // Get element extras. if ( 'undefined' !== typeof element.extras ) { extras = jQuery.extend( true, {}, element.extras ); } } templateAttributes.parentValues = parentValues; templateAttributes.values = values; templateAttributes.extras = extras; templateAttributes.thisModel = this.model; templateAttributes.parentModel = parentModel; templateAttributes = this.getDynamicAtts( templateAttributes ); templateAttributes = this.filterTemplateAtts( templateAttributes ); return templateAttributes; } }, /** * Renders the content. * * @since 2.0.0 * @return {void} */ renderContent: function() { // Use appropriate template. if ( 'undefined' !== typeof this.elementTemplate ) { this.$el.find( '.fusion-builder-child-element-content' ).html( this.getTemplate() ); return; } // Ajax here this.$el.find( '.fusion-builder-child-element-content' ).html( 'no template found' ); }, /** * Removes an element. * * @since 2.0.0 * @param {Object} event - The event triggering the element removal. * @return {void} */ removeElement: function( event, isAutomated ) { var parentCid = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCid; // jshint ignore: line } ), MultiGlobalArgs; if ( event ) { event.preventDefault(); parentView.$el.find( '.fusion-builder-module-controls-container a' ).trigger( 'mouseleave' ); } // Hook to allow custom actions. this.beforeRemove(); // Remove extra content not within view. this.removeExtraContents(); // Remove element view FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); // Remove live editors. FusionPageBuilderApp.inlineEditorHelpers.removeLiveEditors( this ); // Destroy element model this.model.destroy(); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); this.remove(); // If element is removed manually if ( event ) { this.forceUpdateParent(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); } if ( parentModel.children.length && 'undefined' === typeof isAutomated ) { // Handle multiple global elements. MultiGlobalArgs = { currentModel: parentModel.children.models[ 0 ], handleType: 'save', attributes: parentModel.children.models[ 0 ].attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); } if ( event ) { parentView.childViewRemoved(); } }, /** * Force-updates the parent element. * * @since 2.0.0 * @return {void} */ forceUpdateParent: function() { // Used to make sure parent of child is updated on live edit. var parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof parentView ) { parentView.updateElementContent(); parentView.refreshJs(); } this.ajaxUpdateParent( parentView ); }, ajaxUpdateParent: function( parentView ) { parentView = 'undefined' === typeof parentView ? FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ) : parentView; // If no template, use ajax to re-render. if ( parentView.model.get( 'noTemplate' ) ) { parentView.noTemplateAjaxUpdate(); } }, /** * Clones an element. * * @since 2.0.0 * @param {Object} event - The event triggering the element cloning. * @return {void} */ cloneElement: function( event ) { var elementAttributes, parentModel, currentModel, MultiGlobalArgs, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), self = this; // Get element parent parentModel = this.collection.find( function( model ) { return model.get( 'cid' ) == self.model.get( 'parent' ); // jshint ignore: line } ); if ( event ) { event.preventDefault(); } if ( true === this.elementIsCloning ) { return; } this.elementIsCloning = true; elementAttributes = jQuery.extend( true, {}, this.model.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.targetElement = this.$el; elementAttributes.at_index = FusionPageBuilderApp.getCollectionIndex( this.$el ); // Add a clone flag for fusion gallery child. if ( 'fusion_gallery_image' === this.model.get( 'element_type' ) ) { elementAttributes.cloned = true; } if ( 'undefined' !== elementAttributes.from ) { delete elementAttributes.from; } FusionPageBuilderApp.addToChildCollection( elementAttributes ); currentModel = parentModel.children.find( function( model ) { return model.get( 'cid' ) == elementAttributes.cid; // jshint ignore:line } ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: currentModel, handleType: 'save', attributes: currentModel.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); this.elementIsCloning = false; this.forceUpdateParent(); if ( event ) { FusionEvents.trigger( 'fusion-content-changed' ); } parentView.childViewCloned(); }, /** * Get the content. * * @since 2.0.0 * @return {string} */ getContent: function() { return FusionPageBuilderApp.generateElementShortcode( this.$el, false ); }, isFirstChild: function() { var self = this, index, parentModel; parentModel = FusionPageBuilderApp.collection.find( function( model ) { return model.get( 'cid' ) === self.model.get( 'parent' ); } ); index = parentModel.children.indexOf( this.model ); return 0 === index; } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionBuilderText, FusionPageBuilderViewManager, FusionEvents, FusionPageBuilderElements, fusionAllElements, fusionSanitize */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Row View FusionPageBuilder.RowView = FusionPageBuilder.BaseRowView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-row-template' ).html() ), className: 'fusion_builder_row', events: { 'click .fusion-builder-insert-column': 'displayColumnsOptions' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.baseRowInit(); this.nestedRow = false; this.model.set( 'rows', {} ); this.model.children = new FusionPageBuilder.Collection(); this.listenTo( this.model.children, 'add', this.addChildView ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.updateColumnsPreview ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.legacyColumns ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function( forced ) { var self = this; forced = 'undefined' === typeof forced ? false : forced; this.$el.html( this.template( this.getTemplateAtts() ) ); this.appendChildren(); setTimeout( function() { self.droppableColumn(); }, 100 ); // Show column dialog when adding a new row if ( 'manually' !== this.model.get( 'created' ) && ! forced ) { this.displayContainerLibrary(); } return this; }, /** * The row attributes. * * @since 3.0 * @return {Object} */ attr: function() { var attr = { style: '' }, parentContainer = FusionPageBuilderApp.getParentContainer( this ), isFlex = parentContainer && parentContainer.isFlex(), containerParams, width, widthValue, columnSpacingUnit, columnSpacingValue, widthUnit; if ( ! parentContainer ) { return attr; } containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, _.fusionCleanParameters( parentContainer.model.attributes.params ) ), attr[ 'class' ] = 'fusion-builder-row-container fusion-builder-row fusion-row'; attr[ 'data-cid' ] = this.model.get( 'cid' ); if ( isFlex ) { attr[ 'class' ] += ' fusion-flex-align-items-' + containerParams.flex_align_items; if ( 'stretch' !== containerParams.align_content ) { attr[ 'class' ] += ' fusion-flex-align-content-' + containerParams.align_content; } if ( 'flex-start' !== containerParams.flex_justify_content ) { attr[ 'class' ] += ' fusion-flex-justify-content-' + containerParams.flex_justify_content; } width = 'yes' === containerParams.hundred_percent ? '100%' : fusionAllElements.fusion_builder_row.extras.site_width; columnSpacingUnit = fusionSanitize.get_unit( containerParams.flex_column_spacing ); if ( '%' === columnSpacingUnit ) { columnSpacingValue = fusionSanitize.number( containerParams.flex_column_spacing ); widthValue = fusionSanitize.number( width ); widthUnit = fusionSanitize.get_unit( width ); width = ( widthValue * ( 1 + ( columnSpacingValue / 100 ) ) ) + widthUnit; } else { width = 'calc( ' + width + ' + ' + containerParams.flex_column_spacing + ' )'; } if ( 'no' === containerParams.hundred_percent ) { attr.style += 'max-width:' + width + ';'; } attr.style += 'margin-left: calc(-' + containerParams.flex_column_spacing + ' / 2 );'; attr.style += 'margin-right: calc(-' + containerParams.flex_column_spacing + ' / 2 );'; } return attr; }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = { attr: this.attr() }; return templateAttributes; }, /** * Display the column options. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ displayColumnsOptions: function( event ) { var viewSettings, view; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.parentRowId = this.model.get( 'cid' ); viewSettings = { model: this.model, collection: this.collection }; if ( jQuery( event.currentTarget ).closest( '.fusion-builder-column' ).length && ! FusionPageBuilderApp.wireframeActive ) { viewSettings.targetElement = jQuery( event.currentTarget ).closest( '.fusion-builder-column' ); } view = new FusionPageBuilder.ColumnLibraryView( viewSettings ); jQuery( view.render().el ).dialog( { title: 'Select Column', width: FusionApp.dialog.dialogWidth, height: FusionApp.dialog.dialogHeight, draggable: false, modal: true, resizable: false, dialogClass: 'fusion-builder-dialog fusion-builder-large-library-dialog fusion-builder-columns-library-dialog', open: function() { FusionApp.dialog.resizeDialog(); }, close: function() { view.remove(); } } ); }, /** * Display the container library. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ displayContainerLibrary: function( event ) { var viewSettings, view, parentView; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.parentRowId = this.model.get( 'cid' ); parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); viewSettings = { model: this.model, collection: this.collection }; view = new FusionPageBuilder.ContainerLibraryView( viewSettings ); jQuery( view.render().el ).dialog( { title: 'Select Container', width: FusionApp.dialog.dialogWidth, height: FusionApp.dialog.dialogHeight, draggable: false, modal: true, resizable: false, dialogClass: 'fusion-builder-dialog fusion-builder-large-library-dialog fusion-builder-container-library-dialog', open: function() { FusionApp.dialog.resizeDialog(); }, close: function() { parentView.removeContainer(); view.remove(); } } ); }, /** * Removes a row. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeRow: function( event ) { // jshint ignore: line var columns; if ( event ) { event.preventDefault(); } columns = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); // Remove all columns _.each( columns, function( column ) { column.removeColumn(); } ); FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); this.setRowData(); if ( event ) { FusionEvents.trigger( 'fusion-content-changed' ); } }, /** * Creates drop zone for empty row. * * @since 2.0.0 * @return {void} */ droppableColumn: function() { var $el = this.$el, self = this; if ( ! $el ) { return; } $el.find( '.fusion-builder-empty-container .fusion-column-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-column', drop: function( event, ui ) { var columnCid = ui.draggable.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCid ), originalCid = columnView.model.get( 'parent' ), originalView, newIndex; // Move the actual html. $el.find( '.fusion-builder-empty-container' ).after( ui.draggable ); newIndex = ui.draggable.parent().children( '.fusion-builder-column' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( columnView.model, newIndex, self.model.get( 'cid' ) ); // Update destination row which is this current one. self.setRowData(); // If destination row and original row are different, update original as well. if ( self.model.get( 'cid' ) !== originalCid ) { originalView = FusionPageBuilderViewManager.getView( originalCid ); originalView.setRowData(); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.column + ' order changed' ); setTimeout( function() { // If different container type we re-render so that it corrects for new situation. if ( 'object' !== typeof originalView || FusionPageBuilderApp.sameContainerTypes( originalView.get( 'parent' ), self.model.get( 'parent' ) ) ) { columnView.droppableColumn(); } else { FusionEvents.trigger( 'fusion-close-settings-' + columnView.model.get( 'cid' ) ); columnView.reRender(); } }, 300 ); } } ); }, /** * Appends children. Calls the delegateEvents function in the view. * * @since 2.0.0 * @return {void} */ appendChildren: function() { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( '.fusion-builder-row-container' ).append( view.$el ); view.delegateEvents(); } ); }, /** * Adds a child view. * * @since 2.0.0 * @param {Object} element - The element model. * @return {void} */ addChildView: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements, attributes: { 'data-cid': element.get( 'cid' ) } }; viewSettings.className = 'fusion-builder-column fusion-builder-column-outer'; if ( 'string' === typeof element.attributes.params.type && element.attributes.params.type.includes( '_' ) ) { viewSettings.className += ' fusion-builder-column-' + element.attributes.params.type; } view = new FusionPageBuilder.ColumnView( viewSettings ); // Calculate virtual rows this.createVirtualRows(); // This column was cloned if ( ! _.isUndefined( element.get( 'cloned' ) ) && true === element.get( 'cloned' ) ) { element.targetElement = view.$el; element.unset( 'cloned' ); } FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'targetElement' ).after( view.render().el ); } else { element.get( 'targetElement' ).before( view.render().el ); } } else { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { this.$el.find( '.fusion-builder-row-container' ).append( view.render().el ); } else { this.$el.find( '.fusion-builder-row-container' ).prepend( view.render().el ); } element.unset( 'from' ); } this.updateColumnsPreview(); }, /** * Delegates child events. * * @since 2.0.0 * @return {void} */ delegateChildEvents: function() { var cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); view.delegateEvents(); view.delegateChildEvents(); view.droppableColumn(); } ); }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.enableSortableColumns(); } else { this.disableSortableColumns(); } }, recalculateMargins: function() { var attr = this.attr(); this.$el.find( '.fusion-builder-row-container' ).first().attr( 'style', attr.style ); }, /** * Destroy or disable column sortable. * * @since 2.0.0 * @return {void} */ disableSortableColumns: function() { var rowContainer = this.$el.find( '.fusion-builder-row-container' ); if ( 'undefined' !== typeof rowContainer.sortable( 'instance' ) ) { rowContainer.enableSelection(); rowContainer.sortable( 'disable' ); } }, /** * Initialize column sortable. * * @since 2.0.0 * @return {void} */ sortableColumns: function() { var rowContainer = this.$el.find( '.fusion-builder-row-container' ), items = '.fusion-builder-column-outer', self = this; rowContainer.sortable( { cancel: '.fusion-builder-column-settings, .fusion-builder-column-size, .fusion-builder-column-clone, .fusion-builder-column-save, .fusion-builder-column-remove, .fusion-builder-add-element, .column-sizes', items: items, connectWith: '.fusion-builder-row-container', tolerance: 'pointer', appendTo: rowContainer.parent(), helper: 'clone', update: function( event, ui ) { self.onSortUpdate( event, ui ); }, stop: function( event, ui ) { self.onSortStop( event, ui, items ); } } ).disableSelection(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Dynamic Selection. FusionPageBuilder.DynamicSelection = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-dynamic-selection' ).html() ), className: 'fusion-builder-dynamic-selection option-field', events: { }, /** * Renders the view. * * @since 2.1 * @return {Object} this */ render: function() { var $option = this.model.get( 'option' ), templateData; if ( $option.length ) { $option.attr( 'data-dynamic-selection', true ); } templateData = { params: FusionPageBuilderApp.dynamicValues.getOrderedParams(), option: $option.attr( 'data-option-type' ) }; this.$el.html( this.template( templateData ) ); this.initSelect(); return this; }, initSelect: function() { var self = this, parent = this.model.get( 'parent' ), $option = this.model.get( 'option' ), param = this.model.get( 'param' ), $selectField = this.$el.find( '.fusion-select-field' ), $selectPreview = $selectField.find( '.fusion-select-preview-wrap' ), $selectSearchInput = $selectField.find( '.fusion-select-search input' ); if ( $selectField.hasClass( 'fusion-select-inited' ) ) { return; } $selectField.addClass( 'fusion-select-inited' ); // Hide empty option groups. $selectField.find( '.fusion-select-optiongroup' ).each( function() { if ( jQuery( this ).next().hasClass( 'fusion-select-optiongroup' ) || 0 === jQuery( this ).next().length ) { jQuery( this ).remove(); } } ); // Open select dropdown. $selectPreview.on( 'click', function( event ) { var open = $selectField.hasClass( 'fusion-open' ); event.preventDefault(); if ( ! open ) { $selectField.addClass( 'fusion-open' ); if ( $selectSearchInput.length ) { $selectSearchInput.focus(); } } else { $selectField.removeClass( 'fusion-open' ); if ( $selectSearchInput.length ) { $selectSearchInput.val( '' ).blur(); } $selectField.find( '.fusion-select-label' ).css( 'display', 'block' ); } } ); // Option is selected. $selectField.on( 'click', '.fusion-select-label', function() { parent.elementView.dynamicParams.addParam( param, jQuery( this ).data( 'value' ) ); parent.initEditDynamic( $option.find( '.fusion-dynamic-content' ), true ); self.removeView(); } ); $selectSearchInput.on( 'keyup change paste', function() { var val = jQuery( this ).val(), optionInputs = $selectField.find( '.fusion-select-label' ); // Select option on "Enter" press if only 1 option is visible. if ( 'keyup' === event.type && 13 === event.keyCode && 1 === $selectField.find( '.fusion-select-label:visible' ).length ) { $selectField.find( '.fusion-select-label:visible' ).trigger( 'click' ); return; } _.each( optionInputs, function( optionInput ) { if ( -1 === jQuery( optionInput ).html().toLowerCase().indexOf( val.toLowerCase() ) ) { jQuery( optionInput ).css( 'display', 'none' ); } else { jQuery( optionInput ).css( 'display', 'block' ); } } ); } ); }, removeView: function() { var $option = this.model.get( 'option' ), parent = this.model.get( 'parent' ); this.$el.remove(); if ( parent ) { parent.dynamicSelection = false; } if ( $option.length ) { $option.attr( 'data-dynamic-selection', false ); } // Destroy element model this.model.destroy(); this.remove(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; FusionPageBuilder.options = FusionPageBuilder.options || {}; FusionPageBuilder.options.fusionDynamicData = { optionDynamicData: function( $element ) { var self = this; $element = $element || this.$el; $element.find( '[data-dynamic="true"] .fusion-dynamic-content' ).each( function() { self.initEditDynamic( jQuery( this ) ); } ); }, initEditDynamic: function( $targetEl, open ) { var dynamicData = this.elementView.dynamicParams.getAll(), self = this, repeater = FusionPageBuilder.template( jQuery( '#fusion-app-repeater-fields' ).html() ), param = $targetEl.closest( '.fusion-builder-option' ).attr( 'data-option-id' ), options = FusionPageBuilderApp.dynamicValues.getOptions(), values = 'object' === typeof dynamicData && 'object' === typeof dynamicData[ param ] ? dynamicData[ param ] : { data: undefined }, dynamic = values && 'object' === typeof options[ values.data ] ? options[ values.data ] : false, fields = dynamic ? dynamic.fields : false, label = dynamic && 'string' === typeof dynamic.label ? dynamic.label : values.data, $html = '', $fields = $targetEl.find( '.dynamic-param-fields' ), supported = jQuery.extend( true, {}, FusionApp.data.dynamicCommon ), excludes = 'object' === typeof dynamic.exclude ? _.values( dynamic.exclude ) : false, ajax = dynamic && 'object' === typeof dynamic.callback && 'undefined' !== typeof dynamic.callback.ajax ? dynamic.callback.ajax : false; if ( 'object' !== typeof dynamicData[ param ] ) { return; } if ( excludes && 'object' === typeof supported ) { _.each( supported, function( supportField, supportId ) { if ( -1 !== _.indexOf( excludes, supportId ) ) { delete supported[ supportId ]; } } ); } if ( 'object' === typeof supported && ! _.isEmpty( supported ) ) { if ( 'object' === typeof fields ) { fields = _.extend( fields, supported ); } else { fields = supported; } } // Update the editable fields. $fields.empty(); if ( fields ) { _.each( fields, function( field, id ) { var value = values[ id ], attributes = { field: field, value: value }; $html += jQuery( repeater( attributes ) ).html(); } ); $fields.append( $html ); } // Update the title, id and ajax attribute. if ( dynamic ) { $targetEl.find( '.dynamic-title h3' ).text( label ); $targetEl.find( '.dynamic-wrapper' ).attr( 'data-id', values.data ).attr( 'data-ajax', ajax ); } // Prevent duplicate listeners. $targetEl.off( 'click' ); // Listener for open and close toggle. $targetEl.on( 'click', '.dynamic-title', function() { jQuery( this ).parent().find( '.dynamic-param-fields' ).slideToggle( 300 ); if ( jQuery( this ).find( '.dynamic-toggle-icon' ).hasClass( 'fusiona-pen' ) ) { jQuery( this ).find( '.dynamic-toggle-icon' ).removeClass( 'fusiona-pen' ).addClass( 'fusiona-minus' ); } else { jQuery( this ).find( '.dynamic-toggle-icon' ).removeClass( 'fusiona-minus' ).addClass( 'fusiona-pen' ); } } ); // Listener for removing the dynamic data. $targetEl.on( 'click', '.dynamic-remove.fusiona-trash-o', function( event ) { event.preventDefault(); self.removeDynamicData( $targetEl ); } ); // Init the editable sub options. if ( 'function' === typeof this.initOptions ) { this.initOptions( $targetEl ); } // If its a newly added one, lets open it. if ( 'undefined' !== typeof open && open ) { $targetEl.find( '.dynamic-param-fields' ).show(); $targetEl.find( '.dynamic-toggle-icon' ).removeClass( 'fusiona-pen' ).addClass( 'fusiona-minus' ); } }, removeDynamicData: function( $targetEl ) { var param = $targetEl.closest( '.fusion-builder-option' ).attr( 'data-option-id' ); if ( 'undefined' !== typeof this.elementView ) { this.elementView.dynamicParams.removeParam( param ); } }, /** * Sets dynamic data param value. * * @since 2.0.0 * @param {Object} $option - jQuery object. * @param {String} param - Parameter ID. * @param {Mixed} value - Value of this option. * @return {void} */ setDynamicParamValue: function( $option, subParam, value ) { var param = $option.parent().closest( '.fusion-builder-option' ).attr( 'data-option-id' ); if ( 'undefined' !== typeof this.elementView ) { this.elementView.dynamicParams.updateParam( param, subParam, value ); } } }; ;/* global FusionApp, FusionPageBuilderViewManager, FusionEvents, fusionAllElements, FusionPageBuilderApp, fusionBuilderText, fusionGlobalManager, fusionBuilderInsertIntoEditor, openShortcodeGenerator, awbPalette */ /* eslint no-unused-vars: 0 */ /* eslint no-alert: 0 */ /* eslint no-empty-function: 0 */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.ElementSettingsView = window.wp.Backbone.View.extend( { className: 'fusion_builder_module_settings', template: FusionPageBuilder.template( jQuery( '#fusion-builder-block-module-settings-template' ).html() ), optionHasChanged: false, events: { 'click [id$="fusion_shortcodes_text_mode"]': 'activateSCgenerator', 'change input': 'optionChange', 'keyup input:not(.fusion-slider-input)': 'optionChange', 'change select': 'optionChange', 'keyup textarea': 'optionChange', 'change textarea': 'optionChange', 'paste textarea': 'optionChangePaste', 'fusion-change input': 'optionChange', 'click .upload-image-remove': 'removeImage', 'click .option-preview-toggle': 'previewToggle', 'click .insert-slider-video': 'addSliderVideo', 'click .fusion-panel-shortcut:not(.dialog-more-menu-item)': 'defaultPreview', 'click .fusion-panel-description': 'showHideDescription', 'click #fusion-close-element-settings': 'saveSettings', 'click .fusion-builder-go-back': 'openParent', 'click .option-dynamic-content': 'addDynamicContent', 'click .option-has-responsive': 'showResponsiveOptions', 'click .fusion-responsive-options li a': 'changeResponsiveOption', 'mouseleave .fusion-builder-option': 'hideResponsiveOptions' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { // Manipulate model attributes via custom function if provided by the element. this.onSettingsCallback(); // Store element view. this.elementView = FusionPageBuilderViewManager.getView( this.model.get( 'cid' ) ); this.loadComplete = false; this.codeEditorOption = false; this.changesPaused = false; // JQuery trigger. this._refreshJs = _.debounce( _.bind( this.refreshJs, this ), 300 ); // Fetch query_data if not present only. dont save if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].has_ajax ) { if ( 'undefined' === typeof this.model.get( 'query_data' ) ) { this.elementView.triggerAjaxCallbacks( true ); } } // When tab is changed we init options. this.tabsRendered = {}; this.initOptions = _.debounce( _.bind( this.debouncedInitOptions, this ), 50 ); this.listenTo( FusionEvents, 'fusion-tab-changed', this.initOptions ); this.listenTo( FusionEvents, 'fusion-inline-edited', this.forceChange ); this.childSortableView = false; // Active states selected for element. this.activeStates = {}; this.$targetEl = 'undefined' !== typeof this.elementView ? this.elementView.$el : false; this._tempStateRemove = _.debounce( _.bind( this.tempStateRemove, this ), 3000 ); this.parentValues = this.getParentValues() ? this.getParentValues() : false; this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.addClass( this.containerIsFlex() ? 'has-flex' : '' ); this.$el.addClass( this.columIsBlockLayout() ? 'has-block-column' : '' ); this.type = 'EO'; this.onInit(); this.listenTo( FusionEvents, 'fusion-element-removed', this.removeView ); this.listenTo( FusionEvents, 'fusion-preview-refreshed', this.saveSettings ); this.listenTo( FusionEvents, 'fusion-close-settings-' + this.model.get( 'cid' ), this.saveSettings ); this.listenTo( FusionEvents, 'fusion-param-changed-' + this.model.get( 'cid' ), this.paramChanged ); this.listenTo( FusionEvents, 'fusion-default-changed-' + this.model.get( 'cid' ), this.defaultChanged ); this.listenTo( FusionEvents, 'fusion-row-nested-edit', this.saveSettings ); if ( 'dialog' !== FusionApp.preferencesData.editing_mode && 'generated_element' !== this.model.get( 'type' ) && ! this.$el.hasClass( 'fusion-builder-settings-chart-table-dialog' ) ) { this.$el.addClass( 'fusion-builder-custom-tab' ); } if ( 'generated_element' === this.model.get( 'type' ) ) { FusionEvents.trigger( 'fusion-history-pause-tracking' ); } this.newElement = false; if ( 'undefined' !== typeof this.model.get( 'added' ) ) { this.newElement = true; } // Dynamic content. this.listenTo( FusionEvents, 'fusion-dynamic-data-removed', this.removeDynamicStatus ); this.listenTo( FusionEvents, 'fusion-dynamic-data-added', this.addDynamicStatus ); this.dynamicSelection = false; this.debouncedOptionChanges = {}; }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.renderOptions(); this.initOptions(); this.model.unset( 'added' ); // Check option dependencies this.dependencies = new FusionPageBuilder.Dependencies( fusionAllElements[ this.model.get( 'element_type' ) ].params, this ); FusionApp.dialog.dialogTabs( this.$el ); this.loadComplete = true; if ( 'undefined' !== this.model.get( 'multi' ) && 'multi_element_parent' === this.model.get( 'multi' ) ) { this.appendChildSortables(); } FusionEvents.trigger( 'fusion-settings-modal-open' ); if ( -1 !== this.model.get( 'element_type' ).indexOf( 'fusion_builder_column' ) ) { this.setDirectionAttribute(); } this.onRender(); this.checkPageTemplate(); this.inlineHistoryListener(); return this; }, setDirectionAttribute: function() { var $option = this.$el.find( '[data-option-id="content_layout"]' ), value = 'column'; if ( ! $option.length ) { return; } value = $option.find( '#content_layout' ).val(); $option.attr( 'data-direction', value ); }, containerIsFlex: function() { var container = FusionPageBuilderApp.getParentContainer( this.model.get( 'cid' ) ); return container && container.isFlex(); }, columIsBlockLayout: function() { var column = FusionPageBuilderApp.getParentColumn( this.model.get( 'cid' ) ); return column && column.isBlockLayout() && 'fusion_builder_column' !== this.model.get( 'element_type' ) && 'fusion_builder_column_inner' !== this.model.get( 'element_type' ); }, addDynamicContent: function( event ) { var self = this, $option = jQuery( event.target ).closest( '.fusion-builder-option' ), param = $option.attr( 'data-option-id' ), sameParam = false, viewSettings; if ( this.dynamicSelection ) { if ( param === this.dynamicSelection.model.get( 'param' ) ) { sameParam = true; } this.dynamicSelection.removeView(); } if ( sameParam ) { return; } viewSettings = { model: new FusionPageBuilder.Element( { param: param, option: $option, parent: this } ) }; // On select or cancel or event we destroy. this.dynamicSelection = new FusionPageBuilder.DynamicSelection( viewSettings ); $option.find( '.fusion-dynamic-selection' ).html( this.dynamicSelection.render().el ); }, removeDynamicStatus: function( param ) { this.$el.find( '.fusion-builder-option[data-option-id="' + param + '"]' ).attr( 'data-dynamic', false ); // Needed for dependencies. this.$el.find( '#' + param ).trigger( 'fusion-change' ); }, addDynamicStatus: function( param ) { this.$el.find( '.fusion-builder-option[data-option-id="' + param + '"]' ).attr( 'data-dynamic', true ); // Needed for dependencies. this.$el.find( '#' + param ).trigger( 'fusion-change' ); }, onRender: function() { }, reRender: function() { var $parentDialog = this.$el.closest( '.ui-dialog' ), $dialogTopContainer; this.tabsRendered = {}; this.destroyOptions(); this.render(); if ( $parentDialog.length ) { $parentDialog.find( '.ui-dialog-titlebar + .fusion-builder-modal-top-container' ).remove(); $parentDialog.find( '.ui-dialog-titlebar' ).after( this.$el.find( '.fusion-builder-modal-top-container' ) ); } else { FusionPageBuilderApp.SettingsHelpers.renderDialogMoreOptions( this ); } }, /** * Listens for change in parent and destroys settings view since no longer valid. * * @since 2.0.0 * @return {void} */ inlineHistoryListener: function() { var self = this, parentCid; if ( this.model.get( 'inlineElement' ) && 'undefined' !== typeof this.model.parentView ) { parentCid = this.model.parentView.model.get( 'cid' ); // Timeout so addition of inline does not trigger. setTimeout( function() { self.listenTo( FusionEvents, 'fusion-param-changed-' + parentCid, function() { self.removeView( parentCid ); } ); }, 1000 ); } }, /** * Simply sets optionHasChanged to true. * * @since 2.0.0 * @return {void} */ forceChange: function() { this.optionHasChanged = true; }, /** * Append child sortables. * * @since 2.0.0 * @return {void} */ appendChildSortables: function() { var viewSettings = { model: this.model, collection: this.collection, attributes: { settingsView: this } }, view; view = new FusionPageBuilder.ElementSettingsParent( viewSettings ); this.$el.find( '.fusion-child-sortables' ).html( view.render().el ); this.childSortableView = view; }, /** * Execute Callbacks. * * @since 2.0.0 * @return {void} */ onSettingsCallback: function() { var functionName, params, processedParams; if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_settings ) { functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_settings; if ( 'function' === typeof FusionPageBuilderApp[ functionName ] ) { params = this.model.get( 'params' ); processedParams = FusionPageBuilderApp[ functionName ]( params, this ); this.model.set( 'params', processedParams ); } } }, /** * Trigger optionChange when pasting. * * @since 2.0.0 * @return {void} */ optionChangePaste: function( event ) { var self = this; setTimeout( function() { self.optionChange( event ); }, 200 ); }, /** * Debounce optionChanged if no template. * * @since 2.0.0 * @param {Object} event - The JS event. * @return {void} */ optionChange: function( event, data ) { var $target = jQuery( event.target ), $option = $target.closest( '.fusion-builder-option' ), paramName = this.getParamName( $target, $option ), $dynamicWrapper = $option.closest( '.dynamic-wrapper' ), ajaxDynamicParam = false, debounceTimeout = 'tinymce' === $option.data( 'option-type' ) ? 300 : 500, element, option; if ( this.changesPaused ) { return; } // Fix range with default value not triggering properly. if ( $target.is( '.fusion-slider-input.fusion-with-default' ) || $target.is( '.awb-ignore' ) ) { return; } // Check if it is a dynamic param being changed which will result in an ajax request. if ( $dynamicWrapper.length && $dynamicWrapper.attr( 'data-ajax' ) && 'before' !== paramName && 'after' !== paramName && 'fallback' !== paramName ) { ajaxDynamicParam = $option.closest( '.dynamic-wrapper' ).attr( 'data-ajax' ); if ( $target.closest( '.fusion-builder-option' ).hasClass( 'text' ) ) { debounceTimeout = 500; } } // Forced default reset on select field. if ( 'object' === typeof data && 'undefined' !== typeof data.silent && data.silent && 'undefined' !== typeof this.elementView ) { element = fusionAllElements[ this.elementView.model.get( 'element_type' ) ]; option = element.params[ paramName ]; // If it has a callback then just set the param value directly. if ( 'undefined' !== typeof option.callback ) { this.elementView.changeParam( paramName, $target.val() ); return; } } if ( ! jQuery( event.target ).hasClass( 'fusion-skip-debounce' ) && ( this.model.get( 'noTemplate' ) || jQuery( event.target ).hasClass( 'fusion-debounce-change' ) || ajaxDynamicParam || 'tinymce' === $option.data( 'option-type' ) ) ) { if ( ! this.debouncedOptionChanges[ paramName ] ) { this.debouncedOptionChanges[ paramName ] = _.debounce( _.bind( this.optionChanged, this ), debounceTimeout ); } this.debouncedOptionChanges[ paramName ]( event ); } else { this.optionChanged( event ); } }, /** * Custom callback on option change. * * @since 2.0.0 * @return {void} */ customOnChangeCallback: function() { var functionName; // Manupulate model attributes via custom function if provided by element if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_change ) { functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_change; if ( 'function' === typeof FusionApp.callback[ functionName ] ) { this.model.attributes = FusionApp.callback[ functionName ]( jQuery.extend( true, {}, this.model.attributes ), this ); } } }, /** * Get real param name. * * @since 2.0.0 * @return {void} */ getParamName: function( $target, $option ) { var paramName = $option.data( 'option-id' ), $wrapper = $target.closest( '.fusion-builder-option' ); // Non single dimension fields or font family input. if ( $wrapper.hasClass( 'typography' ) || ( $wrapper.hasClass( 'dimension' ) && ! $target.closest( '.single-builder-dimension' ).length ) ) { paramName = $target.attr( 'name' ); } return paramName; }, /** * Get param value. * * @since 2.0.0 * @return {void} */ getParamValue: function( $target ) { var paramValue = $target.val(); // If code block element then need to use method to get val. if ( $target.closest( '.fusion-builder-option.code' ).length ) { paramValue = this.codeEditorOption[ $target.closest( '.fusion-builder-option.code' ).attr( 'data-index' ) ].getValue(); // Base64 encode for Code option type. if ( 1 === Number( FusionApp.settings.disable_code_block_encoding ) ) { paramValue = FusionPageBuilderApp.base64Encode( paramValue ); } } if ( $target.hasClass( 'fusion-builder-raw-textarea' ) ) { paramValue = FusionPageBuilderApp.base64Encode( paramValue ); } // Escape input fields. if ( $target.is( 'input' ) && '' !== paramValue ) { if ( ! $target.hasClass( 'fusion-builder-upload-field' ) && ! $target.hasClass( 'awb-typo-input' ) && ! $target.is( '#generator_element_content' ) && ! $target.is( '#generator_multi_child_content' ) && false === $target.closest( 'li' ).data( 'dynamic' ) ) { paramValue = _.escape( paramValue ); } } if ( $target.closest( '.fusion-builder-option' ).hasClass( 'escape_html' ) ) { paramValue = _.escape( paramValue ); } if ( $target.hasClass( 'fusion-multi-select-option' ) ) { paramValue = []; jQuery.each( $target.parent().find( '> .fusion-multi-select-option:checked' ), function( index, elem ) { paramValue.push( jQuery( elem ).val() ); } ); paramValue = paramValue.join( ',' ); } // Ajax select option type. if ( $target.closest( '.fusion-builder-option' ).hasClass( 'ajax_select' ) ) { paramValue = []; jQuery.each( $target.parent().find( '.fusion-select-option:checked' ), function( index, elem ) { paramValue.push( jQuery( elem ).val() ); } ); paramValue = paramValue.join( ',' ); } return paramValue; }, /** * Whether or not option change is valid. * * @since 2.0.0 * @return {void} */ shouldContinue: function( $target, paramName, paramValue, params ) { var tabId = this.$el.find( '.fusion-tab-content.active' ).length ? this.$el.find( '.fusion-tab-content.active' ).attr( 'id' ) : false, rowIndex, pricing, callbackFunction; // Filter value being changed. if ( $target.closest( '.fusion-builder-option.subgroup' ).length ) { return false; } // Repeater value being changed. if ( $target.closest( '.fusion-builder-option.repeater' ).length && ! $target.hasClass( 'fusion-repeater-value' ) ) { rowIndex = $target.closest( '.repeater-row' ).index(); this.setRepeaterValue( $target.closest( '.fusion-builder-option.repeater' ).find( '.fusion-repeater-value' ), paramName, rowIndex, paramValue ); return false; } // Dynamic value being changed. if ( $target.closest( '.fusion-dynamic-content' ).length ) { this.setDynamicParamValue( $target.closest( '.fusion-builder-option' ), paramName, paramValue ); return false; } if ( $target.hasClass( 'fusion-always-update' ) ) { return true; } if ( $target.hasClass( 'fusion-hide-from-atts' ) ) { return false; } // If its a tab and its not fully rendered yet. if ( tabId && ( 'undefined' === typeof this.tabsRendered[ tabId ] || true !== this.tabsRendered[ tabId ] ) ) { return false; } // Layout not complete. if ( false === this.loadComplete ) { return false; } if ( ! paramName ) { return false; } // If value hasnt changed. if ( paramValue === params[ paramName ] || ( '' === paramValue && 'undefined' === typeof params[ paramName ] ) ) { if ( 'fusion_pricing_column' !== this.model.get( 'element_type' ) ) { return false; } callbackFunction = FusionPageBuilderApp.getCallbackFunction( this.model.attributes, paramName, paramValue, this.elementView ); if ( 'fusionPricingTablePrice' !== callbackFunction[ 'function' ] ) { return false; } pricing = this.model.get( 'priceParams' ); if ( '' === paramValue && 'undefined' === typeof pricing[ paramName ] ) { return false; } } // If its a color picker with fusion using default set but the value its trying to use is not empty, then return. if ( $target.hasClass( 'fusion-using-default' ) && '' !== paramValue && 'undefined' !== typeof paramValue ) { return false; } return true; }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {Object} event - The event triggering the option change. * @return {void} */ optionChanged: function( event ) { var $target = jQuery( event.target ), $option = $target.closest( '.fusion-builder-option' ), reRender = true, params = this.model.get( 'params' ), modelData = jQuery.extend( this.model.attributes, {} ), paramName, initialVal, MultiGlobalArgs, paramValue, parentView; this.customOnChangeCallback(); paramName = this.getParamName( $target, $option ); paramValue = this.getParamValue( $target, paramName, paramValue, params ); initialVal = 'undefined' === typeof params[ paramName ] ? '' : params[ paramName ]; if ( ! this.shouldContinue( $target, paramName, paramValue, params ) ) { return; } this.optionHasChanged = true; if ( ! this.model.get( 'inlineElement' ) ) { if ( 'undefined' !== typeof this.elementView ) { reRender = this.elementView.updateParam( paramName, paramValue, event ); } } if ( 'undefined' !== typeof this.elementView && 'function' === typeof this.elementView.onOptionChange ) { this.elementView.onOptionChange( paramName, paramValue, event ); } // Trigger temporary active state if exists. this.triggerTemporaryState( $option ); // Trigger Option change for any other option to listen for it. FusionEvents.trigger( 'awb-options-change-' + paramName, paramValue, this.model.get( 'cid' ) ); if ( 'generated_element' === this.model.get( 'type' ) ) { return; } // Update inline element which has no separate view. if ( this.model.get( 'inlineElement' ) ) { params[ paramName ] = paramValue; this.model.set( 'params', params ); FusionPageBuilderApp.inlineEditorHelpers.processInlineElement( this.model, paramName ); } // Re render view, right now that is auto done on model change. if ( reRender && 'undefined' !== typeof this.elementView && ! $target.hasClass( 'skip-update' ) ) { // Re-render if element should. if ( -1 === this.model.get( 'element_type' ).indexOf( 'fusion_builder_column' ) || ( 'spacing' !== paramName ) ) { this.elementView.reRender(); } } // JS trigger for option specific refreshes. this._refreshJs( paramName ); // Trigger active states. this.triggerActiveStates(); // A setting of some kind has been changed. this.settingChanged = true; if ( this.childSortableView ) { this.childSortableView.render(); } // Handle multiple global elements. MultiGlobalArgs = { currentModel: this.model, handleType: 'changeOption', Name: paramName, Value: paramValue }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); }, getParentValues: function() { var parentView; if ( 'multi_element_child' === this.model.get( 'multi' ) ) { parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' === parentView ) { return false; } return parentView.model.get( 'params' ); } return false; }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function( paramName ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-option-change-' + paramName, this.model.attributes.cid ); }, /** * Destroys the options. * * @since 2.0.0 * @return {void} */ destroyOptions: function() { var self = this; // Close colorpickers before saving this.$el.find( '.fusion-color-created' ).each( function() { if ( 'undefined' !== typeof jQuery( this ).awbColorPicker( 'instance' ) ) { jQuery( this ).awbColorPicker( 'close' ); } } ); // Destroy each CodeMirror editor instance this.$el.find( '.fusion-builder-code-block' ).each( function( index ) { if ( self.codeEditorOption[ index ] ) { self.codeEditorOption[ index ].toTextArea(); } } ); // Remove each instance of tinyMCE editor from this view if it has been init. this.$el.find( '.fusion-editor-field' ).each( function() { var editorID = jQuery( this ).attr( 'id' ); if ( jQuery( this ).hasClass( 'fusion-init' ) ) { self.fusionBuilderMCEremoveEditor( editorID ); } } ); this.onDestroyOptions(); }, /** * Destroy options callback. * * @since 2.0.0 * @return {void} */ onDestroyOptions: function() { }, /** * Activate shortcode generator. * * @since 2.0.0 * @return {void} */ activateSCgenerator: function( event ) { openShortcodeGenerator( jQuery( event.target ) ); }, /** * Init the view options. * * @since 2.0.0 * @return {void} */ renderOptions: function() { var thisModel = this.model, fixSettingsLvl = false, parentAtts, attributes = jQuery.extend( true, {}, this.model.attributes ); // Fix for deprecated 'settings_lvl' attribute if ( 'undefined' !== thisModel.attributes.params.settings_lvl && 'parent' === thisModel.attributes.params.settings_lvl ) { fixSettingsLvl = true; parentAtts = thisModel.attributes.params; } if ( 'object' === typeof this.elementView ) { attributes.dynamic_params = this.elementView.dynamicParams.getAll(); } // Set correct type param based on TO setting in case 'old' container is edited. if ( 'fusion_builder_container' === this.model.get( 'element_type' ) && 'undefined' === typeof attributes.params.type ) { attributes.params.type = 1 === parseInt( fusionAllElements.fusion_builder_container.extras.container_legacy_support ) ? 'legacy' : 'flex'; } // We don't allow 'legacy' containers in header layout sections. if ( 'fusion_builder_container' === this.model.get( 'element_type' ) && 'undefined' !== typeof FusionApp.data.template_category && 'header' === FusionApp.data.template_category ) { attributes.params.type = 'flex'; } if ( 'function' === typeof this.filterAttributes ) { attributes = this.filterAttributes( attributes ); } this.$el.html( this.template( { atts: attributes } ) ); }, /** * Init the view options. * * @since 2.0.0 * @return {void} */ debouncedInitOptions: function( $element ) { var tabId = this.$el.find( '.fusion-tab-content.active' ).length ? this.$el.find( '.fusion-tab-content.active' ).attr( 'id' ) : false, $baseEl = tabId ? this.$el.find( '.fusion-tab-content.active' ) : this.$el, $thisEl = 'undefined' !== typeof $element && $element.length ? $element : $baseEl, self = this; // Check if tab has already been init. if ( 'undefined' === typeof $element && ( ( tabId && true === this.tabsRendered ) || ( 'undefined' !== typeof this.tabsRendered[ tabId ] && this.tabsRendered[ tabId ] ) || true === this.tabsRendered ) ) { return; } this.optionDynamicData( $thisEl ); this.textFieldPlaceholder( $thisEl ); this.optionDateTimePicker( $thisEl ); this.optionColorpicker( $thisEl ); this.optionColumnWidth( $thisEl ); this.optionFormOptions( $thisEl ); this.optionLogics( $thisEl ); this.optionIconpicker( $thisEl ); this.optionCodeBlock( $thisEl ); this.optionDimension( $thisEl ); this.optionSelect( $thisEl ); this.optionMultiSelect( $thisEl ); this.optionUpload( $thisEl ); this.optionMultiUpload( $thisEl ); this.optionEditor( $thisEl ); this.optionCheckboxButtonSet( $thisEl ); this.optionRadioButtonSet( $thisEl ); this.optionLinkSelector( $thisEl ); this.optionRange( $thisEl ); this.optionSortable( $thisEl ); this.optionSortableText( $thisEl ); this.optionConnectedSortable( $thisEl ); this.optionAjaxSelect( $thisEl ); this.optionFocusImage( $thisEl ); this.optionTypography( $thisEl ); // TODO: fix for WooCommerce element. if ( 'fusion_woo_shortcodes' === this.model.get( 'element_type' ) ) { if ( true === FusionPageBuilderApp.shortcodeGenerator ) { $thisEl.find( '#element_content' ).attr( 'id', 'generator_element_content' ); } } // Attachment upload alert. $thisEl.find( '.uploadattachment .fusion-builder-upload-button' ).on( 'click', function() { alert( fusionBuilderText.to_add_images ); // jshint ignore: line } ); // Fusion Form label update. if ( this.model.get( 'element_type' ).includes( 'fusion_form_' ) ) { setTimeout( function() { var elem = $thisEl.find( 'input[name="label"]' )[ 0 ], elemLen, oSel; if ( elem ) { elemLen = elem.value.length; // For IE Only if ( document.selection ) { // Set focus elem.focus(); // Use IE Ranges oSel = document.selection.createRange(); // Reset position to 0 & then set at end oSel.moveStart( 'character', -elemLen ); oSel.moveStart( 'character', elemLen ); oSel.moveEnd( 'character', 0 ); oSel.select(); } else if ( elem.selectionStart || '0' == elem.selectionStart ) { // Firefox/Chrome elem.selectionStart = elemLen; elem.selectionEnd = elemLen; elem.focus(); } // if } }, 200 ); $thisEl.on( 'change', '[name="label"]', function( event ) { var label = ( event.target && event.target.value ) || ''; var $name = jQuery( this ).parents().siblings( '[data-option-id="name"]' ).find( 'input' ); if ( '' === $name.val() && label ) { $name.val( _.fusionSanitize( label ) ); $name.trigger( 'change' ); } } ); $thisEl.on( 'keydown', '[name="name"], [name$="field_name"]', function( e ) { var c = e.which; var ascii = { '109': '45', '173': '45', '186': '59', '189': '45' }; if ( ascii.hasOwnProperty( c ) ) { c = ascii[ c ]; } if ( ( 65 <= c && 90 >= c ) || ( !e.shiftKey && 48 <= c && 57 >= c ) || 45 == c || ( e.shiftKey && 59 == c ) || 8 == c || ( 37 <= c && 40 >= c ) ) { return; } return event.preventDefault(); } ); } if ( 'undefined' === typeof $element ) { this.optionRepeater( 'builder' ); } setTimeout( function() { $thisEl.find( 'select, input, textarea, radio' ).filter( ':eq(0)' ).not( '[data-placeholder], .awb-color-picker' ).focus(); }, 1 ); // If rendering a specific tab, save this fact to prevent reinit. if ( tabId ) { setTimeout( function() { self.tabsRendered[ tabId ] = true; }, 500 ); } else { this.tabsRendered = true; } }, /** * Inserts shortcode from generator. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ insertGeneratedShortcode: function( event ) { var attributes, functionName, parentView, element; if ( event ) { event.preventDefault(); } // Remove activee states. this.removeActiveStates(); attributes = this.model.attributes; // Escapes &, <, >, ", `, and ' characters if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].escape_html && true === fusionAllElements[ this.model.get( 'element_type' ) ].escape_html ) { attributes.params.element_content = _.escape( attributes.params.element_content ); } // Manupulate model attributes via custom function if provided by element if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_save ) { functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_save; if ( 'function' === typeof FusionApp.callback[ functionName ] ) { attributes = FusionApp.callback[ functionName ]( attributes, this ); } } element = FusionPageBuilderApp.generateElementShortcode( this.model, false, true ); FusionEvents.trigger( 'fusion-history-resume-tracking' ); this.openGeneratorTarget(); fusionBuilderInsertIntoEditor( element, FusionPageBuilderApp.shortcodeGeneratorEditorID ); // Destroy option fields this.destroyOptions(); if ( 'multi_element_child' === this.model.get( 'multi' ) ) { // Set element/model attributes this.model.set( attributes ); FusionEvents.trigger( 'fusion-multi-element-edited' ); FusionEvents.trigger( 'fusion-multi-child-update-preview' ); parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof parentView ) { parentView.updateElementContent(); } } else if ( 'multi_element_parent' === this.model.get( 'multi' ) ) { // TODO: this.mode.set( 'params' ); this.model.set( attributes ); } if ( FusionPageBuilderApp.manuallyAdded ) { FusionPageBuilderApp.shortcodeGenerator = FusionPageBuilderApp.manualGenerator; FusionPageBuilderApp.shortcodeGeneratorEditorID = FusionPageBuilderApp.manualEditor; FusionPageBuilderApp.manuallyAdded = false; } if ( 'undefined' !== typeof this.model && 'undefined' !== typeof this.model.get( 'multi' ) && 'multi_element_child' === this.model.get( 'multi' ) ) { FusionEvents.trigger( 'fusion-child-changed' ); } this.remove(); FusionPageBuilderApp.shortcodeGenerator = ''; FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-settings-modal-save' ); }, removeView: function( cid ) { if ( cid !== this.model.get( 'cid' ) && ( 'undefined' === typeof this.model.parentView || ! this.model.parentView || cid !== this.model.parentView.model.get( 'cid' ) ) ) { return; } if ( this.dynamicSelection ) { this.dynamicSelection.removeView(); } // Destroy option fields this.destroyOptions(); FusionEvents.trigger( 'fusion-settings-removed', this.model.get( 'cid' ) ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-dialog-ui-active' ); this.remove(); }, /** * Saves the settings. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ saveSettings: function( event ) { var attributes, functionName, parentView, MultiGlobalArgs; if ( event ) { event.preventDefault(); } // Destroy option fields this.destroyOptions(); // Remove activee states. this.removeActiveStates(); attributes = this.model.attributes; // Column and container spacing. if ( 'fusion_builder_container' === this.model.get( 'element_type' ) || 'fusion_builder_column' === this.model.get( 'element_type' ) || 'fusion_builder_column_inner' === this.model.get( 'element_type' ) ) { this.elementView.destroyResizable(); this.elementView.$el.removeClass( 'fusion-builder-element-edited' ); } // Escapes &, <, >, ", `, and ' characters if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].escape_html && true === fusionAllElements[ this.model.get( 'element_type' ) ].escape_html ) { attributes.params.element_content = _.escape( attributes.params.element_content ); } // Manupulate model attributes via custom function if provided by element if ( 'undefined' !== typeof fusionAllElements[ this.model.get( 'element_type' ) ].on_save ) { functionName = fusionAllElements[ this.model.get( 'element_type' ) ].on_save; if ( 'function' === typeof FusionApp.callback[ functionName ] ) { attributes = FusionApp.callback[ functionName ]( attributes, this ); } } if ( 'multi_element_child' === this.model.get( 'multi' ) ) { // Set element/model attributes this.model.set( attributes ); FusionEvents.trigger( 'fusion-multi-element-edited' ); FusionEvents.trigger( 'fusion-multi-child-update-preview' ); parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof parentView ) { parentView.updateElementContent(); // Close parent's settings dialog. if ( event && 'undefined' !== typeof event.currentTarget && ( jQuery( event.currentTarget ).hasClass( 'fusiona-close-fb' ) || jQuery( event.currentTarget ).hasClass( 'ui-dialog-titlebar-close' ) ) ) { FusionEvents.trigger( 'fusion-close-settings-' + this.model.get( 'parent' ) ); } } this.remove(); } else if ( 'multi_element_parent' === this.model.get( 'multi' ) ) { // TODO: this.mode.set( 'params' ); this.model.set( attributes ); this.remove(); } else { // Regular element this.remove(); } if ( 'undefined' !== typeof this.elementView ) { this.elementView.onSettingsClose(); } // Handle multiple global elements. MultiGlobalArgs = { currentModel: this.model, handleType: 'save', attributes: this.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); if ( FusionPageBuilderApp.manuallyAdded ) { FusionPageBuilderApp.shortcodeGenerator = FusionPageBuilderApp.manualGenerator; FusionPageBuilderApp.shortcodeGeneratorEditorID = FusionPageBuilderApp.manualEditor; FusionPageBuilderApp.manuallyAdded = false; } if ( 'undefined' !== typeof this.model && 'undefined' !== typeof this.model.get( 'multi' ) && 'multi_element_child' === this.model.get( 'multi' ) ) { FusionEvents.trigger( 'fusion-child-changed' ); } FusionEvents.trigger( 'fusion-settings-modal-save', this.model.get( 'cid' ) ); }, /** * Saves the child and opens parent settings. * * @since 2.0.0 * @return {void} */ openParent: function( event ) { var parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( parentView ) { parentView.settings(); } this.saveSettings( event ); }, /** * Opens target dialog for generator insert/cancel. * * @since 2.0.0 * @return {void} */ openGeneratorTarget: function() { var targetView = FusionPageBuilderViewManager.getView( this.model.get( 'target' ) ); if ( targetView && 'dialog' === FusionApp.preferencesData.editing_mode ) { targetView.settings(); } }, /** * Closes the generator modal. * * @since 2.0.0 * @return {void} */ closeGeneratorModal: function() { // Destroy element model this.model.destroy(); FusionEvents.trigger( 'fusion-history-resume-tracking' ); FusionEvents.trigger( 'fusion-settings-modal-cancel' ); this.openGeneratorTarget(); this.remove(); }, /** * Remove an MCE Editor. * * @since 2.0.0 * @param {string} id - The editor ID. * @return {void} */ fusionBuilderMCEremoveEditor: function( id ) { if ( 'undefined' !== typeof window.tinyMCE ) { window.tinyMCE.execCommand( 'mceRemoveEditor', false, id ); if ( 'undefined' !== typeof window.tinyMCE.get( id ) ) { window.tinyMCE.remove( '#' + id ); } } }, /** * Runs before we start processing element settings dependencies. * * @since 2.0.0 * @return {void} */ beforeProcessDependencies: function() { var view = this, thisEl = view.$el, shortcode = view.model.get( 'element_type' ), dividerType, upAndDown, centerOption; // Special check for section separator. if ( 'undefined' !== typeof shortcode && 'fusion_section_separator' === shortcode ) { dividerType = thisEl.find( '#divider_type' ); upAndDown = dividerType.closest( 'ul' ).find( 'li[data-option-id="divider_candy"]' ).find( '.fusion-option-divider_candy' ).find( '.ui-button[data-value="bottom,top"]' ); centerOption = dividerType.closest( 'ul' ).find( 'li[data-option-id="divider_position"]' ).find( '.fusion-option-divider_position' ).find( '.ui-button[data-value="center"]' ); if ( 'triangle' !== dividerType.val() ) { upAndDown.hide(); } else { upAndDown.show(); } if ( 'bigtriangle' !== dividerType.val() ) { centerOption.hide(); } else { centerOption.show(); } dividerType.on( 'change paste keyup', function() { if ( 'triangle' !== jQuery( this ).val() ) { upAndDown.hide(); } else { upAndDown.show(); } if ( 'bigtriangle' !== jQuery( this ).val() ) { centerOption.hide(); if ( centerOption.hasClass( 'ui-state-active' ) ) { centerOption.prev().click(); } } else { centerOption.show(); } } ); } }, addSliderVideo: function( event ) { var defaultParams, elementType, targetCid = this.model.get( 'cid' ); if ( event ) { event.preventDefault(); } FusionPageBuilderApp.manualGenerator = FusionPageBuilderApp.shortcodeGenerator; FusionPageBuilderApp.manualEditor = FusionPageBuilderApp.shortcodeGeneratorEditorID; FusionPageBuilderApp.manuallyAdded = true; FusionPageBuilderApp.shortcodeGenerator = true; FusionPageBuilderApp.shortcodeGeneratorEditorID = 'video'; elementType = jQuery( event.currentTarget ).data( 'type' ); // Get default options defaultParams = fusionAllElements[ elementType ].defaults; this.collection.add( [ { type: 'generated_element', added: 'manually', element_type: elementType, params: defaultParams, target: targetCid } ] ); }, defaultPreview: function( event ) { var $element = jQuery( event.currentTarget ); if ( event ) { event.preventDefault(); } if ( FusionApp.sidebarView ) { FusionApp.sidebarView.shortcutClick( $element ); } }, showHideDescription: function( event ) { var $element = jQuery( event.currentTarget ); $element.closest( '.fusion-builder-option' ).find( '.description' ).first().slideToggle( 250 ); $element.toggleClass( 'active' ); }, showResponsiveOptions: function( event ) { var $element = jQuery( event.currentTarget ).parent(); $element.toggleClass( 'active-item' ); }, changeResponsiveOption: function( event ) { var $element = jQuery( event.currentTarget ); var $parent = jQuery( event.currentTarget ).closest( 'li.active-item' ); jQuery( '.fusion-builder-preview-' + $element.data( 'indicator' ) ).trigger( 'click' ); $parent.removeClass( 'active-item' ); }, hideResponsiveOptions: function( event ) { var $element = jQuery( event.currentTarget ); $element.find( '.fusion-panel-options li.active-item' ).removeClass( 'active-item' ); }, checkPageTemplate: function() { var option = this.$el.find( 'li[data-option-id="hundred_percent"]' ), postTypes = [ 'post', 'fusion_template', 'fusion_element' ]; if ( 'fusion_builder_container' === this.model.get( 'element_type' ) ) { option.show(); // Normal post and content override is not active. if ( 'fusion_tb_section' !== FusionApp.data.postDetails.post_type && 'object' !== typeof FusionApp.data.template_override.content ) { // Check the post type. if ( postTypes.includes( FusionApp.data.postDetails.post_type ) ) { // Blog post. if ( 'no' === FusionApp.data.postMeta._fusion.blog_width_100 || ( 'default' === FusionApp.data.postMeta._fusion.blog_width_100 && '0' === FusionApp.settings.blog_width_100 ) ) { option.hide(); } } else if ( 'avada_portfolio' === FusionApp.data.postDetails.post_type ) { // Portfolio post. if ( 'no' === FusionApp.data.postMeta._fusion.portfolio_width_100 || ( 'default' === FusionApp.data.postMeta._fusion.portfolio_width_100 && '0' === FusionApp.settings.portfolio_width_100 ) ) { option.hide(); } } else if ( '100-width.php' !== FusionApp.data.postMeta._wp_page_template ) { // Page with default template. option.hide(); } } else if ( 'undefined' !== typeof FusionApp.data.postMeta._fusion.fusion_tb_section_width_100 && 'no' === FusionApp.data.postMeta._fusion.fusion_tb_section_width_100 ) { // Template Builder. option.hide(); } } }, onInit: function() { }, onCancel: function() { }, defaultChanged: function( param, value ) { var self = this, $option = 0 < this.$el.find( 'li[data-option-id="' + param + '"]' ).length ? this.$el.find( 'li[data-option-id="' + param + '"]' ) : this.$el.find( '#' + param ).closest( '.fusion-builder-option' ), optionType = false, oldValue, $target, validColorValue, values, $datePicker, $timePicker; if ( ! $option.length ) { return; } if ( $option.attr( 'data-option-type' ) ) { optionType = $option.attr( 'data-option-type' ); } if ( ! optionType ) { optionType = $option.attr( 'class' ).replace( 'fusion-builder-option', '' ).trim(); } switch ( optionType ) { case 'colorpicker': case 'colorpickeralpha': $target = $option.find( '.awb-color-picker' ); if ( $target.length ) { if ( 'undefined' === typeof $target.awbColorPicker( 'instance' ) ) { break; } $target.awbColorPicker( 'instance' ).defaultColor( value ); if ( '' === $target.val() ) { // Refresh the preview to global color. $target.awbColorPicker( 'color', value ); $target.awbColorPicker( 'color', '' ); } } break; case 'range': if ( 'object' === typeof self.$rangeSlider && 'undefined' !== typeof self.$rangeSlider[ $option.attr( 'data-index' ) ] ) { if ( $option.find( '.fusion-range-default' ).length ) { oldValue = $option.find( '.fusion-range-default' ).attr( 'data-default' ); $option.find( '.fusion-range-default' ).attr( 'data-default', value ); } self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.options[ 'default' ] = value; if ( oldValue === self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.get() ) { $option.find( '.fusion-range-default' ).trigger( 'click' ); } } break; } }, paramChanged: function( param, value ) { var self = this, $option = 0 < this.$el.find( 'li[data-option-id="' + param + '"]' ).length ? this.$el.find( 'li[data-option-id="' + param + '"]' ) : this.$el.find( '[name=' + param + ']' ).closest( '.fusion-builder-option' ), optionType = false, $target, values, $datePicker, $timePicker; if ( jQuery( '.fusion-table-builder-chart' ).length ) { jQuery( '.fusion-table-builder-chart' ).closest( '.ui-dialog-content' ).dialog( 'close' ); } if ( ! $option.length ) { return; } if ( $option.attr( 'data-option-type' ) ) { optionType = $option.attr( 'data-option-type' ); } this.changesPaused = true; if ( ! optionType ) { optionType = $option.attr( 'class' ).replace( 'fusion-builder-option', '' ).trim(); } switch ( optionType ) { case 'iconpicker': $option.find( '.icon_preview.selected-element' ).removeClass( 'selected-element' ); if ( value && 2 === value.split( ' ' ).length ) { $option.find( '.icon-' + value.split( ' ' )[ 0 ] ).addClass( 'selected-element' ); } $option.find( '#' + param ).val( value ).trigger( 'change' ); break; case 'upload': $option.find( '#' + param ).val( value ).trigger( 'change' ); $option.find( '.fusion-builder-upload-preview img' ).remove(); if ( value && '' !== value ) { $option.find( '.fusion-upload-area:not( .fusion-uploaded-image )' ).addClass( 'fusion-uploaded-image' ); $option.find( '.fusion-builder-upload-preview' ).prepend( '<img src="' + value + '" />' ); } else { $option.find( '.fusion-upload-area' ).removeClass( 'fusion-uploaded-image' ); } break; case 'multiple_select': $option.find( '.fusion-select-preview' ).empty(); $option.find( 'input[type="checkbox"]' ).prop( 'checked', false ); if ( value && '' !== value ) { values = value.split( ',' ); _.each( values, function( value ) { $option.find( 'input[value="' + value + '"]' ).prop( 'checked', true ); $option.find( '.fusion-select-preview' ).append( '<span class="fusion-preview-selected-value" data-value="' + value + '">' + $option.find( 'input[value="' + value + '"]' ).attr( 'data-label' ) + '<span class="fusion-option-remove">x</span></span>' ); } ); } if ( 0 === $option.find( '.fusion-select-preview .fusion-preview-selected-value' ).length ) { $option.find( '.fusion-select-preview-wrap' ).addClass( 'fusion-select-show-placeholder' ); } else { $option.find( '.fusion-select-preview-wrap' ).removeClass( 'fusion-select-show-placeholder' ); } $option.find( '#' + param ).val( value ).trigger( 'change' ); break; case 'tinymce': if ( $option.find( '#child_' + param ).length ) { param = 'child_' + param; } $option.find( '#' + param ).val( value ); if ( $option.find( '#' + param ).hasClass( 'fusion-editor-field' ) && 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( param ) && ! window.tinyMCE.get( param ).isHidden() ) { if ( window.tinyMCE.get( param ).getParam( 'wpautop', true ) && 'undefined' !== typeof window.switchEditors ) { value = window.switchEditors.wpautop( value ); } window.tinyMCE.get( param ).setContent( value, { format: 'html' } ); } break; case 'date_time_picker': $option.find( '#' + param ).val( value ).trigger( 'change' ); $datePicker = $option.find( '.fusion-date-picker' ); $timePicker = $option.find( '.fusion-time-picker' ); if ( -1 !== value.indexOf( ' ' ) && $datePicker.length && $timePicker.length ) { values = value.split( ' ' ); $datePicker.val( values[ 0 ] ); $timePicker.val( values[ 1 ] ); } else if ( $datePicker.length ) { $datePicker.val( value ); } else if ( $timePicker.length ) { $timePicker.val( value ); } break; case 'raw_textarea': try { value = FusionPageBuilderApp.base64Decode( value ); $option.find( '#' + param ).val( value ).trigger( 'change' ); } catch ( e ) { console.warn( 'Something went wrong! Error triggered - ' + e ); } break; case 'code': if ( 'undefined' !== typeof self.codeEditorOption[ $option.attr( 'data-index' ) ] ) { try { value = FusionPageBuilderApp.base64Decode( value ); self.codeEditorOption[ $option.attr( 'data-index' ) ].setValue( value ); } catch ( e ) { console.warn( 'Something went wrong! Error triggered - ' + e ); } } break; case 'range': if ( 'undefined' !== typeof self.$rangeSlider[ $option.attr( 'data-index' ) ] ) { if ( 'undefined' === typeof value || '' === value ) { value = self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.options[ 'default' ]; } self.$rangeSlider[ $option.attr( 'data-index' ) ].noUiSlider.set( value ); } break; case 'checkbox_button_set': $option.find( '.button-set-value' ).val( value ).trigger( 'change' ); $option.find( '.ui-state-active' ).removeClass( 'ui-state-active' ); if ( 'string' === typeof value && '' !== value ) { values = value.split( ',' ); _.each( values, function( value ) { $option.find( '[data-value="' + value + '"]' ).addClass( 'ui-state-active' ); } ); } else if ( 'hide_on_mobile' === param ) { $option.find( '.buttonset-item' ).addClass( 'ui-state-active' ); } break; case 'select': $target = $option.find( '.fusion-select-options .fusion-select-label[data-value="' + value + '"]' ); if ( $target.length ) { $option.find( '.fusion-option-selected' ).removeClass( 'fusion-option-selected' ); $target.addClass( 'fusion-option-selected' ); $option.find( '.fusion-select-preview' ).html( $target.html() ); $option.find( '#' + param ).val( value ).trigger( 'fusion-change' ); } break; case 'colorpicker': case 'colorpickeralpha': $target = $option.find( '.fusion-builder-color-picker-hex' ); if ( $target.length ) { $target.val( value ).trigger( 'change' ); } break; case 'radio_button_set': $target = $option.find( '.buttonset-item[data-value="' + value + '"]' ); if ( $target.length ) { $option.find( '.ui-state-active' ).removeClass( 'ui-state-active' ); $target.addClass( 'ui-state-active' ); $option.find( '#' + param ).val( value ).trigger( 'change' ); } break; case 'dimension': $target = $option.find( '#' + param ); if ( $target.length ) { $target.val( value ).trigger( 'change' ); } break; case 'sortable': self.reRender(); break; case 'sortable_text': self.reRender(); break; case 'connected_sortable': self.reRender(); break; default: $option.find( '[name=' + param + ']' ).val( value ).trigger( 'change' ); break; } this.changesPaused = false; } } ); // Options _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionCodeBlock ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionColorPicker ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDimensionField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionIconPicker ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionOptionUpload ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.radioButtonSet ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionRangeField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSelectField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionCheckboxButtonSet ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDateTimePicker ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionEditor ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionAjaxSelect ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionMultiSelect ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSwitchField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionTextFieldPlaceholder ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionLinkSelector ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionRepeaterField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSortable ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionSortableText ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionConnectedSortable ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionDynamicData ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionTypographyField ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionColumnWidth ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionFormOptions ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionLogics ); _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.options.fusionImageFocusPoint ); // Active states. _.extend( FusionPageBuilder.ElementSettingsView.prototype, FusionPageBuilder.fusionActiveStates ); }( jQuery ) ); ;/* global CodeMirror, fusionAppConfig, fusionAllElements, fusionBuilderConfig */ /* eslint no-shadow: 0 */ /* eslint no-empty: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { var widgets, widget, widgetData, widgetDataPromise, widgetDataLoading, widgetDataLoaded, fusionConfig; widgets = []; /** * Gets all widget HTML forms * @param {Function} callback */ function getWidgetForms( callback ) { if ( widgetDataLoaded ) { return callback(); } if ( widgetDataLoading ) { widgetDataPromise.success( callback ); } else { widgetDataLoading = true; widgetDataPromise = jQuery.ajax( { url: fusionConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'fusion_get_widget_form' } } ).done( function( response ) { widgetDataLoaded = true; widgetDataLoading = false; widgetData = response.data; // Fix for the hashed widget php class names _.each( widgetData, function( value, key ) { if ( 'undefined' === typeof fusionAllElements.fusion_widget.params.type.value[ key ] ) { // Try to find a corresponding class name by widget name jQuery.map( fusionAllElements.fusion_widget.params.type.value, function( val, i ) { if ( val === value.name ) { // Add the new class name key value.title = i; widgetData[ i ] = value; // Delete the old class name key widgetData[ key ][ 'delete' ]; } } ); } } ); return callback && callback(); } ); } } $( document ).ready( function() { // Get correct fusion config in both front/backend fusionConfig = ( 'undefined' !== typeof FusionApp ) ? fusionAppConfig : fusionBuilderConfig; // Check if widget_element is enabled and get corresponding form html if ( fusionConfig.widget_element_enabled ) { getWidgetForms(); } FusionPageBuilder.BaseWidgetSettingsView = FusionPageBuilder.ElementSettingsView.extend( { /** * Invalid widgets list * Different from blacklist, because invalid widgets will force form append rather than use compatibility mode * * @since 2.0.0 */ invalidWidgets: [ 'Fusion_Widget_Social_Links' ], /** * Creates a formatted widget form field name. * * @since 2.0.0 * @param {String} className * @param {String} name */ createWidgetFieldName: function ( className, name ) { var prefix = className.toLowerCase().replace( /\\/g, '_' ) + '__'; name = name.toLowerCase(); try { prefix += name.match( /\[(.*?)\]/g ).slice( -1 )[ 0 ].replace( /\[|(\])/g, '' ); } catch ( e ) {} return prefix; }, /** * Parses a widget and registers it to `widgets` variable. * * @since 2.0.0 * @param {Object} widget * @param {String} className */ registerWidget: function( widget, className ) { var $form, selectors, fields, getElementAttributes, incorrectFields, self; self = this; fields = {}; // Make a form and insert widget form contents for easy manipulation $form = $( '<form></form>' ).html( widget.form ); // HTML selectors we want to retrieve from `$form` selectors = [ 'fieldset', 'input', 'select', 'textarea' ].join( ',' ); getElementAttributes = function ( element, keys ) { var result = {}; _.each( keys, function( key ) { result[ key ] = element[ key ]; } ); return result; }; // Start form parsing $form.find( selectors ).not( '[type="button"]' ).each( function() { var field, name; // The form field attributes field = getElementAttributes( this, [ 'id', 'className', 'name', 'tagName', 'type', 'value', 'placeholder', 'options', 'checked' ] ); // The form field name name = self.createWidgetFieldName( className, field.name ); // Map options for select elements field.options = _.map( field.options, function( option ) { return getElementAttributes( option, [ 'value', 'text', 'selected' ] ); } ); // Match field attributes to fusion form fields by tagName switch ( field.tagName ) { case 'INPUT': { if ( [ 'text', 'number' ].includes( field.type ) ) { field.type = 'textfield'; } else if ( 'checkbox' === field.type ) { field.type = 'radio_button_set'; field.value = { 'on': 'On', 'off': 'Off' }; // eslint-disable-next-line dot-notation field.default = field.checked ? 'on' : 'off'; } break; } case 'SELECT': { field.type = 'select'; field.value = _.reduce( field.options, function( options, option ) { if ( option.selected ) { field[ 'default' ] = option.value; } options[ option.value ] = option.text; return options; }, {} ); break; } case 'TEXTAREA': { field.type = 'textarea'; break; } default: break; } // Match field attributes to fusion form fields if ( field.id ) { // Temporal fix for menu widget typo field.id = 'widget-menu-widget--menu_Link_color' === field.id ? field.id.toLowerCase() : field.id; field.heading = $form.find( 'label[for="' + field.id + '"]' ).text() || field.placeholder; } field.param_name = name; // assing same ajax callback field.callback = {}; field.callback[ 'function' ] = 'fusion_get_widget_markup'; field.callback.ajax = true; if ( 'hidden' === field.type ) { delete field.dependency; field.hidden = true; } fields[ name ] = field; } ); // Check if there were errors during parsing and add it to incorrect fields array incorrectFields = _.find( fields, function ( field ) { return ! field.heading || !field.name; } ); widgets[ className ] = { className: className, fields: fields, data: widget, isInvalid: incorrectFields || this.invalidWidgets.includes( className ), isCoreWidget: [ 'WP_Widget_Text', 'WP_Widget_Media_Audio', 'WP_Widget_Media_Image', 'WP_Widget_Media_Video', 'WP_Widget_Media_Gallery', 'WP_Widget_Custom_HTML' ].includes( className ) }; }, /** * Register all widgets from `widgetData` to `widgets` * * @since 2.0.0 * @returns {void} */ registerWidgets: function () { var self = this; // Attach a callback to getWidgetForms() in case `widgetData` is not fully loaded getWidgetForms( function() { self.widgetData = widgetData; // Just parse `widgetData` once if ( ! widgets.length ) { _.each( self.widgetData, self.registerWidget.bind( self ) ); } self.setWidgetFields(); // HTML and Text widget especial unescape. if ( widget ) { if ( 'WP_Widget_Custom_HTML' === widget.className ) { self.model.attributes.params.wp_widget_custom_html__content = _.unescape( self.model.attributes.params.wp_widget_custom_html__content ); } else if ( 'WP_Widget_Text' === widget.className ) { self.model.attributes.params.wp_widget_text__text = _.unescape( self.model.attributes.params.wp_widget_text__text ); } } } ); }, /** * Cleans selection of a appended widget form * * @since 2.0.0 * @returns {void} */ clean: function() { //NOTE: required for form only this.destroyWidgetOptions(); this.deleteWpModels(); this.cleanForm(); }, /** * Cleans previous appended forms * * @since 2.0.0 * @return {void} */ cleanForm: function() { this.$el.find( '.fusion-widget-settings-form' ).remove(); }, /** * Appends form into settings view * * @since 2.2.0 * @return {void} */ insertForm: function () { var container, event, formSettings, widgetData, codeElement, $el, widgetClassName, self = this; // Create form and append it below the widget selector. container = this.$el.find( '#general .fusion_widget .fusion-builder-option:first ' ); widgetData = widget.data; widgetClassName = widget.className; formSettings = { coreWidget: widget.isCoreWidget, attributes: { id: widgetData.id + '-' + this.cid, base: widgetData.id, form: widgetData.form, type: widgetClassName, class: widgetData.classname }, widgetData: this.widgetData }; this.appendedForm = this.formTemplate( formSettings ); container.after( this.appendedForm ); jQuery( container.next() ).find( 'label' ).each( function() { if ( 'INPUT' === jQuery( this ).prev().prop( 'tagName' ) ) { jQuery( this ).prev().before( jQuery( this ) ); } jQuery( this ).children().insertAfter( jQuery( this ) ); } ); // Aditional steps for core widgets. if ( formSettings.coreWidget ) { $el = this.$el.find( '.widget-inside' ).parent(); this.setFormValues( widgetClassName ); // Create the core WP view. event = new jQuery.Event( 'widget-added' ); if ( 'WP_Widget_Text' === widgetClassName ) { wp.textWidgets.handleWidgetAdded( event, $el ); } else if ( 'WP_Widget_Custom_HTML' === widgetClassName ) { wp.customHtmlWidgets.handleWidgetAdded( event, $el ); } else { wp.mediaWidgets.handleWidgetAdded( event, $el ); } this.$el.find( '.widget-inside' ).css( 'display', 'block' ); if ( this.$el.find( '.wp-editor-area' ).length ) { setTimeout( function() { wp.textWidgets.widgetControls[ 'text-' + self.cid ].initializeEditor(); }, 200 ); } if ( this.$el.find( '.custom-html-widget-fields .code' ).length ) { codeElement = this.$el.find( '.custom-html-widget-fields .code' ); self.codeBlock = codeElement.next( '.CodeMirror' ).get( 0 ).CodeMirror; if ( ! self.codeBlock ) { self.codeBlock = CodeMirror.fromTextArea( codeElement[ 0 ], { lineNumbers: true, lineWrapping: true, autofocus: true, mode: 'htmlmixed' } ); } // Refresh editor after initialization setTimeout( function() { self.codeBlock.refresh(); self.codeBlock.focus(); }, 100 ); } } else { $el = this.$el.find( '.fusion-widget-settings-form' ); this.setFormValues( widgetClassName ); setTimeout( function() { $el.find( '.widget-inside' ).css( 'display', 'block' ); }, 100 ); } }, /** * Goes to each form value and set's default values or previously selected ones. * * @since 2.2.0 * @return {void} */ setFormValues: function( widgetClassName ) { var self = this; // Set form values var paramPrefix = widgetClassName.toLowerCase() + '__'; _.each( this.model.attributes.params, function( value, key ) { var $input, selector; if ( 'type' !== key && -1 !== key.indexOf( paramPrefix ) ) { selector = '[name$="[' + key.replace( paramPrefix, '' ) + ']"]'; $input = self.$el.find( selector ); } if ( $input && $input.length ) { if ( $input.is( ':checkbox' ) ) { if ( 1 === parseInt( value ) || true === value || 'on' === value || 'enabled' === value ) { $input.prop( 'checked', true ); } else { $input.prop( 'checked', false ); } } else { $input.val( value ); } } } ); }, /** * Delete the models. * * @since 2.2.0 * @returns {void} */ deleteWpModels: function() { if ( 'undefined' !== typeof wp.mediaWidgets.widgetControls && 'undefined' !== typeof wp.mediaWidgets.modelCollection ) { wp.mediaWidgets.modelCollection.reset(); wp.mediaWidgets.widgetControls = {}; } if ( 'undefined' !== typeof wp.textWidgets.widgetControls ) { wp.textWidgets.widgetControls = {}; } if ( 'undefined' !== typeof wp.customHtmlWidgets.widgetControls ) { wp.customHtmlWidgets.widgetControls = {}; } }, /** * Handler to destroy specific widget options. * * @since 2.2.0 * @returns {void} */ destroyWidgetOptions: function() { // Remove each instance of tinyMCE editor from this view this.$el.find( '.wp-editor-area' ).each( function() { var editorID = jQuery( this ).attr( 'id' ); if ( 'undefined' !== typeof window.tinyMCE ) { window.tinyMCE.execCommand( 'mceRemoveEditor', false, editorID ); if ( 'undefined' !== typeof window.tinyMCE.get( editorID ) ) { window.tinyMCE.remove( '#' + editorID ); } } } ); }, /** * Removes all generated options from selected widget * * @since 2.2.0 * @returns {void} */ cleanWidget: function() { var self = this; if ( ! widget ) { return; } // Clean prev fields _.each( widget.fields, function( field, key ) { delete fusionAllElements.fusion_widget.params[ key ]; delete self.model.attributes.params[ key ]; } ); widget = null; }, /** * Returns current selected widget * * @since 2.2.0 * @returns {void} */ getWidget: function() { return widget; }, /** * Sets the widget * Action get's called when user selects a widget in <select />. * * @since 2.2.0 * @returns {void} */ setWidget: function() { var className = this.model.attributes.params.type; if ( ! className || ! widgets[ className ] ) { return; } widget = widgets[ className ]; }, /** * Updates settings fields according to the selected widget * * @since 2.2.0 * @returns {Void} */ updateWidget: function() { var self = this; if ( ! widget || widget.isCoreWidget || widget.isInvalid ) { return; } // Update with widget fields fusionAllElements.fusion_widget.params = _.extend( { type: fusionAllElements.fusion_widget.params.type }, widget.fields, fusionAllElements.fusion_widget.params ); // Set default values _.each( widget.fields, function( field, key ) { // Skip if it already have a default param if ( 'undefined' !== typeof self.model.attributes.params[ key ] ) { return; } if ( 'object' === typeof field.value && field.value[ field[ 'default' ] ] ) { self.model.attributes.params[ key ] = field[ 'default' ]; } else if ( 'object' !== typeof field.value && ( field[ 'default' ] || field.value ) ) { self.model.attributes.params[ key ] = field[ 'default' ] || field.value; } } ); }, /** * Sets settings fields according to the selected widget * * @since 2.2.0 * @returns {Void} */ setWidgetFields: function () { if ( widget && widget.className === this.model.attributes.params.type ) { return; } this.cleanWidget(); this.setWidget(); this.updateWidget(); } } ); } ); }( jQuery ) ); ;/* eslint-disable no-mixed-operators */ /* eslint no-useless-concat: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { $( document ).ready( function() { FusionPageBuilder.BulkAddView = window.wp.Backbone.View.extend( { className: FusionPageBuilder.ElementSettingsView.prototype.className + ' fusion-builder-bulk-add-dialog', template: FusionPageBuilder.template( $( '#fusion-builder-bulk-add-template' ).html() ), events: { 'click .predefined-choice': 'predefinedChoices' }, getChoices: function() { var textarea = this.$el.find( 'textarea' ).val(), choices = []; if ( textarea ) { _.each( textarea.split( /\n/ ), function( line ) { var choice = line.trim(); if ( choice ) { choices.push( choice ); } } ); } return choices; }, predefinedChoices: function( event ) { var $element = jQuery( event.target ), value = $element.data( 'value' ), choices; if ( ! isNaN( value ) ) { choices = this.options.choices[ value ].values; choices = choices.join( '\n' ); this.$el.find( 'textarea' ).val( choices ); } } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, fusionAppConfig, FusionEvents, fusionBuilderText, FusionPageBuilderApp, fusionGlobalManager */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element View FusionPageBuilder.ElementSettingsParent = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-child-sortables' ).html() ), events: { 'click .fusion-builder-add-multi-child': 'addChildElement', 'click .fusion-builder-add-predefined-multi-child': 'addPredefinedChildElement', 'click .fusion-builder-add-multi-gallery-images': 'openMediaUploaderForGalleryAndImageCarousel', 'click .fusion-builder-multi-setting-remove': 'removeChildElement', 'click .fusion-builder-multi-setting-clone': 'cloneChildElement', 'click .fusion-builder-multi-setting-options': 'editChildElement' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.elementView = FusionPageBuilderViewManager.getView( this.model.get( 'cid' ) ); this.listenTo( FusionEvents, 'fusion-child-changed', this.render ); this.listenTo( this.model.children, 'add', this.render ); this.listenTo( this.model.children, 'remove', this.render ); this.listenTo( this.model.children, 'sort', this.render ); this.settingsView = this.attributes.settingsView; }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.html( this.template( this.model ) ); this.sortableOptions(); return this; }, /** * Make sortable. * * @since 2.0.0 * @return {void} */ sortableOptions: function() { var self = this; this.$el.find( '.fusion-builder-sortable-children' ).sortable( { axis: 'y', cancel: '.fusion-builder-multi-setting-remove, .fusion-builder-multi-setting-options, .fusion-builder-multi-setting-clone', helper: 'clone', update: function( event, ui ) { var content = '', newIndex = ui.item.parent().children( '.ui-sortable-handle' ).index( ui.item ), elementView = FusionPageBuilderViewManager.getView( ui.item.data( 'cid' ) ), childView; // Update collection FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, self.model.get( 'cid' ) ); self.$el.find( '.fusion-builder-sortable-children li' ).each( function() { childView = FusionPageBuilderViewManager.getView( jQuery( this ).data( 'cid' ) ); content += FusionPageBuilderApp.generateElementShortcode( childView.$el, false ); } ); self.elementView.setContent( content ); // After sorting of children remove the preview block class, as the mouseleave sometimes isn't triggered. if ( ! jQuery( 'body' ).hasClass( 'fusion-sidebar-resizing' ) && jQuery( 'body' ).hasClass( 'fusion-preview-block' ) ) { jQuery( 'body' ).removeClass( 'fusion-preview-block' ); } // Save history state FusionEvents.trigger( 'fusion-history-save-step', window.fusionBuilderText.moved + ' ' + window.fusionAllElements[ childView.model.get( 'element_type' ) ].name + ' ' + window.fusionBuilderText.element ); } } ); }, /** * Adds a child element view and renders it. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addChildElement: function( event, predefinedParams ) { if ( event ) { event.preventDefault(); } this.elementView.addChildElement( null, predefinedParams ); this.render(); this.settingsView.optionHasChanged = true; }, /** * Adds a children element views and renders it, used in Bulk Add dialog. * * @since 3.5.0 * @param {Object} event - The event. * @return {void} */ addPredefinedChildElement: function( event ) { var self = this, modalView; if ( event ) { event.preventDefault(); } if ( jQuery( '.fusion-builder-settings-bulk-dialog' ).length ) { return; } modalView = new FusionPageBuilder.BulkAddView( { choices: fusionAppConfig.predefined_choices } ); jQuery( modalView.render().el ).dialog( { title: ( fusionBuilderText.bulk_add + ' / ' + fusionBuilderText.bulk_add_predefined ), dialogClass: 'fusion-builder-dialog fusion-builder-settings-dialog bulk-add-dialog', resizable: false, width: 450, buttons: [ { text: fusionBuilderText.cancel, click: function() { jQuery( this ).dialog( 'close' ); } }, { text: fusionBuilderText.bulk_add_insert_choices, click: function() { var choices = modalView.getChoices(); event.preventDefault(); _.each( choices, function( choice ) { var predefinedParams = {}; if ( -1 !== choice.indexOf( '||' ) ) { // We have multiple params in one choice. _.each( choice.split( '||' ), function( param ) { var paramKeyValue = param.split( '|' ); predefinedParams[ paramKeyValue[ 0 ] ] = {}; predefinedParams[ paramKeyValue[ 0 ] ].param_name = paramKeyValue[ 0 ].trim(); predefinedParams[ paramKeyValue[ 0 ] ].value = paramKeyValue[ 1 ].trim(); } ); } else { // Use choice as element_content. predefinedParams = { 'element_content': { param_name: 'element_content', value: choice } }; } self.addChildElement( null, predefinedParams ); } ); jQuery( this ).dialog( 'close' ); }, class: 'ui-button-blue' } ], open: function() { jQuery( '.fusion-builder-modal-settings-container' ).css( 'z-index', 9998 ); }, beforeClose: function() { jQuery( '.fusion-builder-modal-settings-container' ).css( 'z-index', 99999 ); jQuery( this ).remove(); } } ); }, /** * Open a WP Media, to select multiple images, for Gallery Element and Image Carousel Element. * * @since 3.5.0 * @param {Object} event - The event. * @return {void} */ openMediaUploaderForGalleryAndImageCarousel: function( event ) { var multi_upload_button = jQuery( event.currentTarget ).closest( '.fusion-tabs' ).find( '.fusion-multiple-upload-image input' ); var originalButtonEvent; if ( event ) { event.preventDefault(); } originalButtonEvent = this.settingsView.openMultipleMedia.bind( multi_upload_button ); originalButtonEvent( event ); }, /** * Removes a child element view and rerenders. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeChildElement: function( event ) { var childCid, childView, MultiGlobalArgs; childCid = jQuery( event.target ).closest( '.fusion-builder-data-cid' ).data( 'cid' ); childView = FusionPageBuilderViewManager.getView( childCid ); event.preventDefault(); childView.removeElement( event ); this.render(); // Handle multiple global elements. MultiGlobalArgs = { currentModel: childView.model, handleType: 'changeOption' }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); this.settingsView.optionHasChanged = true; }, /** * Clones a child element view and rerenders. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ cloneChildElement: function( event ) { var childCid, childView, parentView, MultiGlobalArgs; childCid = jQuery( event.target ).closest( '.fusion-builder-data-cid' ).data( 'cid' ); childView = FusionPageBuilderViewManager.getView( childCid ); parentView = FusionPageBuilderViewManager.getView( this.model.get( 'cid' ) ); event.preventDefault(); childView.cloneElement(); this.render(); // Handle multiple global elements. MultiGlobalArgs = { currentModel: childView.model, handleType: 'changeOption' }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); this.settingsView.optionHasChanged = true; }, /** * Edits a child element view and rerenders. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ editChildElement: function( event ) { var childCid = jQuery( event.target ).closest( '.fusion-builder-data-cid' ).data( 'cid' ), childView = FusionPageBuilderViewManager.getView( childCid ); event.preventDefault(); childView.settings(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderEvents, fusionBuilderText, FusionPageBuilderApp, fusionAppConfig, FusionApp, FusionEvents, ajaxurl */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { $( document ).ready( function() { // Base Library View FusionPageBuilder.BaseLibraryView = window.wp.Backbone.View.extend( { /** * Array of studio content's media. */ mediaImportKeys: [], /** * Studio Import Modal View. */ studioImportModalView: null, /** * Demo Import Modal View. */ demoImportModalView: null, initialize: function( attributes ) { this.options = attributes; this.listenTo( FusionEvents, 'fusion-studio-content-imported', this.loadBuilderAssets ); }, removeView: function() { FusionPageBuilderApp.activeModal = ''; this.remove(); }, loadStudio: function( type ) { var self = this, $container = 'fusion_template' === type ? jQuery( '#fusion-builder-' + type + '-studio' ) : this.$el.find( '#fusion-builder-' + type + '-studio' ), $layoutsContainer = $container.find( '.studio-imports' ), $sidebar = $container.find( 'aside > ul' ); // Early exit if studio is not active. if ( '1' !== fusionAppConfig.studio_status ) { return; } // Ajax request for data. if ( ! $layoutsContainer.children().length ) { // Already have the data, append the layouts we want. if ( FusionPageBuilderApp.studio.studioData ) { self.insertStudioContent( $layoutsContainer, $sidebar, type ); return; } // Make the request and do it on success. jQuery.when( FusionPageBuilderApp.studio.getStudioData() ).done( function() { self.insertStudioContent( $layoutsContainer, $sidebar, type ); } ); return; } FusionPageBuilderApp.studio.initFilter( $sidebar ); FusionPageBuilderApp.studio.initLazyLoad( $layoutsContainer ); }, insertStudioContent: function( $layoutsContainer, $sidebar, type ) { var studioTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_studio_layout' ).html() ), studioElements = {}; $layoutsContainer.prev( '.fusion-loader' ).hide(); // TB section. if ( 'fusion_template' === type && 'string' === typeof FusionApp.data.template_category ) { type = FusionApp.data.template_category; } // Forms. if ( 'fusion_template' === type && 'string' === typeof FusionApp.data.postDetails.post_type && 'fusion_form' === FusionApp.data.postDetails.post_type ) { type = 'forms'; } // Off Canvas. if ( 'fusion_template' === type && 'string' === typeof FusionApp.data.postDetails.post_type && 'awb_off_canvas' === FusionApp.data.postDetails.post_type ) { type = 'awb_off_canvas'; } if ( 'object' === typeof FusionPageBuilderApp.studio.studioData && null !== FusionPageBuilderApp.studio.studioData && 'undefined' !== typeof FusionPageBuilderApp.studio.studioData[ type ] ) { studioElements = FusionPageBuilderApp.studio.filterLayouts( FusionPageBuilderApp.studio.studioData[ type ] ); _.each( studioElements, function( templateData ) { $layoutsContainer.append( jQuery( studioTemplate( templateData ) ) ); } ); // TODO: needs to be translatable. $sidebar.append( '<li data-slug="all" class="current">' + fusionBuilderText.all + ' <span>' + _.size( studioElements ) + '</span></li>' ); _.each( FusionPageBuilderApp.studio.studioData.studio_tags[ type ], function( templateTag ) { $sidebar.append( '<li data-slug="' + templateTag.slug + '">' + templateTag.name + ' <span>' + templateTag.count + '</span></li>' ); } ); } FusionPageBuilderApp.studio.initFilter( $sidebar ); FusionPageBuilderApp.studio.initLazyLoad( $layoutsContainer ); }, /** * Things to do before studio item import starts. * * @return void */ beforeStudioItemImport: function() { // Hide library modal and it's overlay. this.$el.closest( '.ui-dialog' ).css( 'display', 'none' ).next( '.ui-widget-overlay' ).css( 'display', 'none' ); // Display import modal. this.studioImportModalView = new FusionPageBuilder.StudioImportModalView(); jQuery( 'body' ).append( this.studioImportModalView.render().el ); this.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_content ); }, /** * Imports studio post's media. * * @param {object} postData * @return promise */ importStudioMedia: function( postData, mediaKey ) { this.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_media + ' ' + mediaKey.replace( '_', ' ' ) ); this.studioImportModalView.updateProgressBar( postData.avada_media, mediaKey ); return jQuery.ajax( { type: 'POST', url: ajaxurl, dataType: 'JSON', data: { action: 'awb_studio_import_media', data: { mediaImportKey: mediaKey, postData: postData }, fusion_load_nonce: fusionAppConfig.fusion_load_nonce }, success: function( data ) { FusionPageBuilderApp.studio.setImportData( data ); } } ); }, /** * Imports demo page's media. * * @param {object} postData * @return promise */ importDemoPageMedia: function( postData, mediaKey ) { this.demoImportModalView.updateStatus( fusionBuilderText.demo_importing_media + ' ' + mediaKey.replace( '_', ' ' ) ); this.demoImportModalView.updateProgressBar( postData.avada_media, mediaKey ); return jQuery.ajax( { type: 'POST', url: ajaxurl, dataType: 'JSON', data: { action: 'awb_studio_import_media', data: { mediaImportKey: mediaKey, postData: postData }, fusion_load_nonce: fusionAppConfig.fusion_load_nonce }, success: function( data ) { FusionPageBuilderApp.website.setImportData( data ); } } ); }, loadWebsite: function() { var self = this, $container = jQuery( '#fusion-builder-layouts-demos' ), $sidebar = $container.find( 'aside' ), $layoutsContainer = $container.find( '.studio-imports' ); // Ajax request for data. if ( ! $container.find( '.studio-imports' ).children().length ) { // Already have the data, append the layouts we want. if ( FusionPageBuilderApp.website.websiteData ) { self.insertWebsiteContent( $container ); return; } // Make the request and do it on success. jQuery.when( FusionPageBuilderApp.website.getWebsiteData() ).done( function() { self.insertWebsiteContent( $container ); } ); } FusionPageBuilderApp.website.initFilter( $sidebar ); FusionPageBuilderApp.website.initLazyLoad( $layoutsContainer ); FusionPageBuilderApp.website.initImport( $container ); }, insertWebsiteContent: function( $container ) { var $layoutsContainer = $container.find( '.studio-imports' ), $sidebar = $container.find( 'aside' ), $pagesContainer = $container.find( '.awb-pages-container' ), siteTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_website_layout' ).html() ), pageTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_website_pages' ).html() ), sidebarTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_website_tags' ).html() ), siteElements = {}, classes; $layoutsContainer.prev( '.fusion-loader' ).hide(); if ( 'object' === typeof FusionPageBuilderApp.website.websiteData ) { $container.find( '.awb-sites-failed-msg' ).hide() .end().find( '.awb-sites-wrapper' ).css( 'display', '' ); siteElements = FusionPageBuilderApp.website.websiteData.data; _.each( siteElements, function( templateData ) { $layoutsContainer.append( jQuery( siteTemplate( templateData ) ) ); $pagesContainer.append( jQuery( pageTemplate( templateData ) ) ); } ); $sidebar.append( jQuery( sidebarTemplate( FusionPageBuilderApp.website.websiteData ) ) ); } else { $container.find( '.awb-sites-failed-msg' ).show() .end().find( '.awb-sites-wrapper' ).hide(); } FusionPageBuilderApp.website.initFilter( $sidebar ); FusionPageBuilderApp.website.initLazyLoad( $layoutsContainer ); FusionPageBuilderApp.website.initImport( $container ); }, /** * Things to do before demo page import starts. * * @return void */ beforeDemoPageImport: function() { // Close library modal. this.removeView(); // Display import modal. this.demoImportModalView = new FusionPageBuilder.DemoImportModalView(); jQuery( 'body' ).append( this.demoImportModalView.render().el ); this.demoImportModalView.updateStatus( fusionBuilderText.demo_importing_content ); }, /** * Dynamically loads assets which are referenced in the studio content import. * * @param {Object} post_data */ loadBuilderAssets: function( post_data ) { // Enqueue custom icons' CSS file, update global icons object and reinit iconpickers. if ( 'undefined' !== typeof post_data.custom_icons ) { jQuery.each( post_data.custom_icons, function( index, customIconSet ) { // Builder window. jQuery( 'head' ).append( '<link rel="stylesheet" id="' + customIconSet.post_name + '" href="' + customIconSet.css_url + '" type="text/css" media="all">' ); // Preview window. jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'head' ).append( '<link rel="stylesheet" id="' + customIconSet.post_name + '" href="' + customIconSet.css_url + '" type="text/css" media="all">' ); // Update global icons object. // It should be an object, wp_localize_script doesnt convert empty array to an object. if ( Array.isArray( fusionAppConfig.customIcons ) && 0 === fusionAppConfig.customIcons.length ) { fusionAppConfig.customIcons = {}; } fusionAppConfig.customIcons[ customIconSet.post_name ] = customIconSet; } ); // Reinit icon picker after all new custom icon sets were added. FusionApp.reInitIconPicker(); } } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionAppConfig, fusionGlobalManager, fusionBuilderText, FusionEvents, fusionAllElements, FusionPageBuilderViewManager */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Elements View FusionPageBuilder.ElementLibraryView = FusionPageBuilder.BaseLibraryView.extend( { className: 'fusion_builder_modal_settings', events: { 'click .fusion-builder-all-modules .fusion-builder-element:not(.fusion-builder-element-generator,.fusion-builder-disabled-element)': 'addModule', 'click .fusion_builder_custom_elements_load': 'addCustomModule', 'click .fusion-builder-column-layouts li': 'addNestedColumns', 'click .fusion-studio-load': 'loadStudioElement' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function( attributes ) { this.options = attributes; if ( true === FusionPageBuilderApp.shortcodeGenerator ) { this.template = FusionPageBuilder.template( jQuery( '#fusion-builder-generator-modules-template' ).html() ); } else if ( 'fusion_builder_column_inner' === this.model.get( 'element_type' ) ) { this.template = FusionPageBuilder.template( jQuery( '#fusion-builder-nested-column-modules-template' ).html() ); } else { this.template = FusionPageBuilder.template( jQuery( '#fusion-builder-modules-template' ).html() ); } }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.html( this.template( FusionPageBuilderApp.elements ) ); // Load saved elements FusionPageBuilderApp.showSavedElements( 'elements', this.$el.find( '#custom-elements' ) ); FusionApp.elementSearchFilter( this.$el ); FusionApp.dialog.dialogTabs( this.$el ); this.loadStudio( 'elements' ); return this; }, /** * Adds a custom element and triggers an ajax call. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addCustomModule: function( event ) { var layoutID, title, self = this, isGlobal, targetElement; if ( event ) { event.preventDefault(); } if ( true === FusionApp.layoutIsLoading ) { return; } FusionApp.layoutIsLoading = true; layoutID = jQuery( event.currentTarget ).closest( 'li' ).data( 'layout_id' ); title = jQuery( event.currentTarget ).find( '.fusion_module_title' ).text(); isGlobal = jQuery( event.currentTarget ).closest( 'li' ).hasClass( 'fusion-global' ); if ( 'undefined' !== typeof this.options.targetElement ) { targetElement = this.options.targetElement; } jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '0' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).show(); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: isGlobal, fusion_layout_id: layoutID } } ) .done( function( data ) { var dataObj = JSON.parse( data ); if ( 'undefined' !== typeof targetElement ) { FusionPageBuilderApp.shortcodesToBuilder( dataObj.post_content, FusionPageBuilderApp.parentColumnId, false, false, targetElement, 'after' ); } else { FusionPageBuilderApp.shortcodesToBuilder( dataObj.post_content, FusionPageBuilderApp.parentColumnId ); } FusionApp.layoutIsLoading = false; jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '1' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).hide(); if ( isGlobal ) { setTimeout( fusionGlobalManager.handleGlobalsFromLibrary, 500, layoutID, FusionPageBuilderApp.parentColumnId ); } } ) .always( function() { FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_custom_element + title ); FusionEvents.trigger( 'fusion-content-changed' ); self.removeView(); } ); }, /** * Adds an element. * * @param {Object} event - The event. * @return {void} */ addModule: function( event ) { var $thisEl, label, params, multi, type, name, defaultParams, allowGenerator, currentModel, childUi, elementParams, MultiGlobalArgs; if ( event ) { event.preventDefault(); } $thisEl = jQuery( event.currentTarget ); label = $thisEl.find( '.fusion_module_label' ).text(); if ( label in fusionAllElements ) { defaultParams = fusionAllElements[ label ].params; multi = fusionAllElements[ label ].multi; type = fusionAllElements[ label ].shortcode; name = fusionAllElements[ label ].name; allowGenerator = fusionAllElements[ label ].allow_generator; childUi = fusionAllElements[ label ].child_ui; } else { defaultParams = ''; multi = ''; type = ''; allowGenerator = ''; } params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { params[ param.param_name ] = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; } ); elementParams = { type: 'element', added: 'manually', cid: FusionPageBuilderViewManager.generateCid(), element_type: type, params: params, parent: this.attributes[ 'data-parent_cid' ], view: this.options.view, allow_generator: allowGenerator, inline_editor: FusionPageBuilderApp.inlineEditorHelpers.inlineEditorAllowed( type ), multi: multi, child_ui: childUi, at_index: FusionPageBuilderApp.getCollectionIndex( this.options.targetElement ) }; if ( 'undefined' !== typeof this.options.targetElement ) { elementParams.targetElement = this.options.targetElement; elementParams.targetElementPosition = 'after'; } currentModel = this.collection.add( [ elementParams ] ); this.remove(); // Handle multiple global elements. MultiGlobalArgs = { currentModel: currentModel[ 0 ], handleType: 'save', attributes: currentModel[ 0 ].attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added + ' ' + name + ' ' + fusionBuilderText.element ); FusionEvents.trigger( 'fusion-content-changed' ); }, /** * Adds nested columns. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addNestedColumns: function( event ) { var moduleID, $layoutEl, layout, layoutElementsNum, innerRow, elementParams; if ( event ) { event.preventDefault(); } moduleID = FusionPageBuilderViewManager.generateCid(); elementParams = { type: 'fusion_builder_row_inner', element_type: 'fusion_builder_row_inner', added: 'manually', cid: moduleID, parent: this.model.get( 'cid' ), view: this, at_index: FusionPageBuilderApp.getCollectionIndex( this.options.targetElement ) }; if ( 'undefined' !== typeof this.options.targetElement ) { elementParams.targetElement = this.options.targetElement; elementParams.targetElementPosition = 'after'; } this.collection.add( [ elementParams ] ); innerRow = FusionPageBuilderViewManager.getView( moduleID ); FusionPageBuilderApp.activeModal = 'column'; $layoutEl = jQuery( event.target ).is( 'li' ) ? jQuery( event.target ) : jQuery( event.target ).closest( 'li' ); layout = $layoutEl.data( 'layout' ).split( ',' ); layoutElementsNum = _.size( layout ); _.each( layout, function( element, index ) { var updateContent = layoutElementsNum == ( index + 1 ) ? 'true' : 'false'; // jshint ignore: line innerRow.addNestedColumn( element, false ); } ); this.remove(); FusionEvents.trigger( 'fusion-content-changed' ); innerRow.setRowData(); // Used to ensure if cancel that the columns are part of initial content. innerRow.updateSavedContent(); if ( event ) { FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_nested_columns ); FusionEvents.trigger( 'fusion-content-changed' ); } setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-content-changed', innerRow.$el.closest( '.fusion-builder-column-outer' ).data( 'cid' ) ); }, 300 ); }, /** * Adds a studio element. * * @since 3.2 * @param {Object} event - The event. * @return {void} */ loadStudioElement: function( event ) { var layoutID, title, self = this, $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), $layoutsContainer = $layout.closest( '.studio-imports' ), targetElement; if ( event ) { event.preventDefault(); } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; layoutID = $layout.data( 'layout_id' ); title = $layout.find( '.fusion_module_title' ).text(); if ( 'undefined' !== typeof this.options.targetElement ) { targetElement = this.options.targetElement; } jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: false, fusion_layout_id: layoutID, fusion_studio: true, category: 'elements', post_id: FusionApp.getPost( 'post_id' ) }, beforeSend: function() { self.beforeStudioItemImport(); }, success: function( data ) { var i, promises = [], dfd = jQuery.Deferred(), // Master deferred. dfdNext = dfd; // Next deferred in the chain. dfd.resolve(); // Reset array. self.mediaImportKeys = []; // We have the content, let's check for assets. // Filter out empty properties (now those are empty arrays). if ( 'object' === typeof data.avada_media ) { Object.keys( data.avada_media ).forEach( function( key ) { // We expect and object. if ( 'object' === typeof data.avada_media[ key ] && ! Array.isArray( data.avada_media[ key ] ) ) { self.mediaImportKeys.push( key ); } } ); } // Import studio media if needed. if ( 0 < self.mediaImportKeys.length ) { // Set first AJAX response as initial data. FusionPageBuilderApp.studio.setImportData( data ); for ( i = 0; i < self.mediaImportKeys.length; i++ ) { // IIFE to freeze the value of i. ( function( k ) { // eslint-disable-line no-loop-func dfdNext = dfdNext.then( function() { return self.importStudioMedia( FusionPageBuilderApp.studio.getImportData(), self.mediaImportKeys[ k ] ); } ); promises.push( dfdNext ); }( i ) ); } jQuery.when.apply( null, promises ).then( function() { /* var lastAjaxResponse; if ( 1 === promises.length ) { lastAjaxResponse = arguments[ 0 ]; } else { lastAjaxResponse = arguments[ promises.length - 1 ][ 0 ]; } */ if ( 'undefined' !== typeof targetElement ) { FusionPageBuilderApp.shortcodesToBuilder( FusionPageBuilderApp.studio.getImportData().post_content, FusionPageBuilderApp.parentColumnId, false, false, targetElement, 'after' ); } else { FusionPageBuilderApp.shortcodesToBuilder( FusionPageBuilderApp.studio.getImportData().post_content, FusionPageBuilderApp.parentColumnId ); } FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', FusionPageBuilderApp.studio.getImportData() ); self.studioElementImportComplete( event ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); }, function() { self.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_content_failed ); self.studioElementImportComplete( event ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); } ); } else { if ( 'undefined' !== typeof targetElement ) { FusionPageBuilderApp.shortcodesToBuilder( data.post_content, FusionPageBuilderApp.parentColumnId, false, false, targetElement, 'after' ); } else { FusionPageBuilderApp.shortcodesToBuilder( data.post_content, FusionPageBuilderApp.parentColumnId ); } FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', data ); self.studioElementImportComplete( event ); } } } ); }, /** * Does what needs to be done when element is imported. * * @since 3.5 * @param {Object} event - The event. */ studioElementImportComplete: function( event ) { var $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), title = $layout.find( '.fusion_module_title' ).text(); FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); // Unset 'added' attribute from newly created row model this.model.unset( 'added' ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_studio_element + title ); FusionEvents.trigger( 'fusion-content-changed' ); // Remove modal view. this.studioImportModalView.remove(); // Close library modal. this.removeView(); } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionAppConfig, fusionBuilderText, FusionEvents, fusionAllElements, FusionPageBuilderViewManager, fusionHistoryState */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Column Library View FusionPageBuilder.ColumnLibraryView = FusionPageBuilder.BaseLibraryView.extend( { className: 'fusion_builder_modal_settings', template: FusionPageBuilder.template( jQuery( '#fusion-builder-column-library-template' ).html() ), events: { 'click .fusion-builder-column-layouts li': 'addColumns', 'click .fusion_builder_custom_columns_load': 'addCustomColumn', 'click .fusion-studio-load': 'loadStudioColumn' }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.html( this.template( this.model.toJSON() ) ); FusionPageBuilderApp.showSavedElements( 'columns', this.$el.find( '#custom-columns' ) ); FusionApp.elementSearchFilter( this.$el ); FusionApp.dialog.dialogTabs( this.$el ); this.loadStudio( 'columns' ); return this; }, /** * Adds a custom column. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addCustomColumn: function( event ) { var thisModel, layoutID, title, self = this, isGlobal; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'column'; if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; thisModel = this.model; layoutID = jQuery( event.currentTarget ).data( 'layout_id' ); title = jQuery( event.currentTarget ).find( '.fusion_module_title' ).text(); isGlobal = jQuery( event.currentTarget ).closest( 'li' ).hasClass( 'fusion-global' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '0' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).show(); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: isGlobal, fusion_layout_id: layoutID } } ) .done( function( data ) { var dataObj = JSON.parse( data ); FusionPageBuilderApp.shortcodesToBuilder( dataObj.post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '1' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).hide(); if ( isGlobal ) { setTimeout( window.fusionGlobalManager.handleGlobalsFromLibrary, 500, layoutID, FusionPageBuilderApp.parentRowId ); } } ) .always( function() { // Unset 'added' attribute from newly created row model thisModel.unset( 'added' ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_custom_column + title ); FusionEvents.trigger( 'fusion-content-changed' ); self.removeView(); } ); }, /** * Adds columns. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addColumns: function( event ) { var that, $layoutEl, layout, layoutElementsNum, thisView, defaultParams, params, value, rowView, updateContent, columnAttributes, columnCids = [], columnCid, columnView, atIndex, targetElement, lastCreated; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'column'; that = this; $layoutEl = jQuery( event.target ).is( 'li' ) ? jQuery( event.target ) : jQuery( event.target ).closest( 'li' ); layout = $layoutEl.data( 'layout' ).split( ',' ); layoutElementsNum = _.size( layout ); thisView = this.options.view, targetElement = ( 'undefined' !== typeof this.options.targetElement ) ? this.options.targetElement : false; atIndex = FusionPageBuilderApp.getCollectionIndex( targetElement ); _.each( layout, function( element, index ) { // Get default settings defaultParams = fusionAllElements.fusion_builder_column.params; params = {}; columnCid = FusionPageBuilderViewManager.generateCid(); columnCids.push( columnCid ); // Process default parameters from shortcode _.each( defaultParams, function( param ) { value = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; params[ param.param_name ] = value; } ); params.type = element; updateContent = layoutElementsNum == ( index + 1 ) ? 'true' : 'false'; // jshint ignore: line columnAttributes = { type: 'fusion_builder_column', element_type: 'fusion_builder_column', cid: columnCid, parent: that.model.get( 'cid' ), view: thisView, params: params, at_index: atIndex }; // Append to last created column if ( lastCreated ) { targetElement = FusionPageBuilderViewManager.getView( lastCreated ); targetElement = targetElement.$el; } if ( targetElement ) { columnAttributes.targetElement = targetElement; columnAttributes.targetElementPosition = 'after'; } FusionPageBuilderApp.collection.add( [ columnAttributes ] ); lastCreated = columnCid; if ( 'new' === atIndex ) { atIndex = 1; } else { atIndex++; } } ); // Unset 'added' attribute from newly created row model this.model.unset( 'added' ); // Update view column calculations. rowView = FusionPageBuilderViewManager.getView( FusionPageBuilderApp.parentRowId ); if ( rowView ) { rowView.createVirtualRows(); rowView.updateColumnsPreview(); } FusionEvents.trigger( 'fusion-content-changed' ); this.removeView(); if ( event ) { _.each( columnCids, function( cid ) { columnView = FusionPageBuilderViewManager.getView( cid ); if ( columnView ) { columnView.scrollHighlight( cid === columnCid ); } } ); // Save history state if ( true === FusionPageBuilderApp.newContainerAdded ) { window.fusionHistoryState = fusionBuilderText.added_section; // jshint ignore: line FusionPageBuilderApp.newContainerAdded = false; } else { window.fusionHistoryState = fusionBuilderText.added_columns; // jshint ignore: line } FusionEvents.trigger( 'fusion-history-save-step', window.fusionHistoryState ); } }, /** * Adds a custom column. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ loadStudioColumn: function( event ) { var layoutID, self = this, parentID = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( parentID ), $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), targetColumn = jQuery( [] ); // Empty jQuery object. if ( parentView.$el instanceof jQuery ) { targetColumn = parentView.$el.find( '.fusion-builder-column' ).last(); } if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'column'; if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; layoutID = $layout.data( 'layout_id' ); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: false, fusion_layout_id: layoutID, fusion_studio: true, category: 'columns', post_id: FusionApp.getPost( 'post_id' ) }, beforeSend: function() { self.beforeStudioItemImport(); }, success: function( data ) { var i, promises = [], dfd = jQuery.Deferred(), // Master deferred. dfdNext = dfd; // Next deferred in the chain. dfd.resolve(); // Reset array. self.mediaImportKeys = []; // We have the content, let's check for assets. // Filter out empty properties (now those are empty arrays). if ( 'object' === typeof data.avada_media ) { Object.keys( data.avada_media ).forEach( function( key ) { // We expect and object. if ( 'object' === typeof data.avada_media[ key ] && ! Array.isArray( data.avada_media[ key ] ) ) { self.mediaImportKeys.push( key ); } } ); } // Import studio media if needed. if ( 0 < self.mediaImportKeys.length ) { // Set first AJAX response as initial data. FusionPageBuilderApp.studio.setImportData( data ); for ( i = 0; i < self.mediaImportKeys.length; i++ ) { // IIFE to freeze the value of i. ( function( k ) { // eslint-disable-line no-loop-func dfdNext = dfdNext.then( function() { return self.importStudioMedia( FusionPageBuilderApp.studio.getImportData(), self.mediaImportKeys[ k ] ); } ); promises.push( dfdNext ); }( i ) ); } jQuery.when.apply( null, promises ).then( function() { /* var lastAjaxResponse; if ( 1 === promises.length ) { lastAjaxResponse = arguments[ 0 ]; } else { lastAjaxResponse = arguments[ promises.length - 1 ][ 0 ]; } */ FusionPageBuilderApp.shortcodesToBuilder( FusionPageBuilderApp.studio.getImportData().post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', FusionPageBuilderApp.studio.getImportData() ); self.studioColumnImportComplete( event, targetColumn ); FusionPageBuilderApp.studio.resetImportData(); }, function() { self.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_content_failed ); self.studioColumnImportComplete( event, targetColumn ); } ); } else { FusionPageBuilderApp.shortcodesToBuilder( data.post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', data ); self.studioColumnImportComplete( event, targetColumn ); } } } ); }, /** * Does what needs to be done when column is imported. * * @since 3.5 * @param {Object} event - The event. * @param {jQuery} targetColumn - The Column after which the new column is inserted. */ studioColumnImportComplete: function( event, targetColumn ) { var $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), $scroll_elem = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-one-page-text-link' ), title = $layout.find( '.fusion_module_title' ).text(), cid = ''; FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); // Unset 'added' attribute from newly created row model this.model.unset( 'added' ); // Scroll to column container. if ( targetColumn.length ) { cid = targetColumn.next( '.fusion-builder-column' ).attr( 'data-cid' ); if ( 'undefined' !== typeof cid && cid ) { $scroll_elem.attr( 'href', '#fusion-column-' + cid ).fusion_scroll_to_anchor_target( 15 ); } } // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_studio_column + title ); FusionEvents.trigger( 'fusion-content-changed' ); // Remove modal view. this.studioImportModalView.remove(); // Close library modal. this.removeView(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, fusionBuilderText, FusionEvents, FusionApp */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Elements View FusionPageBuilder.NestedColumnLibraryView = window.wp.Backbone.View.extend( { className: 'fusion-builder-modal-settings-container', template: FusionPageBuilder.template( jQuery( '#fusion-builder-column-library-template' ).html() ), events: { 'click .fusion-builder-column-layouts li': 'addNestedColumns', 'click .fusion-builder-modal-close': 'closeModal' }, initialize: function( attributes ) { this.options = attributes; this.listenTo( FusionEvents, 'fusion-modal-view-removed', this.remove ); }, render: function() { this.$el.html( this.template( this.options ) ); this.$el.addClass( 'fusion-add-to-nested' ); FusionApp.elementSearchFilter( this.$el ); return this; }, addNestedColumns: function( event ) { var $layoutEl, layout, layoutElementsNum, appendAfter, innerRow, innerColumn, targetElement, parent = this.attributes[ 'data-parent_cid' ], atIndex, lastCreatedCid, lastCreatedView; if ( event ) { event.preventDefault(); } innerRow = FusionPageBuilderViewManager.getView( parent ); if ( 'undefined' !== typeof this.attributes[ 'data-nested_column_cid' ] ) { innerColumn = FusionPageBuilderViewManager.getView( this.attributes[ 'data-nested_column_cid' ] ); appendAfter = innerColumn.$el; targetElement = innerColumn.$el; } else { appendAfter = ( this.$el ).closest( '.fusion-builder-row-content' ).find( '.fusion-builder-row-container-inner' ); } atIndex = window.FusionPageBuilderApp.getCollectionIndex( targetElement ); $layoutEl = jQuery( event.target ).is( 'li' ) ? jQuery( event.target ) : jQuery( event.target ).closest( 'li' ); layout = $layoutEl.data( 'layout' ).split( ',' ); layoutElementsNum = _.size( layout ); _.each( layout, function( element, index ) { // jshint ignore:line lastCreatedCid = innerRow.addNestedColumn( element, appendAfter, targetElement, atIndex ); lastCreatedView = FusionPageBuilderViewManager.getView( lastCreatedCid ); targetElement = lastCreatedView.$el; atIndex++; } ); innerRow.createVirtualRows(); innerRow.updateColumnsPreview(); this.remove(); FusionEvents.trigger( 'fusion-columns-added' ); if ( event ) { // Save history state FusionEvents.trigger( 'fusion-history-turn-on-tracking' ); window.fusionHistoryState = fusionBuilderText.added_nested_columns; FusionEvents.trigger( 'fusion-content-changed' ); } }, closeModal: function( event ) { event.preventDefault(); this.remove(); } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionAllElements, FusionPageBuilderViewManager, FusionEvents, fusionHistoryState, fusionAppConfig, fusionBuilderText, fusionGlobalManager */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Column Library View FusionPageBuilder.ContainerLibraryView = FusionPageBuilder.BaseLibraryView.extend( { className: 'fusion_builder_modal_settings', template: FusionPageBuilder.template( jQuery( '#fusion-builder-container-library-template' ).html() ), events: { 'click .fusion-builder-column-layouts li': 'addColumns', 'click .fusion_builder_custom_sections_load': 'addCustomSection', 'click .fusion-special-item': 'addSpecialItem', 'click .fusion-studio-load': 'loadStudioContainer' }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.html( this.template( this.model.toJSON() ) ); // Show saved custom sections FusionPageBuilderApp.showSavedElements( 'sections', this.$el.find( '#custom-sections' ) ); FusionApp.elementSearchFilter( this.$el ); FusionApp.dialog.dialogTabs( this.$el ); // TODO: move to tab change and only if registered. this.loadStudio( 'sections' ); return this; }, /** * Adds columns. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addColumns: function( event ) { var that, $layoutEl, layout, layoutElementsNum, thisView, defaultParams, params, value, rowView, updateContent, columnAttributes, columnCids = [], columnCid, columnView; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'column'; that = this; $layoutEl = jQuery( event.target ).is( 'li' ) ? jQuery( event.target ) : jQuery( event.target ).closest( 'li' ); layout = '' !== $layoutEl.data( 'layout' ) ? $layoutEl.data( 'layout' ).split( ',' ) : false; layoutElementsNum = _.size( layout ); thisView = this.options.view; // Create row columns. if ( layout ) { _.each( layout, function( element, index ) { // Get default settings defaultParams = fusionAllElements.fusion_builder_column.params; params = {}; columnCid = FusionPageBuilderViewManager.generateCid(); columnCids.push( columnCid ); // Process default parameters from shortcode _.each( defaultParams, function( param ) { value = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; params[ param.param_name ] = value; } ); params.type = element; updateContent = layoutElementsNum == ( index + 1 ) ? 'true' : 'false'; // jshint ignore: line columnAttributes = { type: 'fusion_builder_column', element_type: 'fusion_builder_column', cid: columnCid, parent: that.model.get( 'cid' ), view: thisView, params: params }; that.collection.add( [ columnAttributes ] ); } ); } // Unset 'added' attribute from newly created row model this.model.unset( 'added' ); // Update view column calculations. rowView = FusionPageBuilderViewManager.getView( FusionPageBuilderApp.parentRowId ); rowView.setRowData(); FusionEvents.trigger( 'fusion-content-changed' ); this.removeView(); if ( event ) { _.each( columnCids, function( cid ) { columnView = FusionPageBuilderViewManager.getView( cid ); if ( columnView ) { columnView.scrollHighlight( cid === columnCid ); } } ); // Save history state if ( true === FusionPageBuilderApp.newContainerAdded ) { window.fusionHistoryState = fusionBuilderText.added_section; // jshint ignore: line FusionPageBuilderApp.newContainerAdded = false; } else { window.fusionHistoryState = fusionBuilderText.added_columns; // jshint ignore: line } FusionEvents.trigger( 'fusion-history-save-step', window.fusionHistoryState ); jQuery( '.fusion-builder-live' ).removeClass( 'fusion-builder-blank-page-active' ); } }, /** * Adds a custom section. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addCustomSection: function( event ) { var thisModel = this.model, parentID = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( parentID ), self = this, layoutID, title, targetContainer, isGlobal; targetContainer = parentView.$el.prev( '.fusion-builder-container' ); FusionPageBuilderApp.targetContainerCID = targetContainer.data( 'cid' ); if ( event ) { event.preventDefault(); } if ( 'undefined' !== typeof parentView ) { parentView.removeContainer(); } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; layoutID = jQuery( event.currentTarget ).data( 'layout_id' ); title = jQuery( event.currentTarget ).find( '.fusion_module_title' ).text(); isGlobal = jQuery( event.currentTarget ).closest( 'li' ).hasClass( 'fusion-global' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '0' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).show(); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: isGlobal, fusion_layout_id: layoutID } } ) .done( function( data ) { var dataObj = JSON.parse( data ); FusionPageBuilderApp.shortcodesToBuilder( dataObj.post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).css( 'opacity', '1' ); jQuery( event.currentTarget ).parent( '.fusion-builder-all-modules' ).prev( '#fusion-loader' ).hide(); if ( isGlobal ) { setTimeout( fusionGlobalManager.handleGlobalsFromLibrary, 500, layoutID, FusionPageBuilderApp.parentRowId ); } } ) .always( function() { // Unset 'added' attribute from newly created section model thisModel.unset( 'added' ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_custom_section + title ); jQuery( '.fusion-builder-live' ).removeClass( 'fusion-builder-blank-page-active' ); FusionEvents.trigger( 'fusion-content-changed' ); self.removeView(); } ); }, /** * Adds special item. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ addSpecialItem: function( event ) { var parentID = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( parentID ), targetContainer, moduleID, params = {}; if ( event ) { event.preventDefault(); } targetContainer = parentView.$el.prev( '.fusion-builder-container' ); FusionPageBuilderApp.targetContainerCID = targetContainer.find( '.fusion-builder-data-cid' ).data( 'cid' ); moduleID = FusionPageBuilderViewManager.generateCid(); this.collection.add( [ { type: jQuery( event.currentTarget ).data( 'type' ), added: 'manually', module_type: jQuery( event.currentTarget ).data( 'type' ), cid: moduleID, params: params, view: parentView, appendAfter: targetContainer, created: 'auto' } ] ); if ( 'undefined' !== typeof parentView ) { FusionPageBuilderApp.targetContainerCID = ''; parentView.removeContainer(); } FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_special_item + jQuery( event.currentTarget ).find( '.fusion_module_title' ).text() ); this.removeView(); }, /** * Loads the container via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ loadStudioContainer: function( event ) { var self = this, parentID = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( parentID ), $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), layoutID, targetContainer; targetContainer = parentView.$el.prev( '.fusion-builder-container' ); FusionPageBuilderApp.targetContainerCID = targetContainer.data( 'cid' ); if ( event ) { event.preventDefault(); } if ( 'undefined' !== typeof parentView ) { parentView.removeContainer(); } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; layoutID = $layout.data( 'layout_id' ); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_is_global: false, fusion_layout_id: layoutID, fusion_studio: true, category: 'sections', post_id: FusionApp.getPost( 'post_id' ) }, beforeSend: function() { self.beforeStudioItemImport(); }, success: function( data ) { var i, promises = [], dfd = jQuery.Deferred(), // Master deferred. dfdNext = dfd; // Next deferred in the chain. dfd.resolve(); // Reset array. self.mediaImportKeys = []; // We have the content, let's check for assets. // Filter out empty properties (now those are empty arrays). if ( 'object' === typeof data.avada_media ) { Object.keys( data.avada_media ).forEach( function( key ) { // We expect and object. if ( 'object' === typeof data.avada_media[ key ] && ! Array.isArray( data.avada_media[ key ] ) ) { self.mediaImportKeys.push( key ); } } ); } // Import studio media if needed. if ( 0 < self.mediaImportKeys.length ) { // Set first AJAX response as initial data. FusionPageBuilderApp.studio.setImportData( data ); for ( i = 0; i < self.mediaImportKeys.length; i++ ) { // IIFE to freeze the value of i. ( function( k ) { // eslint-disable-line no-loop-func dfdNext = dfdNext.then( function() { return self.importStudioMedia( FusionPageBuilderApp.studio.getImportData(), self.mediaImportKeys[ k ] ); } ); promises.push( dfdNext ); }( i ) ); } jQuery.when.apply( null, promises ).then( function() { /* var lastAjaxResponse; if ( 1 === promises.length ) { lastAjaxResponse = arguments[ 0 ]; } else { lastAjaxResponse = arguments[ promises.length - 1 ][ 0 ]; } */ FusionPageBuilderApp.shortcodesToBuilder( FusionPageBuilderApp.studio.getImportData().post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', FusionPageBuilderApp.studio.getImportData() ); self.studioContainerImportComplete( event, targetContainer ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); }, function() { self.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_content_failed ); self.studioContainerImportComplete( event, targetContainer ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); } ); } else { FusionPageBuilderApp.shortcodesToBuilder( data.post_content, FusionPageBuilderApp.parentRowId ); FusionPageBuilderApp.layoutIsLoading = false; FusionEvents.trigger( 'fusion-studio-content-imported', data ); self.studioContainerImportComplete( event, targetContainer ); } } } ); }, /** * Does what needs to be done when container is imported. * * @since 3.5 * @param {Object} event - The event. * @param {jQuery} targetContainer - The container after which the new container is inserted. */ studioContainerImportComplete: function( event, targetContainer ) { var $scroll_elem = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-one-page-text-link' ), cid = '', thisModel = this.model, $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), title = $layout.find( '.fusion_module_title' ).text(); FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); // Unset 'added' attribute from newly created section model thisModel.unset( 'added' ); // Scroll to container. if ( targetContainer.length ) { cid = targetContainer.next( '.fusion-builder-container' ).attr( 'data-cid' ); if ( 'undefined' !== typeof cid && cid ) { $scroll_elem.attr( 'href', '#fusion-container-' + cid ).fusion_scroll_to_anchor_target( 15 ); } } // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.added_studio_section + title ); jQuery( '.fusion-builder-live' ).removeClass( 'fusion-builder-blank-page-active' ); FusionEvents.trigger( 'fusion-content-changed' ); // Remove modal view. this.studioImportModalView.remove(); // Close library modal. this.removeView(); } } ); } ); }( jQuery ) ); ;/* global FusionEvents, FusionPageBuilderViewManager, fusionAllElements, tinyMCE, FusionPageBuilderApp, fusionBuilderInsertIntoEditor, FusionApp */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Generator elements library FusionPageBuilder.GeneratorElementsView = window.wp.Backbone.View.extend( { className: 'fusion_builder_modal_settings', template: FusionPageBuilder.template( jQuery( '#fusion-builder-generator-modules-template' ).html() ), events: { 'click .fusion-builder-all-modules .fusion-builder-element': 'addElement', 'click .fusion-builder-column-layouts .generator-column': 'addColumns', 'click .fusion-builder-column-layouts .generator-section': 'addContainer' }, initialize: function( attributes ) { this.options = attributes; this.listenTo( FusionEvents, 'fusion-modal-view-removed', this.remove ); }, render: function() { this.$el.html( this.template( FusionPageBuilderApp.elements ) ); FusionApp.elementSearchFilter( this.$el ); FusionApp.dialog.dialogTabs( this.$el ); return this; }, addElement: function( event ) { var $thisEl, title, label, params, multi, type, selection, defaultParams, elementSettings; if ( event ) { event.preventDefault(); } $thisEl = jQuery( event.currentTarget ); title = $thisEl.find( '.fusion_module_title' ).text(); label = $thisEl.find( '.fusion_module_label' ).text(); if ( label in fusionAllElements ) { multi = fusionAllElements[ label ].multi; type = fusionAllElements[ label ].shortcode; } else { params = ''; multi = ''; type = ''; } // Get default settings defaultParams = jQuery.extend( true, {}, fusionAllElements[ label ].params ); params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { var value; if ( _.isObject( param.value ) ) { value = param[ 'default' ]; } else { value = param.value; } params[ param.param_name ] = value; } ); elementSettings = { type: 'generated_element', added: 'manually', element_type: type, params: params, view: this.options.view, multi: multi, target: this.options.targetCid, cid: FusionPageBuilderViewManager.generateCid() }; if ( 'undefined' !== params.element_content && 'undefined' !== typeof tinyMCE && 'undefined' !== tinyMCE.activeEditor && 'undefined' === typeof multi && window.tinyMCE.activeEditor ) { selection = window.tinyMCE.activeEditor.selection.getContent(); if ( selection ) { elementSettings.params.element_content = selection; window.tinyMCE.activeEditor.selection.setContent( '' ); selection = ''; delete elementSettings.added; } } this.collection.add( elementSettings ); // Reset shortcode generator. FusionPageBuilderApp.shortcodeGenerator = ''; FusionPageBuilderApp.shortcodeGeneratorEditorID = ''; this.remove(); }, addColumns: function( event ) { var that, $layoutEl, layout, layoutElementsNum, thisView, defaultParams, params, value, columnModel, generatedShortcode = '[fusion_builder_row_inner]', elementType = 'fusion_builder_column_inner', closingTag = '[/fusion_builder_row_inner]'; if ( ! FusionPageBuilderApp.builderActive && jQuery( event.target ).closest( '#builder-regular-columns' ).length ) { generatedShortcode = ''; elementType = 'fusion_builder_column'; closingTag = ''; } if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'column'; that = this; $layoutEl = jQuery( event.target ).is( 'li' ) ? jQuery( event.target ) : jQuery( event.target ).closest( 'li' ); layout = $layoutEl.data( 'layout' ).split( ',' ); layoutElementsNum = _.size( layout ); thisView = this.options.view; // Get default settings defaultParams = fusionAllElements[ elementType ].params; params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { if ( _.isObject( param.value ) ) { value = param[ 'default' ]; } else { value = param.value; } params[ param.param_name ] = value; } ); _.each( layout, function( element, index ) { var updateContent, columnAttributes; params.type = element; updateContent = layoutElementsNum === ( index + 1 ) ? 'true' : 'false'; columnAttributes = { type: 'generated_element', added: 'manually', element_type: elementType, view: thisView, params: params }; columnModel = that.collection.add( columnAttributes ); generatedShortcode += FusionPageBuilderApp.generateElementShortcode( columnModel, false, true ); } ); generatedShortcode += closingTag; fusionBuilderInsertIntoEditor( generatedShortcode, FusionPageBuilderApp.shortcodeGeneratorEditorID ); // Reset shortcode generator FusionPageBuilderApp.shortcodeGenerator = ''; FusionPageBuilderApp.shortcodeGeneratorEditorID = ''; this.remove(); }, addContainer: function( event ) { var elementID, defaultParams, params, value; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.activeModal = 'container'; elementID = FusionPageBuilderViewManager.generateCid(); defaultParams = fusionAllElements.fusion_builder_container.params; params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { if ( _.isObject( param.value ) ) { value = param[ 'default' ]; } else { value = param.value; } params[ param.param_name ] = value; } ); this.collection.add( [ { type: 'generated_element', added: 'manually', element_type: 'fusion_builder_container', params: params, view: this } ] ); } } ); } ); }( jQuery ) ); ;/* global fusionGlobalManager, fusionBuilderText, fusionAllElements, FusionEvents, FusionPageBuilderViewManager, FusionPageBuilderApp, FusionPageBuilderElements, FusionApp */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { $( document ).ready( function() { // Nested Column View FusionPageBuilder.NestedColumnView = FusionPageBuilder.BaseColumnView.extend( { template: FusionPageBuilder.template( $( '#fusion-builder-inner-column-template' ).html() ), events: { 'click .fusion-builder-add-element': 'addModule', 'click .fusion-builder-settings-column': 'settings', 'click .fusion-builder-column-remove': 'removeColumn', 'click .fusion-builder-column-clone': 'cloneColumn', 'click .fusion-builder-column-size': 'sizesShow', 'click .column-size': 'sizeSelectWirefame', 'click .fusion-builder-column-drag': 'preventDefault' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.$el.attr( 'data-column-size', this.model.attributes.params.type ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-nested-column' ).addClass( 'fusion-global-nested-column' ); } this.columnSpacer = false; this.forceAppendChildren = false; this.listenTo( FusionEvents, 'fusion-view-update-fusion_builder_column_inner', this.reRender ); this.baseColumnInit(); this.baseInit(); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this, data = this.getTemplateAtts(); this.$el.html( this.template( data ) ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.setElementAttributes( this.$el, this.model.attributes.selectors ); } this.appendChildren(); setTimeout( function() { self.droppableColumn(); self.sortableElements(); self.disableSortableElements(); }, 100 ); return this; }, droppableColumn: function() { var self = this, $el = this.$el, cid = this.model.get( 'cid' ), $droppables = $el.find( '.fusion-nested-column-target' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-builder-live-element', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-column-helper ' + $classes + '" data-cid="' + cid + '"><span class="fusiona-column"></span></div>' ); }, start: function() { $body.addClass( 'fusion-nested-column-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-nested-column-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); } } ); $droppables.droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-column-inner', drop: function( event, ui ) { var parentCid, destinationRow, columnCid = ui.draggable.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCid ), originalCid = columnView.model.get( 'parent' ), $target = $el, originalView, newIndex; if ( 'large' !== FusionApp.getPreviewWindowSize() && 'undefined' !== typeof self.isFlex && true === self.isFlex ) { // Update columns' order. FusionPageBuilderViewManager.getView( self.model.get( 'parent' ) )._updateResponsiveColumnsOrder( ui.draggable, $target.closest( '.fusion-builder-row' ).children( '.fusion-builder-column-inner' ), parseInt( jQuery( event.target ).closest( '.fusion-builder-column-inner' ).data( 'cid' ) ), jQuery( event.target ).hasClass( 'target-after' ) ); return; } // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $target.after( ui.draggable ); } else { $el.before( ui.draggable ); } parentCid = ui.draggable.closest( '.fusion-builder-row-content' ).data( 'cid' ); destinationRow = FusionPageBuilderViewManager.getView( parentCid ); newIndex = ui.draggable.parent().children( '.fusion-builder-column-inner' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( columnView.model, newIndex, parentCid ); // Update destination row which is this current one. destinationRow.setRowData(); // If destination row and original row are different, update original as well. if ( parentCid !== originalCid ) { originalView = FusionPageBuilderViewManager.getView( originalCid ); originalView.setRowData(); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.column + ' order changed' ); setTimeout( function() { // If different container type we re-render so that it corrects for new situation. if ( 'object' !== typeof originalView || FusionPageBuilderApp.sameContainerTypes( originalView.model.get( 'parent' ), destinationRow.model.get( 'parent' ) ) ) { columnView.droppableColumn(); } else { FusionEvents.trigger( 'fusion-close-settings-' + columnView.model.get( 'cid' ) ); columnView.reRender(); } }, 300 ); } } ); $el.find( '.fusion-element-target-column' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-live-element', drop: function( event, ui ) { var parentCid = self.model.get( 'cid' ), elementCid = ui.draggable.data( 'cid' ), elementView = FusionPageBuilderViewManager.getView( elementCid ), newIndex, MultiGlobalArgs; // Move the actual html. $el.find( '.fusion-nested-column-content' ).append( ui.draggable ); newIndex = ui.draggable.parent().children( '.fusion-builder-live-element' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, parentCid ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.moved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); self._equalHeights(); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableColumn(); } }, /** * Destroy the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableColumn: function() { var $el = this.$el, $droppables = $el.find( '.fusion-column-target' ); if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'destroy' ); } if ( 'undefined' !== typeof $droppables.droppable( 'instance' ) ) { $droppables.droppable( 'destroy' ); } if ( 'undefined' !== typeof $el.find( '.fusion-element-target-column' ).droppable( 'instance' ) ) { $el.find( '.fusion-element-target-column' ).droppable( 'destroy' ); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableColumn: function() { this.droppableColumn(); }, /** * Triggers a refresh. * * @since 2.0.0 * @return {void} */ refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_builder_column_inner', this.model.attributes.cid ); }, /** * Removes a column. * * @since 2.0.0 * @param {Object} event - The event triggering the column removal. * @return {void} */ removeColumn: function( event ) { var modules, row = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), parentCid = this.$el.closest( '.fusion-builder-column-outer' ).data( 'cid' ); if ( event ) { event.preventDefault(); } setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-content-changed', parentCid ); }, 300 ); modules = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( modules, function( module ) { module.removeElement(); } ); FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); row.setRowData(); // If the column is deleted manually if ( event ) { FusionEvents.trigger( 'fusion-content-changed' ); } }, /** * Appends children to the columns. * * @since 2.0.0 * @return {void} */ appendChildren: function() { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( '.fusion-builder-column-content' ).append( view.$el ); view.delegateEvents(); } ); }, /** * Adds a child view. * * @since 2.0.0 * @param {Object} element - The element. * @return {void} */ addChildView: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements, attributes: { 'data-cid': element.get( 'cid' ) } }; if ( 'undefined' !== typeof element.get( 'multi' ) && 'multi_element_parent' === element.get( 'multi' ) ) { if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { view = new FusionPageBuilder[ element.get( 'element_type' ) ]( viewSettings ); } else { view = new FusionPageBuilder.ParentElementView( viewSettings ); } } else if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { view = new FusionPageBuilder[ element.get( 'element_type' ) ]( viewSettings ); } else { view = new FusionPageBuilder.ElementView( viewSettings ); } // Add new view to manager FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); // Add element builder view to proper column if ( 'undefined' !== typeof this.model && 'fusion_builder_column_inner' === this.model.get( 'type' ) ) { if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'targetElement' ).after( view.render().el ); } else { element.get( 'targetElement' ).before( view.render().el ); } } else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { this.$el.find( '.fusion-builder-column-content.fusion-nested-column-content' ).append( view.render().el ); } else { this.$el.find( '.fusion-builder-column-content.fusion-nested-column-content' ).find( '.fusion-builder-empty-column' ).after( view.render().el ); } } else if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'targetElement' ).after( view.render().el ); } else { element.get( 'targetElement' ).before( view.render().el ); } } else if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { this.$el.find( '.fusion-builder-column-content.fusion-nested-column-content' ).append( view.render().el ); } else { this.$el.find( '.fusion-builder-column-content.fusion-nested-column-content' ).find( '.fusion-builder-empty-column' ).after( view.render().el ); } // Check if we should open the settings or not. if ( 'off' !== FusionApp.preferencesData.open_settings && 'undefined' !== typeof element.get( 'added' ) ) { view.settings(); } }, /** * Clones a column. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ cloneColumn: function( event ) { var columnAttributes = jQuery.extend( true, {}, this.model.attributes ), row = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), $thisColumn; if ( event ) { event.preventDefault(); } columnAttributes.created = 'manually'; columnAttributes.cid = FusionPageBuilderViewManager.generateCid(); columnAttributes.targetElement = this.$el; columnAttributes.cloned = true; columnAttributes.at_index = FusionPageBuilderApp.getCollectionIndex( this.$el ); FusionPageBuilderApp.collection.add( columnAttributes ); // Parse column elements $thisColumn = this.$el; $thisColumn.find( '.fusion-builder-live-element' ).each( function() { var $thisModule, moduleCID, module, elementAttributes; // Standard element if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { $thisModule = jQuery( this ); moduleCID = 'undefined' === typeof $thisModule.data( 'cid' ) ? $thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisModule.data( 'cid' ); // Get model from collection by cid module = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == moduleCID; // jshint ignore: line } ); // Clone model attritubes elementAttributes = jQuery.extend( true, {}, module.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.parent = columnAttributes.cid; elementAttributes.from = 'fusion_builder_column_inner'; // Don't need target element, position is defined from order. delete elementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( elementAttributes ); } } ); // If column is cloned manually if ( event ) { // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned + ' ' + fusionBuilderText.column ); row.createVirtualRows(); row.updateColumnsPreview(); FusionEvents.trigger( 'fusion-content-changed' ); } this._refreshJs(); }, /** * Changes the column size. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ sizeSelectWirefame: function( event ) { var $thisEl = false, // Get current column size size = this.model.attributes.params.type, // New column size. newSize = '', // New column size text. columnNewSizeText = '', // New fraction size. fractionNewSize = '', columnSizeText = this.getColumnSizeText( size ), innerColumnsString = '', innerRowWrapper = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' === typeof event ) { return; } event.preventDefault(); $thisEl = jQuery( event.currentTarget ); newSize = $thisEl.attr( 'data-column-size' ); if ( 'undefined' !== typeof newSize ) { fractionNewSize = newSize.replace( '_', '/' ); columnNewSizeText = this.getColumnSizeText( newSize ), // Set new size. this.$el.attr( 'data-column-size', newSize ); // Change css size class. this.$el.removeClass( columnSizeText ); this.$el.removeClass( size ); this.$el.removeClass( 'fusion-builder-column-' + size ); this.$el.removeClass( 'fusion_builder_column_' + size ); this.$el.removeClass( 'fusion_builder_column_inner_' + size ); this.$el.addClass( columnNewSizeText ); this.$el.addClass( newSize ); this.$el.addClass( 'fusion-builder-column-' + newSize ); this.$el.addClass( 'fusion_builder_column_' + newSize ); this.$el.find( '.fusion-builder-resize-inner-column' ).text( fractionNewSize ); setTimeout( function() { innerRowWrapper.$el.find( '.fusion-builder-column-inner' ).each( function() { innerColumnsString += jQuery( this ).attr( 'data-column-size' ).replace( '_', '/' ) + ' + '; } ); innerRowWrapper.$el.find( '.fusion-builder-module-preview p' ).html( innerColumnsString.slice( 0, innerColumnsString.length - 3 ) ); }, 100 ); } this.sizeSelect( event ); }, /** * Returns the colum size class name. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ getColumnSizeText: function( size ) { var sizeText = ''; switch ( size ) { case '1_1': sizeText = 'fusion-one-full'; break; case '1_4': sizeText = 'fusion-one-fourth'; break; case '3_4': sizeText = 'fusion-three-fourth'; break; case '1_2': sizeText = 'fusion-one-half'; break; case '1_3': sizeText = 'fusion-one-third'; break; case '2_3': sizeText = 'fusion-two-third'; break; case '1_5': sizeText = 'fusion-one-fifth'; break; case '2_5': sizeText = 'fusion-two-fifth'; break; case '3_5': sizeText = 'fusion-three-fifth'; break; case '4_5': sizeText = 'fusion-four-fifth'; break; case '5_6': sizeText = 'fusion-five-sixth'; break; case '1_6': sizeText = 'fusion-one-sixth'; break; } return sizeText; }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {string} paramName - The name of the parameter that changed. * @param {mixed} paramValue - The value of the option that changed. * @param {Object} event - The event triggering the option change. * @return {void} */ onOptionChange: function( paramName, paramValue, event ) { var rowView, parentCID = this.model.get( 'parent' ), cid = this.model.get( 'cid' ), reInitDraggables = false; // Reverted to history step or user entered value manually. if ( 'undefined' === typeof event || ( 'undefined' !== typeof event && ( 'change' !== event.type || ( 'change' === event.type && 'undefined' !== typeof event.srcElement ) ) ) ) { reInitDraggables = true; } switch ( paramName ) { case 'spacing': this.model.attributes.params[ paramName ] = paramValue; // Only update preview if it a valid unit. if ( this.validColumnSpacing( paramValue ) ) { rowView = FusionPageBuilderViewManager.getView( parentCID ); rowView.setSingleRowData( cid ); } if ( true === reInitDraggables ) { if ( 'yes' === paramValue || 'no' === paramValue ) { this.destroySpacingResizable(); } else { this.columnSpacer = false; this.columnSpacing(); } } break; case 'margin_top': case 'margin_bottom': this.model.attributes.params[ paramName ] = paramValue; if ( true === reInitDraggables ) { this.destroyMarginResizable(); this.marginDrag(); } break; case 'padding_top': case 'padding_right': case 'padding_bottom': case 'padding_left': this.model.attributes.params[ paramName ] = paramValue; if ( true === reInitDraggables ) { this.destroyPaddingResizable(); this.paddingDrag(); } break; } }, /** * Initialize element sortable. * * @since 2.0.0 * @return {void} */ sortableElements: function() { var self = this; this.$el.find( '.fusion-builder-column-content' ).sortable( { items: '.fusion-builder-live-element', connectWith: '.fusion-builder-column-inner .fusion-builder-column-content', cancel: '.fusion-builder-settings, .fusion-builder-clone, .fusion-builder-remove, .fusion-builder-element-save, .fusion-builder-add-element, .fusion-builder-insert-column, .fusion-builder-save-module-dialog, .fusion-builder-inner-row-close', tolerance: 'pointer', appendTo: self.$el.find( '.fusion-builder-column-content' ).parent(), helper: 'clone', over: function( event ) { self.onSortOver( event ); }, update: function( event, ui ) { self.onSortUpdate( event, ui ); }, stop: function( event, ui ) { self.onSortStop( event, ui ); } } ); }, /** * Checks if column layout type is block. * * @since 3.0.0 * @return {Boolean} */ isBlockLayout: function() { return this.values && 'block' === this.values.content_layout; }, /** * Gets the column content. * * @since 2.0.0 * @return {string} */ getColumnContent: function() { var columnParams = {}, shortcode = '', self = this, plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false, metaValue = 'undefined' !== typeof FusionApp.data.postMeta._fusion.studio_replace_params ? FusionApp.data.postMeta._fusion.studio_replace_params : '', elementType = this.model.get( 'element_type' ), columnAttributesCheck; // If studio active. if ( false !== plugins && true === plugins.awb_studio && 'undefined' !== elementType && 'yes' === metaValue ) { // remove BC param. if ( 'undefined' !== typeof fusionAllElements[ elementType ].defaults.padding ) { delete fusionAllElements[ elementType ].defaults.padding; } this.model.set( 'params', jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ) ); } _.each( this.model.get( 'params' ), function( value, name ) { columnParams[ name ] = ( 'undefined' === value || 'undefined' === typeof value ) ? '' : value; } ); // Legacy support for new column options columnAttributesCheck = { min_height: '', last: 'no', hover_type: 'none', link: '', border_position: 'all' }; _.each( columnAttributesCheck, function( value, name ) { if ( 'undefined' === typeof columnParams[ name ] ) { columnParams[ name ] = value; } } ); this.beforeGenerateShortcode(); // Build column shortcdoe shortcode += '[fusion_builder_column_inner type="' + columnParams.type + '"'; _.each( columnParams, function( value, name ) { shortcode += ' ' + name + '="' + FusionPageBuilderApp.getParamValue( name, value, self.model ) + '"'; } ); shortcode += ']'; // Find elements in this column this.$el.find( '.fusion-builder-live-element' ).each( function() { shortcode += FusionPageBuilderApp.generateElementShortcode( jQuery( this ), false ); } ); shortcode += '[/fusion_builder_column_inner]'; return shortcode; } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAllElements, FusionEvents, FusionPageBuilderViewManager, FusionPageBuilderApp, FusionPageBuilderElements, fusionBuilderText, fusionGlobalManager, fusionSanitize */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Inner Row View FusionPageBuilder.InnerRowView = FusionPageBuilder.BaseRowView.extend( { className: 'fusion_builder_row_inner fusion_builder_column_element fusion-nested-columns fusion-builder-nested-element', template: FusionPageBuilder.template( jQuery( '#fusion-builder-row-inner-template' ).html() ), defaultZIndex: 10, events: { 'click .fusion-builder-row-remove': 'removeRow', 'click .fusion-builder-row-save': 'openLibrary', 'click .fusion-builder-row-clone': 'cloneNestedRow', 'click .fusion-builder-row-settings': 'editRow', 'click .fusion-builder-stop-editing': 'stopEdit', 'click .fusion-builder-cancel-row': 'cancelChanges', 'click .fusion-builder-row-add-child': 'displayInnerColumn', 'click .fusion-builder-insert-inner-column': 'displayInnerColumn', 'click .fusion-builder-settings': 'editNestedColumn', 'click .fusion-builder-modal-save': 'closeNestedPopupAndSave', 'click .fusion-builder-inner-row-close': 'closeNestedPopup', 'click .fusion-builder-modal-close': 'closeNestedPopup', 'mousedown .fusion-builder-nested-columns-settings-overlay': 'overlayMousedown' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.baseRowInit(); this.nestedRow = true; this.model.set( 'rows', {} ); this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); if ( 'undefined' !== typeof this.model.attributes.params && 'undefined' !== typeof this.model.attributes.params.fusion_global ) { this.$el.attr( 'fusion-global-layout', this.model.attributes.params.fusion_global ); this.$el.removeClass( 'fusion-global-nested-row' ).addClass( 'fusion-global-nested-row' ); } // Close modal view this.listenTo( FusionEvents, 'fusion-close-inner-modal', this.hideInnerRowDialog ); this.model.children = new FusionPageBuilder.Collection(); this.savedContent = ''; this.listenTo( this.model.children, 'add', this.addChildView ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.updateColumnsPreview ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el.html( this.template( this.getTemplateAtts() ) ); setTimeout( function() { self.droppableColumn(); self.droppableElement(); self.updateWireframeUI(); }, 100 ); return this; }, updateWireframeUI: function() { var innerColumnsWrapper = this.$el, innerColumnsString = ''; this.$el.find( '.fusion-nested-column-preview-columns' ).remove(); innerColumnsWrapper.find( '.fusion-builder-column-inner' ).each( function() { innerColumnsString += String( jQuery( this ).data( 'column-size' ) ).replace( '_', '/' ) + ' + '; } ); innerColumnsWrapper.find( '.fusion-nested-column-preview-title' ).after( '<p class="fusion-nested-column-preview-columns">' + innerColumnsString.slice( 0, innerColumnsString.length - 3 ) + '</p>' ); }, /** * Stop propagation on overlay mousedown. * * @since 2.0.0 * @return {void} */ overlayMousedown: function( event ) { event.stopPropagation(); }, /** * The row attributes. * * @since 3.0 * @return {Object} */ attr: function() { var attr = { style: '' }, parentContainer = FusionPageBuilderApp.getParentContainer( this ), isFlex = parentContainer && parentContainer.isFlex(), containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, _.fusionCleanParameters( parentContainer.model.attributes.params ) ), width, widthValue, columnSpacingUnit, columnSpacingValue, widthUnit; attr.id = 'fusion-builder-row-' + this.model.get( 'cid' ); attr[ 'class' ] = 'fusion-row fusion-builder-row-container-inner fusion-builder-row-inner fusion-builder-row'; attr[ 'data-cid' ] = this.model.get( 'cid' ); if ( isFlex ) { attr[ 'class' ] += ' fusion-flex-align-items-' + containerParams.flex_align_items; if ( 'stretch' !== containerParams.align_content ) { attr[ 'class' ] += ' fusion-flex-align-content-' + containerParams.align_content; } if ( 'flex-start' !== containerParams.flex_justify_content ) { attr[ 'class' ] += ' fusion-flex-justify-content-' + containerParams.flex_justify_content; } width = '100%'; columnSpacingUnit = fusionSanitize.get_unit( containerParams.flex_column_spacing ); if ( '%' === columnSpacingUnit ) { columnSpacingValue = fusionSanitize.number( containerParams.flex_column_spacing ); widthValue = fusionSanitize.number( width ); widthUnit = fusionSanitize.get_unit( width ); width = ( widthValue * ( 1 + ( columnSpacingValue / 100 ) ) ) + widthUnit; } else { width = 'calc( ' + width + ' + ' + containerParams.flex_column_spacing + ' )'; } attr.style += 'max-width:' + width + ' !important;'; attr.style += 'width:' + width + ';'; attr.style += 'margin-left: calc(-' + containerParams.flex_column_spacing + ' / 2 );'; attr.style += 'margin-right: calc(-' + containerParams.flex_column_spacing + ' / 2 );'; } return attr; }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = {}; templateAttributes.id = this.model.get( 'cid' ); templateAttributes.title = fusionAllElements[ this.model.get( 'element_type' ) ].name; templateAttributes.params = this.model.get( 'params' ); templateAttributes.attr = this.attr(); return templateAttributes; }, /** * Get the content. * * @since 2.0.0 * @return {string} */ getContent: function() { return this.getInnerRowContent(); }, /** * Creates drop zone for empty nested row. * * @since 2.0.0 * @return {void} */ droppableColumn: function() { var $el = this.$el; $el.find( '.fusion-nested-column-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-column', drop: function( scopedEvent, ui ) { var parentCid = jQuery( scopedEvent.target ).closest( '.fusion-builder-row-content' ).data( 'cid' ), destinationRow = FusionPageBuilderViewManager.getView( parentCid ), columnCid = ui.draggable.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCid ), originalCid = columnView.model.get( 'parent' ), originalView, newIndex; newIndex = ui.draggable.parent().children( '.fusion-builder-column' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( columnView.model, newIndex, self.model.get( 'cid' ) ); // Move the actual html. $el.find( '.fusion-builder-row-container-inner' ).append( ui.draggable ); // Update destination row which is this current one. destinationRow.setRowData(); // If destination row and original row are different, update original as well. if ( parentCid !== originalCid ) { originalView = FusionPageBuilderViewManager.getView( originalCid ); originalView.setRowData(); } FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.column + ' order changed' ); setTimeout( function() { columnView.droppableColumn(); }, 300 ); } } ); }, /** * Destroy or disable the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableElement: function() { var $el = this.$el; // If its been init, just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'disable' ); } // If its been init, just disable. if ( 'undefined' !== typeof $el.find( '> .fusion-element-target' ).droppable( 'instance' ) ) { $el.find( '> .fusion-element-target' ).droppable( 'disable' ); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableElement: function() { var $el = this.$el; // If they have been init, then just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) && 'undefined' !== typeof $el.find( '> .fusion-element-target' ).droppable( 'instance' ) ) { $el.draggable( 'enable' ); $el.find( '> .fusion-element-target' ).droppable( 'enable' ); } else { // No sign of init, then need to call it. this.droppableElement(); } }, /** * Creates droppable zone and makes element draggable. * * @since 2.0.0 * @return {void} */ droppableElement: function() { var $el = this.$el, cid = this.model.get( 'cid' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-live-editable, .fusion-builder-live-child-element:not( [data-fusion-no-dragging] )', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-element-helper ' + $classes + '" data-cid="' + cid + '"><span class="fusiona-column"></span></div>' ); }, start: function() { $body.addClass( 'fusion-element-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); $el.prev( '.fusion-builder-live-element' ).find( '.target-after' ).addClass( 'target-disabled' ); }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-element-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); FusionPageBuilderApp.$el.find( '.target-disabled' ).removeClass( 'target-disabled' ); } } ); $el.find( '.fusion-element-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-live-element, .fusion_builder_row_inner', drop: function( event, ui ) { var parentCid = jQuery( event.target ).closest( '.fusion-builder-column' ).data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( parentCid ), elementCid = ui.draggable.data( 'cid' ), elementView = FusionPageBuilderViewManager.getView( elementCid ), MultiGlobalArgs, newIndex; // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $el.after( ui.draggable ); } else { $el.before( ui.draggable ); } newIndex = ui.draggable.parent().children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).index( ui.draggable ); FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, parentCid ); // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.moved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); FusionEvents.trigger( 'fusion-content-changed' ); columnView._equalHeights(); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableElement(); } }, /** * Clones a nested row. * * @since 2.0.0 * @param {Object} event - The event. * @param {parentCID} parentCID - The parent element's CID. * @return {void} */ cloneNestedRow: function( event, parentCID ) { var innerRowAttributes, thisInnerRow, innerColAttributes; if ( 'object' === typeof event ) { event.preventDefault(); } innerRowAttributes = jQuery.extend( true, {}, this.model.attributes ); innerRowAttributes.created = 'manually'; innerRowAttributes.cid = FusionPageBuilderViewManager.generateCid(); innerRowAttributes.at_index = FusionPageBuilderApp.getCollectionIndex( this.$el ); if ( 'object' === typeof event ) { innerRowAttributes.targetElement = this.$el; innerRowAttributes.targetElementPosition = 'after'; } else if ( 'clone' === event ) { // Don't need target element, position is defined from order. delete innerRowAttributes.targetElementPosition; } if ( parentCID ) { innerRowAttributes.parent = parentCID; } FusionPageBuilderApp.collection.add( innerRowAttributes ); // Parse inner columns thisInnerRow = this.$el; thisInnerRow.find( '.fusion-builder-column-inner' ).each( function() { var $thisColumnInner = jQuery( this ), columnInnerCID = $thisColumnInner.data( 'cid' ), innerColumnModule = FusionPageBuilderViewManager.getView( columnInnerCID ); // Clone model attritubes innerColAttributes = jQuery.extend( true, {}, innerColumnModule.model.attributes ); innerColAttributes.created = 'manually'; innerColAttributes.cid = FusionPageBuilderViewManager.generateCid(); innerColAttributes.parent = innerRowAttributes.cid; FusionPageBuilderApp.collection.add( innerColAttributes ); // Parse elements inside inner col $thisColumnInner.find( '.fusion-builder-live-element' ).each( function() { var thisModule = jQuery( this ), moduleCID = 'undefined' === typeof thisModule.data( 'cid' ) ? thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : thisModule.data( 'cid' ), // Get model from collection by cid module = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == moduleCID; // jshint ignore: line } ), // Clone model attritubes innerElementAttributes = jQuery.extend( true, {}, module.attributes ); innerElementAttributes.created = 'manually'; innerElementAttributes.cid = FusionPageBuilderViewManager.generateCid(); innerElementAttributes.parent = innerColAttributes.cid; innerElementAttributes.from = 'fusion_builder_row_inner'; // Don't need target element, position is defined from order. delete innerElementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( innerElementAttributes ); } ); } ); if ( ! parentCID ) { // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.cloned_nested_columns ); FusionEvents.trigger( 'fusion-content-changed' ); } }, /** * Adds the 'editing' and 'nested-ui-active' classes. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ editRow: function( event ) { var parentColumn, parentRow; if ( event ) { event.preventDefault(); } // We have opened, means we no longer need added flag. this.model.unset( 'added' ); this.updateSavedContent(); parentColumn = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentColumn.$el.addClass( 'fusion-builder-editing-child' ); parentColumn.$el.removeClass( 'active' ); parentColumn.$el.closest( '.fusion-builder-container' ).removeClass( 'fusion-column-sizer-active' ).addClass( 'fusion-container-editing-child' ); parentRow = parentColumn.$el.closest( '.fusion-builder-row' ); parentRow.addClass( 'fusion-builder-row-editing-child' ); parentRow.parent().closest( '.fusion-builder-row' ).addClass( 'fusion-builder-row-editing-child' ); this.$el.addClass( 'editing' ); this.$el.append( '<div class="fusion-row-overlay"></div>' ); jQuery( 'body' ).addClass( 'nested-ui-active' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).append( '<div class="fusion-row-overlay"></div>' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'nested-ui-active nested-columns-edited' ); FusionEvents.trigger( 'fusion-row-nested-edit' ); FusionEvents.trigger( 'fusion-history-pause-tracking' ); }, updateSavedContent: function() { this.savedContent = this.getInnerRowContent(); }, /** * Removes the 'editing' and 'nested-ui-active' classes, saves history step. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ stopEdit: function( event ) { if ( event ) { event.preventDefault(); } this.removeEditUI(); // Close children settings. this.closeChildrenSettings(); FusionEvents.trigger( 'fusion-history-resume-tracking' ); if ( true === this.contentChanged() ) { window.fusionHistoryState = fusionBuilderText.edited + ' ' + fusionAllElements[ this.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.element; FusionEvents.trigger( 'fusion-history-save-step', window.fusionHistoryState ); } }, /** * Checks if content changed. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ contentChanged: function() { var content = this.getInnerRowContent(); if ( content !== this.savedContent ) { return true; } return false; }, /** * Removes the 'editing' and 'nested-ui-active' classes. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeEditUI: function( event ) { var parentColumn; if ( event ) { event.preventDefault(); } parentColumn = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentColumn.$el.removeClass( 'fusion-builder-editing-child' ); parentColumn.$el.closest( '.fusion-builder-row' ).removeClass( 'fusion-builder-row-editing-child' ); parentColumn.$el.closest( '.fusion-container-editing-child' ).removeClass( 'fusion-container-editing-child' ); this.$el.removeClass( 'editing' ); this.$el.find( '.fusion-row-overlay' ).remove(); jQuery( 'body' ).removeClass( 'nested-ui-active' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).find( '.fusion-row-overlay' ).remove(); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'nested-ui-active nested-columns-edited' ); }, /** * Closes children settings. * * @since 2.0.0 * @return {void} */ closeChildrenSettings: function() { _.each( this.collection.models, function( model ) { if ( ( 'element' === model.attributes.type || 'fusion_builder_column_inner' === model.attributes.type ) && 0 < jQuery( '.fusion_builder_module_settings[data-cid="' + model.attributes.cid + '"]' ).length ) { FusionEvents.trigger( 'fusion-close-settings-' + model.attributes.cid ); } } ); }, /** * Gets the contents of the inner row. * * @since 2.0.0 * @return {string} */ getInnerRowContent: function() { var shortcode = '', $thisRowInner = this.$el, thisRowInnerCID = $thisRowInner.data( 'cid' ), module = FusionPageBuilderElements.findWhere( { cid: thisRowInnerCID } ); // eslint-disable-line no-unused-vars shortcode += '[fusion_builder_row_inner]'; $thisRowInner.find( '.fusion-builder-column-inner' ).each( function() { var $thisColumnInner = jQuery( this ), columnCID = $thisColumnInner.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent(); } ); shortcode += '[/fusion_builder_row_inner]'; return shortcode; }, /** * Removes a row. * * @since 2.0.0 * @param {Object} event - The event. * @param {boolean|undefined} force - Should we force-remove the row? * @return {void} */ removeRow: function( event ) { var columns, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( event ) { event.preventDefault(); } columns = FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); // Remove columns _.each( columns, function( column ) { column.removeColumn(); } ); FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); FusionEvents.trigger( 'fusion-element-removed', this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); // If row ( nested columns ) is removed manually if ( event ) { // Save history state FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted_nested_columns ); FusionEvents.trigger( 'fusion-content-changed' ); parentView.$el.find( '.fusion-builder-module-controls-container a' ).trigger( 'mouseleave' ); this.removeEditUI(); } }, /** * Reverts nested column changes. * * @since 2.0.0 * @return {void} */ cancelChanges: function( event ) { if ( event ) { event.preventDefault(); } this.removeEditUI(); // Close children settings. this.closeChildrenSettings(); if ( true === this.contentChanged() ) { FusionPageBuilderApp.shortcodesToBuilder( this.savedContent, this.model.get( 'parent' ), 'undefined', 'undefined', this.$el ); this.removeRow(); } FusionEvents.trigger( 'fusion-history-resume-tracking' ); }, addNestedColumn: function( element, appendAfter, targetElement, atIndex ) { var that, thisView, defaultParams, params, parent, value, columnAttributes; parent = this.model.get( 'cid' ); that = this; thisView = this.options.view; // Get default options defaultParams = fusionAllElements.fusion_builder_column_inner.params; params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { value = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; params[ param.param_name ] = value; } ); params.type = element; columnAttributes = { type: 'fusion_builder_column_inner', element_type: 'fusion_builder_column_inner', cid: FusionPageBuilderViewManager.generateCid(), parent: parent, view: thisView, params: params, targetElement: targetElement, at_index: atIndex }; // Make sure not clones columnAttributes = jQuery.extend( true, {}, columnAttributes ); that.collection.add( [ columnAttributes ] ); return columnAttributes.cid; }, /** * Appends children. Calls the delegateEvents function in the view. * * @since 2.0.0 * @param {bool} reRender * @return {void} */ appendChildren: function( reRender = true ) { var self = this, cid, view; this.model.children.each( function( child ) { cid = child.attributes.cid; view = FusionPageBuilderViewManager.getView( cid ); self.$el.find( '.fusion-builder-row-container-inner' ).append( reRender ? view.render().$el : view.$el ); view.delegateEvents(); } ); }, /** * Adds a child view. * * @since 2.0.0 * @param {Object} element - The element model. * @return {void} */ addChildView: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements, attributes: { 'data-cid': element.get( 'cid' ) } }; viewSettings.className = 'fusion-builder-column fusion-builder-column-inner'; // Calculate virtual rows this.createVirtualRows(); view = new FusionPageBuilder.NestedColumnView( viewSettings ); // This column was cloned if ( ! _.isUndefined( element.get( 'cloned' ) ) && true === element.get( 'cloned' ) ) { element.targetElement = view.$el; element.unset( 'cloned' ); } FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'targetElement' ) ) && 'undefined' === typeof element.get( 'from' ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'targetElement' ).after( view.render().el ); } else { element.get( 'targetElement' ).before( view.render().el ); } } else { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'end' === element.get( 'targetElementPosition' ) ) { this.$el.find( '.fusion-builder-row-container-inner' ).append( view.render().el ); } else { this.$el.find( '.fusion-builder-row-container-inner' ).prepend( view.render().el ); } element.unset( 'from' ); } this.updateColumnsPreview(); }, displayInnerColumn: function( event ) { var view, viewSettings, columnCID; if ( event ) { event.preventDefault(); } columnCID = jQuery( event.currentTarget ).closest( '.fusion-builder-column-inner' ).data( 'cid' ); FusionPageBuilderApp.parentRowId = this.model.get( 'cid' ); viewSettings = { model: this.model, collection: this.collection, view: this, attributes: { 'data-modal_view': 'nested_column_library', 'data-parent_cid': this.model.get( 'cid' ), 'data-nested_column_cid': columnCID }, nested: true }; view = new FusionPageBuilder.NestedColumnLibraryView( viewSettings ); jQuery( view.render().el ).dialog( { title: 'Select Column', width: FusionApp.dialog.dialogWidth, height: FusionApp.dialog.dialogHeight, draggable: false, modal: true, resizable: false, dialogClass: 'fusion-builder-dialog fusion-builder-element-library-dialog', open: function( scopedEvent ) { var $dialogContent = jQuery( scopedEvent.target ); $dialogContent.find( '.fusion-builder-modal-top-container' ).appendTo( '.fusion-builder-element-library-dialog .ui-dialog-titlebar' ); FusionApp.dialog.resizeDialog(); }, close: function() { view.remove(); } } ); }, /** * Opens nested columns in popup for wireframe mode. * * @since 2.0.0 * @param {Object} element - The element model. * @return {void} */ editNestedColumn: function( event ) { var self = this; if ( event ) { event.preventDefault(); } this.savedContent = this.getInnerRowContent(); this.$el.find( '.fusion-builder-row-content' ).addClass( 'fusion-builder-row-content-active' ); self.$el.closest( '.fusion-row' ).addClass( 'fusion-builder-row-active' ); this.$el.closest( '.fusion-builder-ui-wireframe' ).addClass( 'fusion-builder-nested-cols-dialog-open' ); // Hides column size popup. this.$el.closest( '.fusion-builder-column' ).removeClass( 'active' ); this.$el.closest( '.fusion-builder-container' ).removeClass( 'fusion-column-sizer-active' ); FusionEvents.trigger( 'fusion-history-turn-on-tracking' ); FusionEvents.trigger( 'fusion-history-capture-editor' ); FusionEvents.trigger( 'fusion-history-turn-off-tracking' ); FusionEvents.trigger( 'fusion-history-pause-tracking' ); }, /** * Closes nested columns in popup for wireframe mode. * * @since 2.0.0 * @param {Object} element - The element model. * @return {void} */ closeNestedPopupAndSave: function( event ) { if ( event ) { event.preventDefault(); } this.updateWireframeUI(); this.$el.find( '.fusion-builder-row-content' ).removeClass( 'fusion-builder-row-content-active' ); this.$el.closest( '.fusion-row' ).removeClass( 'fusion-builder-row-active' ); this.$el.closest( '.fusion-builder-ui-wireframe' ).removeClass( 'fusion-builder-nested-cols-dialog-open' ); FusionEvents.trigger( 'fusion-history-resume-tracking' ); }, /** * Closes nested columns in popup for wireframe mode and revert changes. * * @since 2.0.0 * @param {Object} element - The element model. * @return {void} */ closeNestedPopup: function( event ) { if ( event ) { event.preventDefault(); } this.$el.find( '.fusion-builder-row-content' ).removeClass( 'fusion-builder-row-content-active' ); this.$el.closest( '.fusion-row' ).removeClass( 'fusion-builder-row-active' ); this.$el.closest( '.fusion-builder-ui-wireframe' ).removeClass( 'fusion-builder-nested-cols-dialog-open' ); if ( true === this.contentChanged() ) { FusionPageBuilderApp.shortcodesToBuilder( this.savedContent, this.model.get( 'parent' ), 'undefined', 'undefined', this.$el ); this.removeRow(); } FusionEvents.trigger( 'fusion-history-resume-tracking' ); }, /** * Opens the library. Builds the settings for this view * and then calls FusionPageBuilder.LibraryView and renders it. * * @since 2.0.0 * @param {Object} event - The js event. * @return {void} */ openLibrary: function( event ) { var view, libraryModel = { target: jQuery( event.currentTarget ).data( 'target' ), focus: jQuery( event.currentTarget ).data( 'focus' ), element_cid: this.model.get( 'cid' ), element_name: 'undefined' !== typeof this.model.get( 'admin_label' ) && '' !== this.model.get( 'admin_label' ) ? this.model.get( 'admin_label' ) : '' }, viewSettings = { model: libraryModel }; if ( event ) { event.preventDefault(); event.stopPropagation(); FusionPageBuilderApp.sizesHide( event ); } view = new FusionPageBuilder.LibraryView( viewSettings ); view.render(); // Make sure to close any context menus which may be open. FusionPageBuilderApp.removeContextMenu(); }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { if ( jQuery( 'body' ).hasClass( 'nested-ui-active' ) ) { this.stopEdit(); } this.enableSortableColumns(); this.disableDroppableElement(); this.updateWireframeUI(); } else { this.disableSortableColumns(); this.enableDroppableElement(); } }, recalculateMargins: function() { var attr = this.attr(); this.$el.find( '.fusion-builder-row-container-inner' ).first().attr( 'style', attr.style ); }, /** * Destroy or disable column sortable. * * @since 2.0.0 * @return {void} */ disableSortableColumns: function() { var rowContainer = this.$el.find( '.fusion-builder-row-container' ); rowContainer.sortable( 'disable' ); }, /** * Initialize column sortable. * * @since 2.0.0 * @return {void} */ sortableColumns: function() { var sortableColumns = this.$el.find( '.fusion-builder-row-container-inner' ), items = '.fusion-builder-column-inner', self = this; sortableColumns.sortable( { items: items, helper: 'clone', cancel: '.fusion-builder-settings-column, .fusion-builder-column-size, .fusion-builder-column-clone, .fusion-builder-column-remove, .fusion-builder-add-element, .fusion-builder-insert-column, .fusion-builder-save-column, .column-sizes, .fusion-builder-modal-save, .fusion-builder-inner-row-close', tolerance: 'pointer', update: function() { self.onSortUpdate(); }, stop: function( event, ui ) { self.onSortStop( event, ui, items ); } } ).disableSelection(); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionPageBuilderViewManager, fusionAllElements, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { $( document ).ready( function() { // Builder Blank Page View FusionPageBuilder.BlankPageView = window.wp.Backbone.View.extend( { className: 'fusion-builder-blank-page', template: FusionPageBuilder.template( $( '#fusion-builder-blank-page-template' ).html() ), events: { 'click .fusion-builder-new-section-add': 'addContainer', 'click .fusion-builder-video-button': 'openVideoModal', 'click #fusion-load-studio-dialog': 'openLibrary' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var colorScheme = this.getColorScheme( FusionApp.settings.content_bg_color ); this.$el.html( this.template( this.model.toJSON() ) ); this.$el.addClass( 'fusion-builder-scheme-' + colorScheme ); this.$el.addClass( 'fusion-post-' + FusionApp.data.postDetails.post_type ); // Add is-empty class to remove close icon in Off Canvas. if ( 'awb_off_canvas' === FusionApp.data.postDetails.post_type ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).find( '.awb-off-canvas' ).addClass( 'is-empty' ); } this.$el.find( '#video-dialog' ).dialog( { dialogClass: 'fusion-builder-dialog fusion-video-dialog', autoOpen: false, modal: true, height: 470, width: 700 } ); return this; }, /** * Calculate color scheme depend on hex color. * * @since 2.0.0 * @param {string} color - The hex color code to calculate color scheme against. * @return {string} */ getColorScheme: function( color ) { return 0.5 < jQuery.AWB_Color( color ).lightness() ? 'light' : 'dark'; }, /** * Opens a video modal. * * @since 2.0.0 * @param {Object} event - The event triggering the modal. * @return {void} */ openVideoModal: function( event ) { if ( event ) { event.preventDefault(); } jQuery( '#video-dialog' ).dialog( 'open' ); jQuery( '#video-dialog iframe' ).focus(); jQuery( '#video-dialog iframe' )[ 0 ].contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); }, /** * Adds a container. * * @since 2.0.0 * @param {Object} event - The event triggering the container addition. * @return {void} */ addContainer: function( event ) { var elementID, defaultParams, params, value, newContainer; if ( event ) { event.preventDefault(); FusionPageBuilderApp.newContainerAdded = true; } elementID = FusionPageBuilderViewManager.generateCid(); defaultParams = fusionAllElements.fusion_builder_container.params; params = {}; // Process default options for shortcode. _.each( defaultParams, function( param ) { if ( _.isObject( param.value ) ) { value = param[ 'default' ]; } else { value = param.value; } params[ param.param_name ] = value; if ( 'dimension' === param.type && _.isObject( param.value ) ) { _.each( param.value, function( val, name ) { params[ name ] = val; } ); } } ); this.collection.add( [ { type: 'fusion_builder_container', added: 'manually', element_type: 'fusion_builder_container', cid: elementID, params: params, view: this, created: 'auto' } ] ); // Make sure to add row to new container not current one. newContainer = FusionPageBuilderViewManager.getView( elementID ); newContainer.addRow(); this.removeBlankPageHelper(); }, /** * Opens the library. * Calls the LibraryView and then renders it. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ openLibrary: function( event ) { var view, libraryModel = { target: jQuery( event.currentTarget ).data( 'target' ), focus: jQuery( event.currentTarget ).data( 'focus' ) }, viewSettings = { model: libraryModel }; if ( event ) { event.preventDefault(); event.stopPropagation(); FusionPageBuilderApp.sizesHide( event ); } view = new FusionPageBuilder.LibraryView( viewSettings ); view.render(); }, /** * Removes the helper for blank pages. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeBlankPageHelper: function( event ) { if ( event ) { event.preventDefault(); } // Remove is-empty class to add back close icon in Off Canvas. if ( 'awb_off_canvas' === FusionApp.data.postDetails.post_type ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).find( '.awb-off-canvas' ).removeClass( 'is-empty' ); } FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); if ( jQuery( '#video-dialog' ).length ) { jQuery( '#video-dialog' ).dialog( 'destroy' ); } this.remove(); } } ); jQuery( 'body' ).on( 'click', '.ui-dialog-titlebar-close', function() { var dialog = jQuery( this ).closest( '.ui-dialog' ); if ( dialog.find( '#video-dialog' ).length ) { dialog.find( '#video-dialog iframe' )[ 0 ].contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); dialog.hide(); } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAppConfig, FusionEvents */ /* eslint no-empty-function: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Preferences. FusionPageBuilder.PreferencesView = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-front-end-preferences' ).html() ), events: { 'click .fusion-panel-description': 'showHideDescription', 'change .button-set-value': 'optionChanged' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el.html( this.template() ); this.$el = this.$el.dialog( { title: 'Preferences', width: 600, height: FusionApp.dialog.dialogHeight, draggable: false, resizable: false, modal: true, dialogClass: 'fusion-builder-dialog fusion-builder-settings-dialog fusion-builder-preferences-dialog', open: function( event ) { var dialogContent = jQuery( event.target ); FusionPageBuilder.options.radioButtonSet.optionRadioButtonSet( dialogContent ); FusionApp.dialog.resizeDialog(); }, close: function() { self.saveChanges(); } } ).closest( '.ui-dialog' ); return this; }, /** * Trigger live-update when an option changes. * * @since 2.0.0 * @return {void} */ optionChanged: function() { var $preferences = {}, preferencesChanged = [], i; this.$el.find( 'input' ).each( function() { $preferences[ jQuery( this ).attr( 'id' ) ] = jQuery( this ).val(); if ( $preferences[ jQuery( this ).attr( 'id' ) ] !== FusionApp.preferencesData[ jQuery( this ).attr( 'id' ) ] ) { preferencesChanged.push( jQuery( this ).attr( 'id' ) ); } } ); FusionApp.preferencesData = $preferences; for ( i = 0; i < preferencesChanged.length; i++ ) { FusionEvents.trigger( 'fusion-preferences-' + preferencesChanged[ i ] + '-updated' ); } }, /** * Cancel the changes. * * @since 2.0.0 * @return {void} */ saveChanges: function() { var $preferences = {}; jQuery( 'li.fusion-builder-preferences' ).css( 'pointer-events', 'none' ); this.$el.find( 'input' ).each( function() { $preferences[ jQuery( this ).attr( 'id' ) ] = jQuery( this ).val(); } ); FusionApp.preferencesData = $preferences; jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_app_save_builder_preferences', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, preferences: $preferences } } ) .done( function( response ) { FusionApp.preferences = response; jQuery( 'li.fusion-builder-preferences' ).css( 'pointer-events', 'auto' ); } ); this.removeView(); }, /** * Removes the view. * * @since 2.0.0 * @return {void} */ removeView: function() { this.$el.find( '.fusion-save-element-fields' ).remove(); this.$el.find( '.fusion-tabs-menu' ).appendTo( '#fusion-builder-front-end-library' ); this.remove(); }, /** * Show or hide description. * * @since 2.0.0 * @param {Object} event - The JS event. * @return {void} */ showHideDescription: function( event ) { var $element = jQuery( event.currentTarget ); $element.closest( '.fusion-builder-option' ).find( '.description' ).first().slideToggle( 250 ); $element.toggleClass( 'active' ); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp, fusionDynamicData, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Element Preview View FusionPageBuilder.ElementPreviewView = window.wp.Backbone.View.extend( { className: 'fusion_module_block_preview ', dynamicParams: {}, // Elements which use element_content for preview. contentPreviewElements: [ 'fusion_text', 'fusion_title', 'fusion_alert', 'fusion_button', 'fusion_imageframe', 'fusion_sharing' ], globalIconPlaceholder: '#fusion_dynamic_data_icon#', initialize: function() { this.dynamicParams = this.options.dynamicParams; if ( jQuery( '#' + fusionAllElements[ this.model.attributes.element_type ].preview_id ).length ) { this.template = FusionPageBuilder.template( jQuery( '#' + fusionAllElements[ this.model.attributes.element_type ].preview_id ).html() ); } else { this.template = FusionPageBuilder.template( jQuery( '#fusion-builder-block-module-default-preview-template' ).html() ); } }, render: function() { var html = this.template( this.getTemplateAttributes() ); this.$el.html( this.updatePreview( html ) ); return this; }, /** * Filter template attributes. * * @since 2.1 * @return {object} */ getTemplateAttributes: function() { var atts = jQuery.extend( true, {}, this.model.attributes ), dynamicData = this.getDynamicData(), label = ''; // If element preview could be updated. if ( -1 !== this.contentPreviewElements.indexOf( this.model.attributes.element_type ) ) { // And there is dynamic content. if ( ! _.isEmpty( dynamicData ) && 'undefined' !== typeof dynamicData.element_content ) { // Elements which use element_content for preview, for example text element. label = ''; if ( 'undefined' !== typeof FusionApp && 'undefined' !== typeof FusionApp.data.dynamicOptions[ dynamicData.element_content.data ] ) { label = FusionApp.data.dynamicOptions[ dynamicData.element_content.data ].label; } else if ( 'undefined' !== typeof fusionDynamicData.dynamicOptions[ dynamicData.element_content.data ] ) { label = fusionDynamicData.dynamicOptions[ dynamicData.element_content.data ].label; } atts.params.element_content = this.globalIconPlaceholder + label; } } return atts; }, /** * Updates preview with dynamic data if needed. * * @since 2.1 * @param {string} html * @return {string} */ updatePreview: function( html ) { var dynamicData = this.getDynamicData(), elDynamicParams = [], childHasDynamicData = false, iconHTML = '<span class="fusiona-dynamic-data"></span>', label = '', childLabel = '', $dynamicPreview; // Check if element children use dynamic data. if ( 'undefined' !== typeof this.model.attributes.multi && 'multi_element_parent' === this.model.attributes.multi && 'undefined' !== typeof this.model.attributes.params.element_content && -1 !== this.model.attributes.params.element_content.indexOf( 'dynamic_params' ) ) { childHasDynamicData = true; } // Update preview if element or it's child uses dynamic data. if ( -1 === this.contentPreviewElements.indexOf( this.model.attributes.element_type ) && ( ! _.isEmpty( dynamicData ) || childHasDynamicData ) ) { $dynamicPreview = jQuery( '<div />', { html: html } ); // If children use dynamic content remove their preview. if ( childHasDynamicData ) { $dynamicPreview.find( 'ul' ).remove(); // Set child preview. if ( 'undefined' !== typeof fusionAllElements[ this.model.attributes.element_type ] && 'undefined' !== typeof fusionAllElements[ fusionAllElements[ this.model.attributes.element_type ].element_child ] ) { childLabel = fusionAllElements[ fusionAllElements[ this.model.attributes.element_type ].element_child ].name; elDynamicParams.push( childLabel ); } } _.each( dynamicData, function( dynamic ) { label = ''; if ( 'undefined' !== typeof FusionApp && 'undefined' !== typeof FusionApp.data.dynamicOptions[ dynamic.data ] ) { label = FusionApp.data.dynamicOptions[ dynamic.data ].label; } else if ( 'undefined' !== typeof fusionDynamicData.dynamicOptions[ dynamic.data ] ) { label = fusionDynamicData.dynamicOptions[ dynamic.data ].label; } elDynamicParams.push( label ); } ); $dynamicPreview.append( '<div class="fusion-builder-dynamic-data-preview fusion-builder-dynamic-data-preview-inline">' + iconHTML + elDynamicParams.join( ', ' ) + '</div>' ); html = $dynamicPreview.html(); } // Replace placeholders if added during attributes filtering. return html.replace( this.globalIconPlaceholder, iconHTML ); }, /** * Get element dynamic data. * * @since 2.1 * @return {object} */ getDynamicData: function() { var dynamicData = {}; if ( 'undefined' !== typeof this.dynamicParams ) { // Get dynamic data in live editor. dynamicData = this.dynamicParams.getAll(); } else if ( 'undefined' !== typeof this.model.attributes.dynamic_params ) { // Get dynamic data in backend editor. dynamicData = this.model.attributes.dynamic_params; } return dynamicData; } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderViewManager, FusionEvents, FusionPageBuilderApp, fusionBuilderText */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Next Page View. FusionPageBuilder.NextPage = FusionPageBuilder.BaseView.extend( { className: 'fusion-builder-next-page fusion-special-item', template: FusionPageBuilder.template( jQuery( '#fusion-builder-next-page-template' ).html() ), events: { 'click .fusion-builder-delete-next-page': 'removeNextPage', 'click .fusion-builder-next-page-toggle': 'toggleNextPagePreview', 'click .fusion-builder-next-page-link': 'changePageTrigger' }, initialize: function() { var params = this.model.get( 'params' ); this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); if ( FusionApp.data.next_page_elements_count <= FusionPageBuilderViewManager.countElementsByType( 'fusion_builder_next_page' ) ) { FusionApp.data.next_page_elements_count += 1; } if ( params.last ) { this.$el.addClass( 'fusion-builder-next-page-last' ); } this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); }, render: function() { var self = this, data = this.getTemplateAtts(); this.$el.html( this.template( data ) ); this.addPaginationLinks(); setTimeout( function() { self.droppableContainer(); }, 100 ); return this; }, /** * Adds drop zones for continers and makes container draggable. * * @since 2.0.0 * @return {void} */ droppableContainer: function() { var $el = this.$el, cid = this.model.get( 'cid' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); if ( ! $el ) { return; } $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-builder-column', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-container-helper ' + $classes + '" data-cid="' + cid + '"><span class="fusiona-container"></span></div>' ); }, start: function() { $body.addClass( 'fusion-container-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); // Add a class to hide the unnecessary target after. if ( $el.prev( '.fusion-builder-container' ).length ) { $el.prev( '.fusion-builder-container' ).addClass( 'hide-target-after' ); } if ( $el.prev( '.fusion-fusion-builder-next-pager' ).length ) { $el.prev( '.fusion-fusion-builder-next-page' ).addClass( 'hide-target-after' ); } }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-container-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); FusionPageBuilderApp.$el.find( '.hide-target-after' ).removeClass( 'hide-target-after' ); } } ); $el.find( '.fusion-container-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-container, .fusion-builder-next-page', drop: function( event, ui ) { // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $el.after( ui.draggable ); } else { $el.before( ui.draggable ); } FusionEvents.trigger( 'fusion-content-changed' ); FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.nextpage + ' Element order changed' ); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } }, /** * Enable the droppable and draggable. * * @since 2.0.0 * @return {void} */ enableDroppableContainer: function() { var $el = this.$el; if ( 'undefined' !== typeof $el.draggable( 'instance' ) && 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.draggable( 'enable' ); $el.find( '.fusion-container-target' ).droppable( 'enable' ); } else { // No sign of init, then need to call it. this.droppableContainer(); } }, /** * Destroy or disable the droppable and draggable. * * @since 2.0.0 * @return {void} */ disableDroppableContainer: function() { var $el = this.$el; // If its been init, just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'disable' ); } // If its been init, just disable. if ( 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.find( '.fusion-container-target' ).droppable( 'disable' ); } }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } else { this.enableDroppableContainer(); } }, /** * Get template attributes. * * @since 2.0.0 * @return {void} */ getTemplateAtts: function() { var templateAttributes = {}, pages = Math.max( FusionApp.data.next_page_elements_count, FusionPageBuilderViewManager.countElementsByType( 'fusion_builder_next_page' ) ); templateAttributes.pages = pages; templateAttributes = this.filterTemplateAtts( templateAttributes ); return templateAttributes; }, /** * Add the pagination links. * * @since 2.0.0 * @return {void} */ addPaginationLinks: function() { var allNextPageElements = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ), i, additionalClasses = ''; for ( i = 1; i <= FusionApp.data.next_page_elements_count; i++ ) { additionalClasses = ( 1 === i ) ? ' current' : ''; this.$el.find( '.fusion-builder-next-page-pagination' ).append( '<a class="fusion-builder-next-page-link' + additionalClasses + '" href="#" data-page="' + i + '">' + i + '</a>' ); } if ( allNextPageElements.find( '.fusion-builder-next-page-pagination' ).eq( 0 ).find( '.fusion-builder-next-page-link' ).length < FusionApp.data.next_page_elements_count ) { allNextPageElements.each( function() { jQuery( this ).find( '.fusion-builder-next-page-pagination' ).append( '<a class="fusion-builder-next-page-link" href="#" data-page="' + FusionApp.data.next_page_elements_count + '">' + ( FusionApp.data.next_page_elements_count ) + '</a>' ); } ); } }, removeNextPage: function( event ) { var allNextPageElements = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ), allContainers = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-container' ), isLivePreviewActive = this.$el.hasClass( 'live-preview-active' ), index = allNextPageElements.index( this.$el ); if ( event ) { event.preventDefault(); } FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); FusionApp.data.next_page_elements_count -= 1; jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ).each( function() { jQuery( this ).find( '.fusion-builder-next-page-link' ).eq( 0 ).remove(); jQuery( this ).find( '.fusion-builder-next-page-link' ).each( function( index ) { jQuery( this ).attr( 'data-page', index + 1 ); jQuery( this ).html( index + 1 ); } ); } ); if ( isLivePreviewActive ) { if ( jQuery( allNextPageElements.get( index ) ).length && 2 < allNextPageElements.length ) { this.changePage( index ); } else { allContainers.show(); if ( 2 === allNextPageElements.length ) { this.toggleNextPagePreview(); } } } FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted_nextpage ); }, toggleNextPagePreview: function( event ) { var allNextPageElements = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ), lastNextPageElement = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page-last' ), allContainers = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-container' ), index = allNextPageElements.index( this.$el ); if ( event ) { event.preventDefault(); } if ( this.$el.hasClass( 'live-preview-active' ) ) { allNextPageElements.show(); lastNextPageElement.hide(); allContainers.show(); } else { this.changePage( index ); } allNextPageElements.toggleClass( 'live-preview-active' ); }, changePageTrigger: function( event ) { var newPage = parseInt( jQuery( event.target ).html(), 10 ) - 1; event.preventDefault(); this.changePage( newPage ); }, changePage: function( newPage ) { var newNextPageElement = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ).eq( newPage ), ancestorNextPageElement = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ).eq( newPage - 1 ), allNextPageElements = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-next-page' ), allContainers = jQuery( '#fb-preview' ).contents().find( '.fusion-builder-container' ); allNextPageElements.removeClass( 'fusion-next-page-active' ); allNextPageElements.find( '.fusion-builder-next-page-link' ).removeClass( 'current' ); allNextPageElements.hide(); allContainers.hide(); newNextPageElement.addClass( 'fusion-next-page-active' ); newNextPageElement.show(); newNextPageElement.find( '.fusion-builder-next-page-link[data-page="' + ( newPage + 1 ) + '"]' ).addClass( 'current' ); if ( 0 === newPage ) { newNextPageElement.prevAll( '.fusion-builder-container' ).show(); } else { newNextPageElement.prevAll( '.fusion-builder-container' ).show(); ancestorNextPageElement.prevAll( '.fusion-builder-container' ).hide(); } }, nextPageTriggerEvent: function( event ) { FusionEvents.trigger( 'fusion-next-page' ); if ( event ) { event.preventDefault(); FusionEvents.trigger( 'fusion-next-page' ); } } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, FusionEvents, FusionPageBuilderApp, fusionBuilderText */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Checkout Form View. FusionPageBuilder.checkoutForm = FusionPageBuilder.BaseView.extend( { className: 'fusion-checkout-form fusion-special-item', template: FusionPageBuilder.template( jQuery( '#fusion-checkout-form-template' ).html() ), events: { 'click .fusion-builder-delete-checkout-form': 'removeCheckoutForm' }, initialize: function() { this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); }, render: function() { var self = this, data = this.getTemplateAtts(); this.$el.html( this.template( data ) ); setTimeout( function() { self.droppableContainer(); }, 100 ); return this; }, /** * Adds drop zones for continers and makes container draggable. * * @since 3.3 * @return {void} */ droppableContainer: function() { var $el = this.$el, cid = this.model.get( 'cid' ), $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); if ( ! $el ) { return; } $el.draggable( { appendTo: FusionPageBuilderApp.$el, zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, iframeScroll: true, containment: $body, cancel: '.fusion-builder-column', helper: function() { var $classes = FusionPageBuilderApp.DraggableHelpers.draggableClasses( cid ); return jQuery( '<div class="fusion-container-helper ' + $classes + '" data-cid="' + cid + '"><span class="fusiona-container"></span></div>' ); }, start: function() { $body.addClass( 'fusion-container-dragging fusion-active-dragging' ); $el.addClass( 'fusion-being-dragged' ); // Add a class to hide the unnecessary target after. if ( $el.prev( '.fusion-builder-container' ).length ) { $el.prev( '.fusion-builder-container' ).addClass( 'hide-target-after' ); } }, stop: function() { setTimeout( function() { $body.removeClass( 'fusion-container-dragging fusion-active-dragging' ); }, 10 ); $el.removeClass( 'fusion-being-dragged' ); FusionPageBuilderApp.$el.find( '.hide-target-after' ).removeClass( 'hide-target-after' ); } } ); $el.find( '.fusion-container-target' ).droppable( { tolerance: 'touch', hoverClass: 'ui-droppable-active', accept: '.fusion-builder-container, .fusion-checkout-form', drop: function( event, ui ) { // Move the actual html. if ( jQuery( event.target ).hasClass( 'target-after' ) ) { $el.after( ui.draggable ); } else { $el.before( ui.draggable ); } FusionEvents.trigger( 'fusion-content-changed' ); FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.checkout_form + ' Element order changed' ); } } ); // If we are in wireframe mode, then disable. if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } }, /** * Enable the droppable and draggable. * * @since 3.3 * @return {void} */ enableDroppableContainer: function() { var $el = this.$el; if ( 'undefined' !== typeof $el.draggable( 'instance' ) && 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.draggable( 'enable' ); $el.find( '.fusion-container-target' ).droppable( 'enable' ); } else { // No sign of init, then need to call it. this.droppableContainer(); } }, /** * Destroy or disable the droppable and draggable. * * @since 3.3 * @return {void} */ disableDroppableContainer: function() { var $el = this.$el; // If its been init, just disable. if ( 'undefined' !== typeof $el.draggable( 'instance' ) ) { $el.draggable( 'disable' ); } // If its been init, just disable. if ( 'undefined' !== typeof $el.find( '.fusion-container-target' ).droppable( 'instance' ) ) { $el.find( '.fusion-container-target' ).droppable( 'disable' ); } }, /** * Fired when wireframe mode is toggled. * * @since 3.3 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableContainer(); } else { this.enableDroppableContainer(); } }, /** * Get template attributes. * * @since 3.3 * @return {void} */ getTemplateAtts: function() { var templateAttributes = {}; templateAttributes = this.filterTemplateAtts( templateAttributes ); return templateAttributes; }, removeCheckoutForm: function( event ) { if ( event ) { event.preventDefault(); } FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); this.remove(); FusionEvents.trigger( 'fusion-content-changed' ); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.deleted_checkout_form ); } } ); } ); }( jQuery ) ); ;/* global FusionApp */ /* eslint no-empty-function: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Library FusionPageBuilder.keyBoardShorCutsView = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-front-end-keyboard-shortcuts' ).html() ), events: { 'click .fusion-open-prefernces-panel': 'openPreferencePanel' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el.html( this.template() ); this.$el = this.$el.dialog( { title: 'Keyboard Shortcuts', width: 600, height: FusionApp.dialog.dialogHeight, draggable: false, resizable: false, modal: true, dialogClass: 'fusion-builder-large-library-dialog fusion-builder-dialog fusion-builder-keyboard-shortcuts-dialog', open: function() { FusionApp.dialog.resizeDialog(); }, close: function() { self.removeDialog(); } } ).closest( '.ui-dialog' ); return this; }, /** * Removes the view. * * @since 2.0.0 * @return {void} */ removeDialog: function() { this.remove(); }, /** * Removes this view and open preference panel. * * @since 2.0.0 * @return {void} */ openPreferencePanel: function() { this.remove(); jQuery( '.fusion-builder-preferences' ).trigger( 'click' ); } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderViewManager, fusionBuilderText, FusionPageBuilderApp, fusionAppConfig, FusionEvents, fusionGlobalManager */ /* eslint no-undef: 0 */ /* eslint no-alert: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Library FusionPageBuilder.LibraryView = FusionPageBuilder.BaseLibraryView.extend( { el: '#fusion-builder-front-end-library', events: { 'click .fusion-tabs-menu > li > a': 'switchTab', 'change .fusion-builder-demo-select': 'demoSelect', 'input .fusion-builder-demo-page-link': 'demoSelectByURL', 'click .fusion-builder-demo-button-load': 'loadDemoPage', 'click .ui-dialog-titlebar-close': 'removeView', 'click .fusion-builder-layout-button-load': 'loadLayout', 'click .fusion-studio-import': 'loadStudioLayout', 'click .fusion-builder-layout-button-save': 'saveLayout', 'click .fusion-builder-layout-button-delete': 'deleteLayout', 'click .fusion-builder-element-button-save': 'saveElement', 'click .awb-sites-import-js': 'importDemoPage', 'mouseenter .fusion-studio-load': 'maybeFlipPopup', 'mouseleave .fusion-studio-load': 'maybeUnFlipPopup' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { var self = this; jQuery( document ).on( 'click', '.fusion-builder-library-dialog .fusion-tabs-menu > li > a', function( event ) { self.switchTab( event ); } ); // Loader animation this.listenTo( FusionEvents, 'fusion-show-loader', this.showLoader ); this.listenTo( FusionEvents, 'fusion-hide-loader', this.hideLoader ); }, showLoader: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-builder-live-editor' ).css( 'height', '148px' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-builder-live-editor' ).append( '<div class="fusion-builder-element-content fusion-loader"><span class="fusion-builder-loader"></span></div>' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#fusion_builder_container' ).hide(); }, hideLoader: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#fusion_builder_container' ).fadeIn( 'fast' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-builder-live-editor > .fusion-builder-element-content.fusion-loader' ).remove(); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-builder-live-editor' ).removeAttr( 'style' ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var self = this; this.$el = this.$el.dialog( { title: fusionBuilderText.builder_ibrary_title, width: FusionApp.dialog.dialogWidth, height: FusionApp.dialog.dialogHeight, draggable: false, resizable: false, modal: true, dialogClass: 'fusion-builder-large-library-dialog fusion-builder-dialog fusion-builder-library-dialog', open: function() { FusionApp.dialog.resizeDialog(); }, close: function() { self.removeView(); } } ).closest( '.ui-dialog' ); this.appendSave(); this.targetTab(); this.focusInput(); return this; }, /** * Find the target tab and trigger the 'click' event on it. * * @since 2.0.0 * @return {void} */ targetTab: function() { if ( 'undefined' !== typeof this.model.target ) { this.$el.find( '.fusion-tabs-menu > li > a[href="' + this.model.target + '"]' ).trigger( 'click' ); } else { this.$el.find( '.fusion-tabs-menu > li:first-child > a' ).trigger( 'click' ); } }, /** * Focus on an element. * * @since 2.0.0 * @return {void} */ focusInput: function() { var self = this; if ( 'undefined' !== typeof this.model.focus ) { setTimeout( function() { self.$el.find( self.model.target ).find( self.model.focus ).focus(); }, 200 ); } }, /** * Appends the HTML that allows users to save an element. * * @since 2.0.0 * @return {void} */ appendSave: function() { var elementView, elementSave; if ( 'undefined' !== typeof this.model.target && 'undefined' !== typeof this.model.element_cid ) { elementView = FusionPageBuilderViewManager.getView( this.model.element_cid ); elementSave = 'undefined' !== typeof elementView.getSaveLabel ? elementView.getSaveLabel() : fusionBuilderText.save_element; jQuery( this.model.target ).find( '.fusion-builder-layouts-header-element-fields' ).append( '<div class="fusion-save-element-fields"><div class="save-as-global"><label><input type="checkbox" id="fusion_save_global" name="fusion_save_global">' + fusionBuilderText.save_global + '</label></div><input type="text" value="' + this.model.element_name + '" id="fusion-builder-save-element-input" class="fusion-builder-save-element-input" placeholder="' + fusionBuilderText.enter_name + '" /><a href="#" class="fusion-builder-save-column fusion-builder-element-button-save" data-element-cid="' + this.model.element_cid + '">' + elementSave + '</a></div>' ); } }, /** * Switches a tab. Takes care of toggling the 'current' & 'inactive' classes * and also changes the 'display' property of elements to properly make the switch. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ switchTab: function( event ) { var $tabLink = jQuery( event.currentTarget ), tab = $tabLink.attr( 'href' ); if ( event ) { event.preventDefault(); } FusionEvents.trigger( 'fusion-switch-element-option-tabs' ); $tabLink.parent( 'li' ).addClass( 'current' ).removeClass( 'inactive' ); $tabLink.parent( 'li' ).siblings().removeClass( 'current' ).addClass( 'inactive' ); this.$el.find( '.fusion-builder-layouts-tab' ).css( 'display', 'none' ); this.$el.find( tab ).css( 'display', 'block' ); // Trigger ajax for studio. if ( '#fusion-builder-fusion_template-studio' === tab ) { this.loadStudio( 'fusion_template' ); } // Trigger ajax for demos. if ( '#fusion-builder-layouts-demos' === tab ) { this.loadWebsite(); } }, /** * Shows/Hides demos on select. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ demoSelect: function( event ) { var $selectedDemo = jQuery( event.target ).val(); jQuery( '#fusion-builder-layouts-demos .fusion-page-layouts' ).addClass( 'hidden' ); jQuery( '#fusion-builder-demo-url-invalid' ).addClass( 'hidden' ); jQuery( '.fusion-builder-demo-page-link' ).val( '' ); jQuery( '#fusion-builder-layouts-demos .demo-' + $selectedDemo ).removeClass( 'hidden' ); }, /** * Shows/Hides demos on added URL change. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ demoSelectByURL: function( event ) { var demoPageLink = jQuery( event.target ).val(), demoPage, parentDemo, demoSelectorVal; demoPageLink = demoPageLink.replace( 'https://', '' ).replace( 'http://', '' ); if ( '/' !== demoPageLink[ demoPageLink.length - 1 ] && ! _.isEmpty( demoPageLink ) ) { demoPageLink += '/'; } demoPage = jQuery( '#fusion-builder-layouts-demos' ).find( '.fusion-page-layout[data-page-link="' + demoPageLink + '"]' ); parentDemo = demoPage.closest( '.fusion-page-layouts' ); jQuery( '#fusion-builder-layouts-demos .fusion-page-layouts' ).addClass( 'hidden' ); jQuery( '#fusion-builder-demo-url-invalid' ).addClass( 'hidden' ); if ( _.isEmpty( demoPageLink ) ) { demoSelectorVal = jQuery( '.fusion-builder-demo-select' ).val(); jQuery( '#fusion-builder-layouts-demos .demo-' + demoSelectorVal ).removeClass( 'hidden' ); } else if ( ! demoPage.length ) { jQuery( '#fusion-builder-demo-url-invalid' ).removeClass( 'hidden' ); } else { parentDemo.show(); parentDemo.find( '.fusion-page-layout' ).hide(); demoPage.show(); } }, /** * Loads the demo pages via an ajax call. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ loadDemoPage: function( event ) { var pageName, demoName, postId, content, self = this, frameDocument = document.getElementById( 'fb-preview' ).contentWindow.document, oldWrite = frameDocument.write; // jshint ignore:line // Turn document write off before page request. frameDocument.write = function() {}; // eslint-disable-line no-empty-function document.write = function() {}; // eslint-disable-line no-empty-function if ( event ) { event.preventDefault(); } FusionApp.confirmationPopup( { title: fusionBuilderText.import_demo_page, content: fusionBuilderText.importing_single_page, actions: [ { label: fusionBuilderText.cancel, classes: 'no', callback: function() { FusionApp.confirmationPopup( { action: 'hide' } ); } }, { label: fusionBuilderText.ok, classes: 'yes', callback: function() { if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; FusionPageBuilderApp.loaded = false; pageName = jQuery( event.currentTarget ).data( 'page-name' ); demoName = jQuery( event.currentTarget ).data( 'demo-name' ); postId = jQuery( event.currentTarget ).data( 'post-id' ); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_load_demo', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, page_name: pageName, demo_name: demoName, post_id: postId }, beforeSend: function() { FusionEvents.trigger( 'fusion-show-loader' ); // Hide confirmation popup. FusionApp.confirmationPopup( { action: 'hide' } ); // Hide library dialog. self.$el.css( 'display', 'none' ); self.$el.next( '.ui-widget-overlay' ).css( 'display', 'none' ); } } ) .done( function( data ) { var dataObj, needsRefresh = false, newCustomCss = false; // New layout loaded FusionPageBuilderApp.layoutLoaded(); dataObj = JSON.parse( data ); newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false; content = dataObj.post_content; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss; } jQuery.each( dataObj.post_meta, function( name, value ) { needsRefresh = true; FusionApp.data.postMeta[ name ] = value[ 0 ]; } ); if ( 'undefined' !== typeof dataObj.page_template && FusionApp.data.postMeta._wp_page_template !== dataObj.page_template ) { FusionApp.data.postMeta._wp_page_template = dataObj.page_template; needsRefresh = true; } if ( needsRefresh ) { FusionApp.contentChange( 'page', 'page-option' ); } FusionApp.data.postContent = content; FusionApp.contentChange( 'page', 'builder-content' ); if ( newCustomCss && 'undefined' !== typeof avadaPanelIFrame ) { // Add the CSS to the page. avadaPanelIFrame.liveUpdatePageCustomCSS( newCustomCss ); } // Create new builder layout. FusionPageBuilderApp.clearBuilderLayout( false ); FusionPageBuilderApp.createBuilderLayout( content ); // Refresh frame if needed. if ( needsRefresh ) { FusionApp.fullRefresh(); } FusionPageBuilderApp.layoutIsLoading = false; } ) .always( function() { // Add success/transition of some kind here. FusionEvents.trigger( 'fusion-hide-loader' ); frameDocument.write = oldWrite; document.write = oldWrite; FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); self.removeView(); } ); } } ] } ); }, /** * Loads the demo pages via an ajax call. * * @since 3.5 * @param {Object} event - The event. * @return {void} */ importDemoPage: function( event ) { var demoName, pageId, completeCB, self = this, frameDocument = document.getElementById( 'fb-preview' ).contentWindow.document, oldWrite = frameDocument.write; // jshint ignore:line // Turn document write off before page request. frameDocument.write = function() {}; // eslint-disable-line no-empty-function document.write = function() {}; // eslint-disable-line no-empty-function completeCB = function() { // Add success/transition of some kind here. FusionEvents.trigger( 'fusion-hide-loader' ); frameDocument.write = oldWrite; document.write = oldWrite; FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); self.removeView(); self.demoPageImportComplete(); }; if ( event ) { event.preventDefault(); } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; FusionPageBuilderApp.loaded = false; demoName = jQuery( event.currentTarget ).data( 'demo-name' ); pageId = jQuery( event.currentTarget ).data( 'page-id' ); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'awb_load_websites_page', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, demo_name: demoName, post_id: FusionApp.getPost( 'post_id' ), page_id: pageId }, beforeSend: function() { self.beforeDemoPageImport(); } } ) .done( function( data ) { var i, dataObj, promises = [], dfd = jQuery.Deferred(), // Master deferred. dfdNext = dfd; // Next deferred in the chain. dataObj = JSON.parse( data ); if ( ! dataObj.success ) { FusionPageBuilderApp.layoutIsLoading = false; alert( fusionBuilderText.api_error_text ); completeCB(); return; } dfd.resolve(); // Reset array. self.mediaImportKeys = []; // We have the content, let's check for assets. // Filter out empty properties (now those are empty arrays). if ( 'object' === typeof dataObj.avada_media ) { Object.keys( dataObj.avada_media ).forEach( function( key ) { // We expect and object. if ( 'object' === typeof dataObj.avada_media[ key ] && ! Array.isArray( dataObj.avada_media[ key ] ) ) { self.mediaImportKeys.push( key ); } } ); } // Import media if needed. if ( 0 < self.mediaImportKeys.length ) { // Set first AJAX response as initial data. FusionPageBuilderApp.website.setImportData( dataObj ); for ( i = 0; i < self.mediaImportKeys.length; i++ ) { // IIFE to freeze the value of i. ( function( k ) { // eslint-disable-line no-loop-func dfdNext = dfdNext.then( function() { return self.importDemoPageMedia( FusionPageBuilderApp.website.getImportData(), self.mediaImportKeys[ k ] ); } ); promises.push( dfdNext ); }( i ) ); } jQuery.when.apply( null, promises ).then( function() { self.setPageContent( dataObj, FusionPageBuilderApp.website.getImportData().post_content ); completeCB(); // Reset import data. FusionPageBuilderApp.website.resetImportData(); }, function() { alert( fusionBuilderText.demo_importing_content_failed ); completeCB(); // Reset import data. FusionPageBuilderApp.website.resetImportData(); } ); } else { self.setPageContent( dataObj, dataObj.post_content ); completeCB(); } } ); }, /** * * @param {Object} dataObj * @param {String} newContent */ setPageContent: function( dataObj, newContent ) { var needsRefresh = false, newCustomCss = false; // New layout loaded FusionPageBuilderApp.layoutLoaded(); newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss; } jQuery.each( dataObj.post_meta, function( name, value ) { needsRefresh = true; FusionApp.data.postMeta[ name ] = value[ 0 ]; } ); if ( 'undefined' !== typeof dataObj.page_template && FusionApp.data.postMeta._wp_page_template !== dataObj.page_template ) { FusionApp.data.postMeta._wp_page_template = dataObj.page_template; needsRefresh = true; } if ( needsRefresh ) { FusionApp.contentChange( 'page', 'page-option' ); } FusionApp.setPost( 'post_content', newContent ); FusionApp.contentChange( 'page', 'builder-content' ); // Refresh frame if needed. if ( needsRefresh ) { FusionApp.fullRefresh( false, {}, { post_content: newContent } ); } else { if ( newCustomCss && 'undefined' !== typeof avadaPanelIFrame ) { // Add the CSS to the page. avadaPanelIFrame.liveUpdatePageCustomCSS( newCustomCss ); } // Create new builder layout. FusionPageBuilderApp.clearBuilderLayout( false ); FusionPageBuilderApp.createBuilderLayout( newContent ); } FusionPageBuilderApp.layoutIsLoading = false; }, /** * Does what needs to be done when demo page is imported. * * @since 3.5 */ demoPageImportComplete: function() { this.$el.css( 'display', 'none' ); this.$el.next( '.ui-widget-overlay' ).css( 'display', 'none' ); FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-sticky-header-reinit' ); // Remove modal view. this.demoImportModalView.remove(); }, /** * Loads the layout via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ loadLayout: function( event ) { var $layout, contentPlacement, content, self = this; if ( event ) { event.preventDefault(); } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ); contentPlacement = jQuery( event.currentTarget ).data( 'load-type' ); // Get correct content. FusionPageBuilderApp.builderToShortcodes(); content = FusionApp.getPost( 'post_content' ); // eslint-disable-line camelcase FusionPageBuilderApp.loaded = false; jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout_id' ), post_id: FusionApp.getPost( 'post_id' ) }, beforeSend: function() { FusionEvents.trigger( 'fusion-show-loader' ); // Hide library dialog. self.$el.css( 'display', 'none' ); self.$el.next( '.ui-widget-overlay' ).css( 'display', 'none' ); } } ) .done( function( data ) { var dataObj, newCustomCss, needsRefresh = false, existingCss = 'undefined' !== typeof FusionApp.data.postMeta._fusion_builder_custom_css ? FusionApp.data.postMeta._fusion_builder_custom_css : ''; // New layout loaded FusionPageBuilderApp.layoutLoaded(); dataObj = JSON.parse( data ); newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false; if ( 'above' === contentPlacement ) { content = dataObj.post_content + content; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss + '\n' + existingCss; } } else if ( 'below' === contentPlacement ) { content = content + dataObj.post_content; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = existingCss + '\n' + newCustomCss; } } else { content = dataObj.post_content; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss; } jQuery.each( dataObj.post_meta, function( name, value ) { needsRefresh = true; FusionApp.data.postMeta[ name ] = value[ 0 ]; } ); if ( 'undefined' !== typeof dataObj.page_template && FusionApp.data.postMeta._wp_page_template !== dataObj.page_template ) { FusionApp.data.postMeta._wp_page_template = dataObj.page_template; needsRefresh = true; } if ( needsRefresh ) { FusionApp.contentChange( 'page', 'page-option' ); } } FusionApp.setPost( 'post_content', content ); FusionApp.contentChange( 'page', 'builder-content' ); if ( needsRefresh ) { // Set new content and refresh frame. FusionApp.fullRefresh( false, {}, { post_content: content } ); } else { if ( newCustomCss && 'undefined' !== typeof avadaPanelIFrame ) { // Add the CSS to the page. avadaPanelIFrame.liveUpdatePageCustomCSS( newCustomCss ); } // Create new builder layout. FusionPageBuilderApp.clearBuilderLayout( false ); FusionPageBuilderApp.createBuilderLayout( content ); } FusionPageBuilderApp.layoutIsLoading = false; } ) .always( function() { FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); FusionEvents.trigger( 'fusion-hide-loader' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-sticky-header-reinit' ); self.removeView(); } ); }, /** * Loads the layout via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ loadStudioLayout: function( event ) { var $layout, self = this, category = 'undefined' !== typeof FusionApp.data.postDetails.post_type && 'fusion_form' === FusionApp.data.postDetails.post_type ? 'forms' : 'fusion_template'; if ( event ) { event.preventDefault(); } // Off canvas. category = 'undefined' !== typeof FusionApp.data.postDetails.post_type && 'awb_off_canvas' === FusionApp.data.postDetails.post_type ? FusionApp.data.postDetails.post_type : category; if ( 'string' === typeof FusionApp.data.template_category ) { category = FusionApp.data.template_category; } if ( true === FusionPageBuilderApp.layoutIsLoading ) { return; } FusionPageBuilderApp.layoutIsLoading = true; $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ); // Get correct content. FusionPageBuilderApp.builderToShortcodes(); content = FusionApp.getPost( 'post_content' ); // eslint-disable-line camelcase FusionPageBuilderApp.loaded = false; jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout_id' ), fusion_studio: true, post_id: FusionApp.getPost( 'post_id' ), category: category }, beforeSend: function() { self.beforeStudioItemImport(); }, success: function( data ) { var i, promises = [], dfd = jQuery.Deferred(), // Master deferred. dfdNext = dfd; // Next deferred in the chain. dfd.resolve(); // Reset array. self.mediaImportKeys = []; // We have the content, let's check for assets. // Filter out empty properties (now those are empty arrays). if ( 'object' === typeof data.avada_media ) { Object.keys( data.avada_media ).forEach( function( key ) { // We expect and object. if ( 'object' === typeof data.avada_media[ key ] && ! Array.isArray( data.avada_media[ key ] ) ) { self.mediaImportKeys.push( key ); } } ); } // Import studio media if needed. if ( 0 < self.mediaImportKeys.length ) { // Set first AJAX response as initial data. FusionPageBuilderApp.studio.setImportData( data ); for ( i = 0; i < self.mediaImportKeys.length; i++ ) { // IIFE to freeze the value of i. ( function( k ) { // eslint-disable-line no-loop-func dfdNext = dfdNext.then( function() { return self.importStudioMedia( FusionPageBuilderApp.studio.getImportData(), self.mediaImportKeys[ k ] ); } ); promises.push( dfdNext ); }( i ) ); } jQuery.when.apply( null, promises ).then( function() { /* var lastAjaxResponse; if ( 1 === promises.length ) { lastAjaxResponse = arguments[ 0 ]; } else { lastAjaxResponse = arguments[ promises.length - 1 ][ 0 ]; } */ self.setStudioContent( data, FusionPageBuilderApp.studio.getImportData().post_content, event ); FusionEvents.trigger( 'fusion-studio-content-imported', FusionPageBuilderApp.studio.getImportData() ); self.studioLayoutImportComplete( event ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); }, function() { self.studioImportModalView.updateStatus( fusionBuilderText.studio_importing_content_failed ); self.studioLayoutImportComplete( event ); // Reset import data. FusionPageBuilderApp.studio.resetImportData(); } ); } else { self.setStudioContent( data, data.post_content, event ); FusionEvents.trigger( 'fusion-studio-content-imported', data ); self.studioLayoutImportComplete( event ); } } } ); }, /** * Does what needs to be done when layout is imported. * * @since 3.5 * @param {Object} event - The event. */ studioLayoutImportComplete: function( event ) { var $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), $layoutsContainer = $layout.closest( '.studio-imports' ); $layoutsContainer.show(); this.$el.css( 'display', 'none' ); this.$el.next( '.ui-widget-overlay' ).css( 'display', 'none' ); FusionPageBuilderApp.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-sticky-header-reinit' ); // Remove modal view. this.studioImportModalView.remove(); // Close library modal. this.removeView(); }, /** * * @param {Object} dataObj * @param {String} newContent */ setStudioContent: function( dataObj, newContent, event ) { var newCustomCss, needsRefresh = false, existingCss = 'undefined' !== typeof FusionApp.data.postMeta._fusion_builder_custom_css ? FusionApp.data.postMeta._fusion_builder_custom_css : '', contentPlacement = jQuery( event.currentTarget ).data( 'load-type' ), content = ''; // Get correct content. FusionPageBuilderApp.builderToShortcodes(); content = FusionApp.getPost( 'post_content' ); // eslint-disable-line camelcase // New layout loaded FusionPageBuilderApp.layoutLoaded(); newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false; if ( 'above' === contentPlacement ) { content = newContent + content; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss + '\n' + existingCss; } } else if ( 'below' === contentPlacement ) { content = content + newContent; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = existingCss + '\n' + newCustomCss; } } else { content = newContent; if ( newCustomCss ) { FusionApp.data.postMeta._fusion_builder_custom_css = newCustomCss; } // Set _fusion meta. if ( 'undefined' !== typeof dataObj.post_meta && 'undefined' !== typeof dataObj.post_meta._fusion ) { jQuery.each( dataObj.post_meta._fusion, function( name, value ) { needsRefresh = true; FusionApp.data.postMeta._fusion[ name ] = value; } ); } if ( needsRefresh ) { FusionApp.contentChange( 'page', 'page-option' ); } } FusionApp.setPost( 'post_content', content ); FusionApp.contentChange( 'page', 'builder-content' ); if ( needsRefresh ) { // Set new content and refresh frame. FusionApp.fullRefresh( false, {}, { post_content: content } ); } else { if ( newCustomCss && 'undefined' !== typeof avadaPanelIFrame ) { // Add the CSS to the page. avadaPanelIFrame.liveUpdatePageCustomCSS( newCustomCss ); } // Create new builder layout. FusionPageBuilderApp.clearBuilderLayout( false ); FusionPageBuilderApp.createBuilderLayout( content ); } FusionPageBuilderApp.layoutIsLoading = false; }, /** * Saves the layout via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ saveLayout: function( event ) { var templateContent, templateName, layoutsContainer, currentPostID, customCSS, pageTemplate; if ( event ) { event.preventDefault(); } FusionPageBuilderApp.builderToShortcodes(); templateContent = FusionApp.getPost( 'post_content' ); // eslint-disable-line camelcase templateName = jQuery( '#new_template_name' ).val(); layoutsContainer = jQuery( '#fusion-builder-layouts-templates .fusion-page-layouts' ); currentPostID = jQuery( '#fusion_builder_main_container' ).data( 'post-id' ); customCSS = 'undefined' !== typeof FusionApp.data.postMeta._fusion_builder_custom_css ? FusionApp.data.postMeta._fusion_builder_custom_css : ''; pageTemplate = 'undefined' !== typeof FusionApp.data.postMeta._wp_page_template ? FusionApp.data.postMeta._wp_page_template : ''; if ( '' !== templateName ) { jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'json', data: { action: 'fusion_builder_save_layout', fusion_po_type: 'object', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_name: templateName, fusion_layout_content: templateContent, fusion_layout_post_type: 'fusion_template', fusion_current_post_id: currentPostID, fusion_custom_css: customCSS, fusion_page_template: pageTemplate, fusion_options: FusionApp.data.postMeta, fusion_front_end: true }, complete: function( data ) { layoutsContainer.prepend( data.responseText ); } } ); jQuery( '#new_template_name' ).val( '' ); } else { alert( fusionBuilderText.please_enter_template_name ); // jshint ignore: line } }, /** * Deletes a layout via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ deleteLayout: function( event ) { var $layout; if ( event ) { event.preventDefault(); FusionApp.confirmationPopup( { title: fusionBuilderText.are_you_sure, content: fusionBuilderText.are_you_sure_you_want_to_delete_this, actions: [ { label: fusionBuilderText.cancel, classes: 'no', callback: function() { FusionApp.confirmationPopup( { action: 'hide' } ); } }, { label: fusionBuilderText.im_sure, classes: 'yes', callback: function() { if ( true === FusionPageBuilderApp.layoutIsDeleting ) { return; } FusionPageBuilderApp.layoutIsDeleting = true; $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, data: { action: 'fusion_builder_delete_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout_id' ) } } ) .done( function() { $layout.remove(); FusionPageBuilderApp.layoutIsDeleting = false; } ); FusionApp.confirmationPopup( { action: 'hide' } ); } } ] } ); } }, /** * Saves an element via AJAX. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ saveElement: function( event ) { var elementName = jQuery( '#fusion-builder-save-element-input' ).val(), layoutsContainer = jQuery( this.model.target ).find( '.fusion-page-layouts' ), saveGlobal = jQuery( this.model.target ).find( '#fusion_save_global' ).is( ':checked' ), elementView = FusionPageBuilderViewManager.getView( this.model.element_cid ), elementContent = elementView.getContent(), elementCategory = 'undefined' !== typeof elementView.getCategory ? elementView.getCategory() : 'elements', isDuplicate = false, oldGLobalID = null, wrapperClass = '', params = {}; if ( event ) { event.preventDefault(); } if ( 'undefined' !== typeof elementView.model.attributes.params && 'undefined' !== typeof elementView.model.attributes.params.fusion_global ) { // Make a copy. oldGLobalID = elementView.model.attributes.params.fusion_global; params = elementView.model.get( 'params' ); // Remove temporarily and update model delete params.fusion_global; elementView.model.set( 'params', params ); // Get content. elementContent = elementView.getColumnContent(); // Add it back. params.fusion_global = oldGLobalID; elementView.model.set( 'params', params ); } switch ( elementCategory ) { case 'sections': wrapperClass = 'ul.fusion-page-layouts.fusion-layout-sections li'; break; case 'columns': wrapperClass = 'ul.fusion-page-layouts.fusion-layout-columns li'; break; case 'elements': wrapperClass = 'ul.fusion-page-layouts.fusion-layout-elements li'; break; } jQuery.each( jQuery( wrapperClass ), function() { var templateName = jQuery( this ).find( 'h4.fusion-page-layout-title' ).html().split( '<div ' )[ 0 ]; templateName = templateName.replace( /\u2013|\u2014/g, '-' ); if ( elementName.toLowerCase().trim() === templateName.toLowerCase().trim() ) { alert( fusionBuilderText.duplicate_element_name_error ); // jshint ignore:line isDuplicate = true; return false; } } ); if ( true === FusionPageBuilderApp.layoutIsSaving || true === isDuplicate ) { return; } FusionPageBuilderApp.layoutIsSaving = true; if ( '' !== elementName ) { jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'json', data: { action: 'fusion_builder_save_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_name: elementName, fusion_layout_content: elementContent, fusion_layout_post_type: 'fusion_element', fusion_layout_new_cat: elementCategory, fusion_save_global: saveGlobal, fusion_front_end: true }, complete: function( data ) { var MultiGlobalArgs, cid = elementView.model.get( 'cid' ), globalID = jQuery( data.responseText ).attr( 'data-layout_id' ); FusionPageBuilderApp.layoutIsSaving = false; layoutsContainer.prepend( data.responseText ); jQuery( '.fusion-save-element-fields' ).remove(); // If global, make it. if ( saveGlobal ) { // For nested elements. if ( 'undefined' === typeof elementView.model.attributes.params ) { elementView.model.attributes.params = {}; } elementView.model.attributes.params.fusion_global = globalID; if ( 'sections' === elementCategory ) { FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-module-controls-type-container .fusion-builder-module-controls' ).after( '<a href="#" class="fusion-builder-container-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-container-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_container + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-wireframe-utility-toolbar' ).first().append( '<a href="#" class="fusion-builder-container-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-container-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_container + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).addClass( 'fusion-global-container' ); } else if ( 'columns' === elementCategory ) { FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-module-controls-inner.fusion-builder-column-controls-inner' ).after( '<a href="#" class="fusion-builder-column-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-column-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_column + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-wireframe-utility-toolbar' ).first().append( '<a href="#" class="fusion-builder-column-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-column-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_column + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).addClass( 'fusion-global-column' ); } else if ( 'elements' === elementCategory && 'undefined' !== typeof elementView.model.get( 'multi' ) && 'multi_element_parent' === elementView.model.get( 'multi' ) ) { FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).addClass( 'fusion-global-parent-element' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-module-controls-inner' ).after( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_element + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-wireframe-utility-toolbar' ).first().append( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_element + '</span></span></a>' ); } else if ( 'elements' === elementCategory && 'fusion_builder_row_inner' === elementView.model.get( 'element_type' ) ) { FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).addClass( 'fusion-global-nested-row' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-module-controls-inner' ).after( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_element + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-wireframe-utility-toolbar' ).last().append( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip">' + fusionBuilderText.global_element + '</span></span></a>' ); } else if ( 'elements' === elementCategory ) { FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).addClass( 'fusion-global-element' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-module-controls-inner' ).after( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_element + '</span></span></a>' ); FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"] .fusion-builder-wireframe-utility-toolbar' ).first().append( '<a href="#" class="fusion-builder-element-global fusion-builder-module-control fusion-builder-unglobal-tooltip" data-cid=' + cid + '><span class="fusiona-globe"></span><span class="fusion-element-tooltip"><span class="fusion-tooltip-text">' + fusionBuilderText.global_element + '</span></span></a>' ); } FusionPageBuilderApp.$el.find( 'div[data-cid="' + cid + '"]' ).attr( 'fusion-global-layout', globalID ); FusionEvents.trigger( 'fusion-element-added' ); FusionPageBuilderApp.saveGlobal = true; // Check for globals. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; setTimeout( fusionGlobalManager.handleMultiGlobal, 500, MultiGlobalArgs ); // Save history FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.saved + ' ' + fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + fusionBuilderText.as_global ); if ( 'undefined' !== typeof FusionApp.contentChange ) { FusionApp.contentChange( 'page', 'builder-content' ); } } } } ); } else { alert( fusionBuilderText.please_enter_element_name ); // jshint ignore: line } }, /** * Removes the view. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeView: function() { this.$el.find( '.fusion-save-element-fields' ).remove(); this.$el.find( '.fusion-builder-modal-top-container' ).prependTo( '#fusion-builder-front-end-library' ); FusionApp.dialogCloseResets( this ); this.remove(); }, /** * Maybe adds CSS class to expand popup below instead. * * @param {Object} event */ maybeFlipPopup: function( event ) { var $target = jQuery( event.currentTarget ), targetTop = $target.offset().top, $popUp = $target.find( '.fusion-template-options' ), popuHeight = $target.find( '.fusion-template-options' ).outerHeight(), $topBar = jQuery( '.fusion-tabs-menu' ), studioContainer = $target.closest( '.studio-imports' ), wrapperPaddingTop = parseInt( studioContainer.css( 'padding-top' ), 10 ); if ( popuHeight > targetTop - ( $topBar.offset().top + $topBar.outerHeight() + wrapperPaddingTop ) ) { $popUp.addClass( 'fusion-template-options-flip' ); } }, /** * Maybe remove added CSS class. * * @param {Object} event */ maybeUnFlipPopup: function( event ) { if ( jQuery( event.currentTarget ).find( '.fusion-template-options' ).hasClass( 'fusion-template-options-flip' ) ) { jQuery( event.currentTarget ).find( '.fusion-template-options' ).removeClass( 'fusion-template-options-flip' ); } } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Builder Container View FusionPageBuilder.DemoImportModalView = FusionPageBuilder.StudioImportModalView.extend( { template: FusionPageBuilder.template( jQuery( '#fusion-builder-demo-import-modal' ).html() ) } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.Wireframe = Backbone.Model.extend( { initialize: function() { this.listenTo( window.FusionEvents, 'fusion-preview-update', this.updateWireframe ); this.listenTo( window.FusionEvents, 'fusion-builder-loaded', this.openWireframeAfterFullRefresh ); this.listenTo( window.FusionEvents, 'fusion-undo-state', this.setUpWireFrameAfterUndo ); }, updateWireframe: function( id, value ) { if ( 'site_width' === id ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-builder-ui-wireframe' ).find( '#fusion_builder_container' ).css( 'max-width', value ); } }, /** * Re-opens Wireframe mode after full refresh. * * @since 2.0.0 * @return {void} */ openWireframeAfterFullRefresh: function() { if ( FusionPageBuilderApp.wireframeActive ) { jQuery( 'body' ).removeClass( 'fusion-builder-ui-wireframe' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-builder-ui-wireframe' ); this.toggleWireframe(); } }, /** * Sets Up wireframe after history undo. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ setUpWireFrameAfterUndo: function( event ) { var contentWindow = jQuery( '#fb-preview' )[ 0 ].contentWindow, fusionBuilderContainer = contentWindow.jQuery( 'body' ).find( '#fusion_builder_container' ), fusionBuilderContainerOffsetTop = fusionBuilderContainer.offset().top, fusionHeaderWrapper = contentWindow.jQuery( 'body' ).find( '.fusion-header-wrapper' ), fusionHeaderWrapperOffsetBottom = fusionHeaderWrapper.length ? fusionHeaderWrapper.offset().top + fusionHeaderWrapper.outerHeight() : 0; if ( event ) { event.preventDefault(); } setTimeout( function() { if ( contentWindow.jQuery( 'body' ).hasClass( 'fusion-builder-ui-wireframe' ) ) { fusionBuilderContainer.css( 'max-width', window.FusionApp.settings.site_width ); if ( fusionHeaderWrapperOffsetBottom > fusionBuilderContainerOffsetTop ) { fusionBuilderContainer.css( 'margin-top', ( fusionHeaderWrapperOffsetBottom + 25 ) + 'px' ); } } else { fusionBuilderContainer.css( { 'margin-top': '', 'max-width': '' } ); } window.FusionEvents.trigger( 'fusion-wireframe-toggle' ); }, 100 ); }, /** * Toggles the 'fusion-builder-ui-wireframe' class. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ toggleWireframe: function( event ) { var contentWindow = jQuery( '#fb-preview' )[ 0 ].contentWindow, fusionBuilderContainer = contentWindow.jQuery( 'body' ).find( '#fusion_builder_container' ), fusionBuilderContainerOffsetTop = fusionBuilderContainer.offset().top, fusionHeaderWrapper = contentWindow.jQuery( 'body' ).find( '.fusion-header-wrapper' ), fusionHeaderWrapperOffsetBottom = fusionHeaderWrapper.length ? fusionHeaderWrapper.offset().top + fusionHeaderWrapper.outerHeight() : 0; if ( event ) { event.preventDefault(); } setTimeout( function() { jQuery( 'body' ).toggleClass( 'fusion-builder-ui-wireframe' ); jQuery( '.fusion-builder-wireframe-toggle' ).toggleClass( 'active' ); contentWindow.jQuery( 'body' ).toggleClass( 'fusion-builder-ui-wireframe' ); if ( contentWindow.jQuery( 'body' ).hasClass( 'fusion-builder-ui-wireframe' ) ) { FusionPageBuilderApp.wireframeActive = true; fusionBuilderContainer.css( 'max-width', window.FusionApp.settings.site_width ); if ( fusionHeaderWrapperOffsetBottom > fusionBuilderContainerOffsetTop ) { fusionBuilderContainer.css( 'margin-top', ( fusionHeaderWrapperOffsetBottom + 25 ) + 'px' ); } // Close nested column edit mode if needed. if ( contentWindow.jQuery( 'body' ).hasClass( 'nested-columns-edited' ) ) { FusionPageBuilderViewManager.getView( contentWindow.jQuery( '.fusion-builder-nested-element.editing' ).data( 'cid' ) ).stopEdit(); } } else { FusionPageBuilderApp.wireframeActive = false; fusionBuilderContainer.css( { 'margin-top': '', 'max-width': '' } ); } window.FusionEvents.trigger( 'fusion-wireframe-toggle' ); }, 100 ); } } ); jQuery( document ).ready( function() { // Column sortables _.extend( FusionPageBuilder.BaseColumnView.prototype, { /** * Destroy or disable element sortable. * * @since 2.0.0 * @return {void} */ disableSortableElements: function() { var sortableContainer = this.$el.find( '.fusion-builder-column-content' ); if ( 'undefined' !== typeof sortableContainer.sortable( 'instance' ) ) { sortableContainer.sortable( 'disable' ); } sortableContainer.removeClass( 'ui-sortable' ); sortableContainer.removeClass( 'ui-sortable-disabled' ); }, /** * Initialize or enable the element sortable. * * @since 2.0.0 * @return {void} */ enableSortableElements: function() { var sortableContainer = this.$el.find( '.fusion-builder-column-content' ), sortables; if ( 'fusion_builder_column' === this.model.get( 'element_type' ) ) { sortables = 'undefined' !== typeof sortableContainer.sortable( 'instance' ) ? true : false; } else { sortables = sortableContainer.data( 'sortable' ); } if ( sortables ) { sortableContainer.sortable( 'enable' ); sortableContainer.addClass( 'ui-sortable' ); } else { this.sortableElements(); } }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { if ( FusionPageBuilderApp.wireframeActive ) { this.disableDroppableColumn(); this.enableSortableElements(); } else { this.enableDroppableColumn(); this.disableSortableElements(); this._equalHeights(); } }, onSortOver: function( event ) { // Move sortable palceholder above +Element button for empty columns. if ( 1 === jQuery( event.target ).find( '.fusion-builder-live-element, .fusion_builder_row_inner' ).length ) { jQuery( event.target ).find( '.fusion-builder-column-content' ).append( '.ui-sortable-placeholder' ); } }, onSortUpdate: function() { this._equalHeights(); }, onSortStop: function( event, ui ) { var elementView = window.FusionPageBuilderViewManager.getView( ui.item.data( 'cid' ) ), newIndex = ui.item.parent().children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).index( ui.item ), MultiGlobalArgs; // Update collection window.FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, ui.item.parent().data( 'cid' ) ); // Handle multiple global elements. MultiGlobalArgs = { currentModel: elementView.model, handleType: 'save', attributes: elementView.model.attributes }; window.fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); // Save history window.FusionEvents.trigger( 'fusion-history-save-step', window.fusionBuilderText.moved + ' ' + window.fusionAllElements[ elementView.model.get( 'element_type' ) ].name + ' ' + window.fusionBuilderText.element ); window.FusionEvents.trigger( 'fusion-content-changed' ); } } ); // Row sortables _.extend( FusionPageBuilder.BaseRowView.prototype, { /** * Initialize or enable the column sortable. * * @since 2.0.0 * @return {void} */ enableSortableColumns: function() { var rowContainer = this.$el.find( '.fusion-builder-row-container' ), sortables; if ( 'fusion_builder_row' === this.model.get( 'element_type' ) ) { sortables = 'undefined' !== typeof rowContainer.sortable( 'instance' ) ? true : false; } else { sortables = rowContainer.data( 'sortable' ); } if ( sortables ) { rowContainer.sortable( 'enable' ); } else { this.sortableColumns(); } }, onSortUpdate: function() { return undefined; }, onSortStop: function( event, ui, items ) { var elementCid = ui.item.data( 'cid' ), elementView = window.FusionPageBuilderViewManager.getView( elementCid ), originalCid = elementView.model.get( 'parent' ), parentCid = ui.item.parent().data( 'cid' ), newIndex = ui.item.parent().children( items ).index( ui.item ), originalView, destinationRow; // Update collection. window.FusionPageBuilderApp.onDropCollectionUpdate( elementView.model, newIndex, parentCid ); destinationRow = FusionPageBuilderViewManager.getView( parentCid ); destinationRow.setRowData(); // If destination row and original row are different, update original as well. if ( parentCid !== originalCid ) { originalView = FusionPageBuilderViewManager.getView( originalCid ); originalView.setRowData(); } // History. window.FusionEvents.trigger( 'fusion-history-save-step', window.fusionBuilderText.column + ' order changed' ); } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.SettingsHelpers = Backbone.Model.extend( { /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function( ) { this.openSettingsView = null; this.openChildSettingsView = null; this.modalDialogMoreView = null; this.listenTo( window.FusionEvents, 'fusion-settings-modal-save', this.removeElementSettingsView ); this.listenTo( window.FusionEvents, 'fusion-settings-modal-cancel', this.removeElementSettingsView ); this.listenTo( window.FusionEvents, 'fusion-settings-removed', this.removeElementSettingsView ); this.listenTo( window.FusionEvents, 'fusion-preferences-editing_mode-updated', this.editingModeChanged ); }, /** * Check if element settings panel (dialog) should be rendered or not. * * @since 2.0.0 * @param {string} view - Element View. * @return {boolean} */ shouldRenderSettings: function( view ) { var modelParent = view.model.get( 'parent' ), isChild = 'multi_element_child' === view.model.get( 'multi' ), modelCid = view.model.get( 'cid' ), generated = 'generated_element' === view.model.get( 'type' ), rendered = false, $editPanel = 'dialog' === window.FusionApp.preferencesData.editing_mode ? jQuery( '.fusion-builder-dialog.fusion-builder-settings-dialog .ui-dialog-content' ) : window.FusionApp.sidebarView.$el.find( '.fusion-builder-custom-tab' ), panelCid, $panelWrap; if ( generated ) { if ( jQuery( '.ui-dialog-content[data-cid="' + modelCid + '"]' ).length ) { jQuery( '.ui-dialog-content[data-cid="' + modelCid + '"]' ).closest( '.ui-dialog' ).show(); return false; } if ( jQuery( '.ui-dialog-content:not( [data-cid="' + modelCid + '"] )' ).length ) { jQuery( '.ui-dialog-content:not( [data-cid="' + modelCid + '"] )' ).closest( '.ui-dialog' ).hide(); } return true; } if ( $editPanel.length ) { // Check if panel is already open, if so do nothing. $editPanel.each( function() { panelCid = jQuery( this ).attr( 'data-cid' ); $panelWrap = 'dialog' === window.FusionApp.preferencesData.editing_mode ? jQuery( this ).closest( '.fusion-builder-dialog.fusion-builder-settings-dialog' ) : jQuery( this ); if ( parseInt( modelCid, 10 ) === parseInt( panelCid, 10 ) ) { $panelWrap.show(); rendered = true; // continue. return; } $panelWrap.hide(); } ); } // Show panel if it is already rendered. if ( rendered ) { // If not dialog we have to show correct sidebar tab before exit. if ( 'dialog' !== window.FusionApp.preferencesData.editing_mode ) { window.FusionApp.sidebarView.openSidebarAndShowEOTab(); } return false; } // Remove the parent view unless its a direct parent of what we want to edit. if ( this.openSettingsView ) { if ( isChild && modelParent === this.openSettingsView.model.get( 'cid' ) && 'multi_element_parent' === this.openSettingsView.model.get( 'multi' ) ) { if ( 'dialog' === window.FusionApp.preferencesData.editing_mode ) { this.openSettingsView.$el.closest( '.fusion-builder-dialog.fusion-builder-settings-dialog' ).hide(); } else { this.openSettingsView.$el.hide(); } } else { this.openSettingsView.saveSettings(); } } // If we have open child view, remove it. if ( this.openChildSettingsView ) { this.openChildSettingsView.saveSettings(); } // Set newly opened view to access. if ( ! isChild ) { this.openSettingsView = view; } else { this.openChildSettingsView = view; } return true; }, removeElementSettingsView: function( cid ) { if ( this.openSettingsView && cid === this.openSettingsView.model.get( 'cid' ) ) { this.openSettingsView = false; } if ( this.openChildSettingsView && cid === this.openChildSettingsView.model.get( 'cid' ) ) { this.openChildSettingsView = false; } }, /** * Render dialog more options template. * * @since 2.0.0 * @param {Object} view - The view. * @param {Object} event - The event. * @return {void} */ renderDialogMoreOptions: function( view ) { var $wrap = 'dialog' === window.FusionApp.preferencesData.editing_mode ? view.$el.closest( '.ui-dialog' ).find( '.fusion-utility-menu-wrap' ) : view.$el.find( '.fusion-utility-menu-wrap' ); this.modalDialogMoreView = new FusionPageBuilder.modalDialogMore( { model: this.model } ); jQuery( this.modalDialogMoreView.render( { view: view } ).el ).appendTo( $wrap ); // After child modal is closed 'click' is attached again. $wrap.find( '.fusion-utility-menu' ).off().on( 'click', function( event ) { $wrap = jQuery( this ).closest( '.fusion-utility-menu-wrap' ); $wrap.toggleClass( 'active' ); event.stopPropagation(); window.FusionPageBuilderApp.sizesHide( event ); } ); }, /** * Things to be done when editing_mode pregerence is changed. */ editingModeChanged: function() { if ( this.openSettingsView ) { this.openSettingsView.saveSettings(); } if ( this.openChildSettingsView ) { this.openChildSettingsView.saveSettings(); } } } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager */ /* eslint no-useless-escape: 0 */ /* eslint max-depth: 0 */ /* eslint no-continue: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; _.mixin( { /** * The FusionBuilder::attributes() function from PHP, translated to JS. * * @since 2.0.0 * @param {Object|string} attributes - The attributes. * @return {string} Ready to use in templates/HTML. */ fusionGetAttributes: function( attributes ) { var out = ''; if ( 'string' === typeof attributes ) { return 'class="' + attributes + '"'; } _.each( attributes, function( value, name ) { if ( 'undefined' !== typeof value ) { value = value.toString(); if ( 'valueless_attribute' === value ) { out += ' ' + name; } else if ( 0 < value.length ) { value = value.replace( /\s\s+/g, ' ' ); out += ' ' + name + '="' + value + '"'; } } } ); return out; }, /** * Remove empty values from params so when merging with defaults, the defaults are used. * * @since 2.0.0 * @param {Object} params - The parameters. * @return {Object} - Returns the params. */ fusionCleanParameters: function( params ) { Object.keys( params ).forEach( function( key ) { if ( params[ key ] && 'object' === typeof params[ key ] ) { _.fusionCleanParameters( params[ key ] ); } else if ( ( null === params[ key ] || '' === params[ key ] ) && 'element_content' !== key ) { delete params[ key ]; } } ); return params; }, /** * Builds section title element. * * @since 2.2 * @param {Object} values - The values. * @param {Object} extras - The extras. * @return {string} */ buildTitleElement: function( values, extras, headingContent ) { var contentAlign = jQuery( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left', size = parseInt( values.heading_size ), sizeArray = [ 'one', 'two', 'three', 'four', 'five', 'six' ], output = '', styles = '', headingStyles = '', classes = '', wrapperClasses = '', marginTop = extras.title_margin.top, marginBottom = extras.title_margin.bottom, sepColor = extras.title_border_color, styleType = extras.title_style_type, underlineOrNone = -1 !== styleType.indexOf( 'underline' ) || -1 !== styleType.indexOf( 'none' ); // Render title. _.each( styleType.split( ' ' ), function( className ) { classes += ' sep-' + className; } ); wrapperClasses = ' fusion-title fusion-title-size-' + sizeArray[ size - 1 ] + classes; if ( marginTop ) { styles += 'margin-top:' + _.fusionGetValueWithUnit( marginTop ) + ';'; } if ( marginBottom ) { styles += 'margin-bottom:' + _.fusionGetValueWithUnit( marginBottom ) + ';'; } if ( '' !== marginTop || '' !== marginBottom ) { headingStyles += 'margin:0;'; } if ( false !== underlineOrNone ) { if ( -1 !== styleType.indexOf( 'underline' ) && sepColor ) { styles += 'border-bottom-color:' + sepColor + ';'; } else if ( -1 !== styleType.indexOf( 'none' ) ) { classes += ' fusion-sep-none'; } } output += '<div class="' + wrapperClasses + '" style="' + styles + '">'; if ( false === underlineOrNone && 'right' === contentAlign ) { output += '<div class="title-sep-container">'; output += '<div class="title-sep' + classes + '"></div>'; output += '</div>'; } output += '<h' + size + ' class="title-heading-' + contentAlign + '" style="' + headingStyles + '">'; output += headingContent; output += '</h' + size + '>'; if ( false === underlineOrNone && 'left' === contentAlign ) { output += '<div class="title-sep-container">'; output += '<div class="title-sep' + classes + '"></div>'; output += '</div>'; } output += '</div>'; return output; }, /** * Copy of our fusion_builder_visibility_atts() function in PHP. * * @since 2.0.0 * @param {string} selection - The selection. * @param {Object|string} attr - The attributes. * @return {Object} The attributes modified to accomodate visibility options from the selection parameter. */ fusionVisibilityAtts: function( selection, attr ) { var allVisibilityValues = [ 'small-visibility', 'medium-visibility', 'large-visibility' ], visibilityValues = allVisibilityValues, visibilityOptions; // If empty, show all. if ( '' === selection ) { selection = visibilityValues; } // If no is used, change that to all options selected, as fallback. if ( 'no' === selection ) { selection = visibilityValues; } // If yes is used, use all selections with mobile visibility removed. if ( 'yes' === selection ) { visibilityValues = visibilityValues.filter( function( e ) { return 'small-visibility' !== e; } ); selection = visibilityValues; } // Make sure the selection is an array. if ( 'string' === typeof selection ) { selection = selection.split( ',' ); _.each( selection, function( value, key ) { selection[ key ] = value.replace( new RegExp( ' ', 'g' ), '' ); } ); } visibilityOptions = allVisibilityValues; _.each( visibilityOptions, function( visibilityOption ) { if ( selection && -1 === selection.indexOf( visibilityOption ) ) { if ( 'object' === typeof attr ) { attr[ 'class' ] += ' fusion-no-' + visibilityOption; } else { attr += ' fusion-no-' + visibilityOption; } } } ); return attr; }, /** * Returns the available animation types. * * @since 2.1 * @return {Object} Animation types. */ fusionGetAnimationTypes: function() { var animations = [ 'bounce', 'bouncIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight', 'fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight', 'flash', 'rubberBand', 'shake', 'slideIn', 'slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight', 'zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInRight', 'zoomInLeft', 'flipinx', 'flipiny', 'lightspeedin' ]; return animations; }, /** * The FusionBuilder::animations() function from PHP, translated to JS. * * @since 2.0.0 * @param {Object} args - The arguments. * @param {string} args.type - The animation type. * @param {string} args.direction - The animation direction. * @param {string|number} args.speed - The animation speed, in seconds. * @param {string} args.offset - The animation offset. * @return {Object} Animation attributes. */ fusionGetAnimations: function( args ) { var animationAttributes = {}, directionSuffix, offset; args = _.defaults( args, { type: '', direction: 'left', speed: '0.1', offset: 'bottom-in-view' } ); if ( args.type ) { animationAttributes.animation_class = 'fusion-animated'; if ( 'static' === args.direction ) { args.direction = ''; } if ( 'flash' !== args.type && 'shake' !== args.type && 'rubberBand' !== args.type && 'flipinx' !== args.type && 'flipiny' !== args.type && 'lightspeedin' !== args.type ) { directionSuffix = 'In' + args.direction.charAt( 0 ).toUpperCase() + args.direction.slice( 1 ); args.type += directionSuffix; } animationAttributes[ 'data-animationType' ] = args.type; if ( args.speed ) { animationAttributes[ 'data-animationDuration' ] = args.speed; } } if ( args.offset ) { offset = args.offset; if ( 'top-into-view' === args.offset ) { offset = '100%'; } else if ( 'top-mid-of-view' === args.offset ) { offset = '50%'; } animationAttributes[ 'data-animationOffset' ] = offset; } return animationAttributes; }, /** * The FusionBuilder::font_awesome_name_handler() function from PHP, translated to JS. * * @since 2.0.0 * @param {string} icon - The icon we want. * @return {string} - Returns the icon. */ fusionFontAwesome: function( icon ) { var oldIcons = { arrow: 'angle-right', asterik: 'asterisk', cross: 'times', 'ban-circle': 'ban', 'bar-chart': 'bar-chart-o', beaker: 'flask', bell: 'bell-o', 'bell-alt': 'bell', 'bitbucket-sign': 'bitbucket-square', 'bookmark-empty': 'bookmark-o', building: 'building-o', 'calendar-empty': 'calendar-o', 'check-empty': 'square-o', 'check-minus': 'minus-square-o', 'check-sign': 'check-square', check: 'check-square-o', 'chevron-sign-down': 'chevron-circle-down', 'chevron-sign-left': 'chevron-circle-left', 'chevron-sign-right': 'chevron-circle-right', 'chevron-sign-up': 'chevron-circle-up', 'circle-arrow-down': 'arrow-circle-down', 'circle-arrow-left': 'arrow-circle-left', 'circle-arrow-right': 'arrow-circle-right', 'circle-arrow-up': 'arrow-circle-up', 'circle-blank': 'circle-o', cny: 'rub', 'collapse-alt': 'minus-square-o', 'collapse-top': 'caret-square-o-up', collapse: 'caret-square-o-down', 'comment-alt': 'comment-o', 'comments-alt': 'comments-o', copy: 'files-o', cut: 'scissors', dashboard: 'tachometer', 'double-angle-down': 'angle-double-down', 'double-angle-left': 'angle-double-left', 'double-angle-right': 'angle-double-right', 'double-angle-up': 'angle-double-up', download: 'arrow-circle-o-down', 'download-alt': 'download', 'edit-sign': 'pencil-square', edit: 'pencil-square-o', 'ellipsis-horizontal': 'ellipsis-h', 'ellipsis-vertical': 'ellipsis-v', 'envelope-alt': 'envelope-o', 'exclamation-sign': 'exclamation-circle', 'expand-alt': 'plus-square-o', expand: 'caret-square-o-right', 'external-link-sign': 'external-link-square', 'eye-close': 'eye-slash', 'eye-open': 'eye', 'facebook-sign': 'facebook-square', 'facetime-video': 'video-camera', 'file-alt': 'file-o', 'file-text-alt': 'file-text-o', 'flag-alt': 'flag-o', 'folder-close-alt': 'folder-o', 'folder-close': 'folder', 'folder-open-alt': 'folder-open-o', food: 'cutlery', frown: 'frown-o', fullscreen: 'arrows-alt', 'github-sign': 'github-square', group: 'users', 'h-sign': 'h-square', 'hand-down': 'hand-o-down', 'hand-left': 'hand-o-left', 'hand-right': 'hand-o-right', 'hand-up': 'hand-o-up', hdd: 'hdd-o', 'heart-empty': 'heart-o', hospital: 'hospital-o', 'indent-left': 'outdent', 'indent-right': 'indent', 'info-sign': 'info-circle', keyboard: 'keyboard-o', legal: 'gavel', lemon: 'lemon-o', lightbulb: 'lightbulb-o', 'linkedin-sign': 'linkedin-square', meh: 'meh-o', 'microphone-off': 'microphone-slash', 'minus-sign-alt': 'minus-square', 'minus-sign': 'minus-circle', 'mobile-phone': 'mobile', moon: 'moon-o', move: 'arrows', off: 'power-off', 'ok-circle': 'check-circle-o', 'ok-sign': 'check-circle', ok: 'check', 'paper-clip': 'paperclip', paste: 'clipboard', 'phone-sign': 'phone-square', picture: 'picture-o', 'pinterest-sign': 'pinterest-square', 'play-circle': 'play-circle-o', 'play-sign': 'play-circle', 'plus-sign-alt': 'plus-square', 'plus-sign': 'plus-circle', pushpin: 'thumb-tack', 'question-sign': 'question-circle', 'remove-circle': 'times-circle-o', 'remove-sign': 'times-circle', remove: 'times', reorder: 'bars', 'resize-full': 'expand', 'resize-horizontal': 'arrows-h', 'resize-small': 'compress', 'resize-vertical': 'arrows-v', 'rss-sign': 'rss-square', save: 'floppy-o', screenshot: 'crosshairs', 'share-alt': 'share', 'share-sign': 'share-square', share: 'share-square-o', 'sign-blank': 'square', signin: 'sign-in', signout: 'sign-out', smile: 'smile-o', 'sort-by-alphabet-alt': 'sort-alpha-desc', 'sort-by-alphabet': 'sort-alpha-asc', 'sort-by-attributes-alt': 'sort-amount-desc', 'sort-by-attributes': 'sort-amount-asc', 'sort-by-order-alt': 'sort-numeric-desc', 'sort-by-order': 'sort-numeric-asc', 'sort-down': 'sort-asc', 'sort-up': 'sort-desc', stackexchange: 'stack-overflow', 'star-empty': 'star-o', 'star-half-empty': 'star-half-o', sun: 'sun-o', 'thumbs-down-alt': 'thumbs-o-down', 'thumbs-up-alt': 'thumbs-o-up', time: 'clock-o', trash: 'trash-o', 'tumblr-sign': 'tumblr-square', 'twitter-sign': 'twitter-square', unlink: 'chain-broken', upload: 'arrow-circle-o-up', 'upload-alt': 'upload', 'warning-sign': 'exclamation-triangle', 'xing-sign': 'xing-square', 'youtube-sign': 'youtube-square', 'zoom-in': 'search-plus', 'zoom-out': 'search-minus' }, faIcon = icon; if ( '' !== icon ) { // Custom icon is used so we need to remove our prefix. if ( 'fusion-prefix-' === icon.substr( 0, 14 ) ) { return icon.replace( 'fusion-prefix-', '' ); } // AWB icon is used. if ( 'awb-icon-' === icon.substr( 0, 9 ) ) { return icon; } // FA icon, but we need to handle BC. if ( 'icon-' === icon.substr( 0, 5 ) || 'fa-' !== icon.substr( 0, 3 ) ) { icon = icon.replace( 'icon-', 'fa-' ); if ( 'undefined' !== typeof oldIcons[ icon.replace( 'fa-', '' ) ] ) { faIcon = 'fa-' + oldIcons[ icon.replace( 'fa-', '' ) ]; } else if ( 'fa-' !== icon.substr( 0, 3 ) ) { faIcon = 'fa-' + icon; } } if ( -1 === icon.trim().indexOf( ' ' ) ) { faIcon = 'fa ' + icon; } } return faIcon; }, /** * The FusionBuilder::validate_shortcode_attr_value() function from PHP, translated to JS. * * @since 2.0.0 * @param {string} value - The value. * @param {string} acceptedUnit - The unit we're accepting. * @param {boolean} bcSupport - Should we add backwards-compatibility support? * @return {string|false} - Returns the validated value. */ fusionValidateAttrValue: function( value, acceptedUnit, bcSupport ) { var validatedValue = '', numericValue, unit; bcSupport = 'undefined' !== typeof bcSupport ? bcSupport : true; value = String( value ); if ( '' !== value ) { value = value.trim(); numericValue = parseFloat( value ); unit = value.replace( numericValue, '' ); if ( 'undefined' === typeof acceptedUnit || '' === acceptedUnit ) { validatedValue = numericValue; } else if ( '' === unit ) { // Add unit if it's required. validatedValue = numericValue + acceptedUnit; } else if ( bcSupport || unit === acceptedUnit ) { // If unit was found use original value. BC support. validatedValue = value; } else { validatedValue = false; } } return validatedValue; }, /** * Clone of fusion_builder_get_video_provider. * * @since 2.0.0 * @param {string} videoString - The URL of the video. * @return {Object} - Returns an object formatted {type: (string) The video-type, id: (string) The video ID }. */ fusionGetVideoProvider: function( videoString ) { var videoId, match; videoString = videoString.trim(); // Check for YouTube. videoId = false; if ( match = videoString.match( /youtube\.com\/watch\?v=([^\&\?\/]+)/ ) ) { // eslint-disable-line no-cond-assign if ( 'undefined' !== typeof match[ 1 ] ) { videoId = match[ 1 ]; } } else if ( match = videoString.match( /youtube\.com\/embed\/([^\&\?\/]+)/ ) ) { // eslint-disable-line no-cond-assign if ( 'undefined' !== typeof match[ 1 ] ) { videoId = match[ 1 ]; } } else if ( match = videoString.match( /youtube\.com\/v\/([^\&\?\/]+)/ ) ) { // eslint-disable-line no-cond-assign if ( 'undefined' !== typeof match[ 1 ] ) { videoId = match[ 1 ]; } } else if ( match = videoString.match( /youtu\.be\/([^\&\?\/]+)/ ) ) { // eslint-disable-line no-cond-assign if ( 'undefined' !== typeof match[ 1 ] ) { videoId = match[ 1 ]; } } if ( false !== videoId ) { return { type: 'youtube', id: videoId }; } // Check for Vimeo. if ( match = videoString.match( /vimeo\.com\/(\w*\/)*(\d+)/ ) ) { // eslint-disable-line no-cond-assign if ( 1 < match.length ) { return { type: 'vimeo', id: match[ match.length - 1 ] }; } } if ( match = videoString.match( /^\d+$/ ) ) { // eslint-disable-line no-cond-assign if ( 'undefined' !== typeof match[ 0 ] ) { return { type: 'vimeo', id: match[ 0 ] }; } } return { type: 'youtube', id: videoString }; }, /** * JS clone of fusion_builder_check_value. * If value is not in pixels or percent, appends 'px'. * * @since 2.0.0 * @param {string} value - The value. * @return {string} - Returns the value. */ fusionCheckValue: function( value ) { if ( -1 === value.indexOf( '%' ) && -1 === value.indexOf( 'px' ) ) { value = value + 'px'; } return value; }, /** * JS clone of get_value_with_unit. * * @param {string|number} value - The value. * @param {string} unit - The unit. * @param {string} unitHandling - Can be 'add'(default) or 'force_replace'. * @return {string} - Returns the value with units. */ fusionGetValueWithUnit: function( value, unit, unitHandling ) { var rawValues, rawValue, values; unit = 'undefined' !== typeof unit ? unit : 'px'; unitHandling = 'undefined' !== typeof unitHandling ? unitHandling : 'add'; rawValues = []; // Trim the value. value = 'undefined' === typeof value ? '' : value; value = value.toString().trim(); if ( -1 !== jQuery.inArray( value, [ 'auto', 'inherit', 'initial' ] ) ) { return value; } // Return empty if there are no numbers in the value. // Prevents some CSS errors. if ( ! ( /\d/ ).test( value ) ) { return; } // Explode if has multiple values. values = value.split( ' ' ); if ( 1 < values.length ) { _.each( values, function( val ) { rawValue = parseFloat( val ); if ( ! isNaN( rawValue ) ) { // Only == here deliberately. if ( val == rawValue ) { val = rawValue + unit; } else if ( 'force_replace' === unitHandling ) { val = rawValue + unit; } } rawValues.push( val ); } ); return rawValues.join( ' ' ); } rawValue = parseFloat( value ); // Only == here deliberately. if ( value == rawValue ) { return rawValue + unit; } if ( 'force_replace' === unitHandling ) { return rawValue + unit; } return value; }, /** * Returns a single side dimension. * * Copy of the PHP fusion_builder_single_dimension function. * * @param {Object} dimensions - The dimensions object{top:'',buttom:'',left:'',right:''}. * @param {string} direction - Which one do we want? left/right/top/bottom. * @return {string} - Returns a single dimension from the array. */ fusionSingleDimension: function( dimensions, direction ) { dimensions = dimensions.split( ' ' ); if ( 4 === dimensions.length ) { if ( 'top' === direction ) { return dimensions[ 0 ]; } else if ( 'right' === direction ) { return dimensions[ 1 ]; } else if ( 'bottom' === direction ) { return dimensions[ 2 ]; } else if ( 'left' === direction ) { return dimensions[ 3 ]; } } else if ( 3 === dimensions.length ) { if ( 'top' === direction ) { return dimensions[ 0 ]; } else if ( 'right' === direction || 'left' === direction ) { return dimensions[ 1 ]; } else if ( 'bottom' === direction ) { return dimensions[ 2 ]; } } else if ( 2 === dimensions.length ) { if ( 'top' === direction || 'bottom' === direction ) { return dimensions[ 0 ]; } else if ( 'right' === direction || 'left' === direction ) { return dimensions[ 1 ]; } } return dimensions[ 0 ]; }, /** * Get the attributes for masonry. * * @since 2.0.0 * @param {Object} data - The data. * @param {string|number} data.blog_grid_column_spacing - Column spacing in pixels. * @param {string} data.element_orientation_class - The orientation class (fusion-element-portrain, fusion-element-landscape etc). * @param {string} data.timeline_color - The timeline color. * @param {string} data.masonry_attribute_style - Masonry styles. * @return {Object} - Returns the masonry attributes. */ fusionGetMasonryAttribute: function( data ) { var masonryColumnOffset, masonryColumnSpacing, masonryAttributes = {}; masonryColumnOffset = ' - ' + ( parseFloat( data.blog_grid_column_spacing ) / 2 ) + 'px'; if ( 'string' === typeof data.element_orientation_class && -1 !== data.element_orientation_class.indexOf( 'fusion-element-portrait' ) ) { masonryColumnOffset = ''; } masonryColumnSpacing = ( parseFloat( data.blog_grid_column_spacing ) ) + 'px'; // Calculate the correct size of the image wrapper container, based on orientation and column spacing. if ( 'transparent' !== data.timeline_color && 0 !== jQuery.AWB_Color( data.timeline_color ).alpha() ) { masonryColumnOffset = ' - ' + ( parseFloat( data.blog_grid_column_spacing ) / 2 ) + 'px'; if ( 'string' === typeof data.element_orientation_class && -1 !== data.element_orientation_class.indexOf( 'fusion-element-portrait' ) ) { masonryColumnOffset = ' + 4px'; } masonryColumnSpacing = ( parseFloat( data.blog_grid_column_spacing ) - 2 ) + 'px'; if ( 'string' === typeof data.element_orientation_class && -1 !== data.element_orientation_class.indexOf( 'fusion-element-landscape' ) ) { masonryColumnSpacing = ( parseFloat( data.blog_grid_column_spacing ) - 6 ) + 'px'; } } // Calculate the correct size of the image wrapper container, based on orientation and column spacing. masonryAttributes[ 'class' ] = 'fusion-masonry-element-container'; masonryAttributes.style = data.masonry_attribute_style + 'padding-top:calc((100% + ' + masonryColumnSpacing + ') * ' + data.element_base_padding + masonryColumnOffset + ');'; return masonryAttributes; }, /** * Combination of first featured image and rollover. * * @since 2.0.0 * @param {Object} data - The data. * @param {string} data.layout - The layout. * @param {string} data.masonry_data - The masonry data. * @param {string|boolean} data.enable_rollover - Should we enable the rollover? * @param {string} data.display_rollover - Should we display the rollover? (yes|no|force_yes). * @param {Object} data.featured_images - The featured images. * @param {string} data.image_rollover_icons - no|zoom|link|linkzoom. * @param {string} data.post_type - The post-type. * @param {string|number} data.post_id - The post-ID. * @param {string} data.icon_permalink - URL. * @param {string} data.link_target - Leave empty or use target="_blank". * @param {string} data.icon_permalink_title - The icon permalink title. * @param {string} data.full_image - URL. * @param {string} data.data_rel - Used in data-rel="". * @param {string} data.data_title - Used in data-title="". * @param {string} data.data_caption - Used in data-caption="". * @param {string} data.lightbox_content - The contents of the lightbox. * @param {string|boolean} data.display_post_title - Should we display the post-title? * @param {string} data.permalink - URL. * @param {string} data.title - The title. * @param {string|boolean} data.display_post_categories - Should we display the post categories? * @param {string} data.terms - The post category terms (HTML). * @param {boolean} data.display_woo_rating - SHould we display Woo rating? * @param {string} data.rating - The rating (HTML). * @param {boolean} data.display_woo_price - Should we display Woo Prices? * @param {string} data.price - The price (HTML). * @param {boolean} data.display_woo_buttons - Should we display the Woo buttons? * @param {string} data.buttons - The buttons (HTML). * @return {string} - Returns the template. */ fusionFeaturedImage: function( data ) { var featuredImageTemplate = FusionPageBuilder.template( jQuery( '#tmpl-featured-image' ).html() ), attributes = {}; if ( 'object' !== typeof data || 'undefined' === typeof data.featured_images ) { return ''; } attributes.data = data; return featuredImageTemplate( attributes ); }, /** * Get element orientation class based on image dimensions and ratio and widthDouble params. * * @since 2.0.0 * @param {Object} attachment - Image object. * @param {number} attachment.imageWidth - Image width. * @param {number} attachment.imageHeight - Image height. * @param {number} ratio - Height / Width ratio. Portrait images have larger height / width ratio. * @param {number} widthDouble - Wider images are considered as 2x2. * @return {string} - Returns the element class. */ fusionGetElementOrientationClass: function( attachment, ratio, widthDouble ) { var elementClass = 'fusion-element-grid', fallbackRatio = 0.8, lowerLimit, upperLimit; if ( 'undefined' !== typeof attachment.imageWidth && 'undefined' !== typeof attachment.imageHeight ) { // Fallback to legacy calcs of Avada 5.4.2 or earlier. if ( '1.0' === ratio ) { lowerLimit = ( fallbackRatio / 2 ) + ( fallbackRatio / 4 ); upperLimit = ( fallbackRatio * 2 ) - ( fallbackRatio / 2 ); if ( lowerLimit > attachment.imageHeight / attachment.imageWidth ) { // Landscape image. elementClass = 'fusion-element-landscape'; } else if ( upperLimit < attachment.imageHeight / attachment.imageWidth ) { // Portrait image. elementClass = 'fusion-element-portrait'; } else if ( attachment.imageWidth > widthDouble ) { // 2x2 image. elementClass = 'fusion-element-landscape fusion-element-portrait'; } } else if ( ratio < attachment.imageWidth / attachment.imageHeight ) { // Landscape image. elementClass = 'fusion-element-landscape'; } else if ( ratio < attachment.imageHeight / attachment.imageWidth ) { // Portrait image. elementClass = 'fusion-element-portrait'; } else if ( attachment.imageWidth > widthDouble ) { // 2x2 image. elementClass = 'fusion-element-landscape fusion-element-portrait'; } } return elementClass; }, /** * Get base element padding based on orientation CSS class. * * @since 2.0.0 * @param {string} elementOrientationClass - CSS class * @return {number} - Returns the padding. */ fusionGetElementBasePadding: function( elementOrientationClass ) { var fusionElementGridPadding = 0.8, masonryElementPadding = { 'fusion-element-grid': fusionElementGridPadding, 'fusion-element-landscape': fusionElementGridPadding / 2, 'fusion-element-portrait': fusionElementGridPadding * 2 }; if ( 'undefined' !== typeof masonryElementPadding[ elementOrientationClass ] ) { fusionElementGridPadding = masonryElementPadding[ elementOrientationClass ]; } return fusionElementGridPadding; }, /** * JS copy of fusion_builder_render_post_metadata. * * @since 2.0.0 * @param {string} layout - The layout. * @param {Object} settings - The settings. * @param {boolean|string} settings.post_meta - Should we display the post-meta? * @param {boolean|string} settings.post_meta_author - Should we display the author? * @param {boolean|string} settings.post_meta_date - Should we display the date? * @param {boolean|string} settings.post_meta_cats - Should we display the categories? * @param {boolean|string} settings.post_meta_tags - Should we display the tags? * @param {boolean|string} settings.post_meta_comments - Should we display comments? * @param {boolean|string} settings.disable_date_rich_snippet_pages - Should we disable the date rich snippet? * @param {Object} data - The data. * @param {string} data.post_meta - yes|no. * @param {string} data.author_post_link - The link to the post-author (HTML, not just URL). * @param {string} data.formatted_date - Formatted date (HTML). * @param {string} data.categories - The categories (HTML). * @param {string} data.tags - The Tags (HTML) * @param {string} data.comments - The comments (HTML) * @param {string} data.disable_date_rich_snippet_pages - Disable date rich snippets? * @return {string} - Returns HTML. */ fusionRenderPostMetadata: function( layout, settings, data ) { var metadata = '', author = '', date = '', output = '', dateMarkup; // Check if meta data is enabled. if ( 'undefined' === typeof data ) { return; } if ( ( settings.post_meta && 'no' !== data.post_meta ) || ( ! settings.post_meta && 'yes' === data.post_meta ) ) { // For alternate, grid and timeline layouts return empty single-line-meta if all meta data for that position is disabled. if ( -1 !== jQuery.inArray( layout, [ 'alternate', 'grid_timeline' ] ) && ! settings.post_meta_author && ! settings.post_meta_date && ! settings.post_meta_cats && ! settings.post_meta_tags && ! settings.post_meta_comments ) { return ''; } // Render author meta data. if ( settings.post_meta_author ) { // Check if rich snippets are enabled. if ( ! settings.disable_date_rich_snippet_pages ) { metadata += 'By <span>' + data.author_post_link + '</span>'; } else { metadata += 'By <span class="vcard"><span class="fn">' + data.author_post_link + '</span></span>'; } metadata += '<span class="fusion-inline-sep">|</span>'; } // Render the updated meta data or at least the rich snippet if enabled. if ( settings.post_meta_date ) { metadata += _.fusionRenderRichSnippets( data, false, false, true ); dateMarkup = '<span>' + data.formatted_date + '</span><span class="fusion-inline-sep">|</span>'; metadata += dateMarkup; } // Render rest of meta data. // Render categories. if ( settings.post_meta_cats ) { if ( data.categories ) { metadata += ( settings.post_meta_tags ) ? 'Categories: ' + data.categories : data.categories; metadata += '<span class="fusion-inline-sep">|</span>'; } } // Render tags. if ( settings.post_meta_tags ) { if ( data.tags ) { metadata += '<span class="meta-tags">' + window.fusionBuilderText.tags.replace( '%s', data.tags ) + '</span><span class="fusion-inline-sep">|</span>'; } } // Render comments. if ( settings.post_meta_comments && 'grid_timeline' !== layout ) { metadata += '<span class="fusion-comments">' + data.comments + '</span>'; } // Render the HTML wrappers for the different layouts. if ( metadata ) { metadata = author + date + metadata; if ( 'single' === layout ) { output += '<div class="fusion-meta-info"><div class="fusion-meta-info-wrapper">' + metadata + '</div></div>'; } else if ( -1 !== jQuery.inArray( layout, [ 'alternate', 'grid_timeline' ] ) ) { output += '<p class="fusion-single-line-meta">' + metadata + '</p>'; } else if ( 'recent_posts' === layout ) { output += metadata; } else { output += '<div class="fusion-alignleft">' + metadata + '</div>'; } } else { output += author + date; } } else if ( data.disable_date_rich_snippet_pages ) { // Render author and updated rich snippets for grid and timeline layouts. output += _.fusionRenderRichSnippets( data, false ); } return output; }, /** * JS Copy of fusion_builder_render_rich_snippets_for_pages. * * @since 2.0.0 * @param {Object} data - The data. * @param {boolean} data.disable_date_rich_snippet_pages Should we display the rich snippets? * @param {string} data.title - The title. * @param {string} data.the_author_posts_link The link to the author (HTML, not just the URL). * @param {string} data.get_the_modified_time - The modified timestamp. * @return {string} - Returns the output. */ fusionRenderRichSnippets: function( data ) { var output = ''; if ( 'undefined' === typeof data ) { return; } if ( data.disable_date_rich_snippet_pages ) { output = ''; } return output; }, /** * JS copy of new-slideshow-blog-shortcode. * * @since 2.0.0 * @param {Object} data - The data. * @param {string} data.layout - The layout. * @param {string} data.featured_image_width - The featured image width. * @param {string} data.id - The ID. * @param {string} data.featured_image_height - The featured image height. * @param {string} data.thumbnail - The thumbnail. * @param {string} data.video - The video * @param {Object} data.image_data - The image data. * @param {Object} data.multiple_featured - Multiple featured images data. * @param {string} data.permalink - The permalink (URL). * @param {string} data.title - The title. * @param {string} data.image_size - The image size. * @return {string} */ fusionGetBlogSlideshow: function( data ) { var slideshowTemplate = FusionPageBuilder.template( jQuery( '#tmpl-new-slideshow-blog-shortcode' ).html() ), attributes = {}; if ( 'object' !== typeof data ) { return ''; } attributes.data = data; return slideshowTemplate( attributes ); }, /** * Ability to change length of content and display correct contents. * * @since 2.0.0 * @param {Object} data - The data. * @param {string} data.read_more - The read more text. * @param {string} data.full_content - The full content. * @param {string} data.excerpt - The excerpt. * @param {string} data.excerpt_stripped - Stripped excerpt. * @param {string} data.excerpt_base - Defaults to 'characters'. * @param {string} excerpt - Do we want excerpt (yes/no)? * @param {number} excerptLength - How long? * @param {boolean} stripHtml - Should we strip HTML? * @return {string} */ fusionGetFixedContent: function( data, excerpt, excerptLength, stripHtml ) { var content, readMoreContent = ''; excerpt = 'undefined' !== typeof excerpt ? excerpt : 'no'; excerptLength = 'undefined' !== typeof excerptLength ? excerptLength : 55; stripHtml = 'undefined' !== typeof stripHtml ? stripHtml : false; stripHtml = ( 'yes' === stripHtml || stripHtml || '1' == stripHtml ); data.read_more = data.hasOwnProperty( 'read_more' ) ? data.read_more : ''; // Return full contents. if ( 'no' === excerpt ) { return data.full_content; } // Set correct stripped data. content = ( stripHtml ) ? data.excerpt_stripped : data.excerpt; // It has a read more, remove it. content = content .replace( /\[/g, '[' ) .replace( /\]/g, ']' ) .replace( /\.\.\./g, '…' ); readMoreContent = ' ' + data.read_more .replace( /\[/g, '[' ) .replace( /\]/g, ']' ) .replace( /\.\.\./g, '…' ) .trim(); if ( -1 !== content.indexOf( readMoreContent ) ) { content = content.replace( readMoreContent, '' ); } if ( 'characters' === data.excerpt_base.toLowerCase() ) { if ( excerptLength < content.length ) { content = content.substring( 0, excerptLength ); } } else { content = content.split( ' ' ).splice( 0, excerptLength ).join( ' ' ); } // Add read more. content += readMoreContent; return _.fusionFixHtml( content ); }, /** * Helper method used in getFixedContent. * * @since 2.0.0 * @param {string} html - The html string. * @return {string} */ fusionFixHtml: function( html ) { var div = document.createElement( 'div' ); div.innerHTML = html; return ( div.innerHTML ); }, /** * Capitalize the 1st letter. * * @since 2.0.0 * @param {string} string - The string we want to modify. * @return {string} */ fusionUcFirst: function( string ) { return string.charAt( 0 ).toUpperCase() + string.slice( 1 ); }, /** * JS port of PHP's rawurlencode function. * * @since 2.0.0 * @param {string} string - The URL. * @return {string} */ fusionRawUrlEncode: function( string ) { string = ( string + '' ); return encodeURIComponent( string ) .replace( /!/g, '%21' ) .replace( /'/g, '%27' ) .replace( /\(/g, '%28' ) .replace( /\)/g, '%29' ) .replace( /\*/g, '%2A' ); }, /** * Auto calculate accent color. * copy of fusion_auto_calculate_accent_color from PHP. * * @since 2.0.0 * @param {string} color - The color. * @return {string} */ fusionAutoCalculateAccentColor: function( color ) { var colorObj = jQuery.AWB_Color( color ), lightness = parseInt( colorObj.lightness() * 100, 10 ); if ( 0 < lightness ) { // Not black. if ( 50 <= lightness ) { return colorObj.lightness( lightness / 200 ).toRgbaString(); } return colorObj.lightness( lightness / 50 ).toRgbaString(); } return colorObj.lightness( 70 ).toRgbaString(); }, /** * JS copy of fusion_builder_build_social_links. * * @since 2.0.0 * @param {Array|Object} socialNetworks - The social networks array. * @param {string} functionName - Callable function-name. * @param {Object} params - The parameters. * @param {number} i - Not used? * @return {string} */ fusionBuildSocialLinks: function( socialNetworks, functionName, params, i ) { var useBrandColors = false, icons = '', shortcodeDefaults = {}, boxColors, iconColors, numOfIconColors, numOfBoxColors, socialNetworksCount, k = 0; socialNetworks = ! _.isUndefined( socialNetworks ) ? socialNetworks : ''; i = ! _.isUndefined( i ) ? i : 0; if ( ! _.isUndefined( params.social_icon_boxed ) ) { params.icons_boxed = params.social_icon_boxed; } if ( '' != socialNetworks && Array.isArray( socialNetworks ) ) { // Add compatibility for different key names in shortcodes. _.each( params, function( value, key ) { key = ( 'social_icon_boxed' === key ) ? 'icons_boxed' : key; key = ( 'social_icon_colors' === key ) ? 'icon_colors' : key; key = ( 'social_icon_boxed_colors' === key ) ? 'box_colors' : key; key = ( 'social_icon_color_type' === key ) ? 'color_type' : key; shortcodeDefaults[ key ] = value; } ); // Check for icon color type. if ( 'brand' === shortcodeDefaults.color_type ) { useBrandColors = true; boxColors = _.fusionSocialIcons( true, true ); // Backwards compatibility for old social network names. boxColors.mail = { label: 'Email Address', color: '#000000' }; iconColors = {}; } else { // Custom social icon colors. iconColors = ( 'undefined' !== typeof shortcodeDefaults.icon_colors ) ? shortcodeDefaults.icon_colors.split( '|' ) : ''; boxColors = ( 'undefined' !== typeof shortcodeDefaults.box_colors ) ? shortcodeDefaults.box_colors.split( '|' ) : ''; numOfIconColors = iconColors.length; numOfBoxColors = boxColors.length; socialNetworksCount = socialNetworks.length; for ( k = 0; k < socialNetworksCount; k++ ) { if ( 1 === numOfIconColors ) { iconColors[ k ] = iconColors[ 0 ]; } if ( 1 === numOfBoxColors ) { boxColors[ k ] = boxColors[ 0 ]; } } } // Process social networks. _.each( socialNetworks, function( value ) { _.each( value, function( link, network ) { var iconOptions; if ( 'custom' === network && link ) { _.each( link, function( url, customKey ) { var customIconBoxColor = '', socialMediaIcons, width, height; if ( 'yes' === params.icons_boxed ) { customIconBoxColor = i < boxColors.length ? boxColors[ i ] : ''; if ( true === useBrandColors ) { customIconBoxColor = ( boxColors[ network ].color ) ? boxColors[ network ].color : ''; } } socialMediaIcons = params.social_media_icons; if ( ! _.isObject( socialMediaIcons ) ) { socialMediaIcons = {}; } if ( _.isUndefined( socialMediaIcons.custom_title ) ) { socialMediaIcons.custom_title = {}; } if ( _.isUndefined( socialMediaIcons.custom_source ) ) { socialMediaIcons.custom_source = {}; } if ( _.isUndefined( socialMediaIcons.custom_title[ customKey ] ) ) { socialMediaIcons.custom_title[ customKey ] = ''; } if ( _.isUndefined( socialMediaIcons.custom_source[ customKey ] ) ) { socialMediaIcons.custom_source[ customKey ] = ''; } if ( _.isUndefined( socialMediaIcons.icon_mark[ customKey ] ) ) { socialMediaIcons.icon_mark[ customKey ] = ''; } iconOptions = { social_network: socialMediaIcons.custom_title[ customKey ], social_link: url, icon_color: i < iconColors.length ? iconColors[ i ] : '', box_color: customIconBoxColor, icon_mark: socialMediaIcons.icon_mark[ customKey ].replace( 'fusion-prefix-', '' ) }; if ( _.isFunction( functionName ) ) { iconOptions = functionName( iconOptions, params ); } icons += '<a ' + _.fusionGetAttributes( iconOptions ) + '>'; if ( _.isEmpty( socialMediaIcons.icon_mark[ customKey ] ) ) { icons += '<img'; if ( ! _.isUndefined( socialMediaIcons.custom_source[ customKey ].url ) ) { icons += ' src="' + socialMediaIcons.custom_source[ customKey ].url + '"'; } if ( ! _.isUndefined( socialMediaIcons.custom_title[ customKey ] ) && '' != socialMediaIcons.custom_title[ customKey ] ) { icons += ' alt="' + socialMediaIcons.custom_title[ customKey ] + '"'; } if ( ! _.isUndefined( socialMediaIcons.custom_source[ customKey ].width ) && socialMediaIcons.custom_source[ customKey ].width ) { width = parseInt( socialMediaIcons.custom_source[ customKey ].width, 10 ); icons += ' width="' + width + '"'; } if ( 'undefined' !== socialMediaIcons.custom_source[ customKey ].height && socialMediaIcons.custom_source[ customKey ].height ) { height = parseInt( socialMediaIcons.custom_source[ customKey ].height, 10 ); icons += ' height="' + height + '"'; } icons += ' />'; } icons += '</a>'; } ); } else { if ( true == useBrandColors ) { iconOptions = { social_network: network, social_link: link, icon_color: ( 'yes' === params.icons_boxed ) ? '#ffffff' : boxColors[ network ].color, box_color: ( 'yes' === params.icons_boxed ) ? boxColors[ network ].color : '' }; } else { iconOptions = { social_network: network, social_link: link, icon_color: i < iconColors.length ? iconColors[ i ] : '', box_color: i < boxColors.length ? boxColors[ i ] : '' }; } if ( _.isFunction( functionName ) ) { iconOptions = functionName( iconOptions, params ); } icons += '<a ' + _.fusionGetAttributes( iconOptions ) + '></a>'; } i++; } ); } ); } return icons; }, /** * JS copy of Fusion_Data::fusion_social_icons * * @since 2.0.0 * @param {boolean} custom - Do we want the custom network? * @param {boolean} colors - Do we want the colors? * @return {Object} */ fusionSocialIcons: function( custom, colors ) { var networks, simpleNetworks; custom = ! _.isUndefined( custom ) ? custom : true; colors = ! _.isUndefined( colors ) ? colors : false; networks = { blogger: { label: 'Blogger', color: '#f57d00' }, deviantart: { label: 'Deviantart', color: '#4dc47d' }, discord: { label: 'Discord', color: '#26262B' }, digg: { label: 'Digg', color: '#000000' }, dribbble: { label: 'Dribbble', color: '#ea4c89' }, dropbox: { label: 'Dropbox', color: '#007ee5' }, facebook: { label: 'Facebook', color: '#3b5998' }, flickr: { label: 'Flickr', color: '#0063dc' }, forrst: { label: 'Forrst', color: '#5b9a68' }, instagram: { label: 'Instagram', color: '#3f729b' }, linkedin: { label: 'LinkedIn', color: '#0077b5' }, myspace: { label: 'Myspace', color: '#000000' }, paypal: { label: 'Paypal', color: '#003087' }, pinterest: { label: 'Pinterest', color: '#bd081c' }, reddit: { label: 'Reddit', color: '#ff4500' }, rss: { label: 'RSS', color: '#f26522' }, skype: { label: 'Skype', color: '#00aff0' }, soundcloud: { label: 'Soundcloud', color: '#ff8800' }, spotify: { label: 'Spotify', color: '#2ebd59' }, teams: { label: 'Teams', color: '#505AC9' }, telegram: { label: 'Telegram', color: '#0088cc' }, tiktok: { label: 'Tiktok', color: '#010101' }, tumblr: { label: 'Tumblr', color: '#35465c' }, twitch: { label: 'Twitch', color: '#6441a5' }, twitter: { label: 'Twitter', color: '#55acee' }, vimeo: { label: 'Vimeo', color: '#1ab7ea' }, vk: { label: 'VK', color: '#45668e' }, wechat: { label: 'WeChat', color: '#7bb22e' }, whatsapp: { label: 'WhatsApp', color: '#77e878' }, xing: { label: 'Xing', color: '#026466' }, yahoo: { label: 'Yahoo', color: '#410093' }, yelp: { label: 'Yelp', color: '#af0606' }, youtube: { label: 'Youtube', color: '#cd201f' }, email: { label: 'Email Address', color: '#000000' }, phone: { label: 'Phone', color: '#000000' } }; // Add a "custom" entry. if ( custom ) { networks.custom = { label: 'Custom', color: '' }; } if ( ! colors ) { simpleNetworks = {}; _.each( networks, function( networkArgs ) { simpleNetworks.network_id = networkArgs.label; } ); networks = simpleNetworks; } return networks; }, /** * JS copy of fusion_builder_sort_social_networks. * * @param {Object} socialNetworksOriginal - The original object. * @param {Object} params - Any parameters we want to pass. * @return {Object} */ fusionSortSocialNetworks: function( socialNetworksOriginal, params ) { var socialNetworks = [], iconOrder = '', newNetwork, newCustom; // Get social networks order from optionthemes. if ( params.social_media_icons_icon && Array.isArray( params.social_media_icons_icon ) ) { iconOrder = params.social_media_icons_icon.join( '|' ); } if ( ! Array.isArray( iconOrder ) ) { iconOrder = iconOrder.split( '|' ); } if ( Array.isArray( iconOrder ) ) { // First put the icons that exist in the Global Options, // and order them using tha same order as in Global Options. _.each( iconOrder, function( value, key ) { var newKey; // Backwards compatibility for old social network names. newKey = ( 'email' === value ) ? 'mail' : value; // Check if social network from TO exists in element. if ( ! _.isUndefined( socialNetworksOriginal[ value ] ) ) { newNetwork = {}; if ( 'custom' === value ) { if ( socialNetworksOriginal[ value ] ) { newNetwork[ key ] = socialNetworksOriginal[ value ][ key ]; newCustom = {}; newCustom[ value ] = newNetwork; socialNetworks.push( newCustom ); } } else { newNetwork[ newKey ] = socialNetworksOriginal[ value ]; socialNetworks.push( newNetwork ); delete socialNetworksOriginal[ value ]; } } } ); // Put any remaining icons after the ones from the Global Options. _.each( socialNetworksOriginal, function( networkurl, name ) { if ( 'custom' !== name ) { newNetwork = {}; newNetwork[ name ] = networkurl; socialNetworks.push( newNetwork ); } } ); } else { console.warn( 'OUT' ); } return socialNetworks; }, /** * JS copy of fusion_builder_get_social_networks. * Gets the social networks. * * @since 2.0.0 * @param {Object} params - The parameters. * @return {Object} */ fusionGetSocialNetworks: function( params ) { // Careful! The icons are also ordered by these. var socialLinksArray = {}, socialLinks = { facebook: 'facebook', twitch: 'twitch', tiktok: 'tiktok', twitter: 'twitter', instagram: 'instagram', youtube: 'youtube', linkedin: 'linkedin', dribbble: 'dribbble', rss: 'rss', pinterest: 'pinterest', flickr: 'flickr', vimeo: 'vimeo', tumblr: 'tumblr', discord: 'discord', digg: 'digg', blogger: 'blogger', skype: 'skype', teams: 'teams', myspace: 'myspace', deviantart: 'deviantart', yahoo: 'yahoo', reddit: 'reddit', forrst: 'forrst', paypal: 'paypal', dropbox: 'dropbox', soundcloud: 'soundcloud', vk: 'vk', wechat: 'wechat', whatsapp: 'whatsapp', telegram: 'telegram', xing: 'xing', yelp: 'yelp', spotify: 'spotify', email: 'mail', phone: 'phone' }; _.each( socialLinks, function( val, key ) { if ( 'undefined' !== typeof params[ key ] && '' !== params[ key ] ) { socialLinksArray[ val ] = params[ key ]; } } ); if ( params.show_custom && 'yes' === params.show_custom ) { socialLinksArray.custom = {}; if ( Array.isArray( params.social_media_icons_icon ) ) { _.each( params.social_media_icons_icon, function( icon, key ) { if ( 'custom' === icon && Array.isArray( params.social_media_icons_url ) && ! _.isUndefined( params.social_media_icons_url[ key ] ) && '' !== params.social_media_icons_url[ key ] ) { // Check if there is a default set for this, if so use that rather than TO link. if ( params[ 'custom_' + key ] && '' !== params[ 'custom_' + key ] ) { socialLinksArray.custom[ key ] = params[ 'custom_' + key ]; } else { socialLinksArray.custom[ key ] = params.social_media_icons_url[ key ]; } } } ); } } return socialLinksArray; }, // WIP: If padding (combined all 4) is not set in params, then use individual variables. fusionGetPadding: function( values ) { values.padding_top = 'undefined' !== typeof values.padding_top ? _.fusionGetValueWithUnit( values.padding_top ) : '0px'; values.padding_right = 'undefined' !== typeof values.padding_right ? _.fusionGetValueWithUnit( values.padding_right ) : '0px'; values.padding_bottom = 'undefined' !== typeof values.padding_bottom ? _.fusionGetValueWithUnit( values.padding_bottom ) : '0px'; values.padding_left = 'undefined' !== typeof values.padding_left ? _.fusionGetValueWithUnit( values.padding_left ) : '0px'; values.padding = values.padding_top + ' ' + values.padding_right + ' ' + values.padding_bottom + ' ' + values.padding_left; return values; }, fusionGetMargin: function( values ) { if ( '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } return values; }, fusionAnimations: function( values, attributes, parent ) { var animations = false; if ( values && 'undefined' !== typeof values.animation_type && '' !== values.animation_type ) { animations = _.fusionGetAnimations( { type: values.animation_type, direction: values.animation_direction, speed: values.animation_speed, offset: values.animation_offset } ); attributes = jQuery.extend( attributes, animations ); // Class to mark as editor. if ( 'undefined' === typeof parent || ! parent ) { if ( 'undefined' !== typeof attributes[ 'class' ] ) { attributes[ 'class' ] += ' ' + attributes.animation_class; } else { attributes[ 'class' ] = attributes.animation_class; } } delete attributes.animation_class; } return attributes; }, fusionPagination: function( maxPages, currentPage, range, pagination, globalPagination, globalStartEndRange ) { var paginationCode = '', i, globalStartRange, globalEndRange, start, end; globalStartEndRange = ( 'undefined' !== typeof globalStartEndRange ) ? parseInt( globalStartEndRange, 10 ) : 2; currentPage = ( 'undefined' !== typeof currentPage ) ? parseInt( currentPage, 10 ) : 1; range = parseInt( range, 10 ); maxPages = parseInt( maxPages, 10 ); globalStartRange = globalStartEndRange; globalEndRange = globalStartEndRange; if ( 1 !== maxPages ) { if ( ( 'pagination' !== pagination && 'pagination' !== globalPagination.toLowerCase() ) ) { paginationCode += '<div class="fusion-infinite-scroll-trigger"></div>'; paginationCode += '<div class="pagination infinite-scroll clearfix">'; } else { paginationCode += '<div class="pagination clearfix">'; } start = currentPage - range; end = currentPage + range; if ( 0 >= start ) { start = ( 0 < currentPage - 1 ) ? currentPage - 1 : 1; } if ( maxPages < end ) { end = maxPages; } if ( 'pagination' === pagination ) { if ( 1 < currentPage ) { paginationCode += '<a class="pagination-prev" href="#"><span class="page-prev"></span><span class="page-text">Previous</span></a>'; if ( 0 < globalStartRange ) { if ( globalStartRange >= start ) { globalStartRange = start - 1; } for ( i = 1; i <= globalStartRange; i++ ) { paginationCode += '<a href="#" class="inactive">' + i + '</a>'; } if ( 0 < globalStartRange && globalStartRange < start - 1 ) { paginationCode += '<span class="pagination-dots paginations-dots-start">···</span>'; } } } for ( i = start; i <= end; i++ ) { if ( currentPage == i ) { paginationCode += '<span class="current">' + i + '</span>'; } else { paginationCode += '<a href="#" class="inactive">' + i + '</a>'; } } if ( currentPage < maxPages ) { if ( 0 < globalEndRange ) { if ( maxPages - globalEndRange <= end ) { globalEndRange = maxPages - end; } globalEndRange--; if ( end + 1 < maxPages - globalEndRange ) { paginationCode += '<span class="pagination-dots paginations-dots-end">···</span>'; } for ( i = maxPages - globalEndRange; i <= maxPages; i++ ) { paginationCode += '<a href="#" class="inactive">' + i + '</a>'; } } paginationCode += '<a class="pagination-next" href="#"><span class="page-text">Next</span><span class="page-next"></span></a>'; } } paginationCode += '</div>'; paginationCode += '<div class="fusion-clearfix"></div>'; } return paginationCode; }, fusionInlineEditor: function( args, attributes ) { var defaults = { cid: false, param: 'element_content', encoding: false, 'disable-return': false, 'disable-extra-spaces': false, toolbar: 'full', overrides: false }, config = _.extend( defaults, args ), view = FusionPageBuilderViewManager.getView( config.cid ); // If cid is not a number then this is a nested render and do not use live editor. if ( 'number' !== typeof config.cid ) { return attributes; } attributes[ 'data-inline-parent-cid' ] = config.cid; // Class to mark as editor. if ( 'undefined' !== typeof attributes[ 'class' ] ) { attributes[ 'class' ] += ' fusion-live-editable'; } else { attributes[ 'class' ] = 'fusion-live-editable'; } if ( config[ 'disable-return' ] ) { attributes[ 'data-disable-return' ] = 'true'; } if ( config[ 'disable-extra-spaces' ] ) { attributes[ 'data-disable-extra-spaces' ] = 'true'; } if ( config.encoding ) { attributes[ 'data-encoding' ] = 'true'; } if ( 'object' === typeof config.overrides ) { _.each( config.overrides, function( elementParam, inlineParam ) { attributes[ 'data-inline-override-' + inlineParam ] = elementParam; } ); } attributes[ 'data-toolbar' ] = config.toolbar.toString(); attributes[ 'data-param' ] = config.param; if ( 'object' === typeof view && 'object' === typeof view.dynamicParams ) { if ( view.dynamicParams.hasDynamicParam( config.param ) ) { attributes[ 'data-dynamic-content-overriding' ] = 'true'; } } return attributes; }, /** * JS copy of fusion_section_deprecated_args. * Maps the dprecated container args. * * @since 2.0.0 * @param {Object} args - The parameters. * @return {Object} */ fusionContainerMapDeprecatedArgs: function( args ) { var paramMapping = { backgroundposition: 'background_position', backgroundattachment: 'background_parallax', background_attachment: 'background_parallax', bordersize: 'border_size', bordercolor: 'border_color', borderstyle: 'border_style', paddingtop: 'padding_top', paddingbottom: 'padding_bottom', paddingleft: 'padding_left', paddingright: 'padding_right', backgroundcolor: 'background_color', backgroundimage: 'background_image', backgroundrepeat: 'background_repeat', paddingBottom: 'padding_bottom', paddingTop: 'padding_top' }; if ( ( 'undefined' !== typeof args.backgroundattachment && 'scroll' === args.backgroundattachment ) || ( 'undefined' !== typeof args.background_attachment && 'scroll' === args.background_attachment ) ) { args.backgroundattachment = 'none'; args.background_attachment = 'none'; } _.each( paramMapping, function( newName, oldName ) { if ( 'undefined' === typeof args[ newName ] && 'undefined' !== typeof args[ oldName ] ) { args[ newName ] = args[ oldName ]; delete args[ oldName ]; } } ); return args; }, /** * Replaces double line-breaks with paragraph elements. * * JS version of the wpautop() PHP function and based on the portation * for the Gutenberg block editor. * * @since 2.0.0 * @param {string} text The text which has to be formatted. * @param {boolean} br Optional. If set, will convert all remaining line- * breaks after paragraphing. Default true. * @return {string} Text which has been converted into paragraph tags. */ autop: function( text, br ) { var preTags = [], textParts, lastText, i, textPart, start, name, allBlocks, texts; if ( 'string' !== typeof text || '' === text.trim() ) { return ''; } br = ( 'undefined' === typeof br ) ? true : br; // Just to make things a little easier, pad the end. text = text + '\n'; /* * Pre tags shouldn't be touched by autop. * Replace pre tags with placeholders and bring them back after autop. */ if ( -1 !== text.indexOf( '<pre' ) ) { textParts = text.split( '</pre>' ); lastText = textParts.pop(); text = ''; for ( i = 0; i < textParts.length; i++ ) { textPart = textParts[ i ]; start = textPart.indexOf( '<pre' ); // Malformed html? if ( -1 === start ) { text += textPart; continue; } name = '<pre wp-pre-tag-' + i + '></pre>'; preTags.push( [ name, textPart.substr( start ) + '</pre>' ] ); text += textPart.substr( 0, start ) + name; } text += lastText; } // Change multiple <br>s into two line breaks, which will turn into paragraphs. text = text.replace( /<br\s*\/?>\s*<br\s*\/?>/g, '\n\n' ); allBlocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; // Add a double line break above block-level opening tags. text = text.replace( new RegExp( '(<' + allBlocks + '[\\s\/>])', 'g' ), '\n\n$1' ); // Add a double line break below block-level closing tags. text = text.replace( new RegExp( '(<\/' + allBlocks + '>)', 'g' ), '$1\n\n' ); // Standardize newline characters to "\n". text = text.replace( /\r\n|\r/g, '\n' ); // Find newlines in all elements and add placeholders. text = this.replaceInHtmlTags( text, { '\n': ' <!-- wpnl --> ' } ); // Collapse line breaks before and after <option> elements so they don't get autop'd. if ( -1 !== text.indexOf( '<option' ) ) { text = text.replace( /\s*<option/g, '<option' ); text = text.replace( /<\/option>\s*/g, '</option>' ); } /* * Collapse line breaks inside <object> elements, before <param> and <embed> elements * so they don't get autop'd. */ if ( -1 !== text.indexOf( '</object>' ) ) { text = text.replace( /(<object[^>]*>)\s*/g, '$1' ); text = text.replace( /\s*<\/object>/g, '</object>' ); text = text.replace( /\s*(<\/?(?:param|embed)[^>]*>)\s*/g, '$1' ); } /* * Collapse line breaks inside <audio> and <video> elements, * before and after <source> and <track> elements. */ if ( -1 !== text.indexOf( '<source' ) || -1 !== text.indexOf( '<track' ) ) { text = text.replace( /([<\[](?:audio|video)[^>\]]*[>\]])\s*/g, '$1' ); text = text.replace( /\s*([<\[]\/(?:audio|video)[>\]])/g, '$1' ); text = text.replace( /\s*(<(?:source|track)[^>]*>)\s*/g, '$1' ); } // Collapse line breaks before and after <figcaption> elements. if ( -1 !== text.indexOf( '<figcaption' ) ) { text = text.replace( /\s*(<figcaption[^>]*>)/, '$1' ); text = text.replace( /<\/figcaption>\s*/, '</figcaption>' ); } // Remove more than two contiguous line breaks. text = text.replace( /\n\n+/g, '\n\n' ); // Split up the contents into an array of strings, separated by double line breaks. texts = text.split( /\n\s*\n/ ).filter( Boolean ); // Reset text prior to rebuilding. text = ''; // Rebuild the content as a string, wrapping every bit with a <p>. texts.forEach( function( textPiece ) { text += '<p>' + textPiece.replace( /^\n*|\n*$/g, '' ) + '</p>\n'; } ); // Under certain strange conditions it could create a P of entirely whitespace. text = text.replace( /<p>\s*<\/p>/g, '' ); // Add a closing <p> inside <div>, <address>, or <form> tag if missing. text = text.replace( /<p>([^<]+)<\/(div|address|form)>/g, '<p>$1</p></$2>' ); // If an opening or closing block element tag is wrapped in a <p>, unwrap it. text = text.replace( new RegExp( '<p>\\s*(<\/?' + allBlocks + '[^>]*>)\\s*<\/p>', 'g' ), '$1' ); // In some cases <li> may get wrapped in <p>, fix them. text = text.replace( /<p>(<li.+?)<\/p>/g, '$1' ); // If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>. text = text.replace( /<p><blockquote([^>]*)>/gi, '<blockquote$1><p>' ); text = text.replace( /<\/blockquote><\/p>/g, '</p></blockquote>' ); // If an opening or closing block element tag is preceded by an opening <p> tag, remove it. text = text.replace( new RegExp( '<p>\\s*(<\/?' + allBlocks + '[^>]*>)', 'g' ), '$1' ); // If an opening or closing block element tag is followed by a closing <p> tag, remove it. text = text.replace( new RegExp( '(<\/?' + allBlocks + '[^>]*>)\\s*<\/p>', 'g' ), '$1' ); // Optionally insert line breaks. if ( br ) { // Replace newlines that shouldn't be touched with a placeholder. text = text.replace( /<(script|style).*?<\/\\1>/g, function( match ) { return match[ 0 ].replace( /\n/g, '<WPPreserveNewline />' ); } ); // Normalize <br> text = text.replace( /<br>|<br\/>/g, '<br />' ); // Replace any new line characters that aren't preceded by a <br /> with a <br />. text = text.replace( /(<br \/>)?\s*\n/g, function( a, b ) { return b ? a : '<br />\n'; } ); // Replace newline placeholders with newlines. text = text.replace( /<WPPreserveNewline \/>/g, '\n' ); } // If a <br /> tag is after an opening or closing block tag, remove it. text = text.replace( new RegExp( '(<\/?' + allBlocks + '[^>]*>)\\s*<br \/>', 'g' ), '$1' ); // If a <br /> tag is before a subset of opening or closing block tags, remove it. text = text.replace( /<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/g, '$1' ); text = text.replace( /\n<\/p>$/g, '</p>' ); // Replace placeholder <pre> tags with their original content. if ( Object.keys( preTags ).length ) { text = text.replace( new RegExp( Object.keys( preTags ).join( '|' ), 'gi' ), function( matched ) { return preTags[ matched ]; } ); } // Restore newlines in all elements. if ( -1 !== text.indexOf( '<!-- wpnl -->' ) ) { text = text.replace( /\s?<!-- wpnl -->\s?/g, '\n' ); } return text; }, /** * Separate HTML elements and comments from the text. * * JS version of the html_split() PHP function and based on the portation * for the Gutenberg block editor. * * @since 2.0 * @param {string} input The text which has to be formatted. * @return {Array} The formatted text. */ htmlSplit: function( input ) { var parts = [], workingInput = input, match, htmlSplitRegex = ( function() { /* eslint-disable no-multi-spaces */ var comments = '!' + // Start of comment, after the <. '(?:' + // Unroll the loop: Consume everything until --> is found. '-(?!->)' + // Dash not followed by end of comment. '[^\\-]*' + // Consume non-dashes. ')*' + // Loop possessively. '(?:-->)?', // End of comment. If not found, match all input. cdata = '!\\[CDATA\\[' + // Start of comment, after the <. '[^\\]]*' + // Consume non-]. '(?:' + // Unroll the loop: Consume everything until ]]> is found. '](?!]>)' + // One ] not followed by end of comment. '[^\\]]*' + // Consume non-]. ')*?' + // Loop possessively. '(?:]]>)?', // End of comment. If not found, match all input. escaped = '(?=' + // Is the element escaped? '!--' + '|' + '!\\[CDATA\\[' + ')' + '((?=!-)' + // If yes, which type? comments + '|' + cdata + ')', regex = '(' + // Capture the entire match. '<' + // Find start of element. '(' + // Conditional expression follows. escaped + // Find end of escaped element. '|' + // ... else ... '[^>]*>?' + // Find end of normal element. ')' + ')'; return new RegExp( regex ); /* eslint-enable no-multi-spaces */ }() ); while ( ( match = workingInput.match( htmlSplitRegex ) ) ) { parts.push( workingInput.slice( 0, match.index ) ); parts.push( match[ 0 ] ); workingInput = workingInput.slice( match.index + match[ 0 ].length ); } if ( workingInput.length ) { parts.push( workingInput ); } return parts; }, /** * Replace characters or phrases within HTML elements only. * * JS version of the replace_html_tags() PHP function and based on the portation * for the Gutenberg block editor. * * @since 2.0 * @param {string} haystack The text which has to be formatted. * @param {Object} replacePairs In the form {from: 'to', ...}. * @return {string} The formatted text. */ replaceInHtmlTags: function( haystack, replacePairs ) { // Find all elements. var textArr = this.htmlSplit( haystack ), changed = false, needles = Object.keys( replacePairs ), // Extract all needles. i, j, needle; // Loop through delimiters (elements) only. for ( i = 1; i < textArr.length; i += 2 ) { for ( j = 0; j < needles.length; j++ ) { needle = needles[ j ]; if ( -1 !== textArr[ i ].indexOf( needle ) ) { textArr[ i ] = textArr[ i ].replace( new RegExp( needle, 'g' ), replacePairs[ needle ] ); changed = true; // After one strtr() break out of the foreach loop and look at next element. break; } } } if ( changed ) { haystack = textArr.join( '' ); } return haystack; }, /** * Generates filter CSS. * * @since 2.1 * @param {Object} values - The values. * @return {String} */ fusionGetFilterStyle: function( values, state ) { var filters = { filter_hue: { property: 'hue-rotate', unit: 'deg', default: '0' }, filter_saturation: { property: 'saturate', unit: '%', default: '100' }, filter_brightness: { property: 'brightness', unit: '%', default: '100' }, filter_contrast: { property: 'contrast', unit: '%', default: '100' }, filter_invert: { property: 'invert', unit: '%', default: '0' }, filter_sepia: { property: 'sepia', unit: '%', default: '0' }, filter_opacity: { property: 'opacity', unit: '%', default: '100' }, filter_blur: { property: 'blur', unit: 'px', default: '0' } }, stateSuffix = 'regular' === state ? '' : '_hover', otherStateSuffix = 'regular' === state ? '_hover' : '', filter_id_state = '', filter_id_other = '', filter_style = ''; _.each( filters, function( filter, filter_id ) { filter_id_state = filter_id + stateSuffix; filter_id_other = filter_id + otherStateSuffix; if ( filter[ 'default' ] !== values[ filter_id_state ] || filter[ 'default' ] !== values[ filter_id_other ] ) { filter_style += filter.property + '(' + values[ filter_id_state ] + filter.unit + ') '; } } ); return filter_style.trim(); }, /** * Generates filter style element. * * @since 2.1 * @param {Object} values - The values. * @param {string|object} selector - Element selector. * @param {integer} cid - Element cid. * @return {String} */ fusionGetFilterStyleElem: function( values, selector, cid ) { var filter_style = '', filter_style_hover = '', regularSelector = 'body:not(.fusion-builder-ui-wireframe):not(.fusion-disable-element-filters) ', hoverSelector = 'body:not(.fusion-builder-ui-wireframe):not(.fusion-disable-element-filters) '; if ( 'object' === typeof selector ) { regularSelector += selector.regular; hoverSelector += selector.hover; } else { regularSelector += selector; hoverSelector += selector + ':hover'; } // Get filter CSS. filter_style = this.fusionGetFilterStyle( values, 'regular' ); if ( '' !== filter_style ) { filter_style = regularSelector + '{filter: ' + filter_style + ';}'; } filter_style_hover = this.fusionGetFilterStyle( values, 'hover' ); if ( '' !== filter_style_hover ) { // Add transition. filter_style = filter_style.replace( '}', 'transition: filter 0.3s ease-in-out;}' ); // Hover state. filter_style += hoverSelector + '{filter: ' + filter_style_hover + ';}'; } // We need empty style element as well. return '<style id="fusion-filter-' + cid + '-style">' + filter_style + '</style>'; }, /** * Generates gradient string for provided options. * * @since 2.1 * @param {Object} values - Element params. * @param {string} type - Required gradient string type. * @return {string} - Generated string. */ getGradientString: function( values, type ) { var gradientString = '', alphaGradientStartColor = jQuery.AWB_Color( values.gradient_start_color ).alpha(), alphaGradientEndColor = jQuery.AWB_Color( values.gradient_end_color ).alpha(), isGradientColor = ( ! _.isEmpty( values.gradient_start_color ) && 0 !== alphaGradientStartColor ) || ( ! _.isEmpty( values.gradient_end_color ) && 0 !== alphaGradientEndColor ) ? true : false; if ( isGradientColor ) { if ( 'linear' === values.gradient_type ) { gradientString += 'linear-gradient(' + values.linear_angle + 'deg,'; } else if ( 'radial' === values.gradient_type ) { gradientString += 'radial-gradient(circle at ' + values.radial_direction + ', '; } gradientString += values.gradient_start_color + ' ' + values.gradient_start_position + '%,'; gradientString += values.gradient_end_color + ' ' + values.gradient_end_position + '%)'; switch ( type ) { case 'main_bg': case 'parallax': if ( '' !== values.background_image && 'yes' !== values.fade ) { gradientString += ',url(\'' + values.background_image + '\')'; } break; case 'fade': case 'column': if ( '' !== values.background_image ) { gradientString += ',url(\'' + values.background_image + '\')'; } break; } } return gradientString; }, /** * Generates gradient string for provided options. * * @since 2.1 * @param {Object} values - Element params. * @return {string} - Generated string. */ getGradientFontString: function( values ) { var gradientString = '', gradientStart = 'string' === typeof values.gradient_start_color && '' !== values.gradient_start_color ? values.gradient_start_color : 'rgba(255,255,255,0)', gradientEnd = 'string' === typeof values.gradient_end_color && '' !== values.gradient_end_color ? values.gradient_end_color : 'rgba(255,255,255,0)', alphaGradientStartColor = jQuery.AWB_Color( gradientStart ).alpha(), alphaGradientEndColor = jQuery.AWB_Color( gradientEnd ).alpha(), isGradientColor = 0 !== alphaGradientStartColor || 0 !== alphaGradientEndColor; if ( isGradientColor ) { gradientString += 'background-color:' + gradientStart + ';'; // Check for type and set accordingly. gradientString += 'background-image:'; if ( 'linear' === values.gradient_type ) { gradientString += 'linear-gradient(' + values.linear_angle + 'deg, '; } else if ( 'radial' === values.gradient_type ) { gradientString += 'radial-gradient(circle at ' + values.radial_direction + ', '; } gradientString += gradientStart + ' ' + values.gradient_start_position + '%,'; gradientString += gradientEnd + ' ' + values.gradient_end_position + '%);'; } return gradientString; }, /** * Generates box-shadow style for provided options. * * @since 2.1 * @param {Object} values - The values. * @return {string} - The generated CSS. */ fusionGetBoxShadowStyle: function( values ) { var style = ''; style += _.fusionGetValueWithUnit( values.box_shadow_horizontal ); style += ' ' + _.fusionGetValueWithUnit( values.box_shadow_vertical ); style += ' ' + _.fusionGetValueWithUnit( values.box_shadow_blur ); style += ' ' + _.fusionGetValueWithUnit( values.box_shadow_spread ); style += ' ' + values.box_shadow_color; if ( 'undefined' !== typeof values.box_shadow_style && '' !== values.box_shadow_style ) { style += ' ' + values.box_shadow_style; } style += ';'; return style; }, /** * Generates text-shadow style for provided options. * * @since 2.1 * @param {Object} values - The values. * @return {string} - The generated CSS. */ fusionGetTextShadowStyle: function( values ) { var style = ''; style += _.fusionGetValueWithUnit( values.text_shadow_horizontal ); style += ' ' + _.fusionGetValueWithUnit( values.text_shadow_vertical ); style += ' ' + _.fusionGetValueWithUnit( values.text_shadow_blur ); style += ' ' + values.text_shadow_color; return style; }, /** * Get font family styling. * * @since 2.1 * @param {string} param_id - Param ID. * @param {Object} values - The values. * @param {string} format - Format of returned value, string or object. * @return {mixed} - The generated styling. */ fusionGetFontStyle: function( param_id, values, format = 'string' ) { var style = {}, style_str = '', weight = ''; if ( 'string' === typeof values[ 'fusion_font_family_' + param_id ] && '' !== values[ 'fusion_font_family_' + param_id ] ) { if ( values[ 'fusion_font_family_' + param_id ].includes( 'var(' ) ) { style[ 'font-family' ] = values[ 'fusion_font_family_' + param_id ]; if ( 'object' === typeof window.awbTypographySelect ) { style[ 'font-weight' ] = window.awbTypographySelect.getVarString( values[ 'fusion_font_family_' + param_id ], 'font-weight' ); style[ 'font-style' ] = window.awbTypographySelect.getVarString( values[ 'fusion_font_family_' + param_id ], 'font-style' ); } } else if ( values[ 'fusion_font_family_' + param_id ].includes( '\'' ) || 'inherit' === values[ 'fusion_font_family_' + param_id ] ) { style[ 'font-family' ] = values[ 'fusion_font_family_' + param_id ]; } else { style[ 'font-family' ] = '\'' + values[ 'fusion_font_family_' + param_id ] + '\''; } if ( 'string' === typeof values[ 'fusion_font_variant_' + param_id ] && '' !== values[ 'fusion_font_variant_' + param_id ] && 'undefined' === typeof style[ 'font-weight' ] ) { weight = values[ 'fusion_font_variant_' + param_id ].replace( 'italic', '' ); if ( weight !== values[ 'fusion_font_variant_' + param_id ] ) { style[ 'font-style' ] = 'italic'; } if ( '' !== weight ) { style[ 'font-weight' ] = weight; } } } if ( 'string' === format ) { jQuery.each( style, function( key, value ) { style_str += key + ':' + value + ';'; } ); return style_str; } return style; }, /** * Checks if valid JSON or not. * * @since 3.0 * @param {String} value - The value to check. * @return {Bolean} */ FusionIsValidJSON: function( value ) { try { JSON.parse( value ); } catch ( e ) { return false; } return true; }, /** * Returns sticky class string. * * @since 3.0 * @param {String} value - The value to check. * @return {String} */ fusionGetStickyClass: function( value ) { return '' !== value && ! value.includes( ',' ) ? ' fusion-display-' + value + '-only' : ''; }, /** * Link attributes. * * @since 3.3 * @param {Object} attr - Element attributes. * @param {Object} values - Element values. * @return {Object} */ fusionLinkAttributes: function( attr, values ) { var linkAttributes; if ( 'undefined' !== typeof values.link_attributes && '' !== values.link_attributes ) { linkAttributes = values.link_attributes.split( ' ' ); _.each( linkAttributes, function( linkAttribute ) { var attributeKeyValue = linkAttribute.split( '=' ); if ( ! _.isUndefined( attributeKeyValue[ 0 ] ) ) { if ( ! _.isUndefined( attributeKeyValue[ 1 ] ) ) { attributeKeyValue[ 1 ] = attributeKeyValue[ 1 ].trim().replace( /{/g, '[' ).replace( /}/g, ']' ).replace( /'/g, '' ).trim(); if ( 'rel' === attributeKeyValue[ 0 ] ) { attr.rel += ' ' + attributeKeyValue[ 1 ]; } else if ( 'string' === typeof attr[ attributeKeyValue[ 0 ] ] ) { attr[ attributeKeyValue[ 0 ] ] += ' ' + attributeKeyValue[ 1 ]; } else { attr[ attributeKeyValue[ 0 ] ] = attributeKeyValue[ 1 ]; } } else { attr[ attributeKeyValue[ 0 ] ] = 'valueless_attribute'; } } } ); } return attr; }, fusionSanitize: function( str ) { var map = { 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ý': 'Y', 'ß': 's', 'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ý': 'y', 'ÿ': 'y', 'Ā': 'A', 'ā': 'a', 'Ă': 'A', 'ă': 'a', 'Ą': 'A', 'ą': 'a', 'Ć': 'C', 'ć': 'c', 'Ĉ': 'C', 'ĉ': 'c', 'Ċ': 'C', 'ċ': 'c', 'Č': 'C', 'č': 'c', 'Ď': 'D', 'ď': 'd', 'Đ': 'D', 'đ': 'd', 'Ē': 'E', 'ē': 'e', 'Ĕ': 'E', 'ĕ': 'e', 'Ė': 'E', 'ė': 'e', 'Ę': 'E', 'ę': 'e', 'Ě': 'E', 'ě': 'e', 'Ĝ': 'G', 'ĝ': 'g', 'Ğ': 'G', 'ğ': 'g', 'Ġ': 'G', 'ġ': 'g', 'Ģ': 'G', 'ģ': 'g', 'Ĥ': 'H', 'ĥ': 'h', 'Ħ': 'H', 'ħ': 'h', 'Ĩ': 'I', 'ĩ': 'i', 'Ī': 'I', 'ī': 'i', 'Ĭ': 'I', 'ĭ': 'i', 'Į': 'I', 'į': 'i', 'İ': 'I', 'ı': 'i', 'IJ': 'IJ', 'ij': 'ij', 'Ĵ': 'J', 'ĵ': 'j', 'Ķ': 'K', 'ķ': 'k', 'Ĺ': 'L', 'ĺ': 'l', 'Ļ': 'L', 'ļ': 'l', 'Ľ': 'L', 'ľ': 'l', 'Ŀ': 'L', 'ŀ': 'l', 'Ł': 'l', 'ł': 'l', 'Ń': 'N', 'ń': 'n', 'Ņ': 'N', 'ņ': 'n', 'Ň': 'N', 'ň': 'n', 'ʼn': 'n', 'Ō': 'O', 'ō': 'o', 'Ŏ': 'O', 'ŏ': 'o', 'Ő': 'O', 'ő': 'o', 'Œ': 'OE', 'œ': 'oe', 'Ŕ': 'R', 'ŕ': 'r', 'Ŗ': 'R', 'ŗ': 'r', 'Ř': 'R', 'ř': 'r', 'Ś': 'S', 'ś': 's', 'Ŝ': 'S', 'ŝ': 's', 'Ş': 'S', 'ş': 's', 'Š': 'S', 'š': 's', 'Ţ': 'T', 'ţ': 't', 'Ť': 'T', 'ť': 't', 'Ŧ': 'T', 'ŧ': 't', 'Ũ': 'U', 'ũ': 'u', 'Ū': 'U', 'ū': 'u', 'Ŭ': 'U', 'ŭ': 'u', 'Ů': 'U', 'ů': 'u', 'Ű': 'U', 'ű': 'u', 'Ų': 'U', 'ų': 'u', 'Ŵ': 'W', 'ŵ': 'w', 'Ŷ': 'Y', 'ŷ': 'y', 'Ÿ': 'Y', 'Ź': 'Z', 'ź': 'z', 'Ż': 'Z', 'ż': 'z', 'Ž': 'Z', 'ž': 'z', 'ſ': 's', 'ƒ': 'f', 'Ơ': 'O', 'ơ': 'o', 'Ư': 'U', 'ư': 'u', 'Ǎ': 'A', 'ǎ': 'a', 'Ǐ': 'I', 'ǐ': 'i', 'Ǒ': 'O', 'ǒ': 'o', 'Ǔ': 'U', 'ǔ': 'u', 'Ǖ': 'U', 'ǖ': 'u', 'Ǘ': 'U', 'ǘ': 'u', 'Ǚ': 'U', 'ǚ': 'u', 'Ǜ': 'U', 'ǜ': 'u', 'Ǻ': 'A', 'ǻ': 'a', 'Ǽ': 'AE', 'ǽ': 'ae', 'Ǿ': 'O', 'ǿ': 'o', 'α': 'a', 'Α': 'A', 'β': 'v', 'Β': 'V', 'γ': 'g', 'Γ': 'G', 'δ': 'd', 'Δ': 'D', 'ε': 'e', 'Ε': 'E', 'ζ': 'z', 'Ζ': 'Z', 'η': 'i', 'Η': 'I', 'θ': 'th', 'Θ': 'TH', 'ι': 'i', 'Ι': 'I', 'κ': 'k', 'Κ': 'K', 'λ': 'l', 'Λ': 'L', 'μ': 'm', 'Μ': 'M', 'ν': 'n', 'Ν': 'N', 'ξ': 'ks', 'Ξ': 'KS', 'ο': 'o', 'Ο': 'O', 'π': 'p', 'Π': 'P', 'ρ': 'r', 'Ρ': 'R', 'σ': 's', 'Σ': 'S', 'ς': 's', 'τ': 't', 'Τ': 'T', 'υ': 'y', 'Υ': 'Y', 'φ': 'f', 'Φ': 'F', 'χ': 'x', 'Χ': 'X', 'ψ': 'ps', 'Ψ': 'PS', 'ω': 'o', 'Ω': 'O', ' ': '_', '\'': '', '?': '', '/': '', '\\': '', '.': '', ',': '', '`': '', '>': '', '<': '', '"': '', '[': '', ']': '', '|': '', '{': '', '}': '', '(': '', ')': '' }, nonWord = /\W/g, mapping = function ( c ) { return ( map[ c ] !== undefined ) ? map[ c ] : c; }; return str.replace( nonWord, mapping ).toLowerCase(); } } ); ;/* global MediumEditor, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.InlineEditorHelpers = Backbone.Model.extend( { initialize: function() { this._reRenderElement = _.debounce( _.bind( this.reRenderElement, this ), 300 ); this._logChangeEvent = _.debounce( _.bind( this.logChangeEvent, this ), 500 ); this.initialValue = null; }, logChangeEvent: function( param, value, tempModel, paramName ) { var label = paramName, state = { type: 'param', param: param, newValue: value, cid: tempModel.parentView.model.get( 'cid' ) }, elementMap = window.fusionAllElements[ tempModel.get( 'element_type' ) ], paramTitle = 'object' === typeof elementMap.params[ label ] ? elementMap.params[ label ].heading : param; state.oldValue = this.initialValue; this.initialValue = null; window.FusionEvents.trigger( 'fusion-history-save-step', window.fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + paramTitle, state ); }, updateInlineShortcode: function( oldShortcode, newShortcode, tempModel, paramName ) { var oldContent = tempModel.parentView.model.attributes.params.element_content, newContent = oldContent.replace( oldShortcode, newShortcode ); tempModel.parentView.model.attributes.params.element_content = newContent; tempModel.set( 'inlineElement', newShortcode ); if ( null === this.initialValue ) { this.initialValue = oldContent; } this._logChangeEvent( 'element_content', newContent, tempModel, paramName ); }, processInlineElement: function( model, paramName ) { var newViewOutput, tooltipElements = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( model.parentView.$el ).find( '[data-id="' + model.get( 'cid' ) + '"]' ).find( '[data-toggle="tooltip"]' ); if ( tooltipElements.length ) { tooltipElements.tooltip( 'destroy' ); } // Update shortcode this.updateInlineShortcode( model.get( 'inlineElement' ), FusionPageBuilderApp.generateElementShortcode( model, false, true ), model, paramName ); // Get markup newViewOutput = this.getInlineElementMarkup( model ); // Append html model.parentView.$el.find( '[data-id="' + model.get( 'cid' ) + '"]:not(.fusion-inline-ajax)' ).html( '' ).append( newViewOutput ); // Trigger js jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_text', model.parentView.model.attributes.cid ); }, getInlineElementMarkup: function( model ) { var viewSettings = { model: model }, newView, newViewOutput; if ( 'undefined' !== typeof FusionPageBuilder[ model.get( 'element_type' ) ] ) { newView = new FusionPageBuilder[ model.get( 'element_type' ) ]( viewSettings ); } else { newView = new FusionPageBuilder.ElementView( viewSettings ); } newViewOutput = newView.getTemplate(); return newViewOutput; }, getInlineElementSettings: function( model ) { var viewSettings = { model: model }, modalView = new FusionPageBuilder.ElementSettingsView( viewSettings ); // No need to render if it already is. if ( ! FusionPageBuilderApp.SettingsHelpers.shouldRenderSettings( modalView ) ) { return; } // If we want dialog. if ( 'dialog' === window.FusionApp.preferencesData.editing_mode ) { jQuery( modalView.render().el ).dialog( { title: window.fusionAllElements[ model.get( 'element_type' ) ].name, width: window.FusionApp.dialog.dialogData.width, height: window.FusionApp.dialog.dialogData.height, position: window.FusionApp.dialog.dialogData.position, dialogClass: 'fusion-builder-dialog fusion-builder-settings-dialog', dragStop: function( event, ui ) { window.FusionApp.dialog.saveDialogPosition( ui.offset ); }, resizeStop: function( event, ui ) { window.FusionApp.dialog.saveDialogSize( ui.size ); }, open: function( event ) { var $dialogContent = jQuery( event.target ), $tabMenu = $dialogContent.find( '.fusion-builder-modal-top-container' ); $dialogContent.closest( '.ui-dialog' ).find( '.ui-dialog-titlebar' ).append( $tabMenu ); FusionPageBuilderApp.$el.addClass( 'fusion-builder-no-ui' ); }, dragStart: function( event ) { // Used to close any open drop-downs in TinyMce. jQuery( event.target ).trigger( 'click' ); }, beforeClose: function() { modalView.saveSettings(); window.FusionEvents.trigger( 'fusion-content-changed' ); FusionPageBuilderApp.$el.removeClass( 'fusion-builder-no-ui' ); } } ); } else { // Adding into sidebar view instead. modalView.model.set( 'title', window.fusionAllElements[ model.get( 'element_type' ) ].name ); modalView.model.set( 'display', 'sidebar' ); window.FusionApp.sidebarView.renderElementSettings( modalView ); } }, removeStyle: function( model ) { var $editor, content, param, params = model.parentView.model.get( 'params' ), editorInstance; $editor = model.$target.closest( '.fusion-live-editable' ); model.$target.replaceWith( model.attributes.params.element_content ); editorInstance = FusionPageBuilderApp.inlineEditors.getEditor( $editor.data( 'medium-editor-editor-index' ) ); if ( 'undefined' !== typeof editorInstance ) { content = editorInstance.getContent(); } else { content = $editor.html(); } param = $editor.data( 'param' ), // Fix for inline font family style. content = content.replace( /"/g, '\'' ); // Adds in any inline shortcodes. content = FusionPageBuilderApp.htmlToShortcode( content, model.parentView.model.get( 'cid' ) ); params[ param ] = content; model.parentView.model.set( 'params', params ); }, /** * Init the Medium Editor for elements that can be live-edited. * * @since 2.0.0 * @return {void} */ liveEditor: function( view ) { var liveElements = view.$el.find( '.fusion-live-editable:not([data-medium-editor-element="true"])' ); if ( liveElements.length ) { liveElements.each( function() { FusionPageBuilderApp.inlineEditors.addEditorInstance( jQuery( this ), view ); } ); } }, /** * Destroys each instance of live editor. * * @since 2.0.0 * @return {void} */ removeLiveEditors: function( view ) { var liveElements = view.$el.find( '[data-medium-editor-element="true"]' ), viewEditors = view.model.get( 'inlineEditors' ); // First remove IDs stored on view. if ( 'undefined' !== typeof viewEditors && viewEditors.length ) { _.each( viewEditors, function( inlineEditor ) { FusionPageBuilderApp.inlineEditors.destroyEditor( inlineEditor ); } ); } // Check if there are still more IDs in DOM. if ( liveElements.length ) { liveElements.each( function() { FusionPageBuilderApp.inlineEditors.destroyEditor( jQuery( this ).data( 'medium-editor-editor-index' ) ); } ); } view.model.set( 'inlineEditors', [] ); }, liveEditorEvent: function( view ) { var self = this, $editors = view.$el.find( '.fusion-live-editable' ); // Remove any we already have, to prevent duplicates. self.removeLiveEditors( view ); if ( true === view.model.get( 'inline_editor' ) && view.$el ) { if ( 1 === $editors.length && view.autoSelectEditor ) { FusionPageBuilderApp.inlineEditors.addEditorInstance( $editors, view, true ); } else { $editors.on( 'mouseenter.inline-editor', function() { self.liveEditor( view ); } ); } view.autoSelectEditor = false; } }, getInlineHTML: function( content, id ) { var $newContent; if ( '' === content || 'undefined' === typeof content ) { return ''; } try { $newContent = jQuery( content ); } catch ( error ) { console.log( error ); // jshint ignore:line return content; } // If no length, meaning no wrapping tag in this case then we wrap. if ( 0 === $newContent.length ) { $newContent = jQuery( '<span />' ).html( content ); } else if ( 1 < $newContent.length ) { $newContent = jQuery( '<div />' ).html( content ); } $newContent.addClass( 'fusion-disable-editing fusion-inline-ajax' ).attr( 'contenteditable', 'false' ).attr( 'data-id', id ); // Span is added for content which is just a string and used as a selector #2609. return $newContent[ 0 ].outerHTML; }, /** * Checks whether the inline editor is enabled. * * @since 2.0.0 * @param {string} shortcodeTag - Shortcode tag. * @return {boolean} */ inlineEditorAllowed: function( shortcodeTag ) { var inlineEditor = 'undefined' !== typeof window.fusionAllElements[ shortcodeTag ] && 'undefined' !== typeof window.fusionAllElements[ shortcodeTag ].inline_editor ? window.fusionAllElements[ shortcodeTag ].inline_editor : false; return inlineEditor; }, /** * Used to update model param if exists as override. * * @since 2.0.0 * @param {string} cid - The element cid. * @param {string} param - The parameter name. * @param {string} value - The new parameter value. * @param {boolean} debounced - To debounce update or not. * @return {void} */ updateParentElementParam: function( cid, param, value, debounced ) { var view = window.FusionPageBuilderViewManager.getView( cid ), params = 'undefined' !== typeof view ? view.model.get( 'params' ) : false; debounced = 'undefined' !== typeof debounced ? debounced : false; if ( 'undefined' === typeof cid || 'undefined' === typeof param || 'undefined' === typeof value || ! params ) { return false; } if ( ! param ) { return false; } if ( value === params[ param ] ) { return true; } view.activeInlineEditing = true; if ( debounced ) { this._reRenderElement( view, param, value ); } else { this.reRenderElement( view, param, value ); } return true; }, reRenderElement: function( view, param, value ) { var reRender = true; if ( view ) { reRender = view.updateParam( param, value ); if ( reRender ) { view.reRender(); } } }, setOverrideParams: function( control, option ) { var selectionHtml = MediumEditor.selection.getSelectionHtml( control.document ), el = MediumEditor.selection.getSelectionElement( control.document ), innerHTML = el ? el.innerHTML.trim() : '', overrideObject = {}; // Default for not full content or overwritable. control.parentCid = false; control.override = false; // Element has not override for option. if ( ! el || ! el.classList.contains( 'fusion-live-editable' ) ) { return; } if ( 'string' === typeof option ) { // Selection is not full. if ( ! el.getAttribute( 'data-inline-override-' + option ) || ( selectionHtml.trim() !== innerHTML && jQuery( '<div>' + selectionHtml + '</div>' ).text().trim() !== jQuery( '<div>' + innerHTML + '</div>' ).text().trim() ) ) { return; } control.override = el.getAttribute( 'data-inline-override-' + option ); control.parentCid = el.getAttribute( 'data-inline-parent-cid' ); } else if ( 'object' == typeof option ) { _.each( option, function( scopedOption ) { if ( ! el.getAttribute( 'data-inline-override-' + scopedOption ) || ( selectionHtml.trim() !== innerHTML && jQuery( '<div>' + selectionHtml + '</div>' ).text().trim() !== jQuery( '<div>' + innerHTML + '</div>' ).text().trim() ) ) { overrideObject[ scopedOption ] = false; } else { overrideObject[ scopedOption ] = el.getAttribute( 'data-inline-override-' + scopedOption ); control.parentCid = el.getAttribute( 'data-inline-parent-cid' ); } control.override = overrideObject; } ); } } } ); }( jQuery ) ); ;/* global fusionOptionName, FusionApp, FusionPageBuilderElements, fusionAppConfig, FusionPageBuilderApp, FusionPageBuilderViewManager */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { _.extend( FusionPageBuilder.Callback.prototype, { fusion_preview: function( name, value, args, view ) { var property = args.property, element = window.fusionAllElements[ view.model.get( 'element_type' ) ], $theEl; if ( ! args.skip ) { view.changeParam( name, value ); } if ( ! value && '' !== value ) { return; } if ( '' === value && 'undefined' !== typeof element && 'undefined' !== typeof element.defaults && 'undefined' !== typeof element.defaults[ name ] ) { value = element.defaults[ name ]; } if ( 'undefined' !== typeof args.dimension ) { property = ( 'undefined' !== typeof args.property[ name ] ) ? args.property[ name ] : name.replace( /_/g, '-' ); } if ( 'undefined' !== typeof args.unit ) { value = _.fusionGetValueWithUnit( value, args.unit ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); if ( 'string' === typeof property ) { $theEl.css( property, value ); } if ( 'object' === typeof property ) { _.each( args.property, function( singleProperty ) { $theEl.css( singleProperty, value ); } ); } return { render: false }; }, fusion_update_flex_elements: function( name, value, args, view ) { var params = view.model.get( 'params' ), oldValue = 'undefined' !== typeof params.content_layout ? params.content_layout : 'column'; if ( ! args.skip ) { view.changeParam( name, value ); } // If we are switching between flex and block then we need to re-render inline elements. if ( ( 'block' === oldValue && 'block' !== value ) || ( 'block' === value && 'block' !== oldValue ) ) { view.model.children.each( function( child ) { var cid = child.attributes.cid, elementView = FusionPageBuilderViewManager.getView( cid ), elementType; if ( elementView ) { elementType = elementView.model.get( 'element_type' ); if ( 'fusion_title' === elementType || 'fusion_button' === elementType || 'fusion_text' === elementType || 'fusion_imageframe' === elementType ) { elementView.reRender(); } } } ); } // Add attribute to the option. jQuery( '[data-option-id="content_layout"]' ).attr( 'data-direction', value ); return { render: true }; }, fusion_container_padding: function( name, value, args, view ) { if ( 'function' !== typeof view.isFlex || ! view.isFlex() ) { return this.fusion_preview( name, value, args, view ); } if ( ! args.skip ) { view.changeParam( name, value ); } view.setValues(); view.setResponsiveContainerStyles(); view.$el.find( '.fusion-container-responsive-styles' ).first().html( view.responsiveStyles ); return { render: false }; }, fusion_container_margin: function( name, value, args, view ) { return this.fusion_container_padding( name, value, args, view ); }, fusion_column_margin: function( name, value, args, view ) { if ( ! args.skip ) { view.changeParam( name, value ); } if ( view.values.flex ) { view.values = {}; view.setArgs(); view.validateArgs(); view.setExtraArgs(); view.setColumnMapData(); view.setResponsiveColumnStyles(); view.$el.find( '.fusion-column-responsive-styles' ).last().html( view.responsiveStyles ); } else { view.$el.css( name.replace( '_', '-' ), value ); view.values[ name ] = value; } return { render: false }; }, fusion_column_padding: function( name, value, args, view ) { return this.fusion_column_margin( name, value, args, view ); }, fusion_add_id: function( name, value, args, view ) { var $theEl; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); $theEl.attr( 'id', value ); return { render: false }; }, fusion_add_class: function( name, value, args, view ) { var $theEl, existingValue = view.model.attributes.params[ name ]; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); $theEl.removeClass( existingValue ); $theEl.addClass( value ); return { render: false }; }, fusion_toggle_class: function( name, value, args, view ) { var $theEl; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); if ( 'object' === typeof args.classes ) { _.each( args.classes, function( optionClass, optionValue ) { $theEl.removeClass( optionClass ); if ( value === optionValue ) { $theEl.addClass( optionClass ); } } ); } return { render: false }; }, fusion_cart_hide: function( name, value, args, view ) { if ( 'string' !== typeof args.selector ) { return { render: true }; } if ( ! args.skip ) { view.changeParam( name, value ); } if ( 'no' === value ) { view.$el.find( '.fusion-woo-cart' ).addClass( args.selector ); } else { view.$el.find( '.fusion-woo-cart' ).removeClass( args.selector ); } return { render: false }; }, fusion_ajax: function( name, value, modelData, args, cid, action, model, elementView ) { var params = jQuery.extend( true, {}, modelData.params ), ajaxData = {}; if ( 'undefined' !== typeof name && ! args.skip ) { params[ name ] = value; } ajaxData.params = jQuery.extend( true, {}, window.fusionAllElements[ modelData.element_type ].defaults, _.fusionCleanParameters( params ) ); jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: action, model: ajaxData, option_name: 'string' === typeof fusionOptionName ? fusionOptionName : false, fusion_options: 'undefined' !== typeof FusionApp && 'object' === typeof FusionApp.settings ? jQuery.param( FusionApp.settings ) : false, fusion_meta: 'undefined' !== typeof FusionApp && 'object' === typeof FusionApp.data.postMeta ? jQuery.param( FusionApp.data.postMeta ) : false, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ), cid: cid } } ) .done( function( response ) { if ( 'undefined' === typeof model ) { model = FusionPageBuilderElements.find( function( scopedModel ) { return scopedModel.get( 'cid' ) == cid; // jshint ignore: line } ); } // This changes actual model. if ( 'undefined' !== typeof name && ! args.skip ) { elementView.changeParam( name, value ); } if ( 'image_id' === name && 'undefined' !== typeof response.image_data && 'undefined' !== typeof response.image_data.url && ! args.skip ) { elementView.changeParam( 'image', response.image_data.url ); } model.set( 'query_data', response ); if ( 'generated_element' !== model.get( 'type' ) ) { if ( 'undefined' == typeof elementView ) { elementView = FusionPageBuilderViewManager.getView( cid ); } if ( 'undefined' !== typeof elementView && ! args.skip ) { elementView.reRender(); } } } ); }, fusion_do_shortcode: function( cid, content, parent, ajaxShortcodes ) { jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_shortcode_render', content: content, shortcodes: 'undefined' !== typeof ajaxShortcodes ? ajaxShortcodes : '', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, cid: cid, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { var markup = {}, modelcid = cid, model, view; if ( 'undefined' !== typeof parent && parent ) { modelcid = parent; } model = FusionPageBuilderElements.find( function( scopedModel ) { return scopedModel.get( 'cid' ) == modelcid; // jshint ignore: line } ); view = FusionPageBuilderViewManager.getView( modelcid ); markup.output = FusionPageBuilderApp.addPlaceholder( content, response.content ); if ( view && 'function' === typeof view.filterOutput ) { markup.output = view.filterOutput( markup.output ); } markup.shortcode = content; if ( model ) { model.set( 'markup', markup ); } // If multi shortcodes, add each. if ( 'object' === typeof response.shortcodes ) { _.each( response.shortcodes, function( output, shortcode ) { FusionPageBuilderApp.extraShortcodes.addShortcode( shortcode, FusionPageBuilderApp.addPlaceholder( shortcode, output ) ); } ); } if ( 'undefined' !== typeof view ) { view.reRender( 'ajax' ); } if ( FusionPageBuilderApp.viewsToRerender ) { _.each( FusionPageBuilderApp.viewsToRerender, function( scopedCID ) { FusionPageBuilderViewManager.getView( scopedCID ).reRender( 'ajax' ); } ); FusionPageBuilderApp.viewsToRerender = []; } } ); }, fusion_code_mirror: function( name, value, args, view ) { // Save encoded value. if ( ! args.skip ) { view.changeParam( name, value ); } if ( FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( value ) ) === value ) { value = FusionPageBuilderApp.base64Decode( value ); } // Update with decoded value. view.syntaxHighlighter.getDoc().setValue( value ); return { render: false }; }, dynamic_shortcode: function( args ) { if ( 'undefined' === typeof args.shortcode || '' === args.shortcode ) { return ''; } return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_shortcode_render', content: args.shortcode, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, cid: false, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, post_featured_image: function( args ) { var ID = '', postMeta = FusionApp.getDynamicPost( 'post_meta' ), postName = FusionApp.getPost( 'post_type_name' ).toLowerCase(); postMeta._fusion = postMeta._fusion || {}; if ( 'undefined' !== typeof args.type && 'main' !== args.type ) { ID = postMeta._fusion[ 'kd_' + args.type + '_' + postName + '_id' ]; } else { ID = postMeta._thumbnail_id; } if ( 'undefined' === typeof ID || '' === ID ) { return ID; } return wp.media.attachment( ID ).fetch().then( function() { FusionPageBuilderApp.dynamicValues.setValue( args, wp.media.attachment( ID ).get( 'url' ) ); } ); }, fusion_get_object_title: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.getDynamicPost( 'post_title' ) : ''; }, fusion_get_post_id: function() { return 'undefined' !== typeof FusionApp.data ? String( FusionApp.getDynamicPost( 'post_id' ) ) : ''; }, fusion_get_object_excerpt: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.getDynamicPost( 'post_excerpt' ) : ''; }, fusion_get_post_date: function( args ) { if ( 'undefined' === typeof FusionApp.data ) { return ''; } if ( 'undefined' === args.format || '' === args.format ) { return 'undefined' !== typeof args.type && 'modified' === args.type ? FusionApp.getDynamicPost( 'post_modified' ) : FusionApp.getDynamicPost( 'post_date' ); } return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, fusion_get_post_time: function( args ) { if ( 'undefined' === typeof FusionApp.data ) { return ''; } return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, fusion_get_post_terms: function( args ) { if ( 'undefined' === typeof FusionApp.data ) { return ''; } return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, fusion_get_post_custom_field: function( args ) { var postMeta = FusionApp.getDynamicPost( 'post_meta' ); postMeta._fusion = postMeta._fusion || {}; return 'undefined' !== typeof postMeta[ args.key ] ? postMeta[ args.key ] : ''; }, fusion_get_page_option: function( args ) { var postMeta = FusionApp.getDynamicPost( 'post_meta' ); postMeta._fusion = postMeta._fusion || {}; return 'undefined' !== typeof postMeta._fusion[ args.data ] ? postMeta._fusion[ args.data ] : ''; }, fusion_get_site_title: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.data.site_title : ''; }, fusion_get_site_tagline: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.data.site_tagline : ''; }, fusion_get_logged_in_username: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.data.loggined_in_username : ''; }, fusion_get_site_url: function() { return 'undefined' !== typeof FusionApp.data ? FusionApp.data.site_url : ''; }, fusion_get_site_logo: function( args ) { var type = 'undefined' !== typeof args.type ? args.type : false, data = {}; if ( ! type ) { return ''; } switch ( type ) { case 'default_normal': return FusionApp.settings.logo.url; case 'default_retina': return FusionApp.settings.logo_retina.url; case 'sticky_normal': return FusionApp.settings.sticky_header_logo.url; case 'sticky_retina': return FusionApp.settings.sticky_header_logo_retina.url; case 'mobile_normal': return FusionApp.settings.mobile_logo.url; case 'mobile_retina': return FusionApp.settings.mobile_logo_retina.url; case 'all': data[ 'default' ] = { 'normal': FusionApp.settings.logo, 'retina': FusionApp.settings.logo_retina }; data.mobile = { 'normal': FusionApp.settings.mobile_logo, 'retina': FusionApp.settings.mobile_logo_retina }; data.sticky = { 'normal': FusionApp.settings.sticky_header_logo, 'retina': FusionApp.settings.sticky_header_logo_retina }; return JSON.stringify( data ); } return ''; }, fusion_menu: function( name, value, args, view ) { if ( ! args.skip ) { view.changeParam( name, value ); } const attrs = view.getTemplateAtts(); view.$el.find( 'style' ).first().replaceWith( attrs.inlineStyles ); // If the ajax markup is still there from initial load then data-count is wrong. view.$el.find( 'nav' ).attr( 'data-count', view.model.get( 'cid' ) ); return { render: false }; }, fusion_style_block: function( name, value, args, view ) { var styleEl; if ( ! args.skip ) { view.changeParam( name, value ); } const attrs = view.getTemplateAtts(); // Can't find base selector, markup likely wrong and needs updated. if ( ! view.$el.find( view.baseSelector ).length ) { return { render: true }; } styleEl = view.$el.find( 'style' ).first(); // When element is added there will be no <style> tag, so we have to create it. if ( 0 === jQuery( styleEl ).length ) { styleEl = view.$el.find( '.fusion-builder-element-content' ).prepend( attrs.styles ); } else { jQuery( styleEl ).replaceWith( attrs.styles ); } return { render: false }; }, woo_get_price: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, woo_get_sku: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, woo_get_cart_count: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, woo_get_cart_total: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, defaultDynamicCallback: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ), is_term: FusionApp.getDynamicPost( 'is_term' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, woo_get_stock: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, woo_get_rating: function( args ) { return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'get', dataType: 'json', data: { action: 'ajax_dynamic_data_default_callback', callback: FusionApp.data.dynamicOptions[ args.data ].callback[ 'function' ], args: args, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ) } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, /** * Updates selector element with CSS filter style. * * @param {*} name Param name. * @param {*} value Param value. * @param {*} args Args defined. * @param {*} view Element view. */ fusion_update_filter_style: function( name, value, args, view ) { var newStyle = '', cid = view.model.get( 'cid' ), $styleEl = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#fusion-filter-' + cid + '-style' ); if ( ! args.skip ) { view.changeParam( name, value ); } newStyle = _.fusionGetFilterStyleElem( view.getValues(), '.' + args.selector_base + cid, cid ); // Update filter style block. if ( 0 < $styleEl.length ) { $styleEl.replaceWith( newStyle ); } return { render: false }; }, /** * Updates gradient styles for selector element. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_gradient_style: function( name, value, args, view ) { var $theEl, mainBGStyles = '', parallaxStyles = '', overlayStyles = '', fadedStyles = '', alphaBackgroundColor = '', videoBg = false, elementType = view.model.get( 'element_type' ), values = {}; if ( ! args.skip ) { view.changeParam( name, value ); } values = view.getValues(); $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ).first(); switch ( elementType ) { case 'fusion_builder_container': mainBGStyles = _.getGradientString( values, 'main_bg' ); parallaxStyles = _.getGradientString( values, 'parallax' ); fadedStyles = _.getGradientString( values, 'fade' ); overlayStyles = _.getGradientString( values ); alphaBackgroundColor = jQuery.AWB_Color( values.background_color ).alpha(); if ( '' === mainBGStyles && '' !== values.background_image && 'yes' !== values.fade ) { mainBGStyles = 'url(\'' + values.background_image + '\')'; } $theEl.css( 'background-image', mainBGStyles ); $theEl.find( '.parallax-inner' ).css( 'background-image', parallaxStyles ); $theEl.find( '.fullwidth-overlay' ).css( 'background-image', overlayStyles ); $theEl.find( '.fullwidth-faded' ).css( 'background-image', fadedStyles ); if ( ( 'undefined' !== typeof values.video_mp4 && '' !== values.video_mp4 ) || ( 'undefined' !== typeof values.video_webm && '' !== values.video_webm ) || ( 'undefined' !== typeof values.video_ogv && '' !== values.video_ogv ) || ( 'undefined' !== typeof values.video_url && '' !== values.video_url ) ) { videoBg = true; } if ( 1 > alphaBackgroundColor && 0 !== alphaBackgroundColor && 'none' === values.background_blend_mode && '' === overlayStyles && ( ! _.isEmpty( values.background_image ) || ! videoBg ) ) { $theEl.addClass( 'fusion-blend-mode' ); } else { $theEl.removeClass( 'fusion-blend-mode' ); } break; case 'fusion_builder_column': case 'fusion_builder_column_inner': mainBGStyles = _.getGradientString( values, 'column' ); alphaBackgroundColor = jQuery.AWB_Color( values.background_color ).alpha(); if ( '' === mainBGStyles && '' !== values.background_image ) { mainBGStyles = 'url(\'' + values.background_image + '\')'; } $theEl.css( 'background-image', mainBGStyles ); if ( 1 > alphaBackgroundColor && 0 !== alphaBackgroundColor && 'none' === values.background_blend_mode && '' === _.getGradientString( values ) && _.isEmpty( values.background_image ) && ! _.isEmpty( values.background_color ) ) { $theEl.closest( '.fusion-layout-column' ).addClass( 'fusion-blend-mode' ); } else { $theEl.closest( '.fusion-layout-column' ).removeClass( 'fusion-blend-mode' ); } break; } return { render: false }; }, /** * Updates separator for selector element. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_breadcrumbs_separator: function( name, value, args, view ) { var $theEl, markup = {}, query_data = {}; if ( ! args.skip ) { view.changeParam( name, value ); } if ( FusionApp.data.is_home || FusionApp.data.is_front_page ) { return; } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); if ( '' !== value ) { $theEl.find( '.fusion-breadcrumb-sep' ).html( value ); } else if ( 'undefined' !== typeof FusionApp && 'object' === typeof FusionApp.settings ) { $theEl.find( '.fusion-breadcrumb-sep' ).html( FusionApp.settings.breadcrumb_separator ); } markup.output = $theEl.html(); query_data.breadcrumbs = $theEl.html(); view.model.set( 'markup', markup ); view.model.set( 'query_data', query_data ); return { render: false }; }, /** * Updates separator for selector element. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_tb_meta_separator: function( name, value, args, view ) { var $theEl, markup = {}, query_data = {}; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); $theEl.find( '.fusion-meta-tb-sep' ).html( value ); markup.output = $theEl.html(); query_data.meta = $theEl.html(); view.model.set( 'markup', markup ); view.model.set( 'query_data', query_data ); return { render: false }; }, /** * Updates prefix for selector element. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_breadcrumbs_prefix: function( name, value, args, view ) { var $theEl, markup = {}, query_data = {}; if ( ! args.skip ) { view.changeParam( name, value ); } if ( FusionApp.data.is_home || FusionApp.data.is_front_page ) { return; } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); $theEl.find( '.fusion-breadcrumb-prefix' ).remove(); if ( '' !== value ) { $theEl.prepend( '<span class="fusion-breadcrumb-prefix"><span class="fusion-breadcrumb-item"><span>' + value + '</span></span>:</span>' ); } else if ( 'undefined' !== typeof FusionApp && 'object' === typeof FusionApp.settings && '' !== FusionApp.settings.breacrumb_prefix ) { $theEl.prepend( '<span class="fusion-breadcrumb-prefix"><span class="fusion-breadcrumb-item"><span>' + FusionApp.settings.breacrumb_prefix + '</span></span>:</span>' ); } markup.output = $theEl.html(); query_data.breadcrumbs = $theEl.html(); view.model.set( 'markup', markup ); view.model.set( 'query_data', query_data ); return { render: false }; }, /** * Updates container flex attributes. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_flex_container: function( name, value, args, view ) { var $theEl; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); switch ( name ) { case 'flex_align_items': $theEl.find( '.fusion-builder-row' ).removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-align-items-\S+/g ) || [] ).join( ' ' ); } ); $theEl.find( '.fusion-builder-row' ).addClass( 'fusion-flex-align-items-' + value ); return { render: false }; case 'flex_justify_content': $theEl.find( '.fusion-builder-row' ).removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-justify-content-\S+/g ) || [] ).join( ' ' ); } ); $theEl.find( '.fusion-builder-row' ).addClass( 'fusion-flex-justify-content-' + value ); return { render: false }; case 'align_content': $theEl.removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-align-content-\S+/g ) || [] ).join( ' ' ); } ); $theEl.find( '.fusion-builder-row' ).removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-align-content-\S+/g ) || [] ).join( ' ' ); } ); if ( 'stretch' !== value ) { $theEl.find( '.fusion-builder-row' ).addClass( 'fusion-flex-align-content-' + value ); $theEl.addClass( 'fusion-flex-align-content-' + value ); } return { render: false }; } }, /** * Updates column flex attributes. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_flex_column: function( name, value, args, view ) { var $theEl = view.$el; if ( ! args.skip ) { view.changeParam( name, value ); } switch ( name ) { case 'align_self': $theEl.removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-align-self-\S+/g ) || [] ).join( ' ' ); } ); if ( 'auto' !== value ) { $theEl.addClass( 'fusion-flex-align-self-' + value ); } return { render: false }; case 'content_wrap': $theEl.find( '.fusion-column-wrapper' ).removeClass( 'fusion-content-nowrap' ); if ( 'wrap' !== value ) { $theEl.find( '.fusion-column-wrapper' ).addClass( 'fusion-content-nowrap' ); } return { render: false }; case 'align_content': $theEl.find( '.fusion-column-wrapper' ).eq( 0 ).removeClass( function ( index, className ) { return ( className.match( /(^|\s)fusion-flex-justify-content-\S+/g ) || [] ).join( ' ' ); } ); $theEl.find( '.fusion-column-wrapper' ).eq( 0 ).addClass( 'fusion-flex-justify-content-' + value ); return { render: false }; } }, /** * Updates menu transition class. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_menu_transition: function( name, value, args, view ) { var oldValue = view.model.get( 'params' )[ name ], queryData = view.model.get( 'query_data' ), searchRegex; if ( ! args.skip ) { view.changeParam( name, value ); } // Replace class in actual HTML. view.$el.find( '.transition-' + oldValue ).removeClass( 'transition-' + oldValue ).addClass( 'transition-' + value ); // Replace class in the stored markup in case they change another option. if ( 'undefined' !== typeof queryData && 'undefined' !== typeof queryData.menu_markup ) { searchRegex = new RegExp( 'transition-' + oldValue, 'g' ); queryData.menu_markup = queryData.menu_markup.replace( searchRegex, 'transition-' + value ); view.model.set( 'query_data', queryData ); } return { render: false }; }, /** * Updates column flex attributes. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_post_card_separator: function( name, value, args, view ) { var params = view.model.get( 'params' ), markup, separatorArgs; if ( ! args.skip ) { view.changeParam( name, value ); } // Find existing separator if exists and remove if ( view.$el.find( '.fusion-absolute-separator' ).length ) { view.$el.find( '.fusion-absolute-separator' ).remove(); } // Separator args. separatorArgs = { 'style_type': params.separator_style_type, 'sep_color': params.separator_sep_color, 'width': params.separator_width, 'alignment': params.separator_alignment, 'border_size': params.separator_border_size, 'position': 'absolute' }; // Update whatever changed. separatorArgs[ name.replace( 'separator_', '' ) ] = value; // Generate markup for element. markup = FusionPageBuilderApp.renderElement( 'fusion_separator', separatorArgs, '', view.model.get( 'cid' ) ); // Append the new separator. view.$el.find( '.fusion-grid > li' ).append( markup ); // Hide if should not be shown. if ( 'grid' !== params.layout || 1 < parseInt( params.columns ) ) { view.$el.find( '.fusion-absolute-separator' ).css( { display: 'none' } ); } // Ensure to update markup for other changes. if ( 'undefined' !== typeof view.model.attributes.markup && 'undefined' !== typeof view.model.attributes.markup.output && 'undefined' === typeof view.model.attributes.query_data ) { view.model.attributes.markup.output = view.$el.find( '.fusion-builder-element-content' ).html(); } else if ( 'undefined' !== typeof view.model.attributes.query_data && 'undefined' !== typeof view.model.attributes.query_data.loop_product ) { view.model.attributes.query_data.loop_product = view.$el.find( '.fusion-grid' ).html(); } return { render: false }; }, /** * Updates box shadow. * * @param {String} name Param name. * @param {String} value Param value. * @param {Object} args Args defined. * @param {Object} view Element view. * @return {Object} */ fusion_update_box_shadow: function( name, value, args, view ) { var $theEl = view.$el; if ( ! args.skip ) { view.changeParam( name, value ); } $theEl = ( 'undefined' === typeof args.selector ) ? view.$el : view.$el.find( args.selector ); $theEl[ 0 ].style.removeProperty( 'box-shadow' ); if ( 'yes' === view.model.attributes.params.box_shadow ) { $theEl[ 0 ].style.setProperty( 'box-shadow', _.fusionGetBoxShadowStyle( view.model.attributes.params ).replace( ';', '' ), 'important' ); } return { render: false }; }, acf_get_field: function( args, image ) { if ( 'undefined' === typeof args.field || '' === args.field ) { return ''; } return jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'ajax_acf_get_field', field: args.field, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, post_id: FusionApp.getDynamicPost( 'post_id' ), image: 'undefined' !== typeof image ? image : false, cid: false } } ) .done( function( response ) { FusionPageBuilderApp.dynamicValues.setValue( args, response.content ); } ); }, acf_get_image_field: function( args ) { return this.acf_get_field( args, true ); } } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionPageBuilderViewManager, fusionAppConfig, FusionEvents, FusionPageBuilderElements, fusionGlobalManager */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.Globals = Backbone.Model.extend( { /** * Init. * * @since 2.0.0 * @param {Object} data - The data. * @return {void} */ initialize: function( ) { // eslint-disable-line no-empty-function }, /** * Handles multiple global elements. * * @since 2.0.0 * @param {Object} args - The Arguments. * @param {Object} args.currentModel - The current model on which method is called. * @param {Object} data.attributes - The changed attributes of a model. * @param {string} data.handleType - The action type. * @param {string} data.Name - The changed attribute param name. * @param {string} data.Value - The changed attribute param value. * @return {void} */ handleMultiGlobal: function( args ) { var globalID, globalCount, currentCID, currentView; // Handle multiple global elements. if ( 'undefined' !== typeof args.currentModel.attributes.params && 'undefined' !== typeof args.currentModel.attributes.params.fusion_global ) { globalID = args.currentModel.attributes.params.fusion_global; globalCount = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '[fusion-global-layout="' + globalID + '"]' ).length; currentCID = args.currentModel.get( 'cid' ); currentView = FusionPageBuilderViewManager.getView( currentCID ); if ( 1 < globalCount ) { jQuery.each( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '[fusion-global-layout="' + globalID + '"]' ), function() { var modelCID, view, model, originalParams, originalMarkup, oldContent; if ( currentCID !== jQuery( this ).data( 'cid' ) ) { modelCID = jQuery( this ).data( 'cid' ); view = FusionPageBuilderViewManager.getView( modelCID ); model = FusionPageBuilderElements.find( function( scopedModel ) { return scopedModel.get( 'cid' ) == modelCID; // jshint ignore: line } ); if ( 'close' === args.handleType ) { originalParams = jQuery.extend( true, {}, args.currentModel.get( 'params' ) ); originalMarkup = jQuery.extend( true, {}, args.currentModel.get( 'markup' ) ); // Restore original params / cancel changes model.set( 'params', originalParams ); // Restore original markup. model.set( 'markup', originalMarkup ); // Reload element view if ( 'undefined' !== typeof view && 'undefined' !== typeof view.reRender ) { view.reRender(); } } else if ( 'save' === args.handleType ) { model.set( args.attributes ); model.set( 'cid', modelCID ); fusionGlobalManager.updateGlobalLayout( globalID, currentView.getContent() ); if ( 'undefined' !== typeof view && 'undefined' !== typeof view.reRender ) { view.reRender(); } } else if ( 'changeView' === args.handleType ) { view.beforePatch(); oldContent = view.getElementContent(); FusionPageBuilderApp._diffdom.apply( oldContent[ 0 ], args.difference ); view.afterPatch(); } else if ( 'changeOption' === args.handleType ) { model.attributes.params[ args.Name ] = args.Value; if ( 'undefined' !== typeof view && 'undefined' !== typeof view.reRender ) { view.reRender(); } } } } ); } } else if ( 'undefined' !== typeof args.currentModel.attributes.parent && 'changeView' !== args.handleType ) { // Check for parent globals. setTimeout( fusionGlobalManager.handleGlobalParents, 500, args ); } }, /** * Handles multiple parent global elements. * * @since 2.0.0 * @param {Object} args - The Arguments. * @param {Object} args.currentModel - The current model on which method is called. * @param {Object} data.attributes - The changed attributes of a model. * @param {string} data.handleType - The action type. * @param {string} data.Name - The changed attribute param name. * @param {string} data.Value - The changed attribute param value. * @return {void} */ handleGlobalParents: function( args ) { var mainContainer = jQuery( '#fb-preview' )[ 0 ].contentWindow, parentCID = args.currentModel.attributes.parent, parentView = FusionPageBuilderViewManager.getView( parentCID ), currentView = {}, parentModel = {}, module; module = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCID; // jshint ignore: line } ); if ( 'undefined' === typeof module ) { return; } if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.attributes.params.fusion_global && 1 < mainContainer.jQuery( '[fusion-global-layout="' + module.attributes.params.fusion_global + '"]' ).length ) { jQuery.each( mainContainer.jQuery( '[fusion-global-layout="' + module.attributes.params.fusion_global + '"]' ), function() { var currentCID; if ( parentCID !== jQuery( this ).data( 'cid' ) ) { currentCID = jQuery( this ).data( 'cid' ); currentView = FusionPageBuilderViewManager.getView( currentCID ); if ( 'undefined' !== typeof module.get( 'multi' ) && 'multi_element_parent' === module.get( 'multi' ) ) { fusionGlobalManager.updateMultiElementParent(); } if ( 'undefined' !== typeof module.get( 'element_type' ) && ( 'fusion_builder_column' === module.get( 'element_type' ) || 'fusion_builder_row_inner' === module.get( 'element_type' ) || 'fusion_builder_container' === module.get( 'element_type' ) ) ) { fusionGlobalManager.removeChildElements( mainContainer, currentCID, module.get( 'element_type' ) ); } if ( 'undefined' !== typeof module.get( 'element_type' ) && 'fusion_builder_column' === module.get( 'element_type' ) ) { fusionGlobalManager.updateColumnElements( parentView.$el, currentCID ); } if ( 'undefined' !== typeof module.get( 'element_type' ) && 'fusion_builder_row_inner' === module.get( 'element_type' ) ) { fusionGlobalManager.updateNestedColumnElements( parentView.$el, currentView ); } if ( 'undefined' !== typeof module.get( 'element_type' ) && 'fusion_builder_container' === module.get( 'element_type' ) ) { fusionGlobalManager.updateContainerElements( parentView.$el, currentView ); } } } ); if ( 'save' === args.handleType ) { fusionGlobalManager.updateGlobalLayout( module.attributes.params.fusion_global, currentView.getContent() ); } } if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.attributes.parent ) { parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCID; // jshint ignore: line } ); args.currentModel = parentModel; fusionGlobalManager.handleGlobalParents( args ); } }, /** * Updates element_content of model and then generates child elements. * * @since 2.0.0 * @param {Object} currentModel - The current model on which method is called. * @param {Object} module - The changed model. * @param {Object} currentView - View obj of current element. * @return {void} */ updateMultiElementParent: function( currentModel, module, currentView ) { currentModel.attributes.params.element_content = module.attributes.params.element_content; currentView.generateChildElements(); }, /** * Removes child elements from nested column, column and container. * * @since 2.0.0 * @param {Object} mainContainer - The reference to main frame container. * @param {string} currentCID - The unique CID of current model. * @return {void} */ removeChildElements: function( mainContainer, currentCID, elementType ) { var findString = ( 'fusion_builder_container' === elementType ) ? '.fusion-builder-remove, .fusion-builder-column-remove' : '.fusion-builder-remove'; // Remove child elements. jQuery.each( mainContainer.jQuery( '[data-cid="' + currentCID + '"] .fusion-builder-module-controls' ), function() { jQuery( this ).find( findString ).trigger( 'click', [ 'automated' ] ); } ); }, /** * Updates column elements. * * @since 2.0.0 * @param {Object} thisColumn - The reference to current column. * @param {string} currentCID - The unique CID of current model. * @return {void} */ updateColumnElements: function( thisColumn, currentCID ) { var container = {}, currentModel = {}; thisColumn.find( '.fusion-builder-live-element:not(.fusion-builder-column-inner .fusion-builder-live-element), .fusion-builder-nested-element' ).each( function() { var $thisModule, moduleCID, elementModule, elementAttributes, $thisInnerRow, innerRowCID, innerRowView; // Standard element if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { $thisModule = jQuery( this ); moduleCID = 'undefined' === typeof $thisModule.data( 'cid' ) ? $thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisModule.data( 'cid' ); // Get model from collection by cid elementModule = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == moduleCID; // jshint ignore: line } ); // Clone model attritubes elementAttributes = jQuery.extend( true, {}, elementModule.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.parent = currentCID; elementAttributes.from = 'fusion_builder_column'; // Don't need target element, position is defined from order. delete elementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( elementAttributes ); // Inner row/nested element } else if ( jQuery( this ).hasClass( 'fusion_builder_row_inner' ) ) { $thisInnerRow = jQuery( this ); innerRowCID = 'undefined' === typeof $thisInnerRow.data( 'cid' ) ? $thisInnerRow.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisInnerRow.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( innerRowCID ); // Clone inner row if ( 'undefined' !== typeof innerRowView ) { innerRowView.cloneNestedRow( '', currentCID ); } } } ); currentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == currentCID; // jshint ignore: line } ); container = FusionPageBuilderViewManager.getView( currentModel.get( 'parent' ) ); container.createVirtualRows(); container.updateColumnsPreview(); FusionEvents.trigger( 'fusion-content-changed' ); }, /** * Updates nested column elements. * * @since 2.0.0 * @param {Object} thisColumnInner - The reference to current nested column. * @param {string} currentCID - The unique CID of current model. * @return {void} */ updateNestedColumnElements: function( thisColumnInner, currentView ) { thisColumnInner.find( '.fusion-builder-live-element' ).each( function() { var innerElementAttributes = {}; var thisModule = jQuery( this ), moduleCID = 'undefined' === typeof thisModule.data( 'cid' ) ? thisModule.find( '.fusion-builder-data-cid' ).data( 'cid' ) : thisModule.data( 'cid' ), // Get model from collection by cid innerModule = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == moduleCID; // jshint ignore: line } ); // Clone model attritubes innerElementAttributes = jQuery.extend( true, {}, innerModule.attributes ); innerElementAttributes.created = 'manually'; innerElementAttributes.cid = FusionPageBuilderViewManager.generateCid(); innerElementAttributes.parent = currentView.$el.find( '.fusion-builder-column-inner' ).data( 'cid' ); innerElementAttributes.from = 'fusion_builder_row_inner'; // Don't need target element, position is defined from order. delete innerElementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( innerElementAttributes ); } ); }, /** * Updates container elements. * * @since 2.0.0 * @param {Object} thisContainer - The reference to current container. * @param {Object} currentView - View obj of current element. * @return {void} */ updateContainerElements: function( thisContainer, currentView ) { thisContainer.find( '.fusion-builder-column-outer' ).each( function() { // Parse column elements var thisColumn = jQuery( this ), $columnCID = thisColumn.data( 'cid' ), // Get model from collection by cid column = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == $columnCID; // jshint ignore: line } ), // Clone column columnAttributes = jQuery.extend( true, {}, column.attributes ); columnAttributes.created = 'manually'; columnAttributes.cid = FusionPageBuilderViewManager.generateCid(); columnAttributes.parent = currentView.$el.find( '.fusion-builder-row-container' ).data( 'cid' ); columnAttributes.from = 'fusion_builder_container'; columnAttributes.cloned = true; FusionPageBuilderApp.collection.add( columnAttributes ); // Find column elements thisColumn.find( '.fusion-builder-column-content:not( .fusion-nested-column-content )' ).children( '.fusion-builder-live-element, .fusion_builder_row_inner' ).each( function() { var thisElement, elementCID, element, elementAttributes, thisInnerRow, InnerRowCID, innerRowView; // Regular element if ( jQuery( this ).hasClass( 'fusion-builder-live-element' ) ) { thisElement = jQuery( this ); elementCID = thisElement.data( 'cid' ); // Get model from collection by cid element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == elementCID; // jshint ignore: line } ); // Clone model attritubes elementAttributes = jQuery.extend( true, {}, element.attributes ); elementAttributes.created = 'manually'; elementAttributes.cid = FusionPageBuilderViewManager.generateCid(); elementAttributes.parent = columnAttributes.cid; elementAttributes.from = 'fusion_builder_container'; // Don't need target element, position is defined from order. delete elementAttributes.targetElementPosition; FusionPageBuilderApp.collection.add( elementAttributes ); // Inner row element } else if ( jQuery( this ).hasClass( 'fusion_builder_row_inner' ) ) { thisInnerRow = jQuery( this ); InnerRowCID = thisInnerRow.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( InnerRowCID ); // Clone inner row if ( 'undefined' !== typeof innerRowView ) { innerRowView.cloneNestedRow( '', columnAttributes.cid ); } } } ); } ); }, /** * Update global layout in the DB. * * @since 2.0.0 * @param {string} layoutID - The ID of current layout. * @param {string} shortcode - The short-code of current layout. * @return {void} */ updateGlobalLayout: function( layoutID, shortcode ) { // Update layout in DB. jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'json', data: { action: 'fusion_builder_update_layout', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, fusion_layout_id: layoutID, fusion_layout_content: shortcode }, complete: function() { // Do Stuff. } } ); }, /** * Handle globals which are added from library. * * @since 2.0.0 * @param {string} layoutID - The ID of global element. * @return {void} */ handleGlobalsFromLibrary: function( layoutID, parentID ) { var currentCID = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '[data-cid="' + parentID + '"] [fusion-global-layout="' + layoutID + '"]' ).last().data( 'cid' ), module = {}, MultiGlobalArgs = {}; if ( 'undefined' === typeof currentCID ) { currentCID = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '[fusion-global-layout="' + layoutID + '"]' ).last().data( 'cid' ); } module = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == currentCID; // jshint ignore: line } ); if ( 'undefined' !== typeof module ) { MultiGlobalArgs = { currentModel: module, handleType: 'save', attributes: module.attributes }; fusionGlobalManager.handleMultiGlobal( MultiGlobalArgs ); } } } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionPageBuilderElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.DraggableHelpers = Backbone.Model.extend( { /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() {}, // eslint-disable-line no-empty-function /** * Get dragable classes. * * @since 2.0.0 * @param {string} cid - ID of model. * @return {string} */ draggableClasses: function( cid ) { var $element, $classes, $values, $parentCID, $parentElement; $element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == cid; // jshint ignore: line } ); $values = _.fusionCleanParameters( jQuery.extend( true, {}, $element.get( 'params' ) ) ); $parentCID = $element.get( 'parent' ); switch ( $element.get( 'type' ) ) { case 'fusion_builder_container': if ( 'undefined' !== typeof $values.fusion_global ) { $classes = ' container-global-helper'; } if ( 'yes' === $values.hundred_percent_height_scroll && 'yes' === $values.hundred_percent_height ) { $classes = ' container-scrolling-helper'; } break; case 'fusion_builder_column': if ( FusionPageBuilderApp.DraggableHelpers.isHeightScroll( $parentCID ) ) { $classes = ' column-scrolling-helper'; } if ( 'undefined' !== typeof $values.fusion_global || FusionPageBuilderApp.DraggableHelpers.isGlobalParent( $parentCID ) ) { $classes = ' column-global-helper'; } break; case 'fusion_builder_row_inner': $classes = ' row-inner-nested-helper'; if ( FusionPageBuilderApp.DraggableHelpers.isHeightScroll( $parentCID ) ) { $classes = ' row-inner-scrolling-helper'; } if ( 'undefined' !== typeof $values.fusion_global || FusionPageBuilderApp.DraggableHelpers.isGlobalParent( $parentCID ) ) { $classes = ' row-inner-global-helper'; } break; case 'fusion_builder_column_inner': $classes = ' column-inner-nested-helper'; if ( FusionPageBuilderApp.DraggableHelpers.isHeightScroll( $parentCID ) ) { $classes = ' column-inner-scrolling-helper'; } if ( 'undefined' !== typeof $values.fusion_global || FusionPageBuilderApp.DraggableHelpers.isGlobalParent( $parentCID ) ) { $classes = ' column-inner-global-helper'; } break; case 'element': $parentElement = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == $parentCID; // jshint ignore: line } ); if ( 'fusion_builder_column_inner' === $parentElement.get( 'type' ) ) { $classes = ' element-nested-helper'; } if ( FusionPageBuilderApp.DraggableHelpers.isHeightScroll( $parentCID ) ) { $classes = ' element-scrolling-helper'; } if ( 'undefined' !== typeof $values.fusion_global || FusionPageBuilderApp.DraggableHelpers.isGlobalParent( $parentCID ) ) { $classes = ' element-global-helper'; } break; } return $classes; }, /** * Check if element has got global parent. * * @since 2.0.0 * @param {string} cid - The ID of parent model. * @return {boolean} */ isGlobalParent: function( parentCID ) { var $element, $values; $element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCID; // jshint ignore: line } ); if ( 'undefined' === typeof $element ) { return false; } $values = _.fusionCleanParameters( jQuery.extend( true, {}, $element.get( 'params' ) ) ); if ( 'undefined' !== typeof $values.fusion_global ) { return true; } if ( 'undefined' !== typeof $element.get( 'parent' ) ) { return FusionPageBuilderApp.DraggableHelpers.isGlobalParent( $element.get( 'parent' ) ); } return false; }, /** * Check if element is inside 100% scrolling height. * * @since 2.0.0 * @param {string} cid - The ID of parent model. * @return {boolean} */ isHeightScroll: function( parentCID ) { var $element, $values; $element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCID; // jshint ignore: line } ); if ( 'undefined' === typeof $element ) { return false; } $values = _.fusionCleanParameters( jQuery.extend( true, {}, $element.get( 'params' ) ) ); if ( 'fusion_builder_container' === $element.get( 'type' ) && 'yes' === $values.hundred_percent_height_scroll && 'yes' === $values.hundred_percent_height ) { return true; } if ( 'undefined' !== typeof $element.get( 'parent' ) ) { return FusionPageBuilderApp.DraggableHelpers.isHeightScroll( $element.get( 'parent' ) ); } return false; } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.IsotopeManager = Backbone.Model.extend( { defaults: { selector: '', container: '', itemSelector: '', layoutMode: 'packery', isOriginLeft: jQuery( 'body.rtl' ).length ? false : true, resizable: true, initLayout: true, view: false }, initialize: function() { this.listenTo( window.FusionEvents, 'fusion-frame-size-changed', this.updateLayout ); this.listenTo( window.FusionEvents, 'fusion-column-resized', this.updateLayout ); }, init: function() { var self = this, container = self.get( 'view' ).$el.find( self.get( 'selector' ) ); self.set( 'container', container ); if ( ! container.data( 'isotope' ) ) { container.isotope( { layoutMode: self.get( 'layoutMode' ), itemSelector: self.get( 'itemSelector' ), isOriginLeft: jQuery( 'body.rtl' ).length ? false : true, resizable: true, initLayout: true } ); } }, reInit: function( delay ) { var self = this; if ( 'undefined' === typeof delay ) { delay = 300; } self.destroyIsotope(); setTimeout( function() { self.init(); }, delay ); }, destroyIsotope: function() { if ( '' !== this.get( 'container' ) && this.get( 'container' ).data( 'isotope' ) ) { this.get( 'container' ).isotope( 'destroy' ); this.get( 'container' ).removeData( 'isotope' ); } }, append: function( content ) { if ( '' !== this.get( 'container' ) && this.get( 'container' ).data( 'isotope' ) ) { this.get( 'container' ).isotope( 'appended', content ).isotope( 'layout' ); } }, remove: function( content ) { if ( '' !== this.get( 'container' ) && this.get( 'container' ).data( 'isotope' ) ) { this.get( 'container' ).isotope( 'remove', content ).isotope( 'layout' ); } }, reloadItems: function() { if ( '' !== this.get( 'container' ) && this.get( 'container' ).data( 'isotope' ) ) { this.get( 'container' ).isotope( 'reloadItems' ).isotope( 'layout' ); } }, updateLayout: function() { if ( '' !== this.get( 'container' ) && this.get( 'container' ).data( 'isotope' ) ) { this.get( 'container' ).isotope( 'layout' ); } } } ); }( jQuery ) ); ;/* global fusionAppConfig, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.Studio = Backbone.Model.extend( { /** * {Object} - Stores current import step data. */ importData: {}, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.studioData = false; this.studioRequest = false; }, /** * Gets the webfonts via AJAX. * * @since 2.0.0 * @return {void} */ getStudioData: function() { var self = this; if ( self.studioData && self.studioData ) { return; } if ( false !== self.studioRequest ) { return self.studioRequest; } return jQuery.post( fusionAppConfig.ajaxurl, { action: 'fusion_builder_load_studio_elements', fusion_load_nonce: fusionAppConfig.fusion_load_nonce }, function( data ) { self.studioData = data; }, 'json' ); }, /** * Filter out invalid layouts, containers etc for current situation. * * @since 3.5 * @param {Object} layouts - The layouts or elements. * @return {Object} */ filterLayouts: function( layouts ) { var plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false; return _.filter( layouts, function( layout ) { var passes = true; // Check for plugins first. if ( false !== plugins && 'object' === typeof layout.plugins ) { _.each( layout.plugins, function( layoutPlugin ) { if ( ! plugins[ layoutPlugin ] ) { passes = false; } } ); if ( ! passes ) { return false; } } if ( 'object' === typeof layout.locations && ! layout.locations.includes( FusionApp.data.template_category ) ) { return false; } return true; } ); }, initFilter: function( $sidebar ) { var timeouts = [], self = this; $sidebar.find( 'li' ).off(); $sidebar.find( 'li' ).on( 'click', function() { var $container = jQuery( this ).closest( '.studio-wrapper' ).find( '.studio-imports' ), $templates = $container.find( 'li.fusion-page-layout' ), slug = jQuery( this ).attr( 'data-slug' ), counter = 1, order = [], $showTemplates = [], i; // Don't do filtering for active filter. if ( jQuery( this ).hasClass( 'current' ) ) { return false; } // Clear all timeouts to prevent animations still running. jQuery.each( timeouts, function( index, value ) { clearTimeout( value ); } ); // Remove current from active. $sidebar.find( 'li.current' ).removeClass( 'current' ); // Hide all templates. $templates.css( { display: 'none' } ).addClass( 'hidden' ); // Fade correct templates in. $templates.each( function() { var $template = jQuery( this ); if ( 'undefined' === typeof $template.data( 'slug' ) ) { return true; } if ( 'all' === slug || -1 !== $template.data( 'slug' ).indexOf( slug ) ) { $template.css( { display: 'inline-block' } ); $showTemplates.push( $template ); } } ); setTimeout( function() { jQuery.each( $showTemplates, function() { var $template = jQuery( this ), position = $template.position(); // Loop afer all have been added to get position. position.$el = $template; order.push( position ); } ); // Sort top to bottom. order.sort( self.SortByTop ); // Reveal top to bottom. for ( i = 0; i < order.length; i++ ) { timeouts.push( self.doSetTimeout( i, order, counter ) ); counter++; } }, 50 ); // Add current to show it is active. jQuery( this ).addClass( 'current' ); } ); }, /** * Delay between showing items. * * @since 7.5 * * @return {void} */ doSetTimeout: function( i, order, counter ) { setTimeout( function() { order[ i ].$el.removeClass( 'hidden' ); }, counter * 50 ); }, /** * Sort elements by vertical position. * * @since 7.5 * */ SortByTop: function( a, b ) { return ( ( a.top < b.top ) ? -1 : ( ( a.top > b.top ) ? 1 : 0 ) ); // eslint-disable-line no-nested-ternary }, /** * Lazy load images. * * @since 3.1 * @return {void} */ initLazyLoad: function( $container ) { var demoImages = $container.find( '.lazy-load' ), options = { root: $container.closest( '.ui-dialog' )[ 0 ], rootMargin: '0px', threshold: 0 }, imageObserver; if ( 'IntersectionObserver' in window ) { imageObserver = new IntersectionObserver( function( entries, observer ) { // eslint-disable-line jQuery.each( entries, function( key, entry ) { var $demo = jQuery( entry.target ), $image = $demo.find( 'img' ); if ( 'undefined' === typeof $image.data( 'src' ) || '' === $image.data( 'src' ) || 'undefined' === $image.data( 'src' ) ) { imageObserver.unobserve( entry.target ); return; } if ( entry.isIntersecting ) { $image.attr( 'src', $image.data( 'src' ) ); $image.imagesLoaded().done( function() { $demo.removeClass( 'lazy-load' ).addClass( 'lazy-loaded' ); $image.attr( 'alt', $image.data( 'alt' ) ); } ); imageObserver.unobserve( entry.target ); } } ); }, options ); demoImages.each( function() { imageObserver.observe( this ); } ); } else { // IE11 fallback. demoImages.each( function() { var $demo = jQuery( this ), $image = $demo.find( 'img' ); if ( 'undefined' === typeof $image.data( 'src' ) || '' === $image.data( 'src' ) || 'undefined' === $image.data( 'src' ) ) { return; } $image.attr( 'src', $image.data( 'src' ) ); $image.imagesLoaded().done( function() { $demo.removeClass( 'lazy-load' ).addClass( 'lazy-loaded' ); $image.attr( 'alt', $image.data( 'alt' ) ); } ); } ); } }, /** * Sets import data to new value. * * @since 3.5 * @param {Object} data * @return {void} */ setImportData: function( data ) { this.importData = data; }, /** * Gets import data to new value. * * @since 3.5 * @return {Object} */ getImportData: function() { return this.importData; }, /** * Resets import data variable. * * @since 3.5 * @return {void} */ resetImportData: function() { this.importData = {}; } } ); }( jQuery ) ); ;/* global fusionAppConfig */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { FusionPageBuilder.Website = FusionPageBuilder.Studio.extend( { /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.websiteData = false; this.websiteRequest = false; this.state = { current: '', title: '', nextCat: '' }; }, /** * Gets the webfonts via AJAX. * * @since 2.0.0 * @return {void} */ getWebsiteData: function() { var self = this; if ( self.websiteData && self.websiteData ) { return; } if ( false !== self.websiteRequest ) { return self.websiteRequest; } return jQuery.post( fusionAppConfig.ajaxurl, { action: 'awb_load_websites', load_website_data: true, fusion_load_nonce: fusionAppConfig.fusion_load_nonce }, function( data ) { if ( ! _.isNull( data ) ) { self.websiteData = data; } }, 'json' ); }, /** * Init filter sidebar. * * @since 3.5 * @param {Object} sidebar - The sidebar elements. * @return {void} */ initFilter: function( $sidebar ) { var timeouts = [], self = this, $container = jQuery( '#fusion-builder-layouts-demos' ); $sidebar.find( 'li' ).off(); $sidebar.find( 'li' ).on( 'click', function() { var $studioImports = jQuery( this ).closest( '.studio-wrapper' ).find( '.studio-imports' ), $templates = $studioImports.find( 'li' ), slug = jQuery( this ).attr( 'data-slug' ), counter = 1, order = [], $showTemplates = [], i; // Don't do filtering for active filter. if ( jQuery( this ).hasClass( 'current' ) ) { return false; } // Clear all timeouts to prevent animations still running. jQuery.each( timeouts, function( index, value ) { clearTimeout( value ); } ); // Hide detail demo. if ( ! $studioImports.next().hasClass( 'hidden' ) ) { $studioImports.removeClass( 'hidden' ).next().addClass( 'hidden' ).find( '.demo-' + self.state.current ).addClass( 'hidden' ); } // Remove current from active. $sidebar.find( 'li.current' ).removeClass( 'current' ); // Hide all templates. $templates.css( { display: 'none' } ).addClass( 'hidden' ); // Fade correct templates in. $templates.each( function() { var $template = jQuery( this ); if ( 'undefined' === typeof $template.data( 'slug' ) ) { return true; } if ( 'all' === slug || -1 !== $template.data( 'slug' ).indexOf( slug ) ) { $template.css( { display: 'inline-block' } ); $showTemplates.push( $template ); } } ); setTimeout( function() { jQuery.each( $showTemplates, function() { var $template = jQuery( this ), position = $template.position(); // Loop afer all have been added to get position. position.$el = $template; order.push( position ); } ); // Sort top to bottom. order.sort( self.SortByTop ); // Reveal top to bottom. for ( i = 0; i < order.length; i++ ) { timeouts.push( self.doSetTimeout( i, order, counter ) ); counter++; } }, 50 ); // Add current to show it is active. jQuery( this ).addClass( 'current' ); } ); $container.find( '#awb_sites_search_demos' ).on( 'change paste keyup', _.debounce( function( ) { var demoPageLink = jQuery( this ).val(), demoPage, parentDemo; demoPageLink = demoPageLink.replace( 'https://', '' ).replace( 'http://', '' ); if ( '/' !== demoPageLink[ demoPageLink.length - 1 ] && ! _.isEmpty( demoPageLink ) ) { demoPageLink += '/'; } demoPage = $container.find( 'li[data-page-link="' + demoPageLink + '"]' ); parentDemo = demoPage.closest( '.awb-page-item' ); if ( demoPage.length ) { if ( $container.find( '.site-details' ).hasClass( 'hidden' ) ) { $container.find( '.site-details' ).removeClass( 'hidden' ).prev().addClass( 'hidden' ); } demoPage.removeClass( 'hidden' ).siblings().addClass( 'hidden' ); self.state.current = parentDemo.data( 'website_id' ); self.state.title = parentDemo.data( 'website_title' ); parentDemo.removeClass( 'hidden' ).siblings().addClass( 'hidden' ); self.updateDetailHeader( $container ); } }, 100 ) ); }, /** * Init Import Demo. * * @since 3.5 * @param {Object} sidebar - The sidebar elements. * @return {void} */ initImport: function( $container ) { var self = this; // Demo on Click. $container.find( '.studio-imports > li' ).on( 'click', function( event ) { event.preventDefault(); self.state.current = jQuery( this ).data( 'website_id' ); self.state.title = jQuery( this ).data( 'website_title' ); jQuery( this ).closest( '.studio-imports' ).addClass( 'hidden' ) .next().removeClass( 'hidden' ).find( '.demo-' + self.state.current ).removeClass( 'hidden' ) .find( 'li.hidden' ).removeClass( 'hidden' ); self.updateDetailHeader( $container ); } ).end().find( '.awb-sites-back-js' ).on( 'click', function( event ) { event.preventDefault(); jQuery( this ).closest( '.site-details' ).find( '.demo-' + self.state.current ).addClass( 'hidden' ) .end().closest( '.site-details' ).addClass( 'hidden' ).prev().removeClass( 'hidden' ); } ).end().find( '.awb-sites-next-js' ).on( 'click', function( event ) { event.preventDefault(); $container.find( 'aside li[data-slug="' + self.state.nextCat + '"]' ).trigger( 'click' ); } ); }, /** * Update Detail Header. * * @since 3.5 * @param {Object} container - The container elements. * @return {void} */ updateDetailHeader: function( $container ) { this.state.nextCat = $container.find( 'aside ul > li.current' ).next().data( 'slug' ); $container.find( '.awb-sites-title' ).html( this.state.title ); if ( this.state.nextCat && this.websiteData.tags[ this.state.nextCat ] ) { $container.find( '.awb-sites-next-js' ).removeClass( 'vs-hidden' ).html( this.websiteData.tags[ this.state.nextCat ].name ); } else { $container.find( '.awb-sites-next-js' ).addClass( 'vs-hidden' ); } } } ); }( jQuery ) ); ;/* global FusionApp, fusionAllElements, FusionPageBuilderViewManager, FusionPageBuilderElements, FusionEvents, fusionMultiElements, FusionPageBuilderApp, fusionBuilderText, diffDOM, tinyMCE, fusionGetPercentPaddingHorizontalNegativeMargin, fusionGetPercentPaddingHorizontalNegativeMarginIfSiteWidthPercent, fusionTriggerEvent, fusionVendorShortcodes, fusionSanitize */ /* eslint no-useless-escape: 0 */ /* eslint no-shadow: 0 */ /* eslint max-depth: 0 */ /* eslint no-unused-vars: 0 */ /* eslint guard-for-in: 0 */ /* eslint no-continue: 0 */ /* eslint no-bitwise: 0 */ /* eslint no-mixed-operators: 0 */ /* eslint no-empty-function: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { var fusionElements = [], fusionGeneratorElements = [], fusionComponents = [], fusionFormComponents = [], sortedElements; jQuery.fn.outerHTML = function() { return ( ! this.length ) ? this : ( this[ 0 ].outerHTML || ( function( el ) { var div = document.createElement( 'div' ), contents; div.appendChild( el.cloneNode( true ) ); contents = div.innerHTML; div = null; return contents; }( this[ 0 ] ) ) ); }; // Loop over all available elements and add them to Avada Builder. sortedElements = _.sortBy( fusionAllElements, function( element ) { return element.name.toLowerCase(); } ); _.each( sortedElements, function( element ) { var newElement, targetObject = fusionGeneratorElements; if ( 'undefined' === typeof element.hide_from_builder ) { newElement = { title: element.name, label: element.shortcode }; if ( 'undefined' !== typeof element.component && element.component ) { targetObject = fusionComponents; } if ( 'undefined' === typeof element.generator_only && 'undefined' === typeof element.form_component ) { fusionElements.push( newElement ); } if ( ( 'undefined' !== typeof element.form_component && element.form_component ) || ( 'undefined' !== typeof element.allow_in_form && element.allow_in_form ) ) { fusionFormComponents.push( newElement ); return; } targetObject.push( Object.assign( {}, newElement, { generator_only: 'undefined' !== typeof element.generator_only ? true : element.generator_only, templates: 'undefined' !== typeof element.templates ? element.templates : false, components_per_template: 'undefined' !== typeof element.components_per_template ? element.components_per_template : false, template_tooltip: 'undefined' !== typeof element.template_tooltip ? element.template_tooltip : false } ) ); } } ); window.FusionPageBuilderViewManager = jQuery.extend( true, {}, new FusionPageBuilder.ViewManager() ); // Avada Builder App View FusionPageBuilder.AppView = Backbone.View.extend( { model: FusionPageBuilder.Element, collection: FusionPageBuilderElements, elements: { modules: fusionElements, generator_elements: fusionGeneratorElements, components: fusionComponents, componentsCounter: 0, usedComponents: [], form_components: fusionFormComponents }, events: { contextmenu: 'contextMenu' }, template: FusionPageBuilder.template( jQuery( '#fusion-builder-front-end-template' ).html() ), /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.extraShortcodes = new FusionPageBuilder.ExtraShortcodes(); this.inlineEditors = new FusionPageBuilder.InlineEditorManager(); this.inlineEditorHelpers = new FusionPageBuilder.InlineEditorHelpers(); this.DraggableHelpers = new FusionPageBuilder.DraggableHelpers(); this.SettingsHelpers = new FusionPageBuilder.SettingsHelpers(); this.wireframe = new FusionPageBuilder.Wireframe(); this.dynamicValues = new FusionPageBuilder.DynamicValues(); this.studio = new FusionPageBuilder.Studio(); this.website = new FusionPageBuilder.Website(); this.formStyles = false; this.offCanvasStyles = false; // Post contents this.postContent = false; // Post Id this.postID = false; // Listen for new elements this.listenTo( this.collection, 'add', this.addBuilderElement ); // Listen for data update this.listenTo( FusionEvents, 'fusion-data-updated', this.updateData ); // Listen for preview toggle. this.listenTo( FusionEvents, 'fusion-preview-toggle', this.previewToggle ); this.previewMode = false; // Listen for preview update to set some global styles. this.listenTo( FusionEvents, 'fusion-preview-update', this.setGlobalStyles ); // Listen for wireframe mode toggle click. this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.wireFrameToggled ); // Listen for frame resizes and sets helper class for CSS. this.listenTo( FusionEvents, 'fusion-preview-resize', this.setStackedContentClass ); this.listenTo( FusionEvents, 'fusion-to-content_break_point-changed', this.setStackedContentClass ); // Listen for header_position option change. this.listenTo( FusionEvents, 'fusion-to-header_position-changed', this.reInitScrollingSections ); this.listenTo( window.FusionEvents, 'fusion-preferences-droppables_visible-updated', this.toggleDroppablesVisibility ); this.listenTo( window.FusionEvents, 'fusion-preferences-sticky_header-updated', this.toggleStickyHeader ); this.listenTo( window.FusionEvents, 'fusion-preferences-tooltips-updated', this.toggleTooltips ); this.listenTo( window.FusionEvents, 'fusion-preferences-element_filters-updated', this.toggleElementFilters ); this.listenTo( window.FusionEvents, 'fusion-preferences-transparent_header-updated', this.toggleTransparentHeader ); // Listen to the fusion-content-changed event and re-trigger sticky header resize. this.listenTo( FusionEvents, 'fusion-content-changed', function() { fusionTriggerEvent( 'fusion-resize-stickyheader' ); } ); this.listenTo( FusionEvents, 'fusion-builder-loaded', this.fusionLibraryUI ); // Base64 encode/decode. this._keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; // Make sure to delay ajax requests to prevent duplicates. this._fusion_do_shortcode = _.debounce( _.bind( FusionApp.callback.fusion_do_shortcode, this ), 300 ); // Debounced event for wireframe mode. this._wireframeToggle = _.debounce( _.bind( this.wireframeToggle, this ), 200 ); this.blankPage = false; this.render(); this.reRenderElements = false; this.contextMenuView = false; this.clipboard = {}; // Stored latest shortcode content to avoid unnecessary ajax. this.lastAjaxCid = false; this.ajaxContentRequests = []; // DiffDOM this._diffdom = new diffDOM( { valueDiffing: false } ); jQuery( jQuery( '#fb-preview' )[ 0 ].contentWindow ).on( 'resize', function() { FusionEvents.trigger( 'fusion-preview-resize' ); } ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).on( 'click', function( event ) { FusionPageBuilderApp.sizesHide( event ); } ); this.correctTooltipPosition(); this.loaded = false; this.shortcodeAjax = false; this.inlineElements = [ 'fusion_highlight', 'fusion_tooltip', 'fusion_dropcap', 'fusion_popover', 'fusion_one_page_text_link', 'fusion_modal_text_link' ]; this.documentWrite = false; this.previewDocumentWrite = false; this.wireframeActive = false; this.viewsToRerender = []; this.listenTo( FusionEvents, 'fusion-data-updated', this.resetRenderVariable ); this.mediaMap = { images: {}, menus: {}, forms: {}, post_cards: {}, videos: {}, icons: {}, off_canvases: {} }; this.listenTo( FusionEvents, 'fusion-content-preview-width', this.contentPreviewWidth ); }, resetRenderVariable: function() { this.reRenderElements = false; }, /** * Gets callback function for option change. * * @since 2.0.0 * @param {Object} modelData - The model data. * @param {string} paramName - Parameter name. * @param {mixed} paramValue - The value of the defined parameter. * @param {Object} view - The view object. * @param {boolean} skip - If set to true we bypass changing the parameter in this view. * @return {void} */ getCallbackFunction: function( modelData, paramName, paramValue, view, skip ) { var element = fusionAllElements[ view.model.get( 'element_type' ) ], option = element.params[ paramName ], callbackFunction, thisView; // Check if it is subfield. if ( 'undefined' === typeof option && 'undefined' !== typeof element.subparam_map && 'undefined' !== typeof element.subparam_map[ paramName ] ) { option = element.params[ element.subparam_map[ paramName ] ]; } if ( 'undefined' !== typeof modelData.noTemplate && modelData.noTemplate ) { // No template, we need to use fusion_do_shortcode. callbackFunction = {}; callbackFunction.ajax = true; callbackFunction[ 'function' ] = 'fusion_do_shortcode'; skip = 'undefined' === typeof skip ? false : skip; thisView = FusionPageBuilderViewManager.getView( modelData.cid ); if ( ! skip ) { thisView.changeParam( paramName, paramValue ); } if ( 'undefined' !== typeof modelData.multi && false !== modelData.multi ) { // Parent or child element, get the parent total content. callbackFunction.parent = this.getParentElementCid( modelData ); callbackFunction.content = this.getParentElementContent( modelData, view ); } else { // Regular element, just get element content. callbackFunction.parent = false; callbackFunction.content = FusionPageBuilderApp.generateElementShortcode( thisView.$el ); } } else { callbackFunction = this.CheckIfCallback( element, option, view.model ); } return callbackFunction; }, getParentElementCid: function( modelData ) { if ( 'multi_element_child' === modelData.multi ) { // Child, return parent value. return modelData.parent; } // Parent, return cid. return modelData.cid; }, getParentElementContent: function( modelData, view ) { var parentView; if ( 'multi_element_child' === modelData.multi ) { // Child, update parent and get total content. parentView = FusionPageBuilderViewManager.getView( modelData.parent ); parentView.updateElementContent(); return parentView.getContent(); } // Already on parent, get full content. return view.getContent(); }, /** * Check if the element has a callback. * * @since 2.0.0 * @param {Object} element - The element. * @param {Object} option - The option. * @param {Object} model - The model. * @return {Object|false} - Returns the callback, or false if none is defined. */ CheckIfCallback: function( element, option, model ) { // First check if the option has a callback if ( 'undefined' !== typeof option && 'undefined' !== typeof option.callback ) { return option.callback; } // Check if the element itself has a callback and query_data is empty. if ( 'undefined' !== typeof element && 'undefined' !== typeof element.callback && 'undefined' === typeof model.attributes.query_data ) { return element.callback; } return false; }, /** * Set some global styles in a style tag added to body. * * @since 2.0.0 * @return {void} */ setGlobalStyles: function( id, setAll ) { var styles = '', setAllStyles = false, margin = 0; if ( 'undefined' !== typeof setAll ) { setAllStyles = setAll; } else if ( 'undefined' === typeof id ) { setAllStyles = true; } // Container outline and controls positioning. if ( 'hundredp_padding' === id || setAllStyles ) { margin = fusionGetPercentPaddingHorizontalNegativeMargin(); margin = fusionGetPercentPaddingHorizontalNegativeMarginIfSiteWidthPercent( 0, margin ); // If we are editing content nested inside a layout section, then no negative margins on containers. if ( 'object' === typeof FusionApp.data.template_override && 'object' === typeof FusionApp.data.template_override.content && 'fusion_tb_section' !== FusionApp.data.postDetails.post_type ) { margin = 0; } styles += 'body:not(.has-sidebar) .width-100 .fusion-builder-container:before,'; styles += 'body:not(.has-sidebar) .width-100 .fusion-builder-container:after,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container:hover > .fusion-builder-module-controls-container-wrapper,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-margin-top,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-margin-bottom,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-padding-top,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-padding-bottom,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-padding-right'; styles += '{margin-left:' + margin + ';margin-right:' + margin + '}'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-padding-left{margin-left:' + margin + ';}'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-container-spacing.fusion-container-padding-right{margin-right:' + margin + ';}'; // Flex styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-padding-left{margin-left:0;}'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-padding-right{margin-right:0;}'; styles += 'body:not(.has-sidebar) .width-100 .fusion-builder-container:before,'; styles += 'body:not(.has-sidebar) .width-100 .fusion-builder-container:after,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container:hover > .fusion-builder-module-controls-container-wrapper,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-margin-top,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-margin-bottom,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-padding-top,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-padding-bottom,'; styles += '.fusion-builder-live .width-100 .fusion-builder-container .fusion-flex-container .fusion-container-spacing.fusion-container-padding-right'; styles += '{margin-left:' + 0 + ';margin-right:' + 0 + '}'; } if ( styles ) { if ( ! this.$el.children( 'style' ).length ) { this.$el.prepend( '<style></style>' ); } this.$el.children( 'style' ).html( styles ); } }, /** * Corrects the position of tooltips that would overflow the viewport. * * @since 2.0.0 * @return {void} */ correctTooltipPosition: function() { var self = this; this.$el.on( 'mouseenter', '.fusion-builder-module-controls-type-container a, .fusion-builder-column-controls a, .fusion-builder-module-controls a, a.fusion-builder-add-element', function() { var anchorWidth = jQuery( this ).outerWidth(), tooltip = jQuery( this ).children( '.fusion-container-tooltip, .fusion-column-tooltip, .fusion-element-tooltip' ), tooltipWidth, tooltipOffset, tooltipOffsetLeft, tooltipOffsetRight, referenceWrapper, referenceWrapperOffsetLeft, referenceWrapperOffsetRight; if ( ! tooltip.length ) { return; } tooltip.children( '.fusion-tooltip-text' ).removeAttr( 'style' ); tooltipWidth = tooltip.outerWidth(); tooltipOffset = tooltip.offset(); tooltipOffsetLeft = tooltipOffset.left; tooltipOffsetRight = tooltipOffsetLeft + tooltipWidth; referenceWrapperOffsetLeft = 0; referenceWrapperOffsetRight = self.$el.width(); jQuery( this ).closest( '.fusion-fullwidth:not(.video-background) .fusion-row' ).css( 'z-index', 'auto' ); jQuery( this ).closest( '.fusion-fullwidth:not(.video-background)' ).children( '.fullwidth-faded' ).css( 'z-index', 'auto' ); if ( ! jQuery( this ).closest( '.fusion-element-alignment-left' ).length && ! jQuery( this ).closest( '.fusion-element-alignment-right' ).length ) { jQuery( this ).closest( '.fusion-builder-container' ).css( 'z-index', 'auto' ); } // Carousels need different positioning. referenceWrapper = tooltip.closest( '.fusion-carousel-wrapper' ); if ( referenceWrapper.length ) { referenceWrapperOffsetLeft = referenceWrapper.offset().left; referenceWrapperOffsetRight = referenceWrapperOffsetLeft + referenceWrapper.outerWidth(); } if ( tooltipOffsetLeft < referenceWrapperOffsetLeft ) { tooltip.children( '.fusion-tooltip-text' ).css( 'margin-left', ( ( tooltipWidth / 2 ) + anchorWidth ) + 'px' ); } else if ( tooltipOffsetRight > referenceWrapperOffsetRight ) { tooltip.children( '.fusion-tooltip-text' ).css( 'margin-left', 'calc(' + anchorWidth + 'px - ' + tooltipWidth + 'px)' ); } if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', 'auto' ); if ( 'fixed' === jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'position' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '-1' ); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).find( '.tfs-slider[data-parallax="1"]' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', 'auto' ); } } } } ); this.$el.on( 'mouseleave', '.fusion-builder-module-controls-container a', function() { var parentElement = jQuery( this ).closest( '.fusion-builder-module-controls-container' ).parent( '.fusion-builder-live-element' ); if ( ! parentElement.length || ! parentElement.find( '.fusion-modal.in' ).length ) { jQuery( this ).closest( '.fusion-row' ).css( 'z-index', '' ); jQuery( this ).closest( '.fusion-builder-container' ).css( 'z-index', '' ); } if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', '' ); } } ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { this.$el.find( '.fusion-builder-live-editor' ).html( this.template() ); // Make sure context menu is available. this.delegateEvents(); this.setStackedContentClass(); return this; }, /** * Store shortcode data. * * @since 2.0.0 * @return {void} */ updateData: function() { var self = this; this.elements.components.forEach( function( component, index ) { var re = new RegExp( '\\[' + component.label, 'g' ); if ( 'string' === typeof FusionApp.data.template_category && ( 'object' !== typeof component.templates || component.templates.includes( FusionApp.data.template_category ) ) ) { self.elements.componentsCounter++; } } ); this.extraShortcodes.addData( FusionApp.data.shortcodeMap ); this.dynamicValues.addData( FusionApp.initialData.dynamicValues, FusionApp.data.dynamicOptions ); }, convertGalleryElement: function( content ) { var regExp = window.wp.shortcode.regexp( 'fusion_gallery' ), innerRegExp = this.regExpShortcode( 'fusion_gallery' ), matches = content.match( regExp ), newContent = content, fetchIds = []; if ( matches ) { _.each( matches, function( shortcode ) { var shortcodeElement = shortcode.match( innerRegExp ), shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '', children = '', newShortcode = '', ids; // Check for the old format shortcode if ( 'undefined' !== typeof shortcodeAttributes.named.image_ids ) { ids = shortcodeAttributes.named.image_ids.split( ',' ); // Add new children shortcodes _.each( ids, function( id ) { children += '[fusion_gallery_image image="" image_id="' + id + '" /]'; fetchIds.push( id ); } ); // Add children shortcodes, remove image_ids attribute. newShortcode = shortcode.replace( '/]', ']' + children + '[/fusion_gallery]' ).replace( 'image_ids="' + shortcodeAttributes.named.image_ids + '" ', '' ); // Replace the old shortcode with the new one newContent = newContent.replace( shortcode, newShortcode ); } } ); // Fetch attachment data if ( 0 < fetchIds.length ) { wp.media.query( { post__in: fetchIds, posts_per_page: fetchIds.length } ).more(); } } return newContent; }, /** * Converts the shortcodes to builder elements. * * @since 2.0.0 * @param {string} content - The content. * @return {void} */ createBuilderLayout: function( content ) { var self = this; if ( FusionApp.data.is_fusion_element ) { content = self.validateLibraryContent( content ); } content = this.convertGalleryElement( content ); this.shortcodesToBuilder( content ); this.builderToShortcodes(); setTimeout( function() { self.scrollingContainers(); self.maybeFormStyles(); self.maybeOfCanvasStyles(); }, 100 ); }, /** * Validate library content. * * @since 2.0.0 * @param {string} content - The content. * @return {string} */ validateLibraryContent: function( content ) { var contentIsEmpty = '' === content, openContainer = '[fusion_builder_container type="flex" hundred_percent="no" flex_column_spacing="0px" equal_height_columns="no" menu_anchor="" hide_on_mobile="small-visibility,medium-visibility,large-visibility" class="" id="" background_color="" background_image="" background_position="center center" background_repeat="no-repeat" fade="no" background_parallax="none" parallax_speed="0.3" video_mp4="" video_webm="" video_ogv="" video_url="" video_aspect_ratio="16:9" video_loop="yes" video_mute="yes" overlay_color="" overlay_opacity="0.5" video_preview_image="" border_size="" border_color="" border_style="solid" padding_top="" padding_bottom="" padding_left="" padding_right=""][fusion_builder_row]', closeContainer = '[/fusion_builder_row][/fusion_builder_container]', openColumn = '[fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" border_position="all" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="small-visibility,medium-visibility,large-visibility" center_content="no" last="no" min_height="" hover_type="none" link=""]', closeColumn = '[/fusion_builder_column]', columnEdit = 'columns' === FusionApp.data.fusion_element_type || 'post_cards' === FusionApp.data.fusion_element_type; // The way it is setup now, we dont want blank page template on library items. if ( columnEdit && '[fusion_builder_blank_page][/fusion_builder_blank_page]' === content ) { content = openColumn + closeColumn; contentIsEmpty = false; } if ( ! contentIsEmpty ) { // Editing element if ( 'elements' === FusionApp.data.fusion_element_type ) { content = openContainer + openColumn + content + closeColumn + closeContainer; } else if ( 'columns' === FusionApp.data.fusion_element_type || 'post_cards' === FusionApp.data.fusion_element_type ) { content = openContainer + content + closeContainer; } } // If library element is blank if ( '' === content && 'elements' === FusionApp.data.fusion_element_type ) { content = openContainer + openColumn + closeColumn + closeContainer; } function replaceDollars() { return '$$'; } content = content.replace( /$$/g, replaceDollars ); return content; }, /** * Convert library content to shortcodes. * * @since 2.0.0 * @return {void} */ libraryBuilderToShortcodes: function() { var shortcode = '', cid, view, element; // Editing an element. if ( 'elements' === FusionApp.data.fusion_element_type ) { // Inner row. element = this.$el.find( '.fusion-builder-column-outer .fusion_builder_row_inner' ); if ( element.length ) { cid = element.data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getInnerRowContent(); // Regular element. } else if ( this.$el.find( '.fusion-builder-live-element' ).length ) { element = this.$el.find( '.fusion-builder-live-element' ); shortcode = FusionPageBuilderApp.generateElementShortcode( this.$el.find( '.fusion-builder-live-element' ), false ); } if ( element.length ) { this.$el.find( '.fusion-builder-column .fusion-builder-add-element' ).hide(); } // Editing a column. } else if ( 'columns' === FusionApp.data.fusion_element_type || 'post_cards' === FusionApp.data.fusion_element_type ) { element = this.$el.find( '.fusion-builder-column-outer' ); if ( element.length ) { cid = element.data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getColumnContent(); } // Editing a container. } else if ( 'sections' === FusionApp.data.fusion_element_type ) { element = this.$el.find( '.fusion-builder-container' ); if ( element.length ) { cid = element.data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getContent(); } } FusionApp.setPost( 'post_content', shortcode ); }, /** * Build the initial layout for the builder. * * @since 2.0.0 * @param {Object} data - The data. * @param {Object} data.fusionGlobalManager - The FusionPageBuilder.Global object. * @param {string} data.postContent - The post-content. * @return {void} */ initialBuilderLayout: function( data ) { var self = this; // Clear all views FusionPageBuilderViewManager.removeViews(); this.postContent = data.postDetails.post_content; this.postID = data.postDetails.post_id; // Add data for exta shortcodes. self.updateData( data ); setTimeout( function() { var content = self.postContent, contentErrorMarkup = '', contentErrorTitle = '', moreDetails = fusionBuilderText.unknown_error_link; try { self.setGlobalStyles( '', true ); content = self.convertGalleryElement( content ); if ( ! FusionApp.data.is_fusion_element ) { content = self.validateContent( content ); } else { content = self.validateLibraryContent( content ); } self.shortcodesToBuilder( content ); // Add data for exta shortcodes. self.updateData( data ); setTimeout( function() { self.scrollingContainers(); self.reRenderElements = true; self.maybeFormStyles(); self.maybeOfCanvasStyles(); if ( 0 < FusionPageBuilderViewManager.countElementsByType( 'fusion_builder_next_page' ) ) { FusionEvents.trigger( 'fusion-next-page' ); } self.loaded = true; FusionEvents.trigger( 'fusion-builder-loaded' ); }, 100 ); } catch ( error ) { console.log( error ); // jshint ignore:line if ( 'undefined' !== error.name && 'ContentException' === error.name ) { contentErrorTitle = fusionBuilderText.content_error_title; contentErrorMarkup = jQuery( '<div>' + fusionBuilderText.content_error_description + '</div>' ); } else { contentErrorTitle = fusionBuilderText.unknown_error_title; // If we have full stack use that rather than external link. if ( 'string' === typeof error.stack ) { moreDetails = '<a href="#" class="copy-full-description">' + fusionBuilderText.unknown_error_copy + '</a>'; } contentErrorMarkup = jQuery( '<div>' + error + '<p>' + moreDetails + '</p></div>' ); } contentErrorMarkup.dialog( { title: contentErrorTitle, dialogClass: 'fusion-builder-dialog fusion-builder-error-dialog fusion-builder-settings-dialog', autoOpen: true, modal: true, width: 400, open: function() { if ( jQuery( this ).find( '.copy-full-description' ).length ) { jQuery( this ).find( '.copy-full-description' ).on( 'click', function( event ) { var $temp = jQuery( '<textarea>' ), errorText = ''; if ( 'string' === typeof error.message ) { errorText += error.message + '\n'; } if ( 'string' === typeof error.stack ) { errorText += error.stack; } event.preventDefault(); jQuery( this ).after( $temp ); $temp.val( errorText ).focus().select(); document.execCommand( 'copy' ); $temp.remove(); jQuery( this ).html( '<i class="fusiona-check" aria-hidden="true"></i> ' + fusionBuilderText.unknown_error_copied ); } ); } }, create: function( event, ui ) { // Add Title. jQuery( this ).siblings().find( 'span.ui-dialog-title' ).prepend( '<span class="icon type-warning"><i class="fusiona-exclamation" aria-hidden="true"></i></span>' ); }, close: function() {} // eslint-disable-line no-empty-function } ); // Remove all views. self.fusionBuilderReset(); } }, 50 ); // TODO - are the checks here necessary? I don't see any data.fusionGlobalManager. window.fusionGlobalManager = 'undefined' !== typeof data.fusionGlobalManager && false !== data.fusionGlobalManager ? data.fusionGlobalManager : new FusionPageBuilder.Globals( ); // jshint ignore: line }, FBException: function( message, name ) { this.message = message; this.name = name; }, validateContent: function( content ) { var contentIsEmpty = '' === content, textNodes = '', columns = [], containers = [], shortcodeTags, columnwrapped, insertionFlag; // Content clean up. content = content.replace( /\r?\n/g, '\r\n' ); content = content.replace( /<p>\[/g, '[' ); content = content.replace( /\]<\/p>/g, ']' ); if ( 'undefined' !== typeof content ) { content = content.trim(); } // Throw exception with the fullwidth shortcode. if ( -1 !== content.indexOf( '[fullwidth' ) ) { throw new this.FBException( 'Avada 4.0.3 or earlier fullwidth container used!', 'ContentException' ); } if ( ! contentIsEmpty ) { // Fixes [fusion_text /] instances, which were created in 5.0.1 for empty text blocks. content = content.replace( /\[fusion\_text \/\]/g, '[fusion_text][/fusion_text]' ).replace( /\[\/fusion\_text\]\[\/fusion\_text\]/g, '[/fusion_text]' ); content = content.replace( /\$\$/g, '$$' ); textNodes = content; // Add container if missing. textNodes = wp.shortcode.replace( 'fusion_builder_container', textNodes, function() { return '@|@'; } ); textNodes = wp.shortcode.replace( 'fusion_builder_next_page', textNodes, function() { return '@|@'; } ); textNodes = wp.shortcode.replace( 'fusion_woo_checkout_form', textNodes, function() { return '@|@'; } ); textNodes = textNodes.trim().split( '@|@' ); _.each( textNodes, function( textNodes ) { if ( '' !== textNodes.trim() ) { content = content.replace( textNodes, '[fusion_builder_container type="flex" hundred_percent="no" equal_height_columns="no" menu_anchor="" hide_on_mobile="small-visibility,medium-visibility,large-visibility" class="" id="" background_color="" background_image="" background_position="center center" background_repeat="no-repeat" fade="no" background_parallax="none" parallax_speed="0.3" video_mp4="" video_webm="" video_ogv="" video_url="" video_aspect_ratio="16:9" video_loop="yes" video_mute="yes" overlay_color="" overlay_opacity="0.5" video_preview_image="" border_size="" border_color="" border_style="solid" padding_top="" padding_bottom="" padding_left="" padding_right=""][fusion_builder_row]' + textNodes + '[/fusion_builder_row][/fusion_builder_container]' ); } } ); textNodes = wp.shortcode.replace( 'fusion_builder_container', content, function( tag ) { containers.push( tag.content ); } ); _.each( containers, function( textNodes ) { // Add column if missing. textNodes = wp.shortcode.replace( 'fusion_builder_row', textNodes, function( tag ) { return tag.content; } ); textNodes = wp.shortcode.replace( 'fusion_builder_column', textNodes, function() { return '@|@'; } ); textNodes = textNodes.trim().split( '@|@' ); _.each( textNodes, function( textNodes ) { if ( '' !== textNodes.trim() && '[fusion_builder_row][/fusion_builder_row]' !== textNodes.trim() ) { columnwrapped = '[fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" border_position="all" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="small-visibility,medium-visibility,large-visibility" center_content="no" last="no" min_height="" hover_type="none" link=""]' + textNodes + '[/fusion_builder_column]'; content = content.replace( textNodes, columnwrapped ); } } ); } ); textNodes = wp.shortcode.replace( 'fusion_builder_column_inner', content, function( tag ) { columns.push( tag.content ); } ); textNodes = wp.shortcode.replace( 'fusion_builder_column', content, function( tag ) { columns.push( tag.content ); } ); _.each( columns, function( textNodes ) { // Wrap non fusion elements. shortcodeTags = fusionAllElements; _.each( shortcodeTags, function( shortcode ) { if ( 'undefined' === typeof shortcode.generator_only ) { textNodes = wp.shortcode.replace( shortcode.shortcode, textNodes, function() { return '@|@'; } ); } } ); textNodes = textNodes.trim().split( '@|@' ); _.each( textNodes, function( textNodes ) { if ( '' !== textNodes.trim() ) { insertionFlag = '@=%~@'; if ( '@' === textNodes.slice( -1 ) ) { insertionFlag = '#=%~#'; } content = content.replace( textNodes, '[fusion_text]' + textNodes.slice( 0, -1 ) + insertionFlag + textNodes.slice( -1 ) + '[/fusion_text]' ); } } ); } ); content = content.replace( /@=%~@/g, '' ).replace( /#=%~#/g, '' ); // Check for once deactivated elements in text blocks that are active again. content = wp.shortcode.replace( 'fusion_text', content, function( tag ) { shortcodeTags = fusionAllElements; textNodes = tag.content; _.each( shortcodeTags, function( shortcode ) { if ( 'undefined' === typeof shortcode.generator_only ) { textNodes = wp.shortcode.replace( shortcode.shortcode, textNodes, function() { return '|'; } ); } } ); if ( ! textNodes.replace( /\|/g, '' ).length ) { return tag.content; } } ); } function replaceDollars() { return '$$'; } content = content.replace( /$$/g, replaceDollars ); return content; }, /** * Regex for shortcodes * * @since 2.0.0 * @param {string} tag - The element. * @returns {mixed} */ regExpShortcode: _.memoize( function( tag ) { return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' ); } ), findShortcodeMatches: function( content, match ) { var shortcodeMatches, shortcodeRegExp; if ( _.isObject( content ) ) { content = content.value; } shortcodeMatches = ''; content = 'undefined' !== typeof content ? content : ''; shortcodeRegExp = window.wp.shortcode.regexp( match ); if ( 'undefined' !== typeof content && '' !== content ) { shortcodeMatches = content.match( shortcodeRegExp ); } return shortcodeMatches; }, /** * Reset the builder. * * @since 2.0.0 * @return {void} */ fusionBuilderReset: function() { // Clear all models and views FusionPageBuilderElements.reset( {} ); this.collection.reset( {} ); FusionPageBuilderViewManager.clear(); // Clear layout this.$el.find( '#fusion_builder_container' ).html( '' ); FusionEvents.trigger( 'fusion-builder-reset' ); }, /** * Clears the layout. * * @since 2.0.0 * @param {Object} event - The jQuery event. * @return {void} */ clearLayout: function( event ) { if ( event ) { event.preventDefault(); } if ( '[fusion_builder_blank_page][/fusion_builder_blank_page]' !== this.postContent ) { this.blankPage = true; this.clearBuilderLayout( true ); } }, /** * Trigger context menu. * * @since 2.0.0 * @param {Object} event - The jQuery event. * @return {void} */ contextMenu: function( event ) { var self = this, $clickTarget = jQuery( event.target ), $target = $clickTarget.closest( '[data-cid]' ), inlineElement = $clickTarget.hasClass( 'fusion-disable-editing' ) || $clickTarget.parents( '.fusion-disable-editing' ).length, shortcodeId, view, viewSettings, model, elementType; // Remove any existing. this.removeContextMenu(); // Disable on blank template element. if ( $clickTarget.hasClass( 'fusion-builder-blank-page' ) || $clickTarget.parents( '.fusion-builder-blank-page' ).length ) { return; } // Disable on row. if ( $clickTarget.hasClass( 'fusion-builder-row-container' ) ) { $clickTarget = $clickTarget.closest( '.fusion-builder-container:not( .fusion-builder-row-container )' ); $target = $clickTarget; } // Disable context menu if right clicking on text block. if ( ! $target.length || ( 'fusion_text' === $target.data( 'type' ) && ! this.wireframeActive && ! $clickTarget.parents( '.fusion-builder-module-controls-container' ).length && ! inlineElement ) ) { return; } // If we are not editing nested columns element, but clicking on a child, only use the nested columns element. if ( ! jQuery( 'body' ).hasClass( 'nested-ui-active' ) && ! this.$el.hasClass( 'fusion-builder-nested-cols-dialog-open' ) && $clickTarget.closest( '.fusion_builder_row_inner' ).length ) { $target = $clickTarget.closest( '.fusion_builder_row_inner' ); } view = FusionPageBuilderViewManager.getView( $target.data( 'cid' ) ); elementType = this.getElementType( view.model.attributes.element_type ); switch ( FusionApp.data.fusion_element_type ) { case 'elements': if ( 'child_element' !== elementType && 'parent_element' !== elementType && 'element' !== elementType ) { return; } break; case 'columns': case 'post_cards': if ( 'fusion_builder_container' === elementType ) { return; } break; } if ( ! inlineElement ) { // This is not an inline element, things are simple. event.preventDefault(); viewSettings = { model: { parent: view.model, event: event, parentView: view } }; this.contextMenuView = new FusionPageBuilder.ContextMenuView( viewSettings ); } else { // This is an inline element, so we have to create the data and so checks. $target = $clickTarget.hasClass( 'fusion-disable-editing' ) ? $clickTarget : $clickTarget.parents( '.fusion-disable-editing' ).first(); // Disable on inline ajax shortcodes. if ( $target.hasClass( 'fusion-inline-ajax' ) ) { return; } shortcodeId = $target.data( 'id' ); model = view.model.inlineCollection.find( function( model ) { return model.get( 'cid' ) == shortcodeId; // jshint ignore: line } ); if ( 'undefined' !== typeof model ) { event.preventDefault(); model.event = event; model.$target = $target; model.parentView = view; viewSettings = { model: model }; this.contextMenuView = new FusionPageBuilder.ContextMenuInlineView( viewSettings ); } } // Check context menu is not undefined and is not false. if ( 'undefined' !== typeof this.contextMenuView && this.contextMenuView ) { // Add context menu to builder. this.$el.append( this.contextMenuView.render().el ); // Add listener to remove. this.$el.one( 'click', function() { self.removeContextMenu(); } ); } }, /** * Remove any contextMenu. * * @since 2.0.0 * @return {void} */ removeContextMenu: function() { if ( this.contextMenuView && 'function' === typeof this.contextMenuView.removeMenu ) { this.contextMenuView.removeMenu(); } }, /** * Shows saved elements. * * @since 2.0.0 * @param {string} elementType - The element-type. * @param {Object} container - The jQuery element of the container. * @return {void} */ showSavedElements: function( elementType, container ) { var data = jQuery( '#fusion-builder-layouts-' + elementType ).find( '.fusion-page-layouts' ).clone(), spacers = '<li class="spacer fusion-builder-element"></li><li class="spacer fusion-builder-element"></li><li class="spacer fusion-builder-element"></li><li class="spacer fusion-builder-element"></li>', postId; data.find( 'li' ).each( function() { postId = jQuery( this ).find( '.fusion-builder-demo-button-load' ).attr( 'data-post-id' ); jQuery( this ).find( '.fusion-layout-buttons' ).remove(); jQuery( this ).find( 'h4' ).attr( 'class', 'fusion_module_title' ); jQuery( this ).attr( 'data-layout_id', postId ); jQuery( this ).addClass( 'fusion_builder_custom_' + elementType + '_load' ); if ( '' !== jQuery( this ).attr( 'data-layout_type' ) ) { jQuery( this ).addClass( 'fusion-element-type-' + jQuery( this ).attr( 'data-layout_type' ) ); } } ); container.append( '<div id="fusion-loader"><span class="fusion-builder-loader"></span></div>' ); container.append( '<ul class="fusion-builder-all-modules fusion-builder-library-list fusion-builder-library-list-' + elementType + '">' + data.html() + spacers + '</div>' ); }, /** * Renders the content, converting all shortcodes and loading their templates. * * @since 2.0.0 * @param {string} content - The content we want to convert & render. * @param {number} cid - A Unique ID. * @return {string} The content. */ renderContent: function( content, cid, parent ) { var shortcodes, self = this, elParent = 'undefined' === typeof parent ? false : parent, ajaxShortcodes = [], insideInlineEditor, hasFusionClients = false; parent = FusionPageBuilderViewManager.getView( cid ); if ( parent && 'function' === typeof parent.filterRenderContent ) { content = parent.filterRenderContent( content ); } // If no signs of a shortcode return early, avoid any unnecessary checks. if ( 'undefined' === typeof content ) { return ''; } if ( -1 === content.indexOf( '[' ) ) { return content; } if ( 'undefined' !== typeof parent ) { // Reset inlines collection parent.model.inlineCollection.reset(); // Check if shortcode allows generator insideInlineEditor = this.inlineEditorHelpers.inlineEditorAllowed( parent.model.get( 'element_type' ) ); } shortcodes = this.shortcodesToBuilder( content, false, false, true ); _.each( shortcodes, function( shortcode ) { var markupContent, newModel, newViewOutput; // Check for deprecated shortcode if ( 'fusion_clients' === shortcode.settings.element_type ) { hasFusionClients = true; } if ( -1 !== jQuery.inArray( shortcode.settings.element_type, FusionPageBuilderApp.inlineElements ) ) { // Create new model shortcode.settings.cid = FusionPageBuilderViewManager.generateCid(); shortcode.settings.parent = cid; shortcode.settings.inlineElement = shortcode.content; newModel = new FusionPageBuilder.Element( shortcode.settings ); parent.model.inlineCollection.add( newModel ); newViewOutput = self.inlineEditorHelpers.getInlineElementMarkup( newModel ); if ( insideInlineEditor ) { content = content.replace( shortcode.content, '<span class="fusion-disable-editing fusion-inline-element" contenteditable="false" data-id="' + shortcode.settings.cid + '">' + newViewOutput + '</span>' ); } else { content = content.replace( shortcode.content, newViewOutput ); } } else { markupContent = FusionPageBuilderApp.extraShortcodes.byShortcode( shortcode.content ); if ( 'undefined' === typeof markupContent ) { ajaxShortcodes.push( shortcode.content ); } else if ( insideInlineEditor ) { content = content.replace( shortcode.content, self.inlineEditorHelpers.getInlineHTML( markupContent.output, markupContent.id ) ); } else { content = content.replace( shortcode.content, markupContent.output ); } } } ); if ( ajaxShortcodes.length ) { content = self.ajaxRenderShortcode( cid, content, elParent, ajaxShortcodes ); } content = FusionApp.removeScripts( content, cid ); setTimeout( function() { FusionApp.injectScripts( cid ); if ( hasFusionClients ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_images', cid ); } }, 200 ); if ( 'undefined' !== content ) { return content; } return '<div id="fusion-loader"><span class="fusion-builder-loader"></span></div>'; }, ajaxRenderShortcode: function( cid, content, elParent, ajaxShortcodes ) { var model, modelcid, markup; // If content is identical to another request we do not want to loop ajax. if ( -1 !== this.ajaxContentRequests.indexOf( content ) ) { modelcid = 'undefined' !== typeof elParent && elParent ? elParent : cid; model = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == modelcid; // jshint ignore: line } ); markup = 'undefined' !== typeof model ? model.get( 'markup' ) : false; // Collect views that need to be re-rendered this.viewsToRerender.push( cid ); // Check for model markup being set. if ( markup ) { return markup.output; } // Just return unchanged. return content; } // If cid is the same debounce, otherwise do not. if ( cid === this.lastAjaxCid ) { this._fusion_do_shortcode( cid, content, elParent, ajaxShortcodes ); } else { FusionApp.callback.fusion_do_shortcode( cid, content, elParent, ajaxShortcodes ); } this.ajaxContentRequests.push( content ); this.lastAjaxCid = cid; }, addPlaceholder: function( content, output ) { var atts, notice; // Add placeholder if no option is selected. if ( -1 !== content.indexOf( 'rev_slider' ) ) { atts = content.match( /\[rev_slider .*?alias\=\"(.*?)\".*?\]/ ); notice = fusionBuilderText.slider_placeholder; } else if ( -1 !== content.indexOf( 'layerslider' ) ) { atts = content.match( /\[layerslider .*?id\=\"(.*?)\".*?\]/ ); notice = fusionBuilderText.slider_placeholder; } else if ( -1 !== content.indexOf( 'contact-form-7' ) ) { atts = content.match( /\[contact-form-7 .*?id\=\"(.*?)\".*?\]/ ); notice = fusionBuilderText.form_placeholder; } else if ( -1 !== content.indexOf( 'gravityform' ) ) { atts = content.match( /\[gravityform .*?id\=\"(.*?)\".*?\]/ ); notice = fusionBuilderText.form_placeholder; } if ( 'undefined' !== typeof atts && atts && ( '0' === atts[ 1 ] || '' === atts[ 1 ] ) ) { output = '<div class="fusion-builder-placeholder">' + notice + '</div>'; } return output; }, /** * Get the shortcode structure from HTML. * * @since 2.0.0 * @param {string} content - The content we want to convert & render. * @param {number} cid - A Unique ID. * @return {string} The content. */ htmlToShortcode: function( content, cid ) { // jshint ignore:line var $content = jQuery( '<div>' + content + '</div>' ), self = this; $content.find( '.fusion-disable-editing' ).each( function() { var shortcodeId = jQuery( this ).data( 'id' ), shortcodeContent, shortCode, parent, model; if ( jQuery( this ).hasClass( 'fusion-inline-ajax' ) ) { shortcodeContent = FusionPageBuilderApp.extraShortcodes.byId( shortcodeId ); shortCode = shortcodeContent.shortcode; } else { parent = FusionPageBuilderViewManager.getView( cid ); model = parent.model.inlineCollection.find( function( model ) { return model.get( 'cid' ) == shortcodeId; // jshint ignore: line } ); shortCode = model.get( 'inlineElement' ); } if ( 'undefined' === typeof shortCode ) { alert( 'Problem encountered. This content cannot be live edited.' ); // eslint-disable-line no-alert } else { jQuery( this ).replaceWith( shortCode ); } } ); $content.find( '[data-inline-shortcode]' ).each( function() { var shortcodeType = jQuery( this ).data( 'element' ), shortcodeContent = jQuery( this ).html(), defaultParams, multi, type, params, elementSettings, elementModel, elementShortcode; if ( shortcodeType in fusionAllElements ) { defaultParams = fusionAllElements[ shortcodeType ].params; multi = fusionAllElements[ shortcodeType ].multi; type = fusionAllElements[ shortcodeType ].shortcode; } else { defaultParams = ''; multi = ''; type = ''; } params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { params[ param.param_name ] = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; } ); // Used as a flag for opening on first render. params.open_settings = 'true'; params.element_content = shortcodeContent; elementSettings = { type: 'element', added: 'manually', element_type: type, params: params, parent: cid, multi: multi }; elementModel = new FusionPageBuilder.Element( elementSettings ); elementShortcode = self.generateElementShortcode( elementModel, false, true ); jQuery( this ).replaceWith( elementShortcode ); } ); return $content.html(); }, renderElement: function( shortcodeType, shortcodeArgs, shortcodeContent, parentCID ) { var defaultParams, params, multi, type, elementSettings, elementModel, elementShortcode, generatedViewSettings, markup, generatedView; if ( 'undefined' === typeof shortcodeType ) { return ''; } if ( shortcodeType in fusionAllElements ) { defaultParams = fusionAllElements[ shortcodeType ].params; type = fusionAllElements[ shortcodeType ].shortcode; } params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { params[ param.param_name ] = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; } ); // Process args passing in. if ( 'object' === typeof shortcodeArgs ) { _.each( shortcodeArgs, function( value, param_name ) { params[ param_name ] = value; } ); } // Used as a flag for opening on first render. params.open_settings = 'false'; // Add content if passed in. params.element_content = 'string' === typeof shortcodeContent ? shortcodeContent : ''; elementSettings = { type: 'element', added: 'manually', element_type: type, params: params, parent: parentCID }; elementModel = new FusionPageBuilder.Element( elementSettings ); generatedViewSettings = { model: elementModel }; generatedView = new FusionPageBuilder[ elementModel.get( 'element_type' ) ]( generatedViewSettings ); markup = generatedView.getTemplate(); generatedView.remove(); return markup; }, /** * Convert shortcodes for the builder. * * @since 2.0.0 * @param {string} content - The content. * @param {number} parentCID - The parent CID. * @param {string} childShortcode - The shortcode. * @param {boolean} noCollection - To collect or not collect. * @param {string} targetEl - If we want to add in relation to a specific element. * @param {string} targetPosition - Whether we want to be before or after specific element. * @return {string|null} */ shortcodesToBuilder: function( content, parentCID, childShortcode, noCollection, targetEl, targetPosition ) { var thisEl, regExp, innerRegExp, matches, shortcodeTags, renderElements = []; noCollection = ( 'undefined' !== typeof noCollection && true === noCollection ); // Show blank page layout if ( '' === content && ! this.$el.find( '.fusion-builder-blank-page-content' ).length ) { this.blankPage = true; // TODO: add fix for new blank library element this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' ); jQuery( '.fusion-builder-live' ).addClass( 'fusion-builder-blank-page-active' ); if ( false === FusionApp.initialData.samePage && 'undefined' !== typeof FusionApp.sidebarView.openOption ) { FusionApp.sidebarView.openOption( 'post_title', 'po' ); } return; } jQuery( '.fusion-builder-live' ).removeClass( 'fusion-builder-blank-page-active' ); thisEl = this; shortcodeTags = _.keys( fusionAllElements ).join( '|' ); // TEMP. Example of non FB shortcode, used for the renderContent function. // TODO: Add a new function for finding shortcodes instead of hijacking shortcodesToBuilder. if ( noCollection && 'undefined' !== typeof fusionVendorShortcodes ) { shortcodeTags += '|' + _.keys( fusionVendorShortcodes ).join( '|' ); } regExp = window.wp.shortcode.regexp( shortcodeTags ); innerRegExp = this.regExpShortcode( shortcodeTags ); matches = content.match( regExp ); _.each( matches, function( shortcode ) { var shortcodeElement = shortcode.match( innerRegExp ), shortcodeName = shortcodeElement[ 2 ], shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : '', shortcodeContent = 'undefined' !== typeof shortcodeElement[ 5 ] ? shortcodeElement[ 5 ] : '', elementCID = ( ! noCollection ) ? FusionPageBuilderViewManager.generateCid() : '', prefixedAttributes = { params: ( {} ) }, elementSettings, key, prefixedKey, dependencyOption, dependencyOptionValue, elementContent, alpha, paging, markupContent, values, atIndex, buttonPrefix, textType, fontFamily, fontVariant, elementFonts, // Check for shortcodes inside shortcode content shortcodesInContent = 'undefined' !== typeof shortcodeContent && '' !== shortcodeContent && shortcodeContent.match( regExp ), // Check if shortcode allows generator allowGenerator = 'undefined' !== typeof fusionAllElements[ shortcodeName ] && 'undefined' !== typeof fusionAllElements[ shortcodeName ].allow_generator ? fusionAllElements[ shortcodeName ].allow_generator : ''; elementSettings = { type: shortcodeName, element_type: shortcodeName, cid: elementCID, created: 'manually', multi: '', params: {}, container: false, allow_generator: allowGenerator, inline_editor: thisEl.inlineEditorHelpers.inlineEditorAllowed( shortcodeName ) }; // Get markup from map if set. Add further checks here so only necessary elements do this check. if ( -1 === shortcodeName.indexOf( 'fusion_builder_' ) ) { markupContent = FusionPageBuilderApp.extraShortcodes.byShortcode( shortcodeElement[ 0 ] ); if ( 'undefined' !== typeof markupContent ) { elementSettings.markup = markupContent; } else { elementSettings.shortcode = shortcodeElement[ 0 ]; } } if ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_row' === shortcodeName || 'fusion_builder_row_inner' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName || 'fusion_builder_inline' === shortcodeName ) { elementSettings.container = true; } if ( 'fusion_builder_container' !== shortcodeName || 'fusion_builder_next_page' !== shortcodeName || 'fusion_woo_checkout_form' !== shortcodeName ) { elementSettings.parent = parentCID; } if ( 'undefined' !== typeof targetEl && targetEl ) { atIndex = FusionPageBuilderApp.getCollectionIndex( targetEl ); if ( 'undefined' !== typeof targetPosition && 'before' === targetPosition ) { atIndex = atIndex - 1; } elementSettings.targetElement = targetEl; elementSettings.at_index = atIndex; } if ( 'undefined' !== typeof targetPosition && targetPosition ) { elementSettings.targetElementPosition = targetPosition; } if ( false === elementSettings.container && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName ) { if ( -1 !== shortcodeName.indexOf( 'fusion_' ) || -1 !== shortcodeName.indexOf( 'layerslider' ) || -1 !== shortcodeName.indexOf( 'rev_slider' ) || 'undefined' !== typeof fusionAllElements[ shortcodeName ] ) { elementSettings.type = 'element'; } } if ( 'fusion_builder_blank_page' === shortcodeName ) { elementSettings.type = 'fusion_builder_blank_page'; } if ( 'fusion_tb_meta' === shortcodeName ) { // Border sizes. if ( ( 'undefined' === typeof shortcodeAttributes.named.border_top || 'undefined' === typeof shortcodeAttributes.named.border_bottom || 'undefined' === typeof shortcodeAttributes.named.border_left || 'undefined' === typeof shortcodeAttributes.named.border_right ) && 'string' === typeof shortcodeAttributes.named.border_size ) { shortcodeAttributes.named.border_top = shortcodeAttributes.named.border_size + 'px'; shortcodeAttributes.named.border_bottom = shortcodeAttributes.named.border_size + 'px'; } delete shortcodeAttributes.named.border_size; } if ( _.isObject( shortcodeAttributes.named ) ) { for ( key in shortcodeAttributes.named ) { prefixedKey = key; prefixedAttributes.params[ prefixedKey ] = shortcodeAttributes.named[ key ]; if ( 'fusion_products_slider' === shortcodeName && 'cat_slug' === key ) { prefixedAttributes.params.cat_slug = shortcodeAttributes.named[ key ].replace( /\|/g, ',' ); } if ( 'gradient_colors' === key ) { delete prefixedAttributes.params[ prefixedKey ]; if ( -1 !== shortcodeAttributes.named[ key ].indexOf( '|' ) ) { prefixedAttributes.params.button_gradient_top_color = shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' ); prefixedAttributes.params.button_gradient_bottom_color = shortcodeAttributes.named[ key ].split( '|' )[ 1 ] ? shortcodeAttributes.named[ key ].split( '|' )[ 1 ].replace( 'transparent', 'rgba(255,255,255,0)' ) : shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' ); } else { prefixedAttributes.params.button_gradient_bottom_color = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' ); prefixedAttributes.params.button_gradient_top_color = prefixedAttributes.params.button_gradient_bottom_color; } } if ( 'gradient_hover_colors' === key ) { delete prefixedAttributes.params[ prefixedKey ]; if ( -1 !== shortcodeAttributes.named[ key ].indexOf( '|' ) ) { prefixedAttributes.params.button_gradient_top_color_hover = shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' ); prefixedAttributes.params.button_gradient_bottom_color_hover = shortcodeAttributes.named[ key ].split( '|' )[ 1 ] ? shortcodeAttributes.named[ key ].split( '|' )[ 1 ].replace( 'transparent', 'rgba(255,255,255,0)' ) : shortcodeAttributes.named[ key ].split( '|' )[ 0 ].replace( 'transparent', 'rgba(255,255,255,0)' ); } else { prefixedAttributes.params.button_gradient_bottom_color_hover = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' ); prefixedAttributes.params.button_gradient_top_color_hover = prefixedAttributes.params.button_gradient_bottom_color_hover; } } if ( 'overlay_color' === key && '' !== shortcodeAttributes.named[ key ] && 'fusion_builder_container' === shortcodeName ) { delete prefixedAttributes.params[ prefixedKey ]; alpha = ( 'undefined' !== typeof shortcodeAttributes.named.overlay_opacity ) ? shortcodeAttributes.named.overlay_opacity : 1; prefixedAttributes.params.background_color = jQuery.AWB_Color( shortcodeAttributes.named[ key ] ).alpha( alpha ).toRgbaString(); } if ( 'overlay_opacity' === key ) { delete prefixedAttributes.params[ prefixedKey ]; } if ( 'scrolling' === key && 'fusion_blog' === shortcodeName ) { delete prefixedAttributes.params.paging; paging = ( 'undefined' !== typeof shortcodeAttributes.named.paging ) ? shortcodeAttributes.named.paging : ''; if ( 'no' === paging && 'pagination' === shortcodeAttributes.named.scrolling ) { prefixedAttributes.params.scrolling = 'no'; } } // The grid-with-text layout was removed in Avada 5.2, so layout has to // be converted to grid. And boxed_layout was replaced by new text_layout. if ( 'fusion_portfolio' === shortcodeName ) { if ( 'layout' === key ) { if ( 'grid' === shortcodeAttributes.named[ key ] && shortcodeAttributes.named.hasOwnProperty( 'boxed_text' ) ) { shortcodeAttributes.named.boxed_text = 'no_text'; } else if ( 'grid-with-text' === shortcodeAttributes.named[ key ] ) { prefixedAttributes.params[ key ] = 'grid'; } } if ( 'boxed_text' === key ) { prefixedAttributes.params.text_layout = shortcodeAttributes.named[ key ]; delete prefixedAttributes.params[ key ]; } if ( 'content_length' === key && 'full-content' === shortcodeAttributes.named[ key ] ) { prefixedAttributes.params[ key ] = 'full_content'; } } // Make sure the background hover color is set to border color, if it does not exist already. if ( 'fusion_pricing_table' === shortcodeName ) { if ( 'backgroundcolor' === key && ! shortcodeAttributes.named.hasOwnProperty( 'background_color_hover' ) ) { prefixedAttributes.params.background_color_hover = shortcodeAttributes.named.bordercolor; } } if ( 'padding' === key && ( 'fusion_widget_area' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) ) { values = shortcodeAttributes.named[ key ].split( ' ' ); if ( 1 === values.length ) { prefixedAttributes.params.padding_top = values[ 0 ]; prefixedAttributes.params.padding_right = values[ 0 ]; prefixedAttributes.params.padding_bottom = values[ 0 ]; prefixedAttributes.params.padding_left = values[ 0 ]; } if ( 2 === values.length ) { prefixedAttributes.params.padding_top = values[ 0 ]; prefixedAttributes.params.padding_right = values[ 1 ]; prefixedAttributes.params.padding_bottom = values[ 0 ]; prefixedAttributes.params.padding_left = values[ 1 ]; } if ( 3 === values.length ) { prefixedAttributes.params.padding_top = values[ 0 ]; prefixedAttributes.params.padding_right = values[ 1 ]; prefixedAttributes.params.padding_bottom = values[ 2 ]; prefixedAttributes.params.padding_left = values[ 1 ]; } if ( 4 === values.length ) { prefixedAttributes.params.padding_top = values[ 0 ]; prefixedAttributes.params.padding_right = values[ 1 ]; prefixedAttributes.params.padding_bottom = values[ 2 ]; prefixedAttributes.params.padding_left = values[ 3 ]; } delete prefixedAttributes.params[ key ]; } } // Fix old values of image_width in content boxes and flip boxes and children. if ( 'fusion_content_boxes' === shortcodeName || 'fusion_flip_boxes' === shortcodeName ) { if ( 'undefined' !== typeof shortcodeAttributes.named.image_width ) { prefixedAttributes.params.image_max_width = shortcodeAttributes.named.image_width; } shortcodeContent = shortcodeContent.replace( /image_width/g, 'image_max_width' ); } if ( 'fusion_button' === shortcodeName || 'fusion_tagline_box' === shortcodeName ) { buttonPrefix = 'fusion_tagline_box' === shortcodeName ? 'button_' : ''; // Ensures backwards compatibility for button shape. if ( 'undefined' !== typeof shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) { if ( 'square' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) { prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '0'; } else if ( 'round' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) { prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '2'; if ( '3d' === shortcodeAttributes.named.type ) { prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '4'; } } else if ( 'pill' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) { prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = '25'; } else if ( '' === shortcodeAttributes.named[ buttonPrefix + 'shape' ] ) { prefixedAttributes.params[ buttonPrefix + 'border_radius' ] = ''; } delete prefixedAttributes.params[ buttonPrefix + 'shape' ]; } } if ( 'fusion_button' === shortcodeName ) { // Ensures backwards compatibility for button border color. if ( 'undefined' === typeof shortcodeAttributes.named.border_color && 'undefined' !== typeof shortcodeAttributes.named.accent_color && '' !== shortcodeAttributes.named.accent_color ) { prefixedAttributes.params.border_color = shortcodeAttributes.named.accent_color; } if ( 'undefined' === typeof shortcodeAttributes.named.border_hover_color && 'undefined' !== typeof shortcodeAttributes.named.accent_hover_color && '' !== shortcodeAttributes.named.accent_hover_color ) { prefixedAttributes.params.border_hover_color = shortcodeAttributes.named.accent_hover_color; } } elementSettings = _.extend( elementSettings, prefixedAttributes ); } if ( ! shortcodesInContent ) { elementSettings.params.element_content = shortcodeContent; } // Add contents to row element_content. Used for working out data. if ( 'fusion_builder_row' === shortcodeName || 'fusion_builder_row_inner' === shortcodeName || 'fusion_builder_inline' === shortcodeName ) { elementSettings.element_content = shortcodeContent; } if ( 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) { elementSettings.column_shortcode = shortcodeElement[ 0 ]; } // Compare shortcode name to multi elements object / array if ( shortcodeName in fusionMultiElements ) { elementSettings.multi = 'multi_element_parent'; thisEl.checkChildUI( shortcodeName, elementSettings ); } // Set content for elements with dependency options if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ] && 'undefined' !== typeof fusionAllElements[ shortcodeName ].option_dependency ) { dependencyOption = fusionAllElements[ shortcodeName ].option_dependency; dependencyOptionValue = prefixedAttributes.params[ dependencyOption ]; elementContent = prefixedAttributes.params.element_content; prefixedAttributes.params[ dependencyOptionValue ] = elementContent; } if ( shortcodesInContent ) { if ( false === elementSettings.container && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName ) { elementSettings.params.element_content = shortcodeContent; } } // Check if child element. if ( 'undefined' !== typeof childShortcode && shortcodeName === childShortcode ) { elementSettings.multi = 'multi_element_child'; // Checks if map has set selectors. If so needs to be set prior to render. if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].selectors ) { elementSettings.selectors = jQuery.extend( true, {}, fusionAllElements[ shortcodeName ].selectors ); } } // Legacy checklist integration. if ( 'fusion_checklist' === shortcodeName && 'undefined' !== typeof elementSettings.params.element_content && -1 !== elementSettings.params.element_content.indexOf( '<li>' ) && -1 === elementSettings.params.element_content.indexOf( '[fusion_li_item' ) ) { elementSettings.params.element_content = elementSettings.params.element_content.replace( /<ul>/g, '' ); elementSettings.params.element_content = elementSettings.params.element_content.replace( /<\/ul>/g, '' ); elementSettings.params.element_content = elementSettings.params.element_content.replace( /<li>/g, '[fusion_li_item]' ); elementSettings.params.element_content = elementSettings.params.element_content.replace( /<\/li>/, '[/fusion_li_item]' ); } if ( ! noCollection ) { if ( 'multi_element_child' !== elementSettings.multi ) { thisEl.collection.add( [ elementSettings ] ); } } else { renderElements.push( { content: shortcodeElement[ 0 ], settings: elementSettings } ); } if ( true === FusionPageBuilderApp.layoutIsLoading && 'object' === typeof FusionPageBuilder.options.fusionTypographyField && 'object' === typeof fusionAllElements[ elementSettings.element_type ] ) { elementFonts = []; // Find typography options and then get values. _.each( fusionAllElements[ elementSettings.element_type ].params, function( optionParam ) { if ( 'font_family' === optionParam.type ) { // If we have a family value, add to array. if ( 'string' === typeof elementSettings.params[ 'fusion_font_family_' + optionParam.param_name ] && '' !== elementSettings.params[ 'fusion_font_family_' + optionParam.param_name ] ) { elementFonts.push( { family: elementSettings.params[ 'fusion_font_family_' + optionParam.param_name ], variant: elementSettings.params[ 'fusion_font_variant_' + optionParam.param_name ] } ); } } } ); if ( ! _.isEmpty( elementFonts ) ) { // If webfonts are not defined, init them and re-run this method. if ( ! FusionApp.assets.webfonts ) { jQuery.when( FusionApp.assets.getWebFonts() ).done( function() { _.each( elementFonts, function( font ) { FusionPageBuilder.options.fusionTypographyField.webFontLoad( font.family, font.variant, false ); } ); } ); return this; } _.each( elementFonts, function( font ) { FusionPageBuilder.options.fusionTypographyField.webFontLoad( font.family, font.variant, false ); } ); } } if ( shortcodesInContent ) { if ( shortcodeName in fusionMultiElements ) { // If this is a parent element, we pass this on to make sure children are proper children for that element. thisEl.shortcodesToBuilder( shortcodeContent, elementCID, fusionMultiElements[ shortcodeName ] ); } else if ( true === elementSettings.container ) { if ( ( 'fusion_builder_row_inner' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName || 'fusion_builder_inline' === shortcodeName ) && ! elementSettings.parent ) { thisEl.shortcodesToBuilder( shortcodeContent, false, false, true ); } else { thisEl.shortcodesToBuilder( shortcodeContent, elementCID ); } } } } ); if ( noCollection ) { return renderElements; } }, /** * Checks if map has set child_ui. If so child UI shows on parent element settings. * * @since 2.0.0 * @param {string} shortcodeName - Shortcode tag. * @param {Object} attributes - Element model attributes. * @return {void} */ checkChildUI: function( shortcodeName, attributes ) { if ( 'undefined' !== typeof fusionAllElements[ shortcodeName ].child_ui ) { attributes.child_ui = fusionAllElements[ shortcodeName ].child_ui; } }, /** * Add an element. * * @since 2.0.0 * @param {Object} element - The element we're adding. * @return {void} */ addBuilderElement: function( element ) { var view, self = this, viewSettings = { model: element, collection: FusionPageBuilderElements }, generatedView, generatedViewSettings, parentModel; switch ( element.get( 'type' ) ) { case 'fusion_builder_blank_page': if ( 'undefined' !== typeof FusionApp.data.postDetails.post_type && 'fusion_form' === FusionApp.data.postDetails.post_type ) { viewSettings.className = 'fusion-builder-blank-page'; view = new FusionPageBuilder.BlankFormView( viewSettings ); } else { view = new FusionPageBuilder.BlankPageView( viewSettings ); } FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'view' ) ) ) { element.get( 'view' ).$el.after( view.render().el ); } else { this.$el.find( '#fusion_builder_container' ).append( view.render().el ); } break; case 'fusion_builder_container': // Check custom container position if ( '' !== FusionPageBuilderApp.targetContainerCID ) { element.attributes.view = FusionPageBuilderViewManager.getView( FusionPageBuilderApp.targetContainerCID ); FusionPageBuilderApp.targetContainerCID = ''; } view = new FusionPageBuilder.ContainerView( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'view' ) ) ) { if ( 'undefined' === typeof element.get( 'targetElementPosition' ) || 'after' === element.get( 'targetElementPosition' ) ) { element.get( 'view' ).$el.after( view.render().el ); } else { element.get( 'view' ).$el.before( view.render().el ); } } else { this.$el.find( '#fusion_builder_container' ).append( view.render().el ); this.$el.find( '.fusion-builder-blank-page' ).remove(); } break; case 'element': case 'fusion_builder_column': case 'fusion_builder_column_inner': case 'fusion_builder_row_inner': self.addToChildCollection( element ); // TODO: check if ( 'fusion_builder_row_inner' === element.get( 'type' ) ) { if ( 'manually' === element.get( 'created' ) && 'row_inner' === element.get( 'element_type' ) ) { element.set( 'view', FusionPageBuilderViewManager.getView( element.get( 'parent' ) ), { silent: true } ); } } break; case 'fusion_builder_row': // Get element parent parentModel = this.collection.find( function( model ) { return model.get( 'cid' ) == element.get( 'parent' ); // jshint ignore:line } ); // Add child element to column's children collection parentModel.children.add( [ element ] ); break; case 'generated_element': // Ignore modals for columns inserted with generator if ( 'fusion_builder_column_inner' !== element.get( 'element_type' ) && 'fusion_builder_column' !== element.get( 'element_type' ) ) { viewSettings.attributes = { 'data-modal_view': 'element_settings' }; generatedViewSettings = { model: element, collection: FusionPageBuilderElements, attributes: { 'data-cid': element.get( 'cid' ) } }; if ( 'undefined' !== typeof element.get( 'multi' ) && 'multi_element_parent' === element.get( 'multi' ) ) { if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { self.checkChildUI( element.get( 'element_type' ), generatedViewSettings.model.attributes ); generatedView = new FusionPageBuilder[ element.get( 'element_type' ) ]( generatedViewSettings ); } else { self.checkChildUI( element.get( 'element_type' ), generatedViewSettings.model.attributes ); generatedView = new FusionPageBuilder.ParentElementView( generatedViewSettings ); } } else if ( 'undefined' !== typeof FusionPageBuilder[ element.get( 'element_type' ) ] ) { generatedView = new FusionPageBuilder[ element.get( 'element_type' ) ]( generatedViewSettings ); } else if ( 'fusion_builder_row_inner' === element.get( 'element_type' ) ) { generatedView = new FusionPageBuilder.InnerRowView( generatedViewSettings ); } else { generatedView = new FusionPageBuilder.ElementView( generatedViewSettings ); } // Add new view to manager FusionPageBuilderViewManager.addView( element.get( 'cid' ), generatedView ); generatedView.render().el; view = fusionAllElements[ element.get( 'element_type' ) ].custom_settings_view_name; if ( 'undefined' !== typeof view && '' !== view ) { view = new FusionPageBuilder[ view ]( viewSettings ); } else { view = new FusionPageBuilder.ElementSettingsView( viewSettings ); } this.generateElementSettings( view ); } break; case 'fusion_builder_next_page': view = new FusionPageBuilder.NextPage( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) { if ( ! element.get( 'appendAfter' ).next().next().hasClass( 'fusion-builder-next-page' ) ) { element.get( 'appendAfter' ).after( view.render().el ); } } else { this.$el.find( '.fusion-builder-container:last-child' ).after( view.render().el ); } break; case 'fusion_woo_checkout_form': view = new FusionPageBuilder.checkoutForm( viewSettings ), self = this; FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) { if ( 2 > this.$el.find( '.fusion-checkout-form' ).length ) { element.get( 'appendAfter' ).after( view.render().el ); } } else if ( ! this.$el.find( '.fusion-builder-container:last-child' ).length ) { setTimeout( function() { self.$el.find( '.fusion-builder-container:first-child' ).before( view.render().el ); }, 200 ); } else { this.$el.find( '.fusion-builder-container:last-child' ).after( view.render().el ); } break; } // Unset target element if it exists. if ( ! _.isUndefined( element.get( 'targetElement' ) ) ) { element.unset( 'targetElement' ); } }, /** * Add a child to it's parent collection. * * @since 2.0.0 * @return {void} */ addToChildCollection: function( child ) { var parentModel, atIndex; if ( child instanceof Backbone.Model ) { parentModel = this.collection.find( function( model ) { return model.get( 'cid' ) == child.get( 'parent' ); // jshint ignore:line } ); atIndex = child.get( 'at_index' ); child.unset( 'at_index' ); } else { parentModel = this.collection.find( function( model ) { return model.get( 'cid' ) == child.parent; // jshint ignore:line } ); atIndex = child.at_index; delete child.at_index; } if ( 'new' !== atIndex && 'undefined' !== typeof atIndex && ! isNaN( atIndex ) ) { parentModel.children.add( [ child ], { at: atIndex } ); } else { parentModel.children.add( [ child ] ); } }, /** * Calculate collection index. * * @since 2.0.0 * @param {Object} element view. * @return {string} */ getCollectionIndex: function( targetView ) { var index = 'new', targetModel, parentModel, targetIndex; if ( 'undefined' !== typeof targetView && false !== targetView ) { // Child element if ( 'undefined' !== typeof targetView.data( 'parent-cid' ) ) { parentModel = FusionPageBuilderApp.collection.find( function( model ) { return model.get( 'cid' ) === targetView.data( 'parent-cid' ); } ); targetModel = parentModel.children.find( function( model ) { return model.get( 'cid' ) === targetView.data( 'cid' ); } ); // Regular element } else { targetModel = FusionPageBuilderApp.collection.find( function( model ) { return model.get( 'cid' ) === targetView.data( 'cid' ); } ); if ( 'undefined' !== typeof targetModel.get( 'parent' ) && targetModel.get( 'parent' ) ) { parentModel = FusionPageBuilderApp.collection.find( function( model ) { return model.get( 'cid' ) === targetModel.get( 'parent' ); } ); } } if ( parentModel ) { targetIndex = parentModel.children.indexOf( targetModel ); index = targetIndex + 1; } } return index; }, onDropCollectionUpdate: function( model, index, senderCid ) { var parentView = FusionPageBuilderViewManager.getView( model.get( 'parent' ) ), senderView; // Remove model from the old collection parentView.model.children.remove( model, { silent: true } ); // Add model to the new collection if ( senderCid !== model.get( 'parent' ) ) { model.set( 'parent', senderCid ); senderView = FusionPageBuilderViewManager.getView( senderCid ); senderView.model.children.add( model, { at: index, silent: true } ); } else { parentView.model.children.add( model, { at: index, silent: true } ); } parentView.model.children.trigger( 'sort' ); }, generateElementSettings: function( view ) { // No need to render if it already is. if ( ! FusionPageBuilderApp.SettingsHelpers.shouldRenderSettings( view ) ) { return; } // If we want dialog. jQuery( view.render().el ).dialog( { title: fusionAllElements[ view.model.get( 'element_type' ) ].name, width: FusionApp.dialog.dialogData.width, height: FusionApp.dialog.dialogData.height, position: FusionApp.dialog.dialogData.position, dialogClass: 'fusion-builder-dialog fusion-builder-settings-dialog', minWidth: 360, dragStop: function( event, ui ) { FusionApp.dialog.saveDialogPosition( ui.offset ); }, resizeStop: function( event, ui ) { FusionApp.dialog.saveDialogSize( ui.size ); }, open: function( event, ui ) { // jshint ignore: line var $dialogContent = jQuery( event.target ), $dialog = $dialogContent.closest( '.ui-dialog' ); if ( view.$el.find( '.has-group-options' ).length ) { $dialog.addClass( 'fusion-builder-group-options' ); } }, dragStart: function( event, ui ) { // jshint ignore: line // Used to close any open drop-downs in TinyMce. jQuery( event.target ).trigger( 'click' ); }, beforeClose: function( event, ui ) { // jshint ignore: line view.closeGeneratorModal(); }, buttons: { Insert: function() { view.insertGeneratedShortcode(); }, Cancel: function() { view.closeGeneratorModal(); } } } ); }, /** * Convert builder to shortcodes. * * @since 2.0.0 * @return {void} */ builderToShortcodes: function() { var shortcode = '', thisEl = this, plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false, referencedOffCanvases = {}, offCanvases; // Reset the media map. this.mediaMap = { images: {}, menus: {}, forms: {}, post_cards: {}, videos: {}, icons: {}, off_canvases: {} }; if ( FusionApp.data.is_fusion_element ) { this.libraryBuilderToShortcodes(); } else { this.$el.find( '.fusion-builder-container' ).each( function( index, value ) { var $thisContainer = jQuery( this ).find( '.fusion-builder-container-content' ); shortcode += thisEl.generateElementShortcode( jQuery( this ), true ); $thisContainer.find( '.fusion_builder_row' ).each( function() { var $thisRow = jQuery( this ); shortcode += '[fusion_builder_row]'; $thisRow.find( '.fusion-builder-column-outer' ).each( function() { var $thisColumn = jQuery( this ), columnCID = $thisColumn.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent(); } ); shortcode += '[/fusion_builder_row]'; } ); shortcode += '[/fusion_builder_container]'; // Check for next page shortcode if ( jQuery( this ).next().hasClass( 'fusion-builder-next-page' ) ) { shortcode += '[fusion_builder_next_page]'; } // Check for checkuot page shortcode if ( jQuery( this ).next().hasClass( 'fusion-checkout-form' ) ) { shortcode += '[fusion_woo_checkout_form]'; } if ( jQuery( this ).prev().hasClass( 'fusion-checkout-form' ) && 0 === index ) { shortcode = '[fusion_woo_checkout_form]' + shortcode; } } ); FusionApp.setPost( 'post_content', shortcode ); } // Add referenced Off Canvases. if ( false !== plugins && true === plugins.awb_studio ) { offCanvases = 'undefined' !== typeof FusionApp.data.postMeta._fusion.off_canvases ? FusionApp.data.postMeta._fusion.off_canvases : []; if ( 'object' === typeof offCanvases && Object.keys( offCanvases ).length ) { _.each( offCanvases, function( key, value ) { referencedOffCanvases[ key ] = true; } ); } this.mediaMap.off_canvases = referencedOffCanvases; } // If media map exists, add to post meta for saving. if ( ! _.isEmpty( this.mediaMap ) && 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets ) { FusionApp.data.postMeta.avada_media = this.mediaMap; // eslint-disable-line camelcase FusionApp.contentChange( 'page', 'page-option' ); } }, /** * Generate the shortcode for an element. * * @since 2.0.0 * @param {Object} $element - The jQuery object of the element. * @param {boolean} openTagOnly - Should we only include an opening tag? Or a closing tag as well? * @param {boolean} generator - Generate? * @return {string} */ generateElementShortcode: function( $element, openTagOnly, generator ) { var attributes = '', content = '', plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false, metaValue = 'undefined' !== typeof FusionApp.data.postMeta._fusion.studio_replace_params ? FusionApp.data.postMeta._fusion.studio_replace_params : '', element, $thisElement, elementCID, elementType, elementSettings = '', shortcode, ignoredAtts, optionDependency, optionDependencyValue, key, setting, settingName, settingValue, param, keyName, optionValue, ignored, paramDependency, paramDependencyElement, paramDependencyValue, parentModel, parentCID, elementView; // Check if added from Shortcode Generator if ( true === generator ) { element = $element; } else { $thisElement = $element; // Get cid from html element elementCID = 'undefined' === typeof $thisElement.data( 'cid' ) ? $thisElement.find( '.fusion-builder-data-cid' ).data( 'cid' ) : $thisElement.data( 'cid' ); if ( $thisElement.hasClass( 'fusion-builder-live-child-element' ) ) { parentCID = 'undefined' === typeof $thisElement.data( 'parent-cid' ) ? $thisElement.find( '.fusion-builder-data-cid' ).data( 'parent-cid' ) : $thisElement.data( 'parent-cid' ); // Get parent model parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parentCID; // jshint ignore:line } ); // Get model from parent collection element = parentModel.children.find( function( model ) { return model.get( 'cid' ) == elementCID; // jshint ignore:line } ); } else { // Get model by cid element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == elementCID; // jshint ignore: line } ); } } // Useful function can be utilized to change save data. elementView = FusionPageBuilderViewManager.getView( elementCID ); if ( 'undefined' !== typeof elementView && 'function' === typeof elementView.beforeGenerateShortcode ) { elementView.beforeGenerateShortcode(); } elementType = 'undefined' !== typeof element ? element.get( 'element_type' ) : 'undefined'; elementSettings = ''; shortcode = ''; elementSettings = element.attributes; // If studio active. if ( false !== plugins && true === plugins.awb_studio && 'undefined' !== elementType && 'yes' === metaValue && 'params' in elementSettings ) { element.set( 'params', jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( element.get( 'params' ) ) ) ); } // Ignored shortcode attributes ignoredAtts = 'undefined' !== typeof fusionAllElements[ elementType ].remove_from_atts ? fusionAllElements[ elementType ].remove_from_atts : []; ignoredAtts.push( 'undefined' ); // Option dependency optionDependency = 'undefined' !== typeof fusionAllElements[ elementType ].option_dependency ? fusionAllElements[ elementType ].option_dependency : ''; if ( 'params' in elementSettings ) { settingName = 'params'; settingValue = 'undefined' !== typeof element.get( settingName ) ? element.get( settingName ) : ''; // Loop over params for ( param in settingValue ) { keyName = param; if ( 'element_content' === keyName ) { optionValue = 'undefined' !== typeof settingValue[ param ] ? settingValue[ param ] : ''; content = optionValue; if ( 'undefined' !== typeof settingValue[ optionDependency ] ) { optionDependency = fusionAllElements[ elementType ].option_dependency; optionDependencyValue = 'undefined' !== typeof settingValue[ optionDependency ] ? settingValue[ optionDependency ] : ''; // Set content content = 'undefined' !== typeof settingValue[ optionDependencyValue ] ? settingValue[ optionDependencyValue ] : ''; } } else { ignored = ''; if ( '' !== optionDependency ) { setting = keyName; // Get option dependency value ( value for type ) optionDependencyValue = ( 'undefined' !== typeof settingValue[ optionDependency ] ) ? settingValue[ optionDependency ] : ''; // Check for old fusion_map array structure if ( 'undefined' !== typeof fusionAllElements[ elementType ].params[ setting ] ) { // Dependency exists if ( 'undefined' !== typeof fusionAllElements[ elementType ].params[ setting ].dependency ) { paramDependency = fusionAllElements[ elementType ].params[ setting ].dependency; paramDependencyElement = ( 'undefined' !== typeof paramDependency.element ) ? paramDependency.element : ''; paramDependencyValue = ( 'undefined' !== typeof paramDependency.value ) ? paramDependency.value : ''; if ( paramDependencyElement === optionDependency ) { if ( paramDependencyValue !== optionDependencyValue ) { ignored = ''; ignored = setting; } } } } } // Ignore shortcode attributes tagged with "remove_from_atts" if ( -1 < jQuery.inArray( param, ignoredAtts ) || ignored === param ) { // This attribute should be ignored from the shortcode } else { optionValue = 'undefined' !== typeof settingValue[ param ] ? settingValue[ param ] : ''; // Check if attribute value is null if ( null === optionValue ) { optionValue = ''; } // Sanitizes values before saving it in the shortcode. if ( 'undefined' !== typeof elementView && 'function' === typeof elementView.sanitizeValue ) { optionValue = elementView.sanitizeValue( param, optionValue ); } attributes += ' ' + param + '="' + this.getParamValue( param, optionValue, element ) + '"'; } } } } shortcode = '[' + elementType + attributes; if ( '' === content && 'fusion_text' !== elementType && 'fusion_code' !== elementType && ( 'undefined' !== typeof elementSettings.type && 'element' === elementSettings.type ) ) { openTagOnly = true; shortcode += ' /]'; } else { shortcode += ']'; } if ( ! openTagOnly ) { shortcode += content + '[/' + elementType + ']'; } return shortcode; }, /** * Gets param value. * * @since 3.6 * @return {string} */ getParamValue: function( param, optionValue, element ) { var plugins = 'object' === typeof FusionApp.data.plugins_active ? FusionApp.data.plugins_active : false, elementType = 'undefined' !== typeof element ? element.get( 'element_type' ) : 'undefined', metaValue = 'undefined' !== typeof FusionApp.data.postMeta._fusion.studio_replace_params ? FusionApp.data.postMeta._fusion.studio_replace_params : '', params = 'undefined' !== typeof fusionAllElements[ elementType ] ? fusionAllElements[ elementType ].params : 'undefined', globalOptionName, subset, subsets; // Early exit. if ( false === plugins || true !== plugins.awb_studio || 'undefined' === elementType || 'yes' !== metaValue || 'undefined' === typeof fusionAllElements[ elementType ] || 'string' !== typeof param || 'string' !== typeof optionValue || '' !== optionValue || 'object' !== typeof FusionApp.settings || this.shouldExclude( param, elementType ) ) { return optionValue; } // Check if params exist. if ( 'undefined' !== params ) { if ( 'undefined' === typeof params[ param ] ) { // If param does not exist. jQuery.each( params, function( index, name ) { if ( 'undefined' !== typeof params[ index ].value && params[ index ].value.hasOwnProperty( param ) ) { globalOptionName = 'undefined' !== typeof params[ index ].default_option ? params[ index ].default_option : ''; subsets = 'undefined' !== typeof params[ index ].default_subset ? params[ index ].default_subset : []; jQuery.each( subsets, function( i, v ) { if ( param.includes( v ) ) { subset = v; return false; } } ); optionValue = 'undefined' !== typeof FusionApp.settings[ globalOptionName ] && 'undefined' !== typeof FusionApp.settings[ globalOptionName ][ subset ] ? FusionApp.settings[ globalOptionName ][ subset ] : optionValue; return false; } } ); } else if ( 'undefined' !== typeof params[ param ].default_option && ( 'undefined' === typeof params[ param ].default_subset || '' === params[ param ].default_subset ) ) { // check if param has got global option. optionValue = 'undefined' !== typeof FusionApp.settings[ params[ param ].default_option ] ? FusionApp.settings[ params[ param ].default_option ] : optionValue; } else if ( 'undefined' !== typeof params[ param ].default_option && 'undefined' !== typeof params[ param ].default_subset && '' !== params[ param ].default_subset ) { // handle fonts. globalOptionName = params[ param ].default_option; subset = params[ param ].default_subset; optionValue = 'undefined' !== typeof FusionApp.settings[ globalOptionName ] && 'undefined' !== typeof FusionApp.settings[ globalOptionName ][ subset ] ? FusionApp.settings[ globalOptionName ][ subset ] : optionValue; } } return optionValue; }, /** * Should exlude param replacement? * * @since 3.6 * @return {Boolean} */ shouldExclude: function( param, elementType ) { var excluded = { 'link_color': 'fusion_builder_container', 'link_hover_color': 'fusion_builder_container' }; if ( 'undefined' !== typeof excluded[ param ] && elementType === excluded[ param ] ) { return true; } return false; }, /** * Define the layout as loaded. * * @since 2.0.0 * @return {void} */ layoutLoaded: function() { FusionEvents.trigger( 'fusion-history-clear' ); this.reRenderElements = true; }, /** * Get element type, split up element. * * @since 2.0.0 * @param {string} elementType - The element type/name. * @return {void} */ getElementType: function( elementType ) { var childElements; if ( 'fusion_builder_container' === elementType || 'fusion_builder_column' === elementType || 'fusion_builder_column_inner' === elementType ) { return elementType; } // First check if its a parent. if ( elementType in fusionMultiElements ) { return 'parent_element'; } // Check if its a child. childElements = _.values( fusionMultiElements ); if ( -1 !== childElements.indexOf( elementType ) ) { return 'child_element'; } if ( 'fusion_builder_row_inner' === elementType ) { return 'fusion_builder_row_inner'; } // Made it this far it must be regular. return 'element'; }, /** * Clears the builder layout. * * @since 2.0.0 * @param {boolean} blankPageLayout - Should we use the blankPageLayout? * @return {void} */ clearBuilderLayout: function( blankPageLayout ) { // Remove blank page layout. this.$el.find( '.fusion-builder-blank-page' ).each( function() { var $that = jQuery( this ), thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeBlankPageHelper(); } } ); // Remove all containers. this.$el.find( '.fusion-builder-container' ).each( function() { var $that = jQuery( this ), thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeContainer( false, true ); } } ); // Remove all next page elements. this.$el.find( '.fusion-builder-next-page' ).each( function() { var thisView = FusionPageBuilderViewManager.getView( jQuery( this ).data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeNextPage(); } } ); // Remove all checkout form elements. this.$el.find( '.fusion-checkout-form' ).each( function() { var thisView = FusionPageBuilderViewManager.getView( jQuery( this ).data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeCheckoutForm(); } } ); // Create blank page layout. if ( blankPageLayout ) { if ( true === this.blankPage ) { if ( ! this.$el.find( '.fusion-builder-blank-page' ).length ) { this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' ); jQuery( '.fusion-builder-live' ).addClass( 'fusion-builder-blank-page-active' ); } this.blankPage = false; } } }, /** * Encodes data using Base64. * * @since 2.0.0 * @param {string} data - The data to encode. * @return {string} */ base64Encode: function( data ) { var b64 = this._keyStr, o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc = '', tmpArr = [], r; if ( ! data ) { return data; } data = unescape( encodeURIComponent( data ) ); do { // Pack three octets into four hexets o1 = data.charCodeAt( i++ ); o2 = data.charCodeAt( i++ ); o3 = data.charCodeAt( i++ ); bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; // Use hexets to index into b64, and append result to encoded string. tmpArr[ ac++ ] = b64.charAt( h1 ) + b64.charAt( h2 ) + b64.charAt( h3 ) + b64.charAt( h4 ); } while ( i < data.length ); enc = tmpArr.join( '' ); r = data.length % 3; return ( r ? enc.slice( 0, r - 3 ) : enc ) + '==='.slice( r || 3 ); }, /** * Decodes data using Base64. * * @since 2.0.0 * @param {string} data - The data to decode. * @return {string} */ base64Decode: function( input ) { var output = '', chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0; if ( 'undefined' === typeof input || ! input || '' === input ) { return input; } input = input.replace( /[^A-Za-z0-9\+\/\=]/g, '' ); while ( i < input.length ) { enc1 = this._keyStr.indexOf( input.charAt( i++ ) ); enc2 = this._keyStr.indexOf( input.charAt( i++ ) ); enc3 = this._keyStr.indexOf( input.charAt( i++ ) ); enc4 = this._keyStr.indexOf( input.charAt( i++ ) ); chr1 = ( enc1 << 2 ) | ( enc2 >> 4 ); chr2 = ( ( enc2 & 15 ) << 4 ) | ( enc3 >> 2 ); chr3 = ( ( enc3 & 3 ) << 6 ) | enc4; output = output + String.fromCharCode( chr1 ); if ( 64 != enc3 ) { // jshint ignore: line output = output + String.fromCharCode( chr2 ); } if ( 64 != enc4 ) { // jshint ignore: line output = output + String.fromCharCode( chr3 ); } } output = this.utf8Decode( output ); return output; }, /** * Decodes data using utf8. * * @since 2.0.0 * @param {string} utftext - The data to decode. * @return {string} */ utf8Decode: function( utftext ) { var string = '', i = 0, c = 0, c1 = 0, // jshint ignore: line c2 = 0, c3; while ( i < utftext.length ) { c = utftext.charCodeAt( i ); if ( 128 > c ) { string += String.fromCharCode( c ); i++; } else if ( ( 191 < c ) && ( 224 > c ) ) { c2 = utftext.charCodeAt( i + 1 ); string += String.fromCharCode( ( ( c & 31 ) << 6 ) | ( c2 & 63 ) ); i += 2; } else { c2 = utftext.charCodeAt( i + 1 ); c3 = utftext.charCodeAt( i + 2 ); string += String.fromCharCode( ( ( c & 15 ) << 12 ) | ( ( c2 & 63 ) << 6 ) | ( c3 & 63 ) ); i += 3; } } return string; }, setContent: function( textareaID, content ) { if ( 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( textareaID ) && ! window.tinyMCE.get( textareaID ).isHidden() ) { if ( window.tinyMCE.get( textareaID ).getParam( 'wpautop', true ) && 'undefined' !== typeof window.switchEditors ) { content = window.switchEditors.wpautop( content ); } window.tinyMCE.get( textareaID ).setContent( content, { format: 'html' } ); } // In both cases, update the textarea as well. jQuery( '#' + textareaID + ':visible' ).val( content ).trigger( 'change' ); }, isTinyMceActive: function() { var isActive = ( 'undefined' !== typeof tinyMCE ) && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden(); return isActive; }, previewToggle: function() { var $body = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ), self = this; this.previewMode = $body.hasClass( 'fusion-builder-preview-mode' ); if ( this.$el.find( '.fusion-scrolling-section-edit' ).length ) { this.toggleScrollingSections(); } }, toggleScrollingSections: function() { if ( this.previewMode ) { this.createScrollingSections(); } else { this.destroyScrollingSections(); } }, reInitScrollingSections: function() { this.destroyScrollingSections(); this.createScrollingSections(); }, scrollingContainers: function() { var $containers = this.$el.find( '.fusion-builder-container ' ), scrollingSections = {}, scrollingActive = false, scrollingIndex = 0; if ( ! this.$el.find( '.fusion-scrolling-section-edit' ).length ) { return; } $containers.each( function() { if ( jQuery( this ).find( '.fusion-scrolling-section-edit' ).length ) { scrollingActive = true; if ( 'undefined' === typeof scrollingSections[ scrollingIndex ] ) { scrollingSections[ scrollingIndex ] = []; } scrollingSections[ scrollingIndex ].push( jQuery( this ) ); } else if ( scrollingActive ) { scrollingIndex++; scrollingActive = false; } } ); _.each( scrollingSections, function( $scrollingContainers ) { var navigation = '', i; for ( i = $scrollingContainers.length; 0 < i; i-- ) { navigation += '<li><a href="#" class="fusion-scroll-section-link"><span class="fusion-scroll-section-link-bullet"></span></a></li>'; } _.each( $scrollingContainers, function( $scrollingContainer ) { $scrollingContainer.find( '.fusion-scroll-section-nav ul' ).html( navigation ); } ); } ); }, createScrollingSections: function() { var $containers = this.$el.find( '.fusion-builder-container ' ), scrollNavigationPosition = ( 'right' === FusionApp.settings.header_position.toLowerCase() || jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'scroll-navigation-left' : 'scroll-navigation-right', scrollingSections = {}, scrollingActive = false, scrollingIndex = 0; $containers.each( function() { if ( jQuery( this ).find( '.fusion-scrolling-section-edit' ).length ) { scrollingActive = true; if ( 'undefined' === typeof scrollingSections[ scrollingIndex ] ) { scrollingSections[ scrollingIndex ] = []; } scrollingSections[ scrollingIndex ].push( jQuery( this ) ); } else if ( scrollingActive ) { scrollingIndex++; scrollingActive = false; } } ); _.each( scrollingSections, function( $scrollingContainers, sectionIndex ) { var $scrollSectionContainer = '<div id="fusion-scroll-section-' + sectionIndex + '" class="fusion-scroll-section" data-section="' + sectionIndex + '">', $scrollingNav = '<nav id="fusion-scroll-section-nav-' + sectionIndex + '" class="fusion-scroll-section-nav ' + scrollNavigationPosition + '" data-section="' + sectionIndex + '"><ul>', $targetContainer = false; _.each( $scrollingContainers, function( $scrollingContainer, containerIndex ) { var active, $parent, $clone, adminLabel, containerId, $containerLink; containerIndex = containerIndex + 1; active = 1 === containerIndex ? ' active' : ''; $parent = $scrollingContainer; $clone = $scrollingContainer.find( '.fusion-scrolling-section-edit' ).clone(); adminLabel = $parent.find( '.fusion-builder-section-name' ).val(); containerId = 'fusion-scroll-section-element-' + sectionIndex + '-' + containerIndex; $containerLink = '<li><a href="#' + containerId + '" class="fusion-scroll-section-link" data-name="' + adminLabel + '" data-element="' + containerIndex + '"><span class="fusion-scroll-section-link-bullet"></span></a></li>'; if ( 1 === containerIndex ) { $targetContainer = $parent; } $clone.find( '.fusion-scroll-section-nav, .fusion-builder-insert-column, .fusion-builder-container-add' ).remove(); $clone.find( '.hundred-percent-height' ).removeClass( 'hundred-percent-height' ).css( { height: '', 'min-height': '' } ); $clone.addClass( 'hundred-percent-height-scrolling hundred-percent-height' ); $scrollingNav += $containerLink; $scrollSectionContainer += '<div class="fusion-scroll-section-element' + active + '" data-section="' + sectionIndex + '" data-element="' + containerIndex + '">' + $clone.outerHTML() + '</div>'; $parent.addClass( 'fusion-temp-hidden-container' ); $parent.hide(); } ); $scrollingNav += '</ul></nav>'; $scrollSectionContainer += $scrollingNav; $scrollSectionContainer += '</div>'; if ( $targetContainer ) { $targetContainer.before( $scrollSectionContainer ); } } ); jQuery( '#fb-preview' )[ 0 ].contentWindow.initScrollingSections(); jQuery( '#fb-preview' ).contents().scrollTop( 0 ); }, destroyScrollingSections: function() { this.$el.find( '.fusion-scroll-section' ).remove(); this.$el.find( '.fusion-temp-hidden-container' ).show().removeClass( 'fusion-temp-hidden-container' ); }, /** * Toggles visibility of droppable areas on hover. * * @since 2.0.0 * @return {void} */ toggleDroppablesVisibility: function() { // Droppables. if ( 'undefined' !== typeof FusionApp && 'on' === FusionApp.preferencesData.droppables_visible ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-hide-droppables' ); } else { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'fusion-hide-droppables' ); } }, /** * Toggles tooltips. * * @since 2.0.0 * @return {void} */ toggleStickyHeader: function() { // Sticky header. if ( 'undefined' !== typeof FusionApp && 'off' === FusionApp.preferencesData.sticky_header ) { fusionTriggerEvent( 'fusion-disable-sticky-header' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'fusion-disable-sticky' ); } else { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-disable-sticky' ); if ( 1 === Number( FusionApp.settings.header_sticky ) ) { fusionTriggerEvent( 'fusion-init-sticky-header' ); } } jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-sticky-header-reinit' ); }, /** * Toggles visibility of droppable areas on hover. * * @since 2.0.0 * @return {void} */ toggleTooltips: function() { // Do nothing for Off Canvas. if ( 'awb_off_canvas' === FusionApp.data.postDetails.post_type ) { return; } // Tooltips. if ( 'undefined' !== typeof FusionApp && 'off' === FusionApp.preferencesData.tooltips ) { jQuery( 'body' ).addClass( 'fusion-hide-all-tooltips' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'fusion-hide-all-tooltips' ); } else { jQuery( 'body' ).removeClass( 'fusion-hide-all-tooltips' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-hide-all-tooltips' ); } }, /** * Toggles element filter options preview. * * @since 2.2 * @return {void} */ toggleElementFilters: function() { if ( 'undefined' !== typeof FusionApp && 'off' === FusionApp.preferencesData.element_filters ) { jQuery( 'body' ).addClass( 'fusion-disable-element-filters' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'fusion-disable-element-filters' ); } else { jQuery( 'body' ).removeClass( 'fusion-disable-element-filters' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'fusion-disable-element-filters' ); } }, /** * Toggles transparent header and absolute containers. * * @since 2.0.0 * @return {void} */ toggleTransparentHeader: function() { var HeaderBGColor = '' === fusionSanitize.getPageOption( 'header_bg_color' ) ? FusionApp.settings.header_bg_color : fusionSanitize.getPageOption( 'header_bg_color' ), $html = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'html' ), $body = $html.find( 'body' ); // Transparent Header. if ( 'undefined' !== typeof FusionApp && 'off' === FusionApp.preferencesData.transparent_header ) { $html.removeClass( 'avada-header-color-not-opaque' ); } else if ( 1 > jQuery.AWB_Color( HeaderBGColor ).alpha() ) { $html.addClass( 'avada-header-color-not-opaque' ); } // Absolute containers. if ( 'undefined' !== typeof FusionApp && 'off' === FusionApp.preferencesData.transparent_header ) { $body.addClass( 'fusion-no-absolute-containers' ); } else { $html.removeClass( 'fusion-no-absolute-containers' ); } }, /** * Hides extra open sizes panels. * * @since 2.0.0 * @return {void} */ sizesHide: function( event ) { var $targetClass = jQuery( event.target ).parent().attr( 'class' ); if ( 'fusion-builder-column-size' !== $targetClass ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body .column-sizes:visible' ).each( function() { jQuery( this ).parent().find( '.fusion-builder-column-size' ).trigger( 'click' ); } ); } }, /** * Fired when wireframe mode is toggled. * * @since 2.0.0 * @return {void} */ wireFrameToggled: function() { this._wireframeToggle(); if ( this.wireframeActive ) { this.enableSortableContainers(); } else { this.disableSortableContainers(); } }, /** * Trigger event on body for other page elements. * * @since 3.0 * @return {void} */ wireframeToggle: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-wireframe-toggle' ); }, /** * Initialize or enable the container sortable. * * @since 2.0.0 * @return {void} */ enableSortableContainers: function() { if ( 'undefined' !== typeof this.$el.sortable( 'instance' ) ) { this.$el.sortable( 'enable' ); } else { this.sortableContainers(); } }, /** * Destroy or disable container sortable. * * @since 2.0.0 * @return {void} */ disableSortableContainers: function() { if ( 'undefined' !== typeof this.$el.sortable( 'instance' ) ) { this.$el.sortable( 'disable' ); } }, /** * Enable sortable for wireframe mode. * * @since 2.0.0 * @return {void} */ sortableContainers: function() { this.$el.sortable( { handle: '.fusion-builder-section-header', items: '.fusion-builder-container, .fusion-builder-next-page, .fusion-checkout-form', cancel: '.fusion-builder-section-name, .fusion-builder-settings, .fusion-builder-clone, .fusion-builder-remove, .fusion-builder-section-add, .fusion-builder-add-element, .fusion-builder-insert-column, #fusion_builder_controls, .fusion-builder-save-element', cursor: 'move', update: function() { FusionEvents.trigger( 'fusion-content-changed' ); FusionPageBuilderApp.scrollingContainers(); FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.full_width_section + ' order changed' ); } } ); }, setStackedContentClass: function() { if ( 'undefined' !== typeof FusionApp.settings && this.$el.width() < FusionApp.settings.content_break_point ) { this.$el.addClass( 'fusion-stacked-content' ); } else { this.$el.removeClass( 'fusion-stacked-content' ); } }, disableDocumentWrite: function() { if ( false === this.previewDocumentWrite ) { this.previewDocumentWrite = document.getElementById( 'fb-preview' ).contentWindow.document.write; document.getElementById( 'fb-preview' ).contentWindow.document.write = function() {}; } if ( false === this.documentWrite ) { this.documentWrite = document.write; document.write = function() {}; } }, enableDocumentWrite: function() { var self = this; setTimeout( function() { if ( false !== self.documentWrite ) { document.write = self.documentWrite; } if ( false !== self.previewDocumentWrite ) { document.getElementById( 'fb-preview' ).contentWindow.document.write = self.previewDocumentWrite; } self.documentWrite = false; self.previewDocumentWrite = false; }, 500 ); }, fusionLibraryUI: function() { if ( 'elements' === FusionApp.data.fusion_element_type ) { if ( this.$el.find( '.fusion-builder-column-outer .fusion_builder_row_inner, .fusion-builder-live-element' ).length ) { this.$el.find( '.fusion-builder-column .fusion-builder-add-element' ).hide(); } } }, sameContainerTypes: function( original, target ) { if ( original === target ) { return true; } if ( 'object' !== typeof original ) { original = FusionPageBuilderViewManager.getView( original ); } if ( 'object' !== typeof target ) { target = FusionPageBuilderViewManager.getView( target ); } // Don't have problem views, so we can't tell. if ( 'object' !== typeof original || 'object' !== typeof target || 'function' !== typeof original.isFlex || 'function' !== typeof target.isFlex ) { return false; } return original.isFlex() === target.isFlex(); }, getParentContainer: function( target ) { var view = target; // Not passing view directly, get it assuming cid is passed. if ( 'object' !== typeof target ) { view = FusionPageBuilderViewManager.getView( target ); } // No view, return false. if ( ! view ) { return false; } // View found and is container, return that. if ( 'fusion_builder_container' === view.model.get( 'element_type' ) ) { return view; } // Not container but parent cid exists, try that. if ( view.model.get( 'parent' ) ) { return this.getParentContainer( view.model.get( 'parent' ) ); } // Got here, that means no parent, no match, return false. return false; }, getParentColumn: function( target ) { var view = target; // Not passing view directly, get it assuming cid is passed. if ( 'object' !== typeof target ) { view = FusionPageBuilderViewManager.getView( target ); } // No view, return false. if ( ! view ) { return false; } // View found and is column, return that. if ( 'fusion_builder_column' === view.model.get( 'element_type' ) || 'fusion_builder_column_inner' === view.model.get( 'element_type' ) ) { return view; } // Not column but parent cid exists, try that. if ( view.model.get( 'parent' ) ) { return this.getParentColumn( view.model.get( 'parent' ) ); } // Got here, that means no parent, no match, return false. return false; }, /** * If appropriate builds styles for form being edited. * * @since 2.0.0 * @return {void} */ maybeFormStyles: function() { // Not editing a form then skip. if ( 'fusion_form' !== FusionApp.getPost( 'post_type' ) ) { return; } if ( false === this.formStyles ) { this.formStyles = new FusionPageBuilder.FormStyles(); return; } this.formStyles.buildStyles(); }, /** * If editing off canvas. * * @since 3.6 * @return {void} */ maybeOfCanvasStyles: function() { // Not editing a form then skip. if ( 'awb_off_canvas' !== FusionApp.getPost( 'post_type' ) ) { return; } if ( false === this.offCanvasStyles ) { this.offCanvasStyles = new FusionPageBuilder.offCanvasStyles(); return; } this.offCanvasStyles.buildStyles(); }, contentPreviewWidth: function() { if ( 'object' === typeof FusionApp && 'object' === typeof FusionApp.data && ( ( 'string' === typeof FusionApp.data.fusion_element_type && 'post_cards' === FusionApp.data.fusion_element_type ) || 'fusion_form' === FusionApp.data.postDetails.post_type ) && 'object' === typeof FusionApp.data.postMeta && 'object' === typeof FusionApp.data.postMeta._fusion && 'undefined' !== typeof FusionApp.data.postMeta._fusion.preview_width ) { this.$el.find( '#fusion_builder_container' ).first().css( { width: parseInt( FusionApp.data.postMeta._fusion.preview_width ) + '%' } ); } } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter circle child View FusionPageBuilder.fusion_counter_circle = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } if ( 'undefined' !== typeof this.model.attributes.childSelectors ) { this.model.attributes.childSelectors[ 'class' ] += ' fusion-builder-child-element-content'; this.setElementAttributes( this.$el.find( '.fusion-builder-child-element-content' ), this.model.attributes.childSelectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } if ( 'undefined' !== typeof this.model.attributes.childSelectors ) { this.model.attributes.childSelectors[ 'class' ] += ' fusion-builder-child-element-content'; this.setElementAttributes( this.$el.find( '.fusion-builder-child-element-content' ), this.model.attributes.childSelectors ); } // Using non debounced version for smoothness. this.refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.computeAtts( atts.values ); attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); attributes.output = atts.values.element_content; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ computeAtts: function( values ) { var scales = '', countdown = '', counterCircleWrapperShortcode = '', counterCircleShortcode = { class: 'fusion-counter-circle counter-circle counter-circle-content' }, multiplicator, strokeSize, fontSize; values.size = _.fusionValidateAttrValue( values.size, '' ); if ( 'yes' === values.scales ) { scales = true; } if ( 'yes' === values.countdown ) { countdown = true; } if ( '' !== values[ 'class' ] ) { counterCircleShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { counterCircleShortcode.id = values.id; } values.size = parseFloat( values.size ); multiplicator = values.size / 220; strokeSize = 11 * multiplicator; fontSize = 50 * multiplicator; counterCircleShortcode[ 'data-percent' ] = this.sanitizePercentage( values.value ); counterCircleShortcode[ 'data-countdown' ] = countdown; counterCircleShortcode[ 'data-filledcolor' ] = jQuery.AWB_Color( values.filledcolor ).toRgbaString(); counterCircleShortcode[ 'data-unfilledcolor' ] = jQuery.AWB_Color( values.unfilledcolor ).toRgbaString(); counterCircleShortcode[ 'data-scale' ] = scales; counterCircleShortcode[ 'data-size' ] = values.size.toString(); counterCircleShortcode[ 'data-speed' ] = values.speed.toString(); counterCircleShortcode[ 'data-strokesize' ] = strokeSize.toString(); counterCircleShortcode.style = 'font-size:' + fontSize + 'px;height:' + values.size + 'px;width:' + values.size + 'px;'; // counterCircleWrapperShortcode Attributes. counterCircleWrapperShortcode = { class: 'counter-circle-wrapper', style: 'height:' + values.size + 'px;width:' + values.size + 'px;' }; counterCircleWrapperShortcode[ 'data-originalsize' ] = values.size.toString(); this.model.set( 'selectors', counterCircleWrapperShortcode ); this.model.set( 'childSelectors', counterCircleShortcode ); }, /** * Sanitize the percentage value, because this can come also from a * dynamic data which can be a string or a float. * * @since 3.6 * @param {Object} values - The values object. * @return {Object} */ sanitizePercentage: function( percentage ) { percentage = parseFloat( percentage ); // percentage can be NaN if parseFloat failed. if ( ! percentage ) { percentage = 0; } percentage = Math.round( percentage ); if ( 0 > percentage ) { percentage = 0; } if ( 100 < percentage ) { percentage = 100; } return percentage; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter circles parent View FusionPageBuilder.fusion_counters_circle = FusionPageBuilder.ParentElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.appendChildren( '.fusion-counters-circle' ); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var countersCircleAtts = this.computeAtts( atts.values ); atts = {}; atts.countersCircleAtts = countersCircleAtts; return atts; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ computeAtts: function( values ) { var countersCircleAtts = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-counters-circle counters-circle' } ); if ( '' !== values[ 'class' ] ) { countersCircleAtts[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { countersCircleAtts.id += ' ' + values.id; } countersCircleAtts[ 'class' ] += ' fusion-child-element'; countersCircleAtts[ 'data-empty' ] = this.emptyPlaceholderText; return countersCircleAtts; } } ); } ); }( jQuery ) ); ;/* global fusionAppConfig, FusionPageBuilderViewManager, imagesLoaded */ /* jshint -W098 */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Gallery View. FusionPageBuilder.fusion_gallery = FusionPageBuilder.ParentElementView.extend( { /** * Image map of child element images and thumbs. * * @since 2.0 */ imageMap: { images: {} }, onInit: function() { this.fusionIsotope = new FusionPageBuilder.IsotopeManager( { selector: '.fusion-gallery-layout-grid, .fusion-gallery-layout-masonry', layoutMode: 'packery', itemSelector: '.fusion-gallery-column', isOriginLeft: jQuery( 'body.rtl' ).length ? false : true, resizable: true, initLayout: true, view: this } ); }, onRender: function() { var galleryElements = this.$el.find( '.fusion-gallery-column' ), self = this; imagesLoaded( galleryElements, function() { self.fusionIsotope.updateLayout(); self.setOutlineControlsPosition(); } ); }, /** * Sets position of outlines and controls for the child elements to match column spacing.. * * @since 2.0 * @return {void} */ setOutlineControlsPosition: function() { var cid = this.model.get( 'cid' ), params = this.model.get( 'params' ), halfColumnSpacing = ( parseFloat( params.column_spacing ) / 2 ) + 'px', css = ''; this.$el.children( 'style' ).remove(); css += '<style type="text/css">'; css += '.fusion-builder-live:not(.fusion-builder-ui-wireframe) div[data-cid="' + cid + '"] .fusion-builder-live-child-element:hover:after{ margin:' + halfColumnSpacing + ';}'; css += '.fusion-builder-live:not(.fusion-builder-ui-wireframe) div[data-cid="' + cid + '"] .fusion-builder-live-child-element:hover .fusion-builder-module-controls-container{ bottom: ' + halfColumnSpacing + '; right:' + halfColumnSpacing + ';}'; css += '</style>'; this.$el.prepend( css ); }, /** * Extendable function for when child elements get generated. * * @since 2.0.0 * @param {Object} modules An object of modules that are not a view yet. * @return {void} */ onGenerateChildElements: function( modules ) { var i = 1; this.fusionIsotope.init(); this.addImagesToImageMap( modules, false, false ); // Set child counter. Used for grid layout clearfix. _.each( this.model.children, function( child ) { child.set( 'counter', i ); i++; } ); }, /** * Add images to the view's image map. * * @since 2.0 * @param {Object} childrenData - The children for which images need added to the map. * @param bool async - Determines if the AJAX call should be async. * @param bool async - Determines if the view should be re-rendered. * @return void */ addImagesToImageMap: function( childrenData, async, reRender, forceQuery ) { var view = this, queryData = {}; async = ( 'undefined' === typeof async ) ? true : async; reRender = ( 'undefined' === typeof reRender ) ? true : reRender; _.each( childrenData, function( child ) { var params = ( 'undefined' !== typeof child.get ) ? child.get( 'params' ) : child.params, imageIdIsValid = ( 'undefined' !== typeof params.image_id && null !== params.image_id && '' !== params.image_id ); if ( imageIdIsValid && ( 'undefined' === typeof view.imageMap.images[ params.image_id ] || forceQuery ) ) { queryData[ params.image_id ] = params; } } ); // Send this data with ajax or rest. if ( ! _.isEmpty( queryData ) ) { jQuery.ajax( { async: async, url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_fusion_gallery', children: queryData, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, gallery: view.model.get( 'params' ) } } ) .done( function( response ) { view.updateImageMap( response, forceQuery ); view.model.set( 'query_data', response ); if ( reRender ) { view.reRender(); } } ); } }, /** * Update the view's image map. * * @since 2.0 * @param {Object} images - The images object to inject. * @return void */ updateImageMap: function( images, forceUpdate ) { var imageMap = this.imageMap; _.each( images.images, function( image, imageId ) { if ( 'undefined' === typeof imageMap.images[ imageId ] || forceUpdate ) { imageMap.images[ imageId ] = image; } } ); // TODO: needed ? this.imageMap = imageMap; }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.appendChildren( '.fusion-gallery-container' ); this.fusionIsotope.reInit(); this.checkVerticalImages(); this.setOutlineControlsPosition(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; attributes.values = atts.values; attributes.query_data = atts.query_data; attributes.captionStyles = this.buildCaptionStyles( atts ); // // Create attribute objects. attributes.attr = this.buildAttr( atts.values ); // Whether it has a dynamic data stream. attributes.usingDynamic = 'undefined' !== typeof atts.values.multiple_upload && 'Select Images' !== atts.values.multiple_upload; return attributes; }, checkVerticalImages: function() { var container = this.$el.find( '.fusion-gallery-layout-grid, .fusion-gallery-layout-masonry' ); if ( container.hasClass( 'fusion-gallery-layout-masonry' ) && 0 < container.find( '.fusion-grid-column:not(.fusion-grid-sizer)' ).not( '.fusion-element-landscape' ).length ) { container.addClass( 'fusion-masonry-has-vertical' ); } else { container.removeClass( 'fusion-masonry-has-vertical' ); } }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.column_spacing = ( parseFloat( values.column_spacing ) / 2 ) + 'px'; values.bordersize = _.fusionValidateAttrValue( values.bordersize, 'px' ); values.border_radius = _.fusionValidateAttrValue( values.border_radius, 'px' ); if ( 'round' === values.border_radius ) { values.border_radius = '50%'; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var totalNumOfColumns = this.model.children.length, attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-gallery fusion-gallery-container fusion-child-element fusion-grid-' + values.columns + ' fusion-columns-total-' + totalNumOfColumns + ' fusion-gallery-layout-' + values.layout + ' fusion-gallery-' + this.model.get( 'cid' ) } ), margin; if ( values.column_spacing ) { margin = ( -1 ) * parseFloat( values.column_spacing ); attr.style = 'margin:' + margin + 'px;'; } attr[ 'data-empty' ] = this.emptyPlaceholderText; return attr; }, /** * Builds caption styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildCaptionStyles: function( atts ) { var selectors, font_styles, sides, marginName, css, media, responsive = ''; this.dynamic_css = {}; this.baseSelector = '.fusion-gallery.fusion-gallery-' + this.model.get( 'cid' ); if ( 'off' === atts.values.caption_style ) { return ''; } if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { this.baseSelector = '.awb-imageframe-style.awb-imageframe-style-' + this.model.get( 'cid' ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-title' ]; // title color. if ( ! this.isDefault( 'caption_title_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_title_color, true ); } // title size. if ( ! this.isDefault( 'caption_title_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_title_size ), true ); } // title font. font_styles = _.fusionGetFontStyle( 'caption_title_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // title transform. if ( ! this.isDefault( 'caption_title_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_title_transform ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; // text color. if ( ! this.isDefault( 'caption_text_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_text_color ); } // text size. if ( ! this.isDefault( 'caption_text_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_text_size ) ); } // text font. font_styles = _.fusionGetFontStyle( 'caption_text_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // text transform. if ( ! this.isDefault( 'caption_text_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_text_transform ); } // Border color. if ( 'resa' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:before' ]; this.addCssProperty( selectors, 'border-top-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-bottom-color', atts.values.caption_border_color ); selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:after' ]; this.addCssProperty( selectors, 'border-right-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-left-color', atts.values.caption_border_color ); } if ( 'dario' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption .awb-imageframe-caption-title:after' ]; this.addCssProperty( selectors, 'background', atts.values.caption_border_color ); } // Overlay color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'dario', 'resa', 'schantel', 'dany', 'navin' ] ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-style' ]; this.addCssProperty( selectors, 'background', atts.values.caption_overlay_color ); } // Background color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'schantel', 'dany' ] ) && ! this.isDefault( 'caption_background_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'background', atts.values.caption_background_color ); } // Caption margin. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { sides = [ 'top', 'right', 'bottom', 'left' ]; selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; _.each( sides, function( side ) { marginName = 'caption_margin_' + side; if ( ! this.isDefault( marginName ) ) { this.addCssProperty( selectors, 'margin-' + side, _.fusionGetValueWithUnit( atts.values[ marginName ] ) ); } }, this ); if ( ! this.isDefault( 'caption_title' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'margin-top', '0.5em' ); } } css = this.parseCSS(); if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { _.each( [ '', 'medium', 'small' ], function( size ) { var key = 'caption_align' + ( '' === size ? '' : '_' + size ); // Check for default value. if ( this.isDefault( key ) ) { return; } this.dynamic_css = {}; // Build responsive alignment. selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; this.addCssProperty( selectors, 'text-align', atts.values[ key ] ); if ( '' === size ) { responsive += this.parseCSS(); } else { media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; responsive += media + '{' + this.parseCSS() + '}'; } }, this ); css += responsive; } return ( css ) ? '<style>' + css + '</style>' : ''; } } ); // Fetch image_date for single image _.extend( FusionPageBuilder.Callback.prototype, { fusion_gallery_image: function( name, value, modelData, args, cid, action, model, elementView ) { var queryData = {}, reRender = true, async = true, parentView = FusionPageBuilderViewManager.getView( model.attributes.parent ), params = jQuery.extend( true, {}, model.attributes.params ), imageId; params[ name ] = value; imageId = params.image_id; if ( 'undefined' === typeof parentView.imageMap.images[ imageId ] && 'undefined' !== typeof value && '' !== value ) { queryData[ imageId ] = params; } // Send this data with ajax or rest. if ( ! _.isEmpty( queryData ) ) { jQuery.ajax( { async: async, url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_fusion_gallery', children: queryData, fusion_load_nonce: fusionAppConfig.fusion_load_nonce, gallery: parentView.model.get( 'params' ) } } ) .done( function( response ) { parentView.updateImageMap( response ); if ( 'undefined' !== typeof response.images[ value ] ) { if ( 'undefined' !== typeof response.images[ value ].image_data && 'image_id' === name && 'undefined' !== typeof response.images[ value ].image_data.url ) { if ( ! args.skip ) { elementView.changeParam( 'image', response.images[ value ].image_data.url ); } } } elementView.changeParam( name, value ); if ( reRender ) { elementView.reRender(); } } ); } else { if ( ! args.skip && 'undefined' !== typeof name ) { elementView.changeParam( name, value ); } if ( reRender ) { elementView.reRender(); } } } } ); _.extend( FusionPageBuilder.Callback.prototype, { fusion_gallery_images: function( name, value, modelData, args, cid, action, model, view ) { view.model.attributes.params[ name ] = value; view.addImagesToImageMap( view.model.children.models, true, true, true ); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager */ /* jshint -W098 */ /* eslint no-empty-function: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Gallery View. FusionPageBuilder.fusion_gallery_image = FusionPageBuilder.ChildElementView.extend( { /** * Runs after initial render. * * @since 2.0 * @return {void} */ onRender: function() { var self = this, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Re-render the parent view if the child was cloned if ( 'undefined' !== typeof self.model.attributes.cloned && true === self.model.attributes.cloned ) { delete self.model.attributes.cloned; parentView.reRender(); parentView.fusionIsotope.reloadItems(); } // Update isotope layout setTimeout( function() { if ( 'undefined' !== typeof parentView.fusionIsotope ) { parentView.fusionIsotope.append( self.$el ); parentView.checkVerticalImages(); } }, 50 ); this.initLightbox(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { }, /** * (Re-)Inits the lightbox. * * @since 2.0.3 * @return {void} */ initLightbox: function( remove ) { var parentCid = this.model.get( 'parent' ), galleryLightboxName = 'iLightbox[awb_gallery_' + parentCid + ']', galleryLightbox, elements, link; if ( 'object' !== typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.$ilInstances ) { return; } galleryLightbox = jQuery( '#fb-preview' )[ 0 ].contentWindow.$ilInstances[ galleryLightboxName ]; if ( 'undefined' !== typeof remove && remove ) { elements = this.$el.closest( '.fusion-gallery' ).find( '.fusion-builder-live-child-element:not([data-cid="' + this.model.get( 'cid' ) + '"]' ).find( '[data-rel="' + galleryLightboxName + '"]' ); } else { elements = this.$el.closest( '.fusion-gallery' ).find( '[data-rel="' + galleryLightboxName + '"]' ); } link = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( elements ); if ( 'object' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox ) { if ( 'undefined' !== typeof galleryLightbox ) { galleryLightbox.destroy(); link.iLightBox( jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox.prepare_options( galleryLightboxName ) ); } } }, /** * Runs before view is removed. * * @since 2.0 * @return {void} */ beforeRemove: function() { var self = this, parentCid = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( parentCid ); if ( 'undefined' !== typeof parentView.fusionIsotope ) { parentView.fusionIsotope.remove( self.$el ); } if ( 'function' === typeof parentView.checkVerticalImages ) { parentView.checkVerticalImages(); } setTimeout( function() { if ( 'undefined' !== typeof parentView.fusionIsotope ) { parentView.fusionIsotope.reloadItems(); } }, 100 ); self.initLightbox( true ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var parentCid = this.model.get( 'parent' ), parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } this.initLightbox(); // Force re-render for child option changes. setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_gallery', parentCid ); parentView.fusionIsotope.updateLayout(); }, 100 ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} - Returns the attributes. */ filterTemplateAtts: function( atts ) { var attributes = {}, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), imageData = 'undefined' !== typeof parentView.imageMap ? parentView.imageMap.images[ this.model.attributes.params.image_id ] : undefined, parentValues = atts.parentValues, orientation = ''; // Validate values. this.validateValues( atts.values ); this.validateValues( atts.parentValues ); attributes.values = atts.values; attributes.parentValues = atts.parentValues; // Added attributes.imageData = imageData; attributes.galleryLayout = parentValues.layout; attributes.galleryLightbox = parentValues.lightbox; attributes.galleryColumns = parentValues.columns; attributes.imageWrapperAttr = this.buildImageWrapperAttr( parentValues ); attributes.counter = this.model.get( 'counter' ); attributes.captionHtml = this.generateCaption( parentValues, atts.values ); // Create attribute objects. attributes.imagesAttr = this.buildImagesAttr( atts.values ); if ( 'undefined' !== typeof imageData && 'undefined' !== typeof imageData.element_orientation_class && false !== imageData.element_orientation_class ) { orientation = imageData.element_orientation_class; } else { this.$el.removeClass( 'fusion-element-landscape' ); } this.$el.addClass( 'fusion-grid-column fusion-gallery-column ' + orientation ); if ( -1 !== jQuery.inArray( parentValues.caption_style, [ 'above', 'below' ] ) ) { this.$el.addClass( 'awb-imageframe-style awb-imageframe-style-' + parentValues.caption_style + ' awb-imageframe-style-' + this.model.get( 'parent' ) ); } else { this.$el.removeClass( 'awb-imageframe-style awb-imageframe-style-above awb-imageframe-style-below' ); } return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.column_spacing = ( parseFloat( values.column_spacing ) / 2 ) + 'px'; values.bordersize = _.fusionValidateAttrValue( values.bordersize, 'px' ); values.border_radius = _.fusionValidateAttrValue( values.border_radius, 'px' ); if ( 'round' === values.border_radius ) { values.border_radius = '50%'; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} - Returns the attributes. */ buildAttr: function( values ) { var imageIds = values.image_ids.split( ',' ), totalNumOfColumns = imageIds.length, attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-gallery fusion-gallery-container fusion-grid-' + values.columns + ' fusion-columns-total-' + totalNumOfColumns + ' fusion-gallery-layout-' + values.layout } ), margin; if ( values.column_spacing ) { margin = ( -1 ) * parseFloat( values.column_spacing ); attr.style = 'margin:' + margin + 'px;'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} - Returns the attributes for the image wrapper. */ buildImageWrapperAttr: function( values ) { var imageWrapperAttr = { class: 'fusion-gallery-image', style: '' }; if ( '' !== values.bordersize && 0 !== values.bordersize ) { imageWrapperAttr.style += 'border:' + values.bordersize + ' solid ' + values.bordercolor + ';'; if ( '0' != values.border_radius && '0px' !== values.border_radius && 'px' !== values.border_radius ) { imageWrapperAttr.style += '-webkit-border-radius:' + values.border_radius + ';border-radius:' + values.border_radius + ';'; if ( '50%' === values.border_radius || 100 < parseInt( values.border_radius, 10 ) ) { imageWrapperAttr.style += '-webkit-mask-image:-webkit-radial-gradient(circle, white, black);'; } } } if ( 'liftup' === values.hover_type && -1 !== jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { imageWrapperAttr[ 'class' ] += ' fusion-gallery-image-liftup'; } // Caption style. if ( -1 === jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { imageWrapperAttr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + values.caption_style; } return imageWrapperAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} queryData - The query data. * @return {Object} - Returns the image attributes. */ buildImagesAttr: function( values ) { var imagesAttr = {}, imageId = this.model.attributes.params.image_id, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), image = 'undefined' !== typeof parentView.imageMap ? parentView.imageMap.images[ imageId ] : undefined, columnSpacing, isPortrait, isLandscape, borderColor; if ( 'undefined' === typeof image ) { image = {}; } columnSpacing = 0; isPortrait = false; isLandscape = false; borderColor = jQuery.AWB_Color( values.bordercolor ); imagesAttr = {}; if ( 'masonry' === values.layout ) { imagesAttr.masonryWrapper = { style: '', class: 'fusion-masonry-element-container' }; if ( image.url ) { imagesAttr.masonryWrapper.style += 'background-image:url(' + image.url + ');'; } if ( 'undefined' !== typeof image.image_data && true !== image.image_data.specific_element_orientation_class ) { image.element_orientation_class = _.fusionGetElementOrientationClass( { imageWidth: image.image_data.width, imageHeight: image.image_data.height }, values.gallery_masonry_grid_ratio, values.gallery_masonry_width_double ); } image.element_base_padding = _.fusionGetElementBasePadding( image.element_orientation_class ); if ( image.element_base_padding ) { columnSpacing = 0; if ( 'undefined' !== typeof image.element_orientation_class && false !== image.element_orientation_class ) { isLandscape = -1 !== image.element_orientation_class.indexOf( 'fusion-element-landscape' ); isPortrait = -1 !== image.element_orientation_class.indexOf( 'fusion-element-portrait' ); } if ( isLandscape || isPortrait ) { columnSpacing = 2 * parseFloat( values.column_spacing ); } // Calculate the correct size of the image wrapper container, based on orientation and column spacing. if ( values.bordersize && 'transparent' !== values.bordercolor && 0 !== borderColor.alpha() ) { if ( isLandscape || isPortrait ) { columnSpacing += 2 * parseFloat( values.bordersize ); } } if ( isLandscape && isPortrait ) { imagesAttr.masonryWrapper.style += 'padding-top:calc((100% - ' + columnSpacing + 'px) * ' + image.element_base_padding + ' + ' + columnSpacing + 'px);'; } else if ( isLandscape ) { imagesAttr.masonryWrapper.style += 'padding-top:calc((100% - ' + columnSpacing + 'px) * ' + image.element_base_padding + ');'; } else if ( isPortrait ) { imagesAttr.masonryWrapper.style += 'padding-top:calc(100% * ' + image.element_base_padding + ' + ' + columnSpacing + 'px);'; } else { imagesAttr.masonryWrapper.style += 'padding-top:calc(100% * ' + image.element_base_padding + ');'; } } } imagesAttr.images = { style: '', class: '' }; if ( 'liftup' !== values.hover_type ) { imagesAttr.images[ 'class' ] += ' hover-type-' + values.hover_type; } if ( '' !== values.column_spacing ) { imagesAttr.images.style = 'padding:' + values.column_spacing + ';'; } if ( values.lightbox && 'no' !== values.lightbox ) { imagesAttr.link = { href: image.pic_link, class: 'fusion-lightbox' }; imagesAttr.link[ 'data-rel' ] = 'iLightbox[awb_gallery_' + this.model.get( 'parent' ) + ']'; // TODO: fix // if ( 'undefined' !== typeof image.image_data ) { // if ( -1 !== values.lightbox_content.indexOf( 'title' ) ) { // imagesAttr.link['data-title'] = image.image_data.title; // imagesAttr.link.title = image.image_data.title; // } // if ( -1 !== values.lightbox_content.indexOf( 'caption' ) ) { // imagesAttr.link['data-caption'] = image.image_data.caption; // } // } } return imagesAttr; }, /** * Generate caption markup. * * @since 3.5 * @param {string} values - The values object. * @return {string} */ generateCaption: function( values, childValues ) { var content = '<div class="awb-imageframe-caption-container"><div class="awb-imageframe-caption">', imageId, parentView, image, title = '', caption = '', title_tag = ''; if ( 'off' === values.caption_style ) { return ''; } imageId = this.model.attributes.params.image_id, parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), image = 'undefined' !== typeof parentView.imageMap ? parentView.imageMap.images[ imageId ] : undefined; if ( 'undefined' === typeof image ) { return ''; } // from image data. if ( image.image_data.title ) { title = image.image_data.title; } if ( image.image_data.caption ) { caption = image.image_data.caption; } // from element data. if ( '' !== childValues.image_title ) { title = childValues.image_title; } if ( '' !== childValues.image_caption ) { caption = childValues.image_caption; } if ( '' !== title ) { title_tag = 'div' === values.caption_title_tag ? 'div' : 'h' + values.caption_title_tag; content += '<' + title_tag + ' class="awb-imageframe-caption-title">' + title + '</' + title_tag + '>'; } if ( '' !== caption ) { content += '<p class="awb-imageframe-caption-text">' + caption + '</p>'; } content += '</div></div>'; return content; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Separator View. FusionPageBuilder.fusion_separator = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var params = this.model.get( 'params' ); if ( params.flex_grow ) { jQuery( this.$el ).closest( '.fusion-builder-live-element' ).css( 'flex-grow', params.flex_grow ); } else { jQuery( this.$el ).closest( '.fusion-builder-live-element' ).css( 'flex-grow', '' ); } }, /** * Modify template attributes. * * @since 2.0 * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); attributes.values = atts.values; // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.borderParts = this.buildBorderPartsAttr( atts.values ); attributes.iconWrapperAttr = this.buildIconWrapperAttr( atts.values ); attributes.iconAttr = this.buildIconAttr( atts.values ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.width = _.fusionValidateAttrValue( values.width, 'px' ); values.top_margin = _.fusionValidateAttrValue( values.top_margin, 'px' ); values.bottom_margin = _.fusionValidateAttrValue( values.bottom_margin, 'px' ); if ( '0' === values.icon_circle ) { values.icon_circle = 'no'; } if ( '' !== values.style ) { values.style_type = values.style; } else if ( 'default' === values.style_type ) { values.style_type = fusionAllElements.fusion_separator.defaults.style_type; } values.style_type = values.style_type.replace( / /g, '|' ); if ( '' !== values.bottom ) { values.bottom_margin = _.fusionValidateAttrValue( values.bottom, 'px' ); } if ( '' !== values.color ) { values.sep_color = values.color; } // Fallback, in case TO is unset, which was need for installs before 7.0. if ( '' === values.icon_color ) { values.icon_color = values.sep_color; } if ( '' !== values.top ) { values.top_margin = _.fusionValidateAttrValue( values.top, 'px' ); if ( '' === values.bottom && 'none' !== values.style ) { values.bottom_margin = _.fusionValidateAttrValue( values.top, 'px' ); } } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-separator ' + values[ 'class' ], style: '', 'aria-hidden': 'true' } ); attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( '' !== values.icon && 'none' !== values.style_type ) { attr[ 'class' ] += ' fusion-has-icon'; } if ( 'absolute' === values.position ) { attr[ 'class' ] += ' fusion-absolute-separator'; attr[ 'class' ] += ' fusion-align-' + values.alignment; if ( '' === values.width ) { values.width = '100%'; } } else if ( 'center' === values.alignment ) { attr.style += 'margin-left: auto;margin-right: auto;'; } else { attr.style += 'float:' + values.alignment + ';'; attr[ 'class' ] += ' fusion-clearfix'; } if ( values.flex_grow ) { attr.style += 'flex-grow:' + values.flex_grow + ';'; } if ( '' !== values.top_margin ) { attr.style += 'margin-top:' + values.top_margin + ';'; } if ( '' !== values.bottom_margin ) { attr.style += 'margin-bottom:' + values.bottom_margin + ';'; } if ( '' !== values.width ) { attr.style += 'width:100%;max-width:' + values.width + ';'; } attr.id = values.id; return attr; }, /** * Builds attributes. * * @since 3.0 * @param {Object} values - The values object. * @return {Object} */ buildBorderPartsAttr: function( values ) { var attr = { class: 'fusion-separator-border', style: '' }, styles, shadow; if ( '' === values.width || '100%' === values.width ) { attr[ 'class' ] += ' fusion-full-width-sep'; } styles = values.style_type.split( '|' ); if ( -1 === jQuery.inArray( 'none', styles ) && -1 === jQuery.inArray( 'single', styles ) && -1 === jQuery.inArray( 'double', styles ) && -1 === jQuery.inArray( 'shadow', styles ) ) { styles.push( 'single' ); } jQuery.each( styles, function( key, style ) { attr[ 'class' ] += ' sep-' + style; } ); if ( values.sep_color ) { if ( 'shadow' === values.style_type ) { shadow = 'background:radial-gradient(ellipse at 50% -50% , ' + values.sep_color + ' 0px, rgba(255, 255, 255, 0) 80%) repeat scroll 0 0 rgba(0, 0, 0, 0);'; attr.style = shadow; attr.style += shadow.replace( 'radial-gradient', '-webkit-radial-gradient' ); attr.style += shadow.replace( 'radial-gradient', '-moz-radial-gradient' ); attr.style += shadow.replace( 'radial-gradient', '-o-radial-gradient' ); } else if ( 'none' !== values.style_type ) { attr.style = 'border-color:' + values.sep_color + ';'; } } if ( -1 !== jQuery.inArray( 'single', styles ) ) { attr.style += 'border-top-width:' + values.border_size + ';'; } if ( -1 !== jQuery.inArray( 'double', styles ) ) { attr.style += 'border-top-width:' + values.border_size + ';border-bottom-width:' + values.border_size + ';'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildIconWrapperAttr: function( values ) { var circleColor, marginTop, styles = values.style_type.split( '|' ), iconWrapperAttr = { class: 'icon-wrapper' }; circleColor = ( 'no' === values.icon_circle ) ? 'transparent' : values.sep_color; iconWrapperAttr.style = 'border-color:' + circleColor + ';'; if ( values.icon_circle_color && 'no' !== values.icon_circle ) { iconWrapperAttr.style += 'background-color:' + values.icon_circle_color + ';'; } if ( values.icon_size ) { iconWrapperAttr.style += 'font-size:' + values.icon_size + 'px;'; iconWrapperAttr.style += 'width: 1.75em;'; iconWrapperAttr.style += 'height: 1.75em;'; } if ( values.border_size ) { iconWrapperAttr.style += 'border-width:' + values.border_size + ';'; iconWrapperAttr.style += 'padding:' + values.border_size + ';'; } if ( -1 !== jQuery.inArray( 'single', styles ) ) { marginTop = parseInt( values.border_size, 10 ) / 2; iconWrapperAttr.style += 'margin-top:-' + marginTop + 'px;'; } return iconWrapperAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildIconAttr: function( values ) { var iconAttr = { class: _.fusionFontAwesome( values.icon ), style: 'font-size:inherit;' }; if ( '' !== values.icon_color ) { iconAttr.style += 'color:' + values.icon_color + ';'; } return iconAttr; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Title View FusionPageBuilder.fusion_title = FusionPageBuilder.ElementView.extend( { /** * Runs when element is first init. * * @since 3.0 * @return {void} */ onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { if ( 'undefined' === typeof params.margin_top_small && 'string' === typeof params.margin_top_mobile ) { params.margin_top_small = params.margin_top_mobile; } if ( 'undefined' === typeof params.margin_bottom_small && 'string' === typeof params.margin_bottom_mobile ) { params.margin_bottom_small = params.margin_bottom_mobile; } this.model.set( 'params', params ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.headingAttr = this.buildHeadingAttr( atts.values ); attributes.animatedAttr = this.buildAnimatedAttr( atts.values ); attributes.rotatedAttr = this.buildRotatedAttr( atts.values ); attributes.separatorAttr = this.builderSeparatorAttr( atts.values ); attributes.style = this.buildStyleBlock( atts.values, atts.extras ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.output = 'string' === typeof atts.values.element_content ? atts.values.element_content : ''; attributes.style_type = atts.values.style_type; attributes.size = atts.values.size; attributes.content_align = atts.values.content_align; attributes.title_type = atts.values.title_type; attributes.before_text = atts.values.before_text; attributes.highlight_text = atts.values.highlight_text; attributes.after_text = atts.values.after_text; attributes.rotation_text = atts.values.rotation_text; attributes.title_link = atts.values.title_link; attributes.title_tag = 'div' === atts.values.size ? 'div' : 'h' + atts.values.size; attributes.isFlex = this.flexDisplay(); attributes.content_align_sizes = { large: atts.values.content_align, medium: atts.values.content_align_medium || atts.values.content_align, small: atts.values.content_align_small || atts.values.content_align }; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' ); values.margin_top_mobile = _.fusionValidateAttrValue( values.margin_top_mobile, 'px' ); values.margin_bottom_mobile = _.fusionValidateAttrValue( values.margin_bottom_mobile, 'px' ); if ( 'rotating' === values.title_type && '' !== values.rotation_text ) { values.rotation_text = values.rotation_text.split( '|' ); } else { values.rotation_text = []; } if ( 'text' !== values.title_type ) { values.style_type = 'none'; } if ( 'default' === values.style_type ) { values.style_type = fusionAllElements.fusion_title.defaults.style_type; } if ( 1 === values.style_type.split( ' ' ).length ) { values.style_type += ' solid'; } // Make sure the title text is not wrapped with an unattributed p tag. if ( 'string' === typeof values.element_content ) { values.element_content = values.element_content.trim(); values.element_content = values.element_content.replace( /(<p[^>]+?>|<p>|<\/p>)/img, '' ); } if ( 'undefined' !== typeof values.font_size && '' !== values.font_size ) { values.font_size = _.fusionGetValueWithUnit( values.font_size ); } if ( 'undefined' !== typeof values.letter_spacing && '' !== values.letter_spacing ) { values.letter_spacing = _.fusionGetValueWithUnit( values.letter_spacing ); } if ( 'yes' === values.text_shadow ) { values.text_shadow = _.fusionGetTextShadowStyle( values ).trim(); } }, buildStyleBlock: function( values, extras ) { var style = '<style type="text/css">', bottomHighlights = [ 'underline', 'double_underline', 'underline_zigzag', 'underline_zigzag', 'curly' ]; if ( 'highlight' === values.title_type && '' !== values.highlight_color ) { style += '.fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + ' svg path{stroke:' + values.highlight_color + '!important}'; } if ( 'highlight' === values.title_type && '' !== values.highlight_top_margin && bottomHighlights.includes( values.highlight_effect ) ) { style += '.fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + ' svg{margin-top:' + values.highlight_top_margin + 'px!important}'; } if ( 'highlight' === values.title_type && '' !== values.highlight_width ) { style += '.fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + ' svg path{stroke-width:' + values.highlight_width + '!important}'; } if ( 'rotating' === values.title_type && '' !== values.text_color && ( 'clipIn' === values.rotation_effect || 'typeIn' === values.rotation_effect ) ) { style += '.fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + ' .fusion-animated-texts-wrapper::before{background-color:' + values.text_color + '!important}'; } // Old legacy CSS only. if ( ! ( '' === values.margin_top_mobile && '' === values.margin_bottom_mobile ) && ! ( '0px' === values.margin_top_mobile && '20px' === values.margin_bottom_mobile ) && ( '0px' === values.margin_top_small && '20px' === values.margin_bottom_small ) ) { style += '@media only screen and (max-width:' + extras.content_break_point + 'px) {'; style += '.fusion-body .fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + '{margin-top:' + values.margin_top_mobile + '!important;margin-bottom:' + values.margin_bottom_mobile + '!important;}'; style += '}'; } // If medium element values are set, use them. if ( ! ( '' === values.margin_top_medium && '' === values.margin_right_medium && '' === values.margin_bottom_medium && '' === values.margin_left_medium ) ) { style += '@media only screen and (max-width:' + extras.visibility_medium + 'px) {'; style += '.fusion-body .fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + '{margin-top:' + values.margin_top_medium + '!important;margin-right:' + values.margin_right_medium + '!important;margin-bottom:' + values.margin_bottom_medium + '!important;margin-left:' + values.margin_left_medium + '!important;}'; style += '}'; } else if ( ! ( '' === values.margin_top && '' === values.margin_right && '' === values.margin_bottom && '' === values.margin_left ) ) { // If no medium element values are set, inherit large ones to make sure that not the content breakpoint media query takes over with mobile values. style += '@media only screen and (max-width:' + extras.visibility_medium + 'px) {'; style += '.fusion-body .fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + '{margin-top:' + values.margin_top + '!important; margin-right:' + values.margin_right + '!important; margin-bottom:' + values.margin_bottom + '!important; margin-left:' + values.margin_left + '!important;}'; style += '}'; } if ( ! ( '' === values.margin_top_small && '' === values.margin_right_small && '' === values.margin_bottom_small && '' === values.margin_left_small ) ) { style += '@media only screen and (max-width:' + extras.visibility_small + 'px) {'; style += '.fusion-body .fusion-title.fusion-title-cid' + this.model.get( 'cid' ) + '{margin-top:' + values.margin_top_small + '!important;margin-right:' + values.margin_right_small + '!important; margin-bottom:' + values.margin_bottom_small + '!important; margin-left:' + values.margin_left_small + '!important;}'; style += '}'; } if ( 'text' === values.title_type && 'on' === values.title_link ) { if ( '' !== values.link_color ) { style += '.fusion-title.fusion-title-text.fusion-title-cid' + this.model.get( 'cid' ) + ' a{color:' + values.link_color + '}'; } if ( '' !== values.link_hover_color ) { style += '.fusion-title.fusion-title-text.fusion-title-cid' + this.model.get( 'cid' ) + ' a:hover{color:' + values.link_hover_color + '}'; } } style += '</style>'; return style; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var styles, titleSize = 'two', attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-title title fusion-title-cid' + this.model.get( 'cid' ), style: '' } ); attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( -1 !== values.style_type.indexOf( 'underline' ) ) { styles = values.style_type.split( ' ' ); _.each( styles, function( style ) { attr[ 'class' ] += ' sep-' + style; } ); if ( values.sep_color ) { attr.style = 'border-bottom-color:' + values.sep_color + ';'; } } else if ( -1 !== values.style_type.indexOf( 'none' ) || 'text' !== values.title_type ) { attr[ 'class' ] += ' fusion-sep-none'; } if ( 'center' === values.content_align ) { attr[ 'class' ] += ' fusion-title-center'; } if ( '' !== values.title_type ) { attr[ 'class' ] += ' fusion-title-' + values.title_type; } if ( 'text' !== values.title_type && '' !== values.loop_animation ) { attr[ 'class' ] += ' fusion-loop-' + values.loop_animation; } if ( '' !== values.rotation_effect ) { attr[ 'class' ] += ' fusion-title-' + values.rotation_effect; } if ( 'highlight' === values.title_type && '' !== values.highlight_effect ) { attr[ 'data-highlight' ] = values.highlight_effect; attr[ 'class' ] += ' fusion-highlight-' + values.highlight_effect; } if ( '1' == values.size ) { titleSize = 'one'; } else if ( '2' == values.size ) { titleSize = 'two'; } else if ( '3' == values.size ) { titleSize = 'three'; } else if ( '4' == values.size ) { titleSize = 'four'; } else if ( '5' == values.size ) { titleSize = 'five'; } else if ( '6' == values.size ) { titleSize = 'six'; } attr[ 'class' ] += ' fusion-title-size-' + titleSize; if ( 'undefined' !== typeof values.font_size && '' !== values.font_size ) { attr.style += 'font-size:' + values.font_size + ';'; } if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' === values.margin_top && '' === values.margin_bottom ) { attr.style += ' margin-top:0px; margin-bottom:0px'; attr[ 'class' ] += ' fusion-title-default-margin'; } attr = _.fusionAnimations( values, attr ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildHeadingAttr: function( values ) { var self = this, headingAttr = { class: 'title-heading-' + values.content_align, style: '' }; if ( 'div' === values.size ) { headingAttr[ 'class' ] += ' title-heading-tag'; } headingAttr.style += _.fusionGetFontStyle( 'title_font', values ); if ( this.flexDisplay() ) { if ( values.content_align_medium && values.content_align !== values.content_align_medium ) { headingAttr[ 'class' ] += ' md-text-align-' + values.content_align_medium; } if ( values.content_align_small && values.content_align !== values.content_align_small ) { headingAttr[ 'class' ] += ' sm-text-align-' + values.content_align_small; } } if ( '' !== values.margin_top || '' !== values.margin_bottom ) { headingAttr.style += 'margin:0;'; } if ( '' !== values.font_size ) { headingAttr.style += 'font-size:1em;'; } if ( 'undefined' !== typeof values.line_height && '' !== values.line_height ) { headingAttr.style += 'line-height:' + values.line_height + ';'; } if ( 'undefined' !== typeof values.letter_spacing && '' !== values.letter_spacing ) { headingAttr.style += 'letter-spacing:' + values.letter_spacing + ';'; } if ( 'undefined' !== typeof values.text_transform && '' !== values.text_transform && 'none' !== values.text_transform ) { headingAttr.style += 'text-transform:' + values.text_transform + ';'; } if ( 'undefined' !== typeof values.text_color && '' !== values.text_color ) { headingAttr.style += 'color:' + values.text_color + ';'; } if ( 'text' === values.title_type && 'yes' === values.gradient_font ) { headingAttr.style += _.getGradientFontString( values ); headingAttr[ 'class' ] += ' awb-gradient-text'; } if ( '' !== values.style_tag ) { headingAttr.style += values.style_tag; } // Text shadow. if ( 'no' !== values.text_shadow ) { if ( 'yes' === values.gradient_font ) { headingAttr.style += 'filter:drop-shadow(' + values.text_shadow + ');'; } else { headingAttr.style += 'text-shadow:' + values.text_shadow + ';'; } } if ( 'text' === values.title_type ) { headingAttr = _.fusionInlineEditor( { cid: self.model.get( 'cid' ), overrides: { color: 'text_color', 'font-size': 'font_size', 'line-height': 'line_height', 'letter-spacing': 'letter_spacing', tag: 'size' } }, headingAttr ); } return headingAttr; }, /** * Builds animation attributes. * * @since 2.1 * @param {Object} values - The values object. * @return {Object} */ buildAnimatedAttr: function( values ) { var animationAttr = { class: 'fusion-animated-texts-wrapper', style: '' }; if ( '' !== values.animated_text_color ) { animationAttr.style += 'color:' + values.animated_text_color + ';'; } if ( values.animated_font_size ) { animationAttr.style += 'font-size:' + values.animated_font_size + ';'; } if ( 'highlight' === values.title_type ) { animationAttr[ 'class' ] = 'fusion-highlighted-text'; } if ( 'rotating' === values.title_type ) { animationAttr[ 'data-length' ] = this.getAnimationLength( values.rotation_effect ); if ( '' !== values.display_time ) { animationAttr[ 'data-minDisplayTime' ] = values.display_time; } if ( '' !== values.after_text || ( '' === values.before_text && '' === values.after_text ) ) { animationAttr.style += 'text-align: center;'; } } return animationAttr; }, /** * Get Animation length. * * @since 2.1 * @param {String} effect - The animation effect. * @return {String} */ getAnimationLength: function ( effect ) { var animationLength = ''; switch ( effect ) { case 'flipInX': case 'bounceIn': case 'zoomIn': case 'slideInDown': case 'clipIn': animationLength = 'line'; break; case 'lightSpeedIn': animationLength = 'word'; break; case 'rollIn': case 'typeIn': case 'fadeIn': animationLength = 'char'; break; } return animationLength; }, /** * Builds rotated text attributes. * * @since 2.1 * @param {Object} values - The values object. * @return {Object} */ buildRotatedAttr: function( values ) { var effect = values.rotation_effect, rotatedAttr = { class: 'fusion-animated-text', style: '' }; rotatedAttr[ 'data-in-effect' ] = effect; rotatedAttr[ 'data-in-sequence' ] = 'true'; rotatedAttr[ 'data-out-reverse' ] = 'true'; effect = effect.replace( 'In', 'Out' ); effect = effect.replace( 'Down', 'Up' ); rotatedAttr[ 'data-out-effect' ] = effect; return rotatedAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ builderSeparatorAttr: function( values ) { var separatorAttr = { class: 'title-sep' }, styles = values.style_type.split( ' ' ); _.each( styles, function( style ) { separatorAttr[ 'class' ] += ' sep-' + style; } ); if ( values.sep_color ) { separatorAttr.style = 'border-color:' + values.sep_color + ';'; } return separatorAttr; }, onCancel: function() { this.resetTypography(); }, afterPatch: function() { this.resetTypography(); this.refreshJs(); }, refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_title', this.model.attributes.cid ); }, resetTypography: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-typography-reset', this.model.get( 'cid' ) ); if ( 800 > jQuery( '#fb-preview' ).width() ) { setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'resize' ); }, 50 ); } } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Testimonials parent View. FusionPageBuilder.fusion_testimonials = FusionPageBuilder.ParentElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { // TODO: save DOM and apply instead of generating. this.generateChildElements(); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_testimonials', this.model.attributes.cid ); }, childViewAdded: function() { this.clearInterval(); }, childViewRemoved: function() { this.clearInterval(); }, childViewCloned: function() { this.clearInterval(); }, clearInterval: function() { // Clear interval, before DOM is patched an info is lost. jQuery( '#fb-preview' )[ 0 ].contentWindow.clearInterval( parseInt( jQuery( this.$el ).find( '.fusion-testimonials' ).attr( 'data-interval' ) ) ); this.reRender(); }, // Empty on purpose, to override parent function. refreshJs: function() {}, // eslint-disable-line no-empty-function /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); attributes.styles = this.buildStyles( atts.values ); attributes.attr = this.buildAttr( atts.values ); attributes.paginationAttr = this.buildPaginationAttr( atts.values ); attributes.navigation = atts.values.navigation; attributes.children = 'undefined' !== typeof atts.values.element_content ? atts.values.element_content.match( /\[fusion_testimonial ((.|\n|\r)*?)\]/g ).length : 1; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.random = ( 'yes' === values.random || '1' === values.random ) ? 1 : 0; if ( 'clean' === values.design && '' === values.navigation ) { values.navigation = 'yes'; } else if ( 'classic' === values.design && '' === values.navigation ) { values.navigation = 'no'; } }, buildStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ); styles += '#fusion-testimonials-cid' + cid + ' a{border-color:' + values.textcolor + ';}'; styles += '#fusion-testimonials-cid' + cid + ' a:hover, #fusion-testimonials-cid' + cid + ' .activeSlide{background-color: ' + values.textcolor + ';}'; styles += '.fusion-testimonials.' + values.design + '.fusion-testimonials-cid' + cid + ' .author:after{border-top-color:' + values.backgroundcolor + ' !important;}'; return styles; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-testimonials ' + values.design + ' fusion-testimonials-cid' + this.model.get( 'cid' ) + ' ' + values[ 'class' ] } ); attr[ 'data-random' ] = values.random; attr[ 'data-speed' ] = values.speed; attr.id = values.id; return attr; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildPaginationAttr: function() { var paginationAttr = { class: 'testimonial-pagination', id: 'fusion-testimonials-cid' + this.model.get( 'cid' ) }; return paginationAttr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter circle child View. FusionPageBuilder.fusion_testimonial = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); this.buildReviewAttr( atts.values ); attributes.values = atts.values; attributes.parentValues = atts.parentValues; attributes.imageAttr = this.buildImageAttr( atts.values ); attributes.thumbnailAttr = this.buildThumbnailAttr( atts ); attributes.blockquoteAttr = this.buildBlockquoteAttr( atts ); attributes.quoteAttr = this.buildQuoteAttr( atts ); attributes.authorAttr = this.buildAuthorAttr( atts ); attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); attributes.content = atts.values.element_content; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'round' === values.image_border_radius ) { values.image_border_radius = '50%'; } else { values.image_border_radius = _.fusionValidateAttrValue( values.image_border_radius, 'px' ); } // Check for deprecated. if ( 'undefined' !== typeof values.gender && '' !== values.gender ) { values.avatar = values.gender; } if ( 'image' === values.avatar && ! values.image ) { values.avatar = 'none'; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildReviewAttr: function( values ) { var reviewAttr = { class: 'review ' }; if ( this.isFirstChild() ) { reviewAttr[ 'class' ] += 'active-testimonial '; } if ( 'none' === values.avatar ) { reviewAttr[ 'class' ] += 'no-avatar'; } else if ( 'image' === values.avatar ) { reviewAttr[ 'class' ] += 'avatar-image'; } else { reviewAttr[ 'class' ] += values.avatar; } this.model.set( 'selectors', reviewAttr ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildImageAttr: function( values ) { var imageAttr = { class: 'testimonial-image', src: values.image, alt: '' }; if ( 'image' === values.avatar ) { imageAttr.style = '-webkit-border-radius: ' + values.image_border_radius + ';-moz-border-radius: ' + values.image_border_radius + ';border-radius: ' + values.image_border_radius + ';'; } return imageAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildThumbnailAttr: function( atts ) { var values = atts.values, parentValues = atts.parentValues, thumbnailAttr = { class: 'testimonial-thumbnail' }; if ( 'image' !== values.avatar ) { thumbnailAttr[ 'class' ] += ' doe'; thumbnailAttr.style = 'color:' + parentValues.textcolor + ';'; } return thumbnailAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildBlockquoteAttr: function( atts ) { var parentValues = atts.parentValues, blockquoteAttr = { style: 'background-color:' + parentValues.backgroundcolor + ';' }; if ( 'clean' === parentValues.design && ( 'transparent' === parentValues.backgroundcolor || 0 === jQuery.AWB_Color( parentValues.backgroundcolor ).alpha() ) ) { blockquoteAttr.style += 'margin: -25px;'; } return blockquoteAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildQuoteAttr: function( atts ) { var parentValues = atts.parentValues, quoteAttr = { style: 'background-color:' + parentValues.backgroundcolor + ';color:' + parentValues.textcolor + ';' }; return quoteAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildAuthorAttr: function( atts ) { var parentValues = atts.parentValues, authorAttr = { class: 'author', style: 'color:' + parentValues.textcolor + ';' }; return authorAttr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Tooltip View. FusionPageBuilder.fusion_tooltip = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects. attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.content = atts.values.element_content; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} - Returns the attributes. */ buildAttr: function( values ) { var attr = { class: 'fusion-tooltip tooltip-shortcode ' + values[ 'class' ] }; attr.id = values.id; attr[ 'data-animation' ] = values.animation; attr[ 'data-delay' ] = values.delay; attr[ 'data-placement' ] = values.placement; attr.title = values.title; attr[ 'data-title' ] = values.title; attr[ 'data-toggle' ] = 'tooltip'; attr[ 'data-trigger' ] = values.trigger; return attr; } } ); } ); }( jQuery ) ); ;/* global cssua, FusionApp */ /* jshint -W107 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Sharing Box View. FusionPageBuilder.fusion_sharing = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var tooltips = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ).find( '.fusion-social-networks [data-toggle="tooltip"]' ); tooltips.tooltip( 'destroy' ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var tooltips = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ).find( '.fusion-social-networks [data-toggle="tooltip"]' ); setTimeout( function() { tooltips.tooltip( { container: 'body' } ); }, 150 ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values and extras. this.validateValuesExtras( atts.values, atts.extras ); this.values = atts.values; // Create attribute objects. attributes.cid = this.model.get( 'cid' ); this.counter = this.model.get( 'cid' ); attributes.shortcodeAttr = this.buildShortcodeAttr( atts.values ); attributes.socialNetworksAttr = this.buildSocialNetworksAttr( atts.values ); attributes.taglineAttr = this.buildTaglineAttr( atts.values ); attributes.icons = this.buildIcons( atts.values ); attributes.tagline = atts.values.tagline; attributes.taglineVisibility = atts.values.tagline_visibility; attributes.styles = this.buildStyleBlock(); return attributes; }, /** * Builds styles. * * @since 2.4 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var selector, large_layout, css, layout_medium, layout_small; this.baseSelector = '.sharingbox-shortcode-icon-wrapper-' + this.counter + ''; this.wrapper_selector = '.fusion-sharing-box-' + this.counter; this.selectors = [ this.baseSelector, this.wrapper_selector ]; this.dynamic_css = {}; if ( 'hide' === this.values.tagline_visibility ) { this.values.layout = 'floated'; this.values.layout_medium = 'floated'; this.values.layout_small = 'floated'; } if ( ! this.values.layout_medium ) { this.values.layout_medium = this.values.layout; } if ( ! this.values.layout_small ) { this.values.layout_small = this.values.layout; } if ( this.values.icon_taglines ) { if ( 'before' === this.values.tagline_placement ) { this.addCssProperty( this.wrapper_selector + ' .fusion-social-network-icon-tagline', 'margin-right', '0.5em', true ); } else { this.addCssProperty( this.wrapper_selector + ' .fusion-social-network-icon-tagline', 'margin-left', '0.5em', true ); } this.addCssProperty( this.baseSelector + ' span a', 'align-items', 'center', true ); this.addCssProperty( this.baseSelector + ' span a', 'display', 'flex', true ); } if ( ! this.values.stacked_align_medium ) { this.values.stacked_align_medium = this.values.stacked_align; } if ( ! this.values.stacked_align_small ) { this.values.stacked_align_small = this.values.stacked_align; } if ( ! this.values.alignment_medium ) { this.values.alignment_medium = this.values.alignment; } if ( ! this.values.alignment_small ) { this.values.alignment_small = this.values.alignment; } if ( !this.isDefault( 'alignment' ) ) { this.addCssProperty( [ this.baseSelector ], 'justify-content', this.values.alignment, true ); } selector = [ this.wrapper_selector ]; if ( 'floated' === this.values.layout ) { this.addCssProperty( [ this.wrapper_selector + ' h4' ], 'margin-bottom', '0', true ); } else { this.addCssProperty( selector, 'align-items', this.values.stacked_align, true ); this.addCssProperty( selector, 'justify-content', 'space-around', true ); this.addCssProperty( [ this.baseSelector ], 'width', '100%', true ); } large_layout = ( 'stacked' === this.values.layout ) ? ' column' : 'row'; this.addCssProperty( selector, 'flex-direction', large_layout, true ); if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( selector, 'border-color', this.values.border_color, true ); } if ( !this.isDefault( 'wrapper_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', _.fusionGetValueWithUnit( this.values.wrapper_padding_top ), true ); } if ( !this.isDefault( 'wrapper_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', _.fusionGetValueWithUnit( this.values.wrapper_padding_bottom ), true ); } if ( !this.isDefault( 'wrapper_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', _.fusionGetValueWithUnit( this.values.wrapper_padding_left ), true ); } if ( !this.isDefault( 'wrapper_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', _.fusionGetValueWithUnit( this.values.wrapper_padding_right ), true ); } if ( !this.isDefault( 'border_bottom' ) ) { this.addCssProperty( selector, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.border_bottom ), true ); } if ( !this.isDefault( 'border_top' ) ) { this.addCssProperty( selector, 'border-top-width', _.fusionGetValueWithUnit( this.values.border_top ), true ); } if ( !this.isDefault( 'border_left' ) ) { this.addCssProperty( selector, 'border-left-width', _.fusionGetValueWithUnit( this.values.border_left ), true ); } if ( !this.isDefault( 'border_right' ) ) { this.addCssProperty( selector, 'border-right-width', _.fusionGetValueWithUnit( this.values.border_right ), true ); } if ( !this.isDefault( 'border_radius_top_left' ) ) { this.addCssProperty( selector, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_left ), true ); } if ( !this.isDefault( 'border_radius_top_right' ) ) { this.addCssProperty( selector, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_right ), true ); } if ( !this.isDefault( 'border_radius_bottom_right' ) ) { this.addCssProperty( selector, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_right ), true ); } if ( !this.isDefault( 'border_radius_bottom_left' ) ) { this.addCssProperty( selector, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_left ), true ); } selector = [ this.baseSelector + ' span:not(.sharingbox-shortcode-icon-separator)' ]; if ( !this.isDefault( 'padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.padding_top, true ); } if ( !this.isDefault( 'padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.padding_bottom, true ); } if ( !this.isDefault( 'padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.padding_left, true ); } if ( !this.isDefault( 'padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.padding_right, true ); } if ( !this.isDefault( 'icon_tagline_color' ) ) { this.addCssProperty( this.baseSelector + ' a', 'color', this.values.icon_tagline_color, true ); } if ( !this.isDefault( 'icon_tagline_color_hover' ) ) { this.addCssProperty( this.baseSelector + ' a:hover', 'color', this.values.icon_tagline_color_hover, true ); } if ( !this.isDefault( 'tagline_text_size' ) ) { this.addCssProperty( this.baseSelector + ' a', 'font-size', this.values.tagline_text_size, true ); } if ( !this.isDefault( 'icon_size' ) ) { this.addCssProperty( this.baseSelector + ' a i', 'font-size', this.values.icon_size, true ); } selector = [ this.baseSelector + ' span.sharingbox-shortcode-icon-separator' ]; if ( !this.isDefault( 'separator_border_color' ) ) { this.addCssProperty( selector, 'border-color', this.values.separator_border_color, true ); } if ( !this.isDefault( 'separator_border_sizes' ) ) { this.values.separator_border_sizes = this.values.separator_border_sizes + 'px'; this.addCssProperty( selector, 'border-right-width', this.values.separator_border_sizes, true ); } css = this.parseCSS(); this.dynamic_css = {}; layout_medium = ( 'stacked' === this.values.layout_medium ) ? ' column' : 'row'; selector = [ this.wrapper_selector ]; this.addCssProperty( selector, 'flex-direction', layout_medium, true ); if ( 'floated' !== this.values.layout_medium ) { this.addCssProperty( [ this.wrapper_selector + ' h4' ], 'margin-bottom', 'revert', true ); this.addCssProperty( [ this.baseSelector ], 'width', '100%', true ); } else { this.addCssProperty( [ this.baseSelector ], 'width', 'auto', true ); this.addCssProperty( selector, 'align-items', 'center', true ); this.addCssProperty( [ this.wrapper_selector + ' h4' ], 'margin-bottom', '0', true ); this.addCssProperty( this.wrapper_selector + ' h4', 'margin-right', '0.5em', true ); } if ( this.values.alignment_medium ) { this.addCssProperty( [ this.baseSelector ], 'justify-content', this.values.alignment_medium, true ); if ( 'floated' !== this.values.layout_medium ) { this.addCssProperty( selector, 'align-items', this.values.stacked_align_medium, true ); } } css += '@media only screen and (max-width:' + FusionApp.settings.visibility_medium + 'px){' + this.parseCSS() + ' }'; layout_small = ( 'stacked' === this.values.layout_small ) ? ' column' : 'row'; this.dynamic_css = {}; this.addCssProperty( selector, 'flex-direction', layout_small, true ); if ( 'floated' !== this.values.layout_small ) { this.addCssProperty( [ this.wrapper_selector + ' h4' ], 'margin-bottom', 'revert', true ); this.addCssProperty( [ this.baseSelector ], 'width', '100%', true ); } else { this.addCssProperty( [ this.wrapper_selector + ' h4' ], 'margin-bottom', '0', true ); this.addCssProperty( selector, 'align-items', 'center', true ); this.addCssProperty( [ this.baseSelector ], 'width', 'auto', true ); this.addCssProperty( this.wrapper_selector + ' h4', 'margin-right', '0.5em', true ); } if ( this.values.alignment_small ) { this.addCssProperty( this.baseSelector, 'justify-content', this.values.alignment_small, true ); if ( 'floated' !== this.values.layout_small ) { this.addCssProperty( selector, 'align-items', this.values.stacked_align_small, true ); } } css += '@media only screen and (max-width:' + FusionApp.settings.visibility_small + 'px){' + this.parseCSS() + ' }'; return ( css ) ? '<style type="text/css">' + css + '</style>' : ''; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} extras - Extra args. * @return {void} */ validateValuesExtras: function( values, extras ) { extras.linktarget = extras.linktarget ? '_blank' : '_self'; values.icons_boxed_radius = _.fusionValidateAttrValue( values.icons_boxed_radius, 'px' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildShortcodeAttr: function( values ) { var sharingboxShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-sharing-box fusion-sharing-box-' + this.model.get( 'cid' ), style: '' } ); sharingboxShortcode[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( 'yes' === values.icons_boxed ) { sharingboxShortcode[ 'class' ] += ' boxed-icons'; } if ( '' !== values.backgroundcolor ) { sharingboxShortcode.style = 'background-color:' + values.backgroundcolor + ';'; if ( 'transparent' === values.backgroundcolor || 0 === jQuery.AWB_Color( values.backgroundcolor ).alpha() ) { sharingboxShortcode.style += 'padding:0;'; } } if ( '' !== values[ 'class' ] ) { sharingboxShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { sharingboxShortcode[ 'class' ] += ' ' + values.id; } if ( '' !== values.margin_top ) { sharingboxShortcode.style += 'margin-top: ' + values.margin_top + ';'; } if ( '' !== values.margin_bottom ) { sharingboxShortcode.style += 'margin-bottom: ' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { sharingboxShortcode.style += 'margin-left: ' + values.margin_left + ';'; } if ( '' !== values.margin_right ) { sharingboxShortcode.style += 'margin-right: ' + values.margin_right + ';'; } sharingboxShortcode[ 'data-title' ] = values.title; sharingboxShortcode[ 'data-description' ] = values.description; sharingboxShortcode[ 'data-link' ] = values.link; sharingboxShortcode[ 'data-image' ] = values.pinterest_image; return sharingboxShortcode; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSocialNetworksAttr: function( values ) { var sharingboxShortcodeSocialNetworks = { class: 'fusion-social-networks sharingbox-shortcode-icon-wrapper sharingbox-shortcode-icon-wrapper-' + this.model.get( 'cid' ) }; if ( 'yes' === values.icons_boxed ) { sharingboxShortcodeSocialNetworks[ 'class' ] += ' boxed-icons'; } if ( '' !== values.alignment ) { sharingboxShortcodeSocialNetworks.style = 'text-align: ' + values.alignment + ';'; } return sharingboxShortcodeSocialNetworks; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildTaglineAttr: function( values ) { var sharingboxShortcodeTagline = { class: 'tagline' }, that = this; if ( '' !== values.tagline_color ) { sharingboxShortcodeTagline.style = 'color:' + values.tagline_color + ';'; } sharingboxShortcodeTagline = _.fusionInlineEditor( { param: 'tagline', cid: that.model.get( 'cid' ), toolbar: false }, sharingboxShortcodeTagline ); return sharingboxShortcodeTagline; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildIconAttr: function( values ) { var sharingboxShortcodeTagline = { class: 'tagline' }; if ( '' !== values.tagline_color ) { sharingboxShortcodeTagline.style = 'color:' + values.tagline_color + ';'; } return sharingboxShortcodeTagline; }, /** * Builds HTML for the icons. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra args. * @return {string} */ buildIcons: function( values ) { var icons = '', iconColors = values.icon_colors, boxColors = values.box_colors, itemTagline = values.icon_taglines, useBrandColors = false, numOfIconColors, numOfBoxColors, socialNetworks, socialNetworksCount, i, description, link, title, image, socialLink, sharingboxShortcodeIcon, sharingboxShortcodeIconLink, iconOptions, socialIconBoxedColors, network, tooltip, numOfTaglines; if ( 'brand' === values.color_type ) { useBrandColors = true; // Get a list of all the available social networks. socialIconBoxedColors = _.fusionSocialIcons( false, true ); socialIconBoxedColors.mail = { label: 'Email Address', color: '#000000' }; } iconColors = iconColors.split( '|' ); boxColors = boxColors.split( '|' ); itemTagline = itemTagline.split( '|' ); numOfIconColors = iconColors.length; numOfBoxColors = boxColors.length; numOfTaglines = itemTagline.length; socialNetworks = values.social_share_links; if ( 'string' === typeof socialNetworks ) { socialNetworks = socialNetworks.split( ',' ); } socialNetworksCount = socialNetworks.length; for ( i = 0; i < socialNetworksCount; i++ ) { network = socialNetworks[ i ]; if ( true === useBrandColors ) { iconOptions = { social_network: network, icon_color: ( 'yes' === values.icons_boxed ) ? '#ffffff' : socialIconBoxedColors[ network ].color, box_color: ( 'yes' === values.icons_boxed ) ? socialIconBoxedColors[ network ].color : '' }; } else { iconOptions = { social_network: network, icon_color: i < iconColors.length ? iconColors[ i ] : '', box_color: i < boxColors.length ? boxColors[ i ] : '' }; if ( 1 === numOfIconColors ) { iconOptions.icon_color = iconColors[ 0 ]; } if ( 1 === numOfBoxColors ) { iconOptions.box_color = boxColors[ 0 ]; } } if ( 1 === numOfTaglines ) { iconOptions.icon_tagline = itemTagline[ 0 ]; } else { iconOptions.icon_tagline = i < itemTagline.length ? itemTagline[ i ] : ''; } iconOptions.social_network = 'email' === iconOptions.social_network ? 'mail' : iconOptions.social_network; // sharingboxShortcodeIcon attributes description = values.description; link = values.link; title = values.title; image = _.fusionRawUrlEncode( values.pinterest_image ); sharingboxShortcodeIcon = { class: 'fusion-social-network-icon fusion-tooltip fusion-' + iconOptions.social_network + ' awb-icon-' + iconOptions.social_network }; sharingboxShortcodeIconLink = {}; socialLink = ''; switch ( iconOptions.social_network ) { case 'facebook': socialLink = 'https://m.facebook.com/sharer.php?u=' + link; if ( cssua.ua.mobile ) { socialLink = 'https://www.facebook.com/sharer.php?m2w&s=100&p[url]=' + link + '&p[images][title]=' + _.fusionRawUrlEncode( title ); } break; case 'twitter': socialLink = 'https://twitter.com/share?text=' + _.fusionRawUrlEncode( title ) + '&url=' + _.fusionRawUrlEncode( link ); break; case 'linkedin': socialLink = 'https://www.linkedin.com/shareArticle?mini=true&url=' + _.fusionRawUrlEncode( link ) + '&title=' + _.fusionRawUrlEncode( title ) + '&summary=' + _.fusionRawUrlEncode( description ); break; case 'reddit': socialLink = 'https://reddit.com/submit?url=' + link + '&title=' + title; break; case 'telegram': socialLink = 'https://t.me/share/url?url=' + _.fusionRawUrlEncode( link ) + '&text=' + _.fusionRawUrlEncode( title ); break; case 'tumblr': socialLink = 'https://www.tumblr.com/share/link?url=' + _.fusionRawUrlEncode( link ) + '&name=' + _.fusionRawUrlEncode( title ) + '&description=' + _.fusionRawUrlEncode( description ); break; case 'pinterest': socialLink = 'https://pinterest.com/pin/create/button/?url=' + _.fusionRawUrlEncode( link ) + '&description=' + _.fusionRawUrlEncode( description ) + '&media=' + image; break; case 'vk': socialLink = 'https://vk.com/share.php?url=' + _.fusionRawUrlEncode( link ) + '&title=' + _.fusionRawUrlEncode( title ) + '&description=' + _.fusionRawUrlEncode( description ); break; case 'mail': socialLink = 'mailto:?subject=' + _.fusionRawUrlEncode( title ) + '&body=' + _.fusionRawUrlEncode( link ); break; } sharingboxShortcodeIconLink.href = socialLink; sharingboxShortcodeIconLink.target = ( values.linktarget && 'mail' !== iconOptions.social_network ) ? '_blank' : '_self'; if ( '_blank' === sharingboxShortcodeIcon.target ) { sharingboxShortcodeIconLink.rel = 'noopener noreferrer'; } sharingboxShortcodeIcon.style = ( iconOptions.icon_color ) ? 'color:' + iconOptions.icon_color + ';' : ''; if ( values.icons_boxed && 'yes' === values.icons_boxed && iconOptions.box_color ) { sharingboxShortcodeIcon.style += 'background-color:' + iconOptions.box_color + ';border-color:' + iconOptions.box_color + ';'; } if ( ( 'yes' === values.icons_boxed && values.icons_boxed_radius ) || '0' === values.icons_boxed_radius ) { if ( 'round' === values.icons_boxed_radius ) { values.icons_boxed_radius = '50%'; } sharingboxShortcodeIcon.style += 'border-radius:' + values.icons_boxed_radius + ';'; } sharingboxShortcodeIconLink[ 'data-placement' ] = values.tooltip_placement; tooltip = iconOptions.social_network; sharingboxShortcodeIconLink[ 'data-title' ] = _.fusionUcFirst( tooltip ); sharingboxShortcodeIconLink.title = _.fusionUcFirst( tooltip ); sharingboxShortcodeIconLink[ 'aria-label' ] = _.fusionUcFirst( tooltip ); if ( 'none' !== values.tooltip_placement ) { sharingboxShortcodeIconLink[ 'data-toggle' ] = 'tooltip'; } icons += '<span><a ' + _.fusionGetAttributes( sharingboxShortcodeIconLink ) + '>'; icons += 'before' === values.tagline_placement && '' !== iconOptions.icon_tagline ? '<div class="fusion-social-network-icon-tagline">' + iconOptions.icon_tagline + '</div>' : ''; icons += '<i ' + _.fusionGetAttributes( sharingboxShortcodeIcon ) + ' aria-hidden="true"></i>'; icons += 'after' === values.tagline_placement && '' !== iconOptions.icon_tagline ? '<div class="fusion-social-network-icon-tagline">' + iconOptions.icon_tagline + '</div>' : ''; icons += '</a></span>'; if ( 0 < values.separator_border_sizes && i < socialNetworks.length - 1 ) { icons += '<span class="sharingbox-shortcode-icon-separator"></span>'; } } return icons; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Section separator view. FusionPageBuilder.fusion_section_separator = FusionPageBuilder.ElementView.extend( { /** * BG Image Separator divider types. * * @since 3.2 * @return {Object} */ bgImageSeparators: [ 'grunge', 'music', 'waves_brush', 'paper', 'squares', 'circles', 'paint', 'grass', 'splash', 'custom' ], /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { // eslint-disable-line no-empty-function }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.extras = atts.extras; // Create attribute objects attributes.attr = this.buildAtts( atts.values ); attributes.attrSvgWrapper = this.buildSvgWrapperAtts( atts.values ); attributes.attrSpacer = this.buildSpacerAtts( atts.values ); attributes.attrSpacerHeight = this.buildSpacerHeightAtts( atts.values ); attributes.attrCandyArrow = this.buildCandyArrowAtts( atts.values ); attributes.attrCandy = this.buildCandyAtts( atts.values ); attributes.attrSVG = this.buildSVGAtts( atts.values ); attributes.attrSVGBGImage = this.buildSVGBGImageAtts( atts.values ); attributes.attrButton = this.buildButtonAtts( atts.values ); attributes.attrRoundedSplit = this.buildRoundedSplitAtts( atts.values ); attributes.values = atts.values; attributes.custom_svg = atts.values.custom_svg ? this.getCustomSvg( atts.values ).svg : ''; attributes.spacerHeight = this.spacerHeight( atts.values ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( ! isNaN( values.bordersize ) ) { values.bordersize = _.fusionGetValueWithUnit( values.bordersize ); } values.borderSizeWithoutUnits = parseInt( values.bordersize.match( /\d+/ ), 10 ); if ( 'horizon' === values.divider_type ) { values.yMin = 'top' === values.divider_candy ? '-0.5' : '0'; } else if ( 'hills_opacity' === values.divider_type ) { values.yMin = 'top' === values.divider_candy ? '-0.5' : '0'; } else if ( 'waves' === values.divider_type ) { values.yMin = 'top' === values.divider_candy ? '54' : '1'; } else if ( 'waves_opacity' === values.divider_type ) { values.yMin = 'top' === values.divider_candy ? '0' : '1'; } values.add_boxed_markup = false; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAtts: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-section-separator section-separator ' + values.divider_type + ' fusion-section-separator-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + _.fusionGetValueWithUnit( values.margin_top ) + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + _.fusionGetValueWithUnit( values.margin_right ) + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + _.fusionGetValueWithUnit( values.margin_bottom ) + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + _.fusionGetValueWithUnit( values.margin_left ) + ';'; } if ( 'rounded-split' === values.divider_type ) { attr[ 'class' ] += ' rounded-split-separator'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds attributes. * * @since 3.0 * @param {Object} values - The values. * @return {Object} */ buildSvgWrapperAtts: function( values ) { var attr = { class: 'fusion-section-separator-svg' }, parentContainernView = FusionPageBuilderApp.getParentContainer( this ), parentContainerValues = 'undefined' !== typeof parentContainernView.values ? parentContainernView.values : {}, parentColumnView = FusionPageBuilderApp.getParentColumn( this ), parentColumnValues = 'undefined' !== typeof parentColumnView.values ? parentColumnView.values : {}, extras = jQuery.extend( true, {}, fusionAllElements.fusion_section_separator.extras ), self = this, paddingValueLeft = '', paddingValueRight = '', columnOuterWidth = jQuery( parentColumnView.$el ).width(), columnWidth = jQuery( parentColumnView.$el ).children( '.fusion-column-wrapper' ).width(), dividerHeightArr = [], selectors, margin, scale; if ( 'triangle' === values.divider_type ) { if ( '' !== values.bordercolor ) { if ( 'bottom' === values.divider_candy ) { attr.style = 'border-bottom:' + values.bordersize + ' solid ' + values.bordercolor + ';'; } else if ( 'top' === values.divider_candy ) { attr.style = 'border-top:' + values.bordersize + ' solid ' + values.bordercolor + ';'; } else if ( -1 !== values.divider_candy.indexOf( 'top' ) && -1 !== values.divider_candy.indexOf( 'bottom' ) ) { attr.style = 'border:' + values.bordersize + ' solid ' + values.bordercolor + ';'; } } } else if ( 'bigtriangle' === values.divider_type || 'slant' === values.divider_type || 'big-half-circle' === values.divider_type || 'clouds' === values.divider_type || 'curved' === values.divider_type ) { attr.style = 'padding:0;'; } else if ( 'horizon' === values.divider_type || 'waves' === values.divider_type || 'waves_opacity' === values.divider_type || 'hills' === values.divider_type || 'hills_opacity' === values.divider_type ) { attr.style = 'font-size:0;line-height:0;'; } values.additional_styles = ''; if ( _.isObject( parentColumnValues ) ) { if ( FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && '1_1' === parentColumnValues.type ) { if ( 'boxed' === extras.layout && _.isObject( parentContainerValues ) ) { values.add_boxed_markup = true; _.each( [ 'large', 'medium', 'small' ], function( size ) { if ( 'large' === size ) { values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; values.additional_styles += 'position: relative;'; if ( ! _.isEmpty( parentContainerValues.padding_left ) && ! _.isEmpty( parentContainerValues.padding_right ) && -1 !== parentContainerValues.padding_left.indexOf( '%' ) && -1 !== parentContainerValues.padding_right.indexOf( '%' ) ) { margin = parseFloat( parentContainerValues.padding_left ) + parseFloat( parentContainerValues.padding_right ); scale = ( 100 - margin ) / 100; values.additional_styles += 'margin-left:-' + ( parseFloat( parentContainerValues.padding_left ) / scale ) + '% !important;'; values.additional_styles += 'margin-right:-' + ( parseFloat( parentContainerValues.padding_right ) / scale ) + '% !important;'; } else { values.additional_styles += 'margin-left:-' + parentContainerValues.padding_left + ';'; values.additional_styles += 'margin-right:-' + parentContainerValues.padding_right + ';'; } values.additional_styles += '}'; } else if ( ( 'undefined' !== typeof parentContainerValues[ 'padding_left_' + size ] && ! _.isEmpty( parentContainerValues[ 'padding_left_' + size ] ) ) || ( 'undefined' !== typeof parentContainerValues[ 'padding_right_' + size ] && ! _.isEmpty( parentContainerValues[ 'padding_right_' + size ] ) ) ) { // Medium and Small size screen styles. values.additional_styles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {'; values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; if ( 'undefined' !== typeof parentContainerValues[ 'padding_left_' + size ] && ! _.isEmpty( parentContainerValues[ 'padding_left_' + size ] ) && 'undefined' !== typeof parentContainerValues[ 'padding_right_' + size ] && ! _.isEmpty( parentContainerValues[ 'padding_right_' + size ] ) && -1 !== parentContainerValues[ 'padding_left_' + size ].indexOf( '%' ) && -1 !== parentContainerValues[ 'padding_right_' + size ].indexOf( '%' ) ) { margin = parseFloat( parentContainerValues[ 'padding_left_' + size ] ) + parseFloat( parentContainerValues[ 'padding_right_' + size ] ); scale = ( 100 - margin ) / 100; values.additional_styles += 'margin-left:-' + ( parseFloat( parentContainerValues[ 'padding_left_' + size ] ) / scale ) + '% !important;'; values.additional_styles += 'margin-right:-' + ( parseFloat( parentContainerValues[ 'padding_right_' + size ] ) / scale ) + '% !important;'; } else { values.additional_styles += 'margin-left:-' + parentContainerValues[ 'padding_left_' + size ] + ';'; values.additional_styles += 'margin-right:-' + parentContainerValues[ 'padding_right_' + size ] + ';'; } values.additional_styles += '}'; values.additional_styles += '}'; } } ); } else { attr[ 'class' ] += ' fusion-section-separator-fullwidth'; } } if ( ! ( FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && 'boxed' === extras.layout ) ) { if ( '1_1' === parentColumnValues.type ) { if ( 'undefined' !== typeof parentColumnValues.upsized_spacing_left && 'undefined' !== typeof parentColumnValues.upsized_spacing_left_medium && 'undefined' !== typeof parentColumnValues.upsized_spacing_left_small ) { _.each( [ 'large', 'medium', 'small' ], function( size ) { if ( 'large' === size ) { if ( ! _.isEmpty( parentColumnValues.upsized_spacing_left ) ) { values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; values.additional_styles += 'margin-left:-' + parentColumnValues.upsized_spacing_left + ';'; values.additional_styles += 'margin-right:-' + parentColumnValues.upsized_spacing_right + ';'; values.additional_styles += '}'; } } else if ( ! _.isEmpty( parentColumnValues[ 'upsized_spacing_left_' + size ] ) ) { // Medium and Small size screen styles. values.additional_styles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {'; values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; values.additional_styles += 'margin-left:-' + parentColumnValues[ 'upsized_spacing_left_' + size ] + ' !important;'; values.additional_styles += 'margin-right:-' + parentColumnValues[ 'upsized_spacing_right_' + size ] + ' !important;'; values.additional_styles += '}'; values.additional_styles += '}'; } } ); } } else { _.each( [ 'large', 'medium', 'small' ], function( size ) { if ( 'large' === size ) { if ( ! _.isEmpty( parentColumnValues.padding_left ) ) { paddingValueLeft = parentColumnValues.padding_left; if ( -1 !== paddingValueLeft.indexOf( '%' ) ) { paddingValueLeft = ( parseFloat( paddingValueLeft.replace( '%', '' ) ) / ( columnWidth / columnOuterWidth ) ) + '%'; } paddingValueRight = parentColumnValues.padding_right; if ( -1 !== paddingValueRight.indexOf( '%' ) ) { paddingValueRight = ( parseFloat( paddingValueRight.replace( '%', '' ) ) / ( columnWidth / columnOuterWidth ) ) + '%'; } values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; values.additional_styles += 'margin-left:-' + paddingValueLeft + ';'; values.additional_styles += 'margin-right:-' + paddingValueRight + ';'; values.additional_styles += '}'; } } else if ( ! _.isEmpty( parentColumnValues[ 'padding_left_' + size ] ) ) { // Medium and Small size screen styles. paddingValueLeft = parentColumnValues[ 'padding_left_' + size ]; if ( -1 !== paddingValueLeft.indexOf( '%' ) ) { paddingValueLeft = ( parseFloat( paddingValueLeft.replace( '%', '' ) ) / ( columnWidth / columnOuterWidth ) ) + '%'; } paddingValueRight = parentColumnValues[ 'padding_right_' + size ]; if ( -1 !== paddingValueRight.indexOf( '%' ) ) { paddingValueRight = ( parseFloat( paddingValueRight.replace( '%', '' ) ) / ( columnWidth / columnOuterWidth ) ) + '%'; } values.additional_styles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {'; values.additional_styles += '.fusion-section-separator-' + self.model.get( 'cid' ) + ' .fusion-section-separator-svg {'; values.additional_styles += 'margin-left:-' + paddingValueLeft + ' !important;'; values.additional_styles += 'margin-right:-' + paddingValueRight + ' !important;'; values.additional_styles += '}'; values.additional_styles += '}'; } } ); } } // Check for custom height. this.baseSelector = '.fusion-section-separator.fusion-section-separator-' + this.model.get( 'cid' ); _.each( [ 'large', 'medium', 'small' ], function( responsiveSize ) { var key = 'divider_height' + ( 'large' === responsiveSize ? '' : '_' + responsiveSize ), media; // Skip for specific type. if ( 'triangle' === values.divider_type || 'rounded-split' === values.divider_type ) { return; } // Check for flex. if ( ! self.flexDisplay() && 'large' !== responsiveSize ) { return; } // Check for empty value. if ( '' === values[ key ] ) { return; } dividerHeightArr[ key ] = values[ key ]; self.dynamic_css = {}; media = 'large' === responsiveSize ? '' : '@media only screen and (max-width:' + extras[ 'visibility_' + responsiveSize ] + 'px)'; // Generate style rules. selectors = [ self.baseSelector + ' .fusion-section-separator-svg svg', self.baseSelector + ' .fusion-section-separator-svg-bg' ]; self.addCssProperty( selectors, 'height', values[ key ] ); selectors = [ self.baseSelector + ' .fusion-section-separator-spacer-height' ]; self.addCssProperty( selectors, 'height', values[ key ] + ' !important' ); self.addCssProperty( selectors, 'padding-top', 'inherit !important' ); if ( 'large' === responsiveSize ) { values.additional_styles += self.parseCSS(); } else { values.additional_styles += media + '{' + self.parseCSS() + '}'; } } ); // Background Repeat. _.each( [ 'large', 'medium', 'small' ], function( responsiveSize ) { var key = 'divider_repeat' + ( 'large' === responsiveSize ? '' : '_' + responsiveSize ), keyDividerH = 'divider_height' + ( 'large' === responsiveSize ? '' : '_' + responsiveSize ), media, height, value; // Only allow for SVG Background type. if ( -1 === jQuery.inArray( values.divider_type, self.bgImageSeparators ) ) { return; } // Check for flex. if ( ! self.flexDisplay() && 'large' !== responsiveSize ) { return; } // Check for empty value. if ( '' === values[ key ] ) { return; } self.dynamic_css = {}; media = 'large' === responsiveSize ? '' : '@media only screen and (max-width:' + extras[ 'visibility_' + responsiveSize ] + 'px)'; height = '' !== values[ keyDividerH ] ? values[ keyDividerH ] : self.getDividerHeightResponsive( keyDividerH, dividerHeightArr ); height = '' === values[ keyDividerH ] && 1 < values[ key ] ? ( parseInt( height ) / values[ key ] ) + 'px' : height; // Aspect ratio height. selectors = [ self.baseSelector + ' .fusion-section-separator-svg-bg' ]; if ( _.contains( height, '%' ) ) { value = parseFloat( 100 / values[ key ] ) + '% 100%'; } else { height = 0 < parseInt( height ) ? height : '100%'; value = parseFloat( 100 / values[ key ] ) + '% ' + height; } self.addCssProperty( selectors, 'background-size', value ); if ( 'large' === responsiveSize ) { values.additional_styles += self.parseCSS(); } else { values.additional_styles += media + '{' + self.parseCSS() + '}'; } } ); } return attr; }, /** * Builds attributes. * * @since 3.0 * @param {Object} values - The values. * @return {Object} */ buildSpacerAtts: function( values ) { // eslint-disable-line no-unused-vars var attrSpacer = { class: 'fusion-section-separator-spacer' }, parentColumnView = FusionPageBuilderApp.getParentColumn( this ), parentColumnValues = 'undefined' !== typeof parentColumnView.values ? parentColumnView.values : {}, extras = jQuery.extend( true, {}, fusionAllElements.fusion_section_separator.extras ); // 100% width template && 1/1 column. if ( FusionPageBuilderApp.$el.find( '#main' ).hasClass( 'width-100' ) && 'undefined' !== typeof parentColumnValues.type && '1_1' === parentColumnValues.type ) { if ( 'wide' === extras.layout ) { attrSpacer[ 'class' ] += ' fusion-section-separator-fullwidth'; } else { attrSpacer.style = 'display: none;'; } } return attrSpacer; }, /** * Builds attributes. * * @since 3.0 * @param {Object} v//alues - The values. * @return {Object}// */ buildSpacerHeightAtts: function( values ) { var attrSpacerHeight = { class: 'fusion-section-separator-spacer-height' }, hundredPxSeparators = [ 'slant', 'bigtriangle', 'curved', 'big-half-circle', 'clouds' ], height; if ( -1 !== jQuery.inArray( values.divider_type, hundredPxSeparators ) ) { attrSpacerHeight.style = 'height:99px;'; } else if ( 'triangle' === values.divider_type ) { if ( values.bordercolor ) { if ( 'bottom' === values.divider_candy || 'top' === values.divider_candy ) { attrSpacerHeight.style = 'height:' + values.bordersize + ';'; } else if ( -1 !== values.divider_candy.indexOf( 'top' ) && -1 !== values.divider_candy.indexOf( 'bottom' ) ) { attrSpacerHeight.style = 'height:calc( ' + values.bordersize + ' * 2 );'; } } } else if ( 'rounded-split' === values.divider_type ) { attrSpacerHeight.style = 'height:71px;'; } else if ( 'hills_opacity' === values.divider_type ) { attrSpacerHeight.style = 'padding-top:' + ( 182 / 1024 * 100 ) + '%;'; } else if ( 'hills' === values.divider_type ) { attrSpacerHeight.style = 'padding-top:' + ( 107 / 1024 * 100 ) + '%;'; } else if ( 'horizon' === values.divider_type ) { attrSpacerHeight.style = 'padding-top:' + ( 178 / 1024 * 100 ) + '%;'; } else if ( 'waves_opacity' === values.divider_type ) { attrSpacerHeight.style = 'padding-top:' + ( 216 / 1024 * 100 ) + '%;'; } else if ( 'waves' === values.divider_type ) { attrSpacerHeight.style = 'padding-top:' + ( 162 / 1024 * 100 ) + '%;'; } else if ( -1 !== jQuery.inArray( values.divider_type, this.bgImageSeparators ) ) { const defaultSepHeight = 'custom' === values.divider_type && values.custom_svg ? this.getCustomSvg( values ).height : this._getDefaultSepHeight()[ values.divider_type ]; height = '' === values.divider_height && 1 < values.divider_repeat ? ( parseInt( defaultSepHeight ) / values.divider_repeat ) + 'px' : defaultSepHeight; // Aspect ratio height. attrSpacerHeight.style = 'height:' + height + ';'; } return attrSpacerHeight; }, /** * Spacer height. * * @since 3.6 * @param {Object} values - The values. * @return {String} Spacer height. */ spacerHeight( values ) { const defaultSepHeight = 'custom' === values.divider_type && values.custom_svg ? this.getCustomSvg( values ).height : this._getDefaultSepHeight()[ values.divider_type ]; const height = '' === values.divider_height && 1 < values.divider_repeat ? ( parseInt( defaultSepHeight ) / values.divider_repeat ) + 'px' : defaultSepHeight; // Aspect ratio height. return height; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildCandyAtts: function( values ) { var attrCandy = { class: 'divider-candy' }; if ( 'bottom' === values.divider_candy ) { attrCandy[ 'class' ] += ' bottom'; attrCandy.style = 'bottom:-' + ( values.borderSizeWithoutUnits + 20 ) + 'px;border-bottom:1px solid ' + values.bordercolor + ';border-left:1px solid ' + values.bordercolor + ';'; } else if ( 'top' === values.divider_candy ) { attrCandy[ 'class' ] += ' top'; attrCandy.style = 'top:-' + ( values.borderSizeWithoutUnits + 20 ) + 'px;border-bottom:1px solid ' + values.bordercolor + ';border-left:1px solid ' + values.bordercolor + ';'; // Modern setup, that won't work in IE8. } else if ( -1 !== values.divider_candy.indexOf( 'top' ) && -1 !== values.divider_candy.indexOf( 'bottom' ) ) { attrCandy[ 'class' ] += ' both'; attrCandy.style = 'background-color:' + values.backgroundcolor + ';border:1px solid ' + values.bordercolor + ';'; } if ( -1 !== values.divider_candy.indexOf( 'top' ) && -1 !== values.divider_candy.indexOf( 'bottom' ) ) { attrCandy[ 'class' ] += ' triangle'; } return attrCandy; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildCandyArrowAtts: function( values ) { var attrCandyArrow = { class: 'divider-candy-arrow' }; // For borders of size 1, we need to hide the border line on the arrow, thus we set it to 0. var arrowPosition = values.borderSizeWithoutUnits; if ( 1 === arrowPosition ) { arrowPosition = 0; } if ( 'bottom' === values.divider_candy ) { attrCandyArrow[ 'class' ] += ' bottom'; attrCandyArrow.style = 'top:' + arrowPosition + 'px;border-top-color: ' + values.backgroundcolor + ';'; } else if ( 'top' === values.divider_candy ) { attrCandyArrow[ 'class' ] += ' top'; attrCandyArrow.style = 'bottom:' + arrowPosition + 'px;border-bottom-color: ' + values.backgroundcolor + ';'; } return attrCandyArrow; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSVGAtts: function( values ) { var attrSVG = { display: 'block' }; if ( 'bigtriangle' === values.divider_type || 'slant' === values.divider_type || 'big-half-circle' === values.divider_type || 'clouds' === values.divider_type || 'curved' === values.divider_type ) { attrSVG.style = 'padding:0;'; } if ( 'slant' === values.divider_type && 'bottom' === values.divider_candy ) { attrSVG.style = 'padding:0;margin-bottom:-3px;display:block'; } attrSVG.fill = jQuery.AWB_Color( values.backgroundcolor ).toRgbaString(); return attrSVG; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildButtonAtts: function( values ) { var attrButton = {}; if ( '' !== values.icon ) { attrButton = { class: 'section-separator-icon icon ' + _.fusionFontAwesome( values.icon ), style: 'color:' + values.icon_color + ';' }; if ( ! values.icon_color ) { values.icon_color = values.bordercolor; } if ( 1 < values.borderSizeWithoutUnits ) { if ( 'bottom' === values.divider_candy ) { attrButton.style += 'bottom:-' + ( values.borderSizeWithoutUnits + 10 ) + 'px;top:auto;'; } else if ( 'top' === values.divider_candy ) { attrButton.style += 'top:-' + ( values.borderSizeWithoutUnits + 10 ) + 'px;'; } } } return attrButton; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildRoundedSplitAtts: function( values ) { var attrRoundedSplit = {}; if ( 'rounded-split' === values.divider_type ) { attrRoundedSplit = { class: 'rounded-split ' + values.divider_candy, style: 'background-color:' + values.backgroundcolor + ';' }; } return attrRoundedSplit; }, /** * Builds SVG BG Image attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildSVGBGImageAtts: function( values ) { var attrSVG = { class: 'fusion-' + values.divider_type + '-candy-sep fusion-section-separator-svg-bg', style: '' }, height = this._getDefaultSepHeight()[ values.divider_type ] ? this._getDefaultSepHeight()[ values.divider_type ] : '100px', transform = []; if ( '' === values.divider_height ) { if ( 1 < values.divider_repeat ) { height = ( parseInt( height ) / values.divider_repeat ) + 'px'; } attrSVG.style += 'height:' + height + ';'; } if ( 'right' === values.divider_position ) { transform.push( 'rotateY(180deg)' ); } else { transform.push( 'rotateY(0)' ); } if ( 'bottom' === values.divider_candy ) { transform.push( 'rotateX(180deg)' ); } else { transform.push( 'rotateX(0)' ); } if ( transform.length ) { attrSVG.style += 'transform: ' + transform.join( ' ' ) + ' ;'; } return attrSVG; }, /** * Get default height of separators. * * @since 3.2 * @return {Object} */ _getDefaultSepHeight: function() { return { grunge: '43px', music: '297px', waves_brush: '124px', paper: '102px', circles: '164px', squares: '140px', paint: '80px', grass: '195px', splash: '65px' }; }, getDividerHeightResponsive: function( key, hash ) { var keys = hash.keys(), found_index = _.contains( keys, key ); if ( false === found_index || 0 === found_index ) { return ''; } return keys[ found_index - 1 ]; }, /** * Get custom svg * * @since 7.6 * @param {Object} values - The values. * @return {Object} */ getCustomSvg: function( values ) { var svg = ''; const url = values.custom_svg; if ( !url ) { return {}; } jQuery.ajax( { url: url, type: 'get', dataType: 'html', async: false, success: function( data ) { svg = data; } } ); svg = svg.replace( /fill="(.*?)"/ig, `fill="${jQuery.AWB_Color( values.backgroundcolor ).toRgbaString()}"` ); //get the default height const rx = /viewBox="(.*?)"/g; const matches = rx.exec( svg ); const height = matches ? matches[ 1 ].split( ' ' )[ 3 ] + 'px' : '65px'; return { svg, height }; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Modal view. FusionPageBuilder.fusion_modal = FusionPageBuilder.ElementView.extend( { /** * Runs during initialize() call. * * @since 2.0.0 * @return null */ onInit: function() { var $modal = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ); $modal.on( 'shown.bs.modal', function() { jQuery( 'body' ).addClass( 'fusion-builder-no-ui fusion-dialog-ui-active' ); $modal.closest( '.fusion-builder-column' ).css( 'z-index', 'auto' ); // Because of animated items getting z-index 2000. $modal.closest( '#main' ).css( 'z-index', 'auto' ); $modal.closest( '.fusion-row' ).css( 'z-index', 'auto' ); $modal.closest( '.fusion-builder-container' ).css( 'z-index', 'auto' ); } ); $modal.on( 'hide.bs.modal', function() { jQuery( 'body' ).removeClass( 'fusion-builder-no-ui fusion-dialog-ui-active' ); $modal.closest( '.fusion-builder-column' ).css( 'z-index', '' ); $modal.closest( '#main' ).css( 'z-index', '' ); $modal.closest( '.fusion-row' ).css( 'z-index', '' ); $modal.closest( '.fusion-builder-container' ).css( 'z-index', '' ); } ); }, /** * Open actual modal. * * @since 2.0 * @return {void} */ onSettingsOpen: function() { var self = this, $modal = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-modal' ) ); this.disableDroppableElement(); jQuery( this.$el ).closest( '.fusion-builder-live-element' ).css( 'cursor', 'default' ); jQuery( this.$el ).closest( '.fusion-builder-column' ).css( 'z-index', 'auto' ); // Because of animated items getting z-index 2000. jQuery( this.$el ).closest( '.fusion-row' ).css( 'z-index', 'auto' ); jQuery( this.$el ).closest( '.fusion-builder-container' ).css( 'z-index', 'auto' ); setTimeout( function() { if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', 'auto' ); if ( 'fixed' === jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'position' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '-1' ); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).find( '.tfs-slider[data-parallax="1"]' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', 'auto' ); } } } }, 100 ); $modal.addClass( 'in' ).show(); $modal.find( 'button[data-dismiss="modal"], .fusion-button[data-dismiss="modal"]' ).one( 'click', function() { window.FusionEvents.trigger( 'fusion-close-settings-' + self.model.get( 'cid' ) ); } ); }, /** * Close the modal. * * @since 2.0 * @return {void} */ onSettingsClose: function() { var $modal = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-modal' ) ); $modal.find( 'button[data-dismiss="modal"], .fusion-button[data-dismiss="modal"]' ).off( 'click' ); this.enableDroppableElement(); jQuery( this.$el ).closest( '.fusion-builder-live-element' ).css( 'cursor', '' ); jQuery( this.$el ).closest( '.fusion-builder-column' ).css( 'z-index', '' ); jQuery( this.$el ).closest( '.fusion-row' ).css( 'z-index', '' ); jQuery( this.$el ).closest( '.fusion-builder-container' ).css( 'z-index', '' ); if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).length ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#main' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '.fusion-footer-parallax' ).css( 'z-index', '' ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( '#sliders-container' ).css( 'z-index', '' ); } $modal.removeClass( 'in' ).hide(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var $modal = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-modal' ) ); if ( jQuery( '.fusion-builder-module-settings[data-element-cid="' + this.model.get( 'cid' ) + '"]' ).length ) { $modal.addClass( 'in' ).show(); $modal.find( '.full-video, .video-shortcode, .wooslider .slide-content' ).fitVids(); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.attrModal = this.buildModalAttr( atts.values ); attributes.attrDialog = this.buildDialogAttr( atts.values ); attributes.attrContent = this.buildContentAttr( atts.values ); attributes.attrButton = this.buildButtonAttr( atts.values ); attributes.attrHeading = this.buildHeadingAttr( atts.values ); attributes.attrFooterButton = this.buildHFooterButtonAttr( atts.values ); attributes.attrBody = this.buildBodyAttr( atts.values ); attributes.borderColor = atts.values.border_color; attributes.title = atts.values.title; attributes.showFooter = atts.values.show_footer; attributes.closeText = atts.extras.close_text; attributes.elementContent = atts.values.element_content; attributes.name = atts.values.name; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildModalAttr: function( values ) { var attrModal = { class: 'fusion-modal modal fade modal-' + this.model.get( 'cid' ), tabindex: '-1', role: 'dialog', style: 'z-index: 9999999; background: rgba(0,0,0,0.5);', 'aria-labelledby': 'modal-heading-' + this.model.get( 'cid' ), 'aria-hidden': 'true' }; if ( '' !== values.name ) { attrModal[ 'class' ] += ' ' + values.name; } if ( '' !== values[ 'class' ] ) { attrModal[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attrModal.id = values.id; } return attrModal; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildDialogAttr: function( values ) { var attrDialog = { class: 'modal-dialog', role: 'document' }; attrDialog[ 'class' ] += ( 'small' === values.size ) ? ' modal-sm' : ' modal-lg'; return attrDialog; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildContentAttr: function( values ) { var attrContent = { class: 'modal-content fusion-modal-content' }; if ( '' !== values.background ) { attrContent.style = 'background-color:' + values.background; } return attrContent; }, /** * Builds attributes. * * @since 2.0 * @return {Object} - Body attributes. */ buildBodyAttr: function() { var attrBody = { class: 'modal-body' }; attrBody = _.fusionInlineEditor( { cid: this.model.get( 'cid' ) }, attrBody ); return attrBody; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildButtonAttr: function() { var attrButton = { class: 'close', type: 'button', 'data-dismiss': 'modal', 'aria-hidden': 'true' }; return attrButton; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildHeadingAttr: function() { var attrHeading = { class: 'modal-title', id: 'modal-heading-' + this.model.get( 'cid' ), 'data-dismiss': 'modal', 'aria-hidden': 'true', 'aria-label': 'Close' }; attrHeading = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), param: 'title', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, attrHeading ); return attrHeading; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildHFooterButtonAttr: function() { var attrFooterButton = { class: 'fusion-button button-default button-medium button default medium', type: 'button', 'data-dismiss': 'modal' }; return attrFooterButton; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Code block view. FusionPageBuilder.fusion_code = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.content = atts.params.element_content; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Alert Element View. FusionPageBuilder.fusion_alert = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.buttonStyles = this.buildButtonStyles( atts.values ); attributes.contentAttr = this.buildContentAttr( atts.values ); attributes.contentStyles = this.buildContentStyles( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; return attributes; }, /** * Modify the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.alert_class = 'info'; values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' ); values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' ); values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); switch ( values.type ) { case 'general': values.alert_class = 'info'; if ( ! values.icon || 'none' !== values.icon ) { values.icon = 'fa-info-circle'; } break; case 'error': values.alert_class = 'danger'; if ( ! values.icon || 'none' !== values.icon ) { values.icon = 'fa-exclamation-triangle'; } break; case 'success': values.alert_class = 'success'; if ( ! values.icon || 'none' !== values.icon ) { values.icon = 'fa-check-circle'; } break; case 'notice': values.alert_class = 'warning'; if ( ! values.icon || 'none' !== values.icon ) { values.icon = 'fa-lg fa-cog'; } break; case 'blank': values.alert_class = 'blank'; break; case 'custom': values.alert_class = 'custom'; break; } // Make sure the title text is not wrapped with an unattributed p tag. if ( 'undefined' !== typeof values.element_content ) { values.element_content = values.element_content.trim(); values.element_content = values.element_content.replace( /(<p[^>]+?>|<p>|<\/p>)/img, '' ); } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-alert alert fusion-live-alert fusion-alert-cid' + this.model.get( 'cid' ), style: '' } ), alertClass = values.alert_class; attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( 'capitalize' === values.text_transform ) { alertClass += ' fusion-alert-capitalize'; } if ( 'yes' === values.dismissable ) { alertClass += ' alert-dismissable'; } attr[ 'class' ] += ' alert-' + alertClass; attr[ 'class' ] += ' fusion-alert-' + values.text_align; attr[ 'class' ] += ' ' + values.type; if ( 'yes' === values.box_shadow ) { attr[ 'class' ] += ' alert-shadow'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildContentStyles: function( values ) { var alertClass = values.alert_class, args = {}, styles = '', cid = this.model.get( 'cid' ), backgroundColor, accentColor; if ( 'custom' === alertClass ) { values.border_size = parseFloat( values.border_size ) + 'px'; args.background_color = values.background_color; args.accent_color = values.accent_color; args.border_size = values.border_size; } else { backgroundColor = 'var(--' + alertClass + '_bg_color)'; accentColor = 'var(--' + alertClass + '_accent_color)'; args.background_color = backgroundColor; args.accent_color = accentColor; args.border_size = parseFloat( window.fusionAllElements.fusion_alert.defaults.border_size ) + 'px'; } styles = '<style type="text/css">'; styles += '.fusion-alert.alert.fusion-alert-cid' + cid + '{'; styles += 'background-color:' + args.background_color + ';'; styles += 'color:' + args.accent_color + ';'; styles += 'border-color:' + args.accent_color + ';'; styles += 'border-width:' + args.border_size + ';'; styles += '}'; styles += '</style>'; return styles; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildContentAttr: function() { var contentAttr = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), 'disable-return': true, 'disable-extra-spaces': true, toolbar: 'simple' }, { class: 'fusion-alert-content' } ); return contentAttr; }, /** * Builds the styles. * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildButtonStyles: function( values ) { if ( 'custom' === values.alert_class ) { return 'color:' + values.accent_color + ';border-color:' + values.accent_color + ';'; } return ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Alert Element View. FusionPageBuilder.fusion_audio = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; return attributes; }, /** * Modify values. * * @since 2.1 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { var corners = [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ]; _.each( corners, function( corner ) { if ( 'undefined' !== typeof values[ 'border_radius_' + corner ] && '' !== values[ 'border_radius_' + corner ] ) { values[ 'border_radius_' + corner ] = _.fusionGetValueWithUnit( values[ 'border_radius_' + corner ] ); } else { values[ 'border_radius_' + corner ] = '0px'; } } ); }, /** * Builds attributes. * * @since 2.1 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var style, attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-audio', style: '' } ), corners = [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ]; if ( values.progress_color ) { style = '--fusion-audio-accent-color:' + values.progress_color + ';'; } if ( values.border_size ) { style += '--fusion-audio-border-size:' + values.border_size + ';'; } if ( values.border_color ) { style += '--fusion-audio-border-color:' + values.border_color + ';'; } _.each( corners, function( corner ) { if ( values[ 'border_radius_' + corner ] ) { style += '--fusion-audio-border-' + corner.replace( '_', '-' ) + '-radius:' + values[ 'border_radius_' + corner ] + ';'; } } ); if ( values.background_color ) { style += '--fusion-audio-background-color:' + values.background_color + ';'; } if ( values.max_width ) { style += '--fusion-audio-max-width:' + values.max_width + ';'; } // Box shadow. if ( 'yes' === values.box_shadow ) { style += '--fusion-audio-box-shadow:' + _.fusionGetBoxShadowStyle( values ) + ';'; } attr.style = style; if ( 'dark' === values.controls_color_scheme ) { attr[ 'class' ] += ' dark-controls'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); attr.values = values; return attr; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Google Map View. FusionPageBuilder.fusion_map = FusionPageBuilder.ElementView.extend( { jsVars: {}, /** * Makes JS init call. * */ initMap: function() { var $thisEl = this.$el; if ( 'undefined' !== typeof $thisEl && ! _.isEmpty( this.jsVars ) && ! _.isEmpty( this.jsVars.json_addresses ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( $thisEl.find( '#map_' + this.model.get( 'cid' ) ) ).fusion_maps( { addresses: this.jsVars.json_addresses, animations: this.jsVars.animation, infobox_background_color: this.jsVars.infobox_background_color, infobox_styling: this.jsVars.infobox, infobox_text_color: this.jsVars.infobox_text_color, map_style: this.jsVars.map_style, map_type: this.jsVars.type, marker_icon: this.jsVars.icon, overlay_color: this.jsVars.overlay_color, overlay_color_hsl: this.jsVars.overlay_color_hsl, pan_control: this.jsVars.zoom_pancontrol, show_address: this.jsVars.popup, scale_control: this.jsVars.scale, scrollwheel: this.jsVars.scrollwheel, zoom: parseInt( this.jsVars.zoom, 10 ), zoom_control: this.jsVars.zoom_pancontrol } ); } }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var self = this; jQuery( '#fb-preview' ).on( 'load', function() { self.initMap(); } ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var mapCopy, parent; if ( ! _.isEmpty( this.jsVars ) && ! _.isEmpty( this.jsVars.json_addresses ) ) { mapCopy = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '#map_' + this.model.get( 'cid' ) ) )[ 0 ].cloneNode(); parent = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-builder-element-content' ) ); jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '#map_' + this.model.get( 'cid' ) ) ).remove(); jQuery( parent ).append( mapCopy ); this.initMap(); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, html, jsVars; // Validate values. this.validateValues( atts.values ); // Create attribute objects if ( 'js' === atts.values.api_type ) { jsVars = this.buildJsVars( atts.values, atts.extras ); } else if ( 'embed' === atts.values.api_type ) { html = this.buildEmbedHtml( atts.values, atts.extras ); } else if ( 'static' === atts.values.api_type ) { html = this.buildStaticHtml( atts.values, atts.extras ); } attributes.googleMapShortcode = this.buildGoogleMapShortcode( atts ); attributes.jsVars = jsVars; attributes.html = html; attributes.id = atts.values.id; attributes.apiType = atts.values.api_type; attributes.address = atts.values.address; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); this.jsVars = jsVars; return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { values.width = _.fusionValidateAttrValue( values.width, 'px' ); values.height = _.fusionValidateAttrValue( values.height, 'px' ); // Set placeholder coordinates. if ( '' === values.address ) { values.address = 'latlng=0,0'; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildGoogleMapShortcode: function( atts ) { var googleMapShortcode = _.fusionVisibilityAtts( atts.values.hide_on_mobile, { class: 'shortcode-map fusion-google-map fusion-maps-' + atts.values.api_type + '-type' } ); if ( '' !== atts.values[ 'class' ] ) { googleMapShortcode[ 'class' ] += ' ' + atts.values[ 'class' ]; } googleMapShortcode.id = 'map_' + this.model.get( 'cid' ); if ( 'js' === atts.values.api_type ) { googleMapShortcode.style = 'height:' + atts.values.height + ';width:' + atts.values.width + ';'; } return googleMapShortcode; }, /** * Builds the vars that will be used by the JS maps. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra args. * @return {Object} */ buildJsVars: function( values, extras ) { var jsVars = {}, address = values.address, mapStyle = values.map_style, icon = values.icon, animation = values.animation, infobox = values.infobox, overlayColor = values.overlay_color, infoboxBackgroundColor = values.infobox_background_color, infoboxTextColor = values.infobox_text_color, infoboxContent = values.infobox_content, type = values.type, zoom = values.zoom, coordinates = [], jsonAddresses = [], iconArray, infoboxContentArray, numOfAddresses, colorObject, overlayColorHSL, rgb, cachedAddresses, latLng, iconUrl, brightnessLevel, addresses, i; if ( '' !== address ) { addresses = address.split( '|' ); if ( addresses.length ) { address = addresses; } numOfAddresses = addresses.length; try { if ( infoboxContent && '' !== infoboxContent && FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( infoboxContent ) ) === infoboxContent ) { infoboxContent = FusionPageBuilderApp.base64Decode( infoboxContent ); } } catch ( error ) { console.log( error ); // jshint ignore:line } infoboxContentArray = ( -1 === jQuery.inArray( values.map_style, [ 'default', 'theme' ] ) && 'default' !== values.infobox ) ? infoboxContent.split( '|' ) : []; iconArray = []; if ( '' !== values.icon ) { iconArray = values.icon.split( '|' ); } if ( 'theme' === values.map_style ) { colorObject = jQuery.AWB_Color( extras.primary_color ); rgb = [ colorObject.red(), colorObject.green(), colorObject.blue() ]; mapStyle = 'custom'; icon = 'theme'; animation = 'yes'; infobox = 'custom'; overlayColor = extras.primary_color; infoboxBackgroundColor = 'rgba(' + rgb[ 0 ] + ', ' + rgb[ 1 ] + ', ' + rgb[ 2 ] + ', 0.8)'; brightnessLevel = colorObject.lightness(); infoboxTextColor = '#747474'; if ( 140 < brightnessLevel ) { infoboxTextColor = '#fff'; } } else if ( 'custom' === values.map_style ) { if ( 0 === jQuery.AWB_Color( values.overlay_color ).alpha() ) { overlayColor = ''; } } // If only one custom icon is set, use it for all markers. if ( 'custom' === values.map_style && '' !== values.icon && 'theme' !== values.icon && iconArray && 1 === iconArray.length ) { iconUrl = iconArray[ 0 ]; for ( i = 0; i < numOfAddresses; i++ ) { iconArray[ i ] = iconUrl; } } if ( 'theme' === values.icon && 'custom' === values.map_style ) { for ( i = 0; i < numOfAddresses; i++ ) { iconArray[ i ] = extras.theme_icon; } } _.each( address, function( add ) { add = add.trim().split( '\n' ).filter( function( e ) { return String( e ).trim(); } ).join( '<br/>' ).replace( /\r/g, '' ).replace( /\n/g, '' ); coordinates.push( { address: add } ); } ); if ( ! coordinates ) { return; } for ( i = 0; i < numOfAddresses; i++ ) { if ( 0 === address[ i ].indexOf( 'latlng=' ) ) { address[ i ] = coordinates[ i ].address; } } infoboxContent = address; if ( infoboxContentArray ) { for ( i = 0; i < numOfAddresses; i++ ) { if ( ! infoboxContentArray[ i ] ) { infoboxContentArray[ i ] = address[ i ]; } } infoboxContent = infoboxContentArray; } cachedAddresses = extras.cached_addresses; _.each( address, function( address, key ) { jsonAddresses.push( { address: address, infobox_content: _.unescape( infoboxContent[ key ] ) } ); if ( iconArray && iconArray[ key ] ) { jsonAddresses[ key ].marker = iconArray[ key ]; } if ( -1 !== address.indexOf( 'latlng=' ) ) { jsonAddresses[ key ].address = address.replace( 'latlng=', '' ); latLng = jsonAddresses[ key ].address.split( ',' ); jsonAddresses[ key ].coordinates = true; jsonAddresses[ key ].latitude = latLng[ 0 ]; jsonAddresses[ key ].longitude = latLng[ 1 ]; jsonAddresses[ key ].cache = false; if ( -1 !== infoboxContent[ key ].indexOf( 'latlng=' ) ) { jsonAddresses[ key ].infobox_content = ''; } if ( cachedAddresses[ jsonAddresses[ key ].latitude.trim() + ',' + jsonAddresses[ key ].longitude.trim() ] ) { jsonAddresses[ key ].geocoded_address = cachedAddresses[ jsonAddresses[ key ].latitude.trim() + ',' + jsonAddresses[ key ].longitude.trim() ].address.trim(); jsonAddresses[ key ].cache = true; } } else { jsonAddresses[ key ].coordinates = false; jsonAddresses[ key ].cache = false; if ( cachedAddresses[ jsonAddresses[ key ].address.trim() ] ) { jsonAddresses[ key ].latitude = cachedAddresses[ jsonAddresses[ key ].address.trim() ].latitude; jsonAddresses[ key ].longitude = cachedAddresses[ jsonAddresses[ key ].address.trim() ].longitude; jsonAddresses[ key ].cache = true; } } } ); colorObject = jQuery.AWB_Color( overlayColor ); overlayColorHSL = { hue: colorObject.hue(), sat: colorObject.saturation() * 100, lum: colorObject.lightness() * 100 }; jsVars.json_addresses = jsonAddresses; jsVars.infobox_background_color = infoboxBackgroundColor; jsVars.infobox = infobox; jsVars.infobox_text_color = infoboxTextColor; jsVars.map_style = mapStyle; jsVars.type = type; jsVars.icon = icon; jsVars.overlay_color = overlayColor; jsVars.overlay_color_hsl = overlayColorHSL; jsVars.zoom = zoom; jsVars.animation = ( 'yes' === animation ) ? 'true' : false; jsVars.zoom_pancontrol = ( 'yes' === values.zoom_pancontrol ) ? 'true' : false, jsVars.popup = ( 'yes' === values.popup ) ? 'true' : false, jsVars.scale = ( 'yes' === values.scale ) ? 'true' : false, jsVars.scrollwheel = ( 'yes' === values.scrollwheel ) ? 'true' : false; } return jsVars; }, /** * Builds the embed HTML. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra data. * @return {string} */ buildEmbedHtml: function( values, extras ) { var html = '', embedAddress = values.embed_address; if ( embedAddress ) { embedAddress = embedAddress.replace( / /g, '+' ); if ( -1 !== values.width.indexOf( 'px' ) ) { values.width = parseInt( values.width, 10 ); } html = '<iframe width="' + values.width + '" height="' + parseInt( values.height, 10 ) + '" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?key=' + extras.gmap_api + '&q=' + embedAddress + '&maptype=' + values.embed_map_type + '&zoom=' + values.zoom + '" allowfullscreen></iframe>'; } return html; }, /** * Builds the static-API HTML. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra data. * @return {string} */ buildStaticHtml: function( values, extras ) { var html = '', style = '', address = values.address, addressesArray, iconArray, markers, addressCount, rgb, colorObject, saturation, lightness, i; if ( address ) { addressesArray = address.split( '|' ); iconArray = values.icon_static ? values.icon_static.split( '|' ) : []; markers = []; addressCount = addressesArray.length; for ( i = 0; i < addressCount; i++ ) { addressesArray[ i ] = addressesArray[ i ].trim(); if ( 0 === addressesArray[ i ].indexOf( 'latlng=' ) ) { addressesArray[ i ] = addressesArray[ i ].replace( 'latlng=', '' ); } else { addressesArray[ i ] = addressesArray[ i ].split( ',' ).map( function( e ) { return e.trim(); } ).join( ',' ); addressesArray[ i ] = addressesArray[ i ].replace( ' ', '+' ); } if ( 'undefined' !== typeof iconArray[ i ] ) { if ( 'theme' === iconArray[ i ] ) { iconArray[ i ] = extras.amms_icon; } // TODO: add permanent JS URL validator funtion. if ( 0 < iconArray[ i ].indexOf( '://' ) || 0 === iconArray[ i ].indexOf( '//' ) ) { iconArray[ i ] = 'icon:' + iconArray[ i ]; } iconArray[ i ] = iconArray[ i ].trim(); iconArray[ i ] = iconArray[ i ].replace( ',', '|' ) + '|'; } else { iconArray[ i ] = ''; } markers.push( iconArray[ i ] + addressesArray[ i ] ); } if ( values.static_map_color ) { rgb = values.static_map_color.replace( '#', '' ); colorObject = jQuery.AWB_Color( values.static_map_color ); saturation = ( colorObject.saturation() * 200 ) - 100; lightness = ( colorObject.lightness() * 200 ) - 100; style += '&style=feature:all|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:administrative|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:landscape|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:poi|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:road|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:transit|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; style += '&style=feature:water|hue:0x' + rgb + '|saturation:' + saturation + '|lightness:' + lightness + '|visibility:simplified'; } html = '<img width="' + parseInt( values.width, 10 ) + '" height="' + parseInt( values.height, 10 ) + '" src="https://maps.googleapis.com/maps/api/staticmap?key=' + extras.gmap_api + '¢er=' + addressesArray[ 0 ] + '&maptype=' + values.type + '&zoom=' + values.zoom + '&size=' + parseInt( values.width, 10 ) + 'x' + parseInt( values.height, 10 ) + '&markers=' + markers.join( '&markers=' ) + style + '&scale=2">'; } return html; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp, FusionPageBuilderApp, fusionAppConfig */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Font Awesome Element View. FusionPageBuilder.fusion_fontawesome = FusionPageBuilder.ElementView.extend( { /** * Runs when element is first init. * * @since 2.0 * @return {void} */ onInit: function() { var params = this.model.get( 'params' ); // Check for newer hover params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { if ( 'undefined' === typeof params.iconcolor_hover && 'string' === typeof params.iconcolor ) { params.iconcolor_hover = params.iconcolor; } if ( 'undefined' === typeof params.circlecolor_hover && 'string' === typeof params.circlecolor ) { params.circlecolor_hover = params.circlecolor; } if ( 'undefined' === typeof params.circlebordercolor_hover && 'string' === typeof params.circlebordercolor ) { params.circlebordercolor_hover = params.circlebordercolor; } this.model.set( 'params', params ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var params = this.model.get( 'params' ), alignment = ''; this.$el.removeClass( 'fusion-element-alignment-right fusion-element-alignment-left fusion-element-alignment-textflow' ); if ( 'undefined' !== typeof params.alignment ) { alignment = params.alignment; // Text-flow. if ( '' === alignment ) { alignment = 'left'; if ( jQuery( 'body' ).hasClass( 'rtl' ) ) { alignment = 'right'; } this.$el.addClass( 'fusion-element-alignment-textflow' ); } } if ( alignment && ( 'right' === alignment || 'left' === alignment ) ) { this.$el.addClass( 'fusion-element-alignment-' + alignment ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.alignment = atts.values.alignment; attributes.alignment_medium = atts.values.alignment_medium; attributes.alignment_small = atts.values.alignment_small; attributes.output = atts.values.element_content; attributes.hasLink = 'string' === typeof atts.values.link && '' !== atts.values.link; attributes.styleBlock = this.styleBlock( atts.values ); return attributes; }, /** * Builds style block. * * @access public * @since 2.2 * @param array values Element values. * @return string */ styleBlock: function( values ) { var backgroundColor = '', borderColor = '', backgroundHover = '', borderHover = '', tag = '', html, cid = this.model.get( 'cid' ); tag = 'string' === typeof values.link && '' !== values.link ? 'a' : 'i'; if ( 'yes' === values.circle ) { if ( values.circlecolor ) { backgroundColor = ' background-color: ' + values.circlecolor + ';'; } if ( values.circlecolor_hover ) { backgroundHover = ' background-color: ' + values.circlecolor_hover + ';'; } if ( values.circlebordercolor ) { borderColor = ' border-color: ' + values.circlebordercolor + ';'; } if ( values.circlebordercolor_hover ) { borderHover = ' border-color: ' + values.circlebordercolor_hover + ';'; } } html = '<style>'; html += tag + '.fb-icon-element.fontawesome-icon.fb-icon-element-live-' + cid + '{ color: ' + values.iconcolor + ';' + backgroundColor + borderColor + '}'; html += tag + '.fb-icon-element.fontawesome-icon.fb-icon-element-live-' + cid + ':hover, .fb-icon-element.fontawesome-icon.fb-icon-element-live-' + cid + '.hover { color: ' + values.iconcolor_hover + ';' + backgroundHover + borderHover + '}'; // Pulsate effect color for outershadow. if ( 'pulsate' === values.icon_hover_type ) { html += tag + '.fb-icon-element.fontawesome-icon.fb-icon-element-live-' + cid + '.icon-hover-animation-pulsate:after {'; html += '-webkit-box-shadow:0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.circlecolor_hover + ', 0 0 0 10px rgba(255,255,255,0.5);'; html += '-moz-box-shadow:0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.circlecolor_hover + ', 0 0 0 10px rgba(255,255,255,0.5);'; html += 'box-shadow: 0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.circlecolor_hover + ', 0 0 0 10px rgba(255,255,255,0.5);'; html += '}'; } html += '</style>'; return html; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { var corners = [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ]; values.font_size = _.fusionValidateAttrValue( this.convertDeprecatedSizes( values.size ), '' ); _.each( corners, function( corner ) { if ( 'undefined' !== typeof values[ 'border_radius_' + corner ] && '' !== values[ 'border_radius_' + corner ] ) { values[ 'border_radius_' + corner ] = _.fusionGetValueWithUnit( values[ 'border_radius_' + corner ] ); } else { values[ 'border_radius_' + corner ] = '0px'; } } ); }, /** * Converts deprecated font sizes. * * @since 2.0 * @param {string} size - The size (small|medium|large). * @return {string} */ convertDeprecatedSizes: function( size ) { switch ( size ) { case 'small': return '10px'; case 'medium': return '18px'; case 'large': return '40px'; default: return size; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var legacyIcon = false; var attr = {}; var corners = [ 'top_left', 'top_right', 'bottom_right', 'bottom_left' ]; values.circle_yes_font_size = 'undefined' !== values.bg_size && '-1' !== values.bg_size ? values.font_size : values.font_size * 0.88; values.height = 'undefined' !== values.bg_size && '-1' !== values.bg_size ? parseInt( values.bg_size ) : values.font_size * 1.76; values.line_height = values.height - ( 2 * parseInt( values.circlebordersize ) ); values.icon_margin = values.font_size * 0.5; values.circlebordersize = _.fusionValidateAttrValue( values.circlebordersize, 'px' ); // Check if an old icon shortcode is used, where no margin option is present, or if all margins were left empty. if ( 'undefined' === typeof values.margin_left || ( '' === values.margin_top && '' === values.margin_right && '' === values.margin_bottom && '' === values.margin_left ) ) { legacyIcon = true; } attr = { class: 'fb-icon-element-live-' + this.model.get( 'cid' ) + ' fb-icon-element fontawesome-icon ' + _.fusionFontAwesome( values.icon ) + ' circle-' + values.circle, 'aria-hidden': 'true' }; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); attr.style = ''; if ( 'yes' === values.circle ) { attr.style += 'font-size:' + values.circle_yes_font_size + 'px;'; attr.style += 'line-height:' + values.line_height + 'px;height:' + values.height + 'px;width:' + values.height + 'px;'; attr.style += 'border-width:' + values.circlebordersize + ';'; _.each( corners, function( corner ) { if ( values[ 'border_radius_' + corner ] ) { attr.style += 'border-' + corner.replace( '_', '-' ) + '-radius:' + values[ 'border_radius_' + corner ] + ';'; } } ); } else { attr.style += 'font-size:' + values.font_size + 'px;'; } if ( '' === values.alignment ) { attr[ 'class' ] += ' fusion-text-flow'; } if ( legacyIcon ) { if ( 'left' === values.alignment ) { values.icon_margin_position = 'right'; } else if ( 'right' === values.alignment ) { values.icon_margin_position = 'left'; } else { values.icon_margin_position = FusionPageBuilderApp.$el.hasClass( 'rtl' ) ? 'left' : 'right'; } if ( 'center' === values.alignment ) { attr.style += 'margin-left:0;margin-right:0;'; } else { attr.style += 'margin-' + values.icon_margin_position + ':' + values.icon_margin + 'px;'; } } else { if ( values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } } if ( values.rotate ) { attr[ 'class' ] += ' fa-rotate-' + values.rotate; } if ( 'yes' === values.spin ) { attr[ 'class' ] += ' fa-spin'; } if ( values.flip ) { attr[ 'class' ] += ' fa-flip-' + values.flip; } // Link related parameters. if ( '' !== values.link ) { attr[ 'class' ] += ' fusion-link'; attr.href = values.link; attr.target = values.linktarget; if ( '_blank' === values.linktarget ) { attr.rel = 'noopener noreferrer'; } } if ( 'pulsate' === values.icon_hover_type || 'slide' === values.icon_hover_type ) { attr[ 'class' ] += ' icon-hover-animation-' + values.icon_hover_type; } if ( values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ), iconWithoutFusionPrefix; if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.icon && 'fusion-prefix-' === values.icon.substr( 0, 14 ) ) { if ( undefined !== typeof fusionAppConfig.customIcons ) { iconWithoutFusionPrefix = values.icon.substr( 14 ); // TODO: try to optimize this check. jQuery.each( fusionAppConfig.customIcons, function( iconPostName, iconSet ) { if ( 0 === iconWithoutFusionPrefix.indexOf( iconSet.css_prefix ) ) { FusionPageBuilderApp.mediaMap.icons[ iconSet.post_id ] = iconSet.css_prefix; return false; } } ); } } } } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Button Element View. FusionPageBuilder.fusion_button = FusionPageBuilder.ElementView.extend( { /** * Migrate params to new format. * * @since 3.5 * @return {void} */ onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { // Split border width into 4. if ( 'undefined' === typeof params.border_top && 'undefined' !== typeof params.border_width && '' !== params.border_width ) { params.border_top = parseInt( params.border_width ) + 'px'; params.border_right = params.border_top; params.border_bottom = params.border_top; params.border_left = params.border_top; delete params.border_width; } // Split border radius into 4. if ( 'undefined' === typeof params.border_radius_top_left && 'undefined' !== typeof params.border_radius && '' !== params.border_radius ) { params.border_radius_top_left = parseInt( params.border_radius ) + 'px'; params.border_radius_top_right = params.border_radius_top_left; params.border_radius_bottom_right = params.border_radius_top_left; params.border_radius_bottom_left = params.border_radius_top_left; delete params.border_radius; } this.model.set( 'params', params ); } }, /** * Runs on render. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var item = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '[rel="iLightbox"]' ) ), params = this.model.get( 'params' ), stretch = params.stretch; if ( 'default' === stretch || '' == stretch ) { stretch = fusionAllElements.fusion_button.defaults.stretch; } this.$el.removeClass( 'fusion-element-alignment-right fusion-element-alignment-left fusion-element-alignment-block fusion-element-alignment-textflow' ); if ( 'yes' !== stretch && ! this.flexDisplay() ) { if ( 'undefined' !== typeof params.alignment && '' !== params.alignment ) { this.$el.addClass( 'fusion-element-alignment-' + params.alignment ); } else if ( ! jQuery( 'body.rtl' ).length ) { this.$el.addClass( 'fusion-element-alignment-left fusion-element-alignment-textflow' ); } else { this.$el.addClass( 'fusion-element-alignment-right fusion-element-alignment-textflow' ); } } else { this.$el.addClass( 'fusion-element-alignment-block' ); } if ( 'object' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox ) { if ( 'undefined' !== typeof this.iLightbox ) { this.iLightbox.destroy(); } if ( item.length ) { this.iLightbox = item.iLightBox( jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox.prepare_options( 'single' ) ); } } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.isFlex = this.flexDisplay(); this.values = atts.values; this.extras = atts.extras; // Validate values. this.validateArgs(); // Create attribute objects. attributes.wrapperAttr = this.buildWrapperAttr( atts.values ); attributes.attr = this.buildAttr( atts.values ); attributes.IconAttr = this.buildIconAttr( atts.values ); attributes.buttonStyles = this.getStyles(); attributes.textAttr = this.buildTextAttr( atts.values ); // Any extras that need passed on. attributes.values = atts.values; return attributes; }, /** * Modify template attributes. * * @since 3.5 * @return {void} */ validateArgs: function() { // variables into current scope var params, border_radius; params = this.model.get( 'params' ); this.values.default_size = false; if ( ( 'undefined' !== typeof params.size && '' === params.size ) || 'undefined' === typeof params.size ) { this.values.default_size = true; } this.values.default_stretch = false; if ( ( 'undefined' !== typeof params.stretch && '' === params.stretch ) || 'undefined' === typeof params.stretch ) { this.values.default_stretch = true; } this.values.default_type = false; if ( ( 'undefined' !== typeof params.type && ( '' === params.type || 'default' === params.type ) ) || 'undefined' === typeof params.type ) { this.values.default_type = true; } this.values.margin_bottom = _.fusionGetValueWithUnit( this.values.margin_bottom ); this.values.margin_left = _.fusionGetValueWithUnit( this.values.margin_left ); this.values.margin_right = _.fusionGetValueWithUnit( this.values.margin_right ); this.values.margin_top = _.fusionGetValueWithUnit( this.values.margin_top ); if ( 'undefined' === typeof this.values.gradient_colors || '' === this.values.gradient_colors ) { this.values.gradient_colors = this.values.button_gradient_top_color.toLowerCase() + '|' + this.values.button_gradient_bottom_color.toLowerCase(); } if ( 'undefined' === typeof this.values.gradient_hover_colors || '' === this.values.gradient_hover_colors ) { this.values.gradient_hover_colors = this.values.button_gradient_top_color_hover.toLowerCase() + '|' + this.values.button_gradient_bottom_color_hover.toLowerCase(); } this.values.old_text_color = ( 'undefined' !== typeof this.values.text_color && '' !== this.values.text_color ) ? this.values.text_color : false; this.values.text_color = this.values.accent_color; this.values.icon_color = this.values.text_color; this.values.text_hover_color = this.values.accent_hover_color; this.values.icon_hover_color = this.values.text_hover_color; if ( 'undefined' !== typeof this.values.old_text_color && '' !== this.values.old_text_color ) { this.values.text_color = this.values.old_text_color; } if ( this.values.modal ) { this.values.link = '#'; } this.values.type = 'string' === typeof this.values.type ? this.values.type.toLowerCase() : 'flat'; // BC compatibility for button shape. if ( 'undefined' !== typeof params.shape && '' !== params.shape && 'undefined' === typeof params.border_radius && 'undefined' === typeof params.border_radius_top_left ) { border_radius = '0'; if ( 'square' === this.values.shape ) { border_radius = '0'; } else if ( 'round' === this.values.shape ) { border_radius = '2'; if ( '3d' === this.values.type.toLowerCase() ) { border_radius = '4'; } } else if ( 'pill' === this.values.shape ) { border_radius = '25'; } this.values.border_radius_top_left = _.fusionGetValueWithUnit( border_radius ); this.values.border_radius_top_right = this.values.border_radius_top_left; this.values.border_radius_bottom_right = this.values.border_radius_top_left; this.values.border_radius_bottom_left = this.values.border_radius_top_left; } else if ( 'undefined' !== typeof params.border_radius && 'undefined' === typeof params.border_radius_top_left && '' !== params.border_radius ) { this.values.border_radius_top_left = params.border_radius; this.values.border_radius_top_right = this.values.border_radius_top_left; this.values.border_radius_bottom_right = this.values.border_radius_top_left; this.values.border_radius_bottom_left = this.values.border_radius_top_left; } this.values.border_radius_top_left = _.isEmpty( this.values.border_radius_top_left ) ? '0' : _.fusionGetValueWithUnit( this.values.border_radius_top_left ); this.values.border_radius_top_right = _.isEmpty( this.values.border_radius_top_right ) ? '0' : _.fusionGetValueWithUnit( this.values.border_radius_top_right ); this.values.border_radius_bottom_right = _.isEmpty( this.values.border_radius_bottom_right ) ? '0' : _.fusionGetValueWithUnit( this.values.border_radius_bottom_right ); this.values.border_radius_bottom_left = _.isEmpty( this.values.border_radius_bottom_left ) ? '0' : _.fusionGetValueWithUnit( this.values.border_radius_bottom_left ); this.values.border_radius = this.values.border_radius_top_left + ' ' + this.values.border_radius_top_right + ' ' + this.values.border_radius_bottom_right + ' ' + this.values.border_radius_bottom_left; // Legacy single border support. if ( 'undefined' !== params.border_width && '' !== params.border_width && 'undefined' === params.border_top ) { this.values.border_top = params.border_width; this.values.border_right = this.values.border_top; this.values.border_bottom = this.values.border_top; this.values.border_left = this.values.border_top; } this.values.default_border_width = false; if ( '' === this.values.border_top && '' === this.values.border_right && '' === this.values.border_bottom && '' === this.values.border_left ) { this.values.default_border_width = true; } else { // Not using default, ensure values for each. this.values.border_top = ( '' === this.values.border_top ) ? this.extras.border_top : this.values.border_top; this.values.border_right = ( '' === this.values.border_right ) ? this.extras.border_right : this.values.border_right; this.values.border_bottom = ( '' === this.values.border_bottom ) ? this.extras.border_bottom : this.values.border_bottom; this.values.border_left = ( '' === this.values.border_left ) ? this.extras.border_left : this.values.border_left; } this.values.border_top = _.isEmpty( this.values.border_top ) ? '0' : _.fusionGetValueWithUnit( this.values.border_top ); this.values.border_right = _.isEmpty( this.values.border_right ) ? '0' : _.fusionGetValueWithUnit( this.values.border_right ); this.values.border_bottom = _.isEmpty( this.values.border_bottom ) ? '0' : _.fusionGetValueWithUnit( this.values.border_bottom ); this.values.border_left = _.isEmpty( this.values.border_left ) ? '0' : _.fusionGetValueWithUnit( this.values.border_left ); this.values.border_width = this.values.border_top + ' ' + this.values.border_right + ' ' + this.values.border_bottom + ' ' + this.values.border_left; if ( 'undefined' === typeof this.values.size ) { this.values.size = ''; } }, /** * Builds the wrapper attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildWrapperAttr: function( values ) { var attr = { class: '', style: '' }, isDefaultStretch = ( 'undefined' !== typeof values.stretch && ( '' === values.stretch || 'default' === values.stretch ) ) || 'undefined' === typeof values.stretch; if ( this.isFlex ) { if ( values.alignment ) { attr.style += 'text-align:' + values.alignment + ';'; } if ( values.alignment_medium && values.alignment !== values.alignment_medium ) { attr[ 'class' ] += ' md-text-align-' + values.alignment_medium; } if ( values.alignment_small && values.alignment !== values.alignment_small ) { attr[ 'class' ] += ' sm-text-align-' + values.alignment_small; } } else { attr[ 'class' ] += 'fusion-button-wrapper'; // Add wrapper to the button for alignment and scoped styling. if ( ( ( ! isDefaultStretch && 'yes' === values.stretch ) || ( isDefaultStretch && 'yes' === fusionAllElements.fusion_button.defaults.stretch ) ) ) { attr[ 'class' ] += ' fusion-align-block'; } else if ( values.alignment ) { attr[ 'class' ] += ' fusion-align' + values.alignment; } } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var params = this.model.get( 'params' ), attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-button button-' + values.type + ' button-' + values.color + ' button-cid' + this.model.get( 'cid' ), style: '' } ), sizeClass = 'button-' + values.size, stretchClass = 'fusion-button-span-' + values.stretch, typeClass = '', isDefaultStretch = ( 'undefined' !== typeof values.stretch && ( '' === values.stretch || 'default' === values.stretch ) ) || 'undefined' === typeof values.stretch, marginRight, marginLeft; attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( ( 'undefined' !== typeof params.size && '' === params.size ) || 'undefined' === typeof params.size ) { sizeClass = 'fusion-button-default-size'; } if ( ( 'undefined' !== typeof params.stretch && ( '' === params.stretch || 'default' === params.stretch ) ) || 'undefined' === typeof params.stretch ) { stretchClass = 'fusion-button-default-span'; } if ( ( 'undefined' !== typeof params.type && ( '' === params.type || 'default' === params.type ) ) || 'undefined' === typeof params.type ) { typeClass = 'fusion-button-default-type'; } attr[ 'class' ] += ' ' + sizeClass + ' ' + stretchClass + ' ' + typeClass; attr.target = values.target; if ( '_blank' === values.target ) { attr.rel = 'noopener noreferrer'; } else if ( 'lightbox' === values.target ) { attr.rel = 'iLightbox'; } attr = _.fusionLinkAttributes( attr, values ); attr.title = values.title; attr.href = values.link; if ( '' !== values.modal ) { attr.data_toggle = 'modal'; attr.data_target = '.fusion-modal.' + values.modal; } if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( ( ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) || ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) ) && ( ( ! isDefaultStretch && 'yes' === values.stretch ) || ( isDefaultStretch && 'yes' === fusionAllElements.fusion_button.defaults.stretch ) ) ) { marginRight = 'undefined' !== typeof values.margin_right && '' !== values.margin_right ? ' - ' + values.margin_right : ''; marginLeft = 'undefined' !== typeof values.margin_left && '' !== values.margin_left ? ' - ' + values.margin_left : ''; attr.style += 'width:calc(100%' + marginRight + marginLeft + ');'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds icon attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildIconAttr: function( values ) { var buttonShortcodeIcon = { class: _.fusionFontAwesome( values.icon ), 'aria-hidden': 'true' }; if ( 'yes' !== values.icon_divider ) { buttonShortcodeIcon[ 'class' ] += ' button-icon-' + values.icon_position; } if ( values.icon_color && values.icon_color !== values.accent_color ) { buttonShortcodeIcon.style = 'color:' + values.icon_color + ';'; } return buttonShortcodeIcon; }, /** * Builds text attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildTextAttr: function( values ) { var buttonTextAttr = { class: 'fusion-button-text' }; if ( '' !== values.icon && 'yes' === values.icon_divider ) { buttonTextAttr[ 'class' ] += ' fusion-button-text-' + values.icon_position; } buttonTextAttr = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), 'disable-return': true, 'disable-extra-spaces': true, toolbar: 'simple' }, buttonTextAttr ); return buttonTextAttr; }, /** * Builds the styles. * * @since 3.5 * @return {void} */ getStyles: function() { // variables into current scope var self = this, hover_selectors, box_shadow_3d, selectors, grad_colors, grad_hover_colors, text_styles, side_padding, font_size, css; this.baseSelector = '.fusion-button.button-cid' + this.model.get( 'cid' ); this.dynamic_css = {}; hover_selectors = [ this.baseSelector + ':hover', this.baseSelector + ':active', this.baseSelector + ':focus' ]; // If its custom, default or a custom color scheme. if ( 'custom' === this.values.color || 'default' === this.values.color || false !== this.values.color.includes( 'scheme-' ) ) { // 3D type with custom bevel color, change box shadow color. if ( '3d' === this.values.type ) { box_shadow_3d = 'inset 0 1px 0 #fff, 0 0.15em 0 ' + this.values.bevel_color + ', 0.1em 0.2em 0.2em 0.15em rgba(0, 0, 0, 0.3)'; this.addCssProperty( this.baseSelector + '.button-3d', 'box-shadow', box_shadow_3d ); box_shadow_3d = 'inset 0 1px 0 #fff, 0 1px 0 ' + this.values.bevel_color + ', 0.05em 0.1em 0.1em 0.07em rgba(0, 0, 0, 0.3)'; this.addCssProperty( this.baseSelector + '.button-3d:active', 'box-shadow', box_shadow_3d ); box_shadow_3d = 'inset 0 1px 0 #fff, 0 0.15em 0 ' + this.values.bevel_color_hover + ', 0.1em 0.2em 0.2em 0.15em rgba(0, 0, 0, 0.3)'; this.addCssProperty( this.baseSelector + '.button-3d:hover', 'box-shadow', box_shadow_3d ); box_shadow_3d = 'inset 0 1px 0 #fff, 0 1px 0 ' + this.values.bevel_color_hover + ', 0.05em 0.1em 0.1em 0.07em rgba(0, 0, 0, 0.3)'; this.addCssProperty( this.baseSelector + '.button-3d:hover:active', 'box-shadow', box_shadow_3d ); } if ( 'default' !== this.values.color ) { selectors = [ this.baseSelector + ' .fusion-button-text', this.baseSelector + ' i' ]; if ( 'string' === typeof this.values.old_text_color && '' !== this.values.old_text_color ) { this.addCssProperty( selectors, 'color', this.values.old_text_color ); } else if ( '' !== this.values.accent_color ) { this.addCssProperty( selectors, 'color', this.values.accent_color ); } if ( '' !== this.values.border_color ) { this.addCssProperty( this.baseSelector, 'border-color', this.values.border_color ); } selectors = [ this.baseSelector + ':hover .fusion-button-text', this.baseSelector + ':hover i', this.baseSelector + ':focus .fusion-button-text', this.baseSelector + ':focus i', this.baseSelector + ':active .fusion-button-text', this.baseSelector + ':active i' ]; if ( 'string' === typeof this.values.old_text_color && '' !== this.values.old_text_color ) { this.addCssProperty( selectors, 'color', this.values.old_text_color ); } else if ( '' !== this.values.accent_hover_color ) { this.addCssProperty( selectors, 'color', this.values.accent_hover_color ); } else if ( '' !== this.values.accent_color ) { this.addCssProperty( selectors, 'color', this.values.accent_color ); } if ( '' !== this.values.border_hover_color ) { this.addCssProperty( hover_selectors, 'border-color', this.values.border_hover_color ); } else if ( '' !== this.values.accent_color ) { this.addCssProperty( hover_selectors, 'border-color', this.values.accent_color ); } if ( '' !== this.values.accent_color && 'yes' === this.values.icon_divider ) { this.addCssProperty( this.baseSelector + ' .fusion-button-icon-divider', 'border-color', this.values.accent_color ); } if ( '' !== this.values.accent_hover_color && 'yes' === this.values.icon_divider ) { selectors = [ this.baseSelector + ':hover .fusion-button-icon-divider', this.baseSelector + ':active .fusion-button-icon-divider', this.baseSelector + ':focus .fusion-button-icon-divider' ]; this.addCssProperty( selectors, 'border-color', this.values.accent_hover_color ); } } if ( '' !== this.values.border_width && 'custom' === this.values.color && ! this.values.default_border_width ) { this.addCssProperty( this.baseSelector, 'border-width', this.values.border_width ); this.addCssProperty( hover_selectors, 'border-width', this.values.border_width ); } this.addCssProperty( this.baseSelector, 'border-radius', this.values.border_radius ); if ( 'default' !== this.values.color ) { if ( 'string' === typeof this.values.gradient_colors && '' !== this.values.gradient_colors ) { // Checking for deprecated separators. if ( this.values.gradient_colors.includes( ';' ) ) { grad_colors = this.values.gradient_colors.split( ';' ); } else { grad_colors = this.values.gradient_colors.split( '|' ); } // Only one, just use that as background color, no gradient. if ( 1 === grad_colors.length || '' === grad_colors[ 1 ] || grad_colors[ 0 ] === grad_colors[ 1 ] ) { this.addCssProperty( this.baseSelector, 'background', grad_colors[ 0 ] ); } else { this.addCssProperty( this.baseSelector, 'background', grad_colors[ 0 ] ); if ( 'linear' === this.values.gradient_type ) { this.addCssProperty( this.baseSelector, 'background-image', 'linear-gradient(' + this.values.linear_angle + 'deg,' + grad_colors[ 0 ] + ' ' + this.values.gradient_start_position + '%,' + grad_colors[ 1 ] + ' ' + this.values.gradient_end_position + '%)' ); } else { this.addCssProperty( this.baseSelector, 'background-image', 'radial-gradient(circle at ' + this.values.radial_direction + ',' + grad_colors[ 0 ] + ' ' + this.values.gradient_start_position + '%,' + grad_colors[ 1 ] + ' ' + this.values.gradient_end_position + '%)' ); } } } if ( 'string' === typeof this.values.gradient_hover_colors && '' !== this.values.gradient_hover_colors ) { // Checking for deprecated separators. if ( this.values.gradient_hover_colors.includes( ';' ) ) { grad_hover_colors = this.values.gradient_hover_colors.split( ';' ); } else { grad_hover_colors = this.values.gradient_hover_colors.split( '|' ); } if ( 1 === grad_hover_colors.length || '' === grad_hover_colors[ 1 ] || grad_hover_colors[ 0 ] === grad_hover_colors[ 1 ] ) { this.addCssProperty( hover_selectors, 'background', grad_hover_colors[ 0 ] ); } else { this.addCssProperty( hover_selectors, 'background', grad_hover_colors[ 0 ] ); if ( 'linear' === this.values.gradient_type ) { this.addCssProperty( hover_selectors, 'background-image', 'linear-gradient(' + this.values.linear_angle + 'deg,' + grad_hover_colors[ 0 ] + ' ' + this.values.gradient_start_position + '%,' + grad_hover_colors[ 1 ] + ' ' + this.values.gradient_end_position + '%)' ); } else { this.addCssProperty( hover_selectors, 'background-image', 'radial-gradient(circle at ' + this.values.radial_direction + ',' + grad_hover_colors[ 0 ] + ' ' + this.values.gradient_start_position + '%,' + grad_hover_colors[ 1 ] + ' ' + this.values.gradient_end_position + '%)' ); } } } } } if ( !this.isDefault( 'text_transform' ) && '' !== this.values.text_transform ) { this.addCssProperty( this.baseSelector + ' .fusion-button-text', 'text-transform', this.values.text_transform ); } if ( '' === this.values.size ) { if ( ! this.isDefault( 'font_size' ) ) { this.addCssProperty( this.baseSelector, 'font-size', _.fusionGetValueWithUnit( this.values.font_size ) ); } if ( ! this.isDefault( 'line_height' ) ) { this.addCssProperty( this.baseSelector, 'line-height', this.values.line_height ); } if ( ! this.isDefault( 'padding_top' ) ) { this.addCssProperty( this.baseSelector, 'padding-top', _.fusionGetValueWithUnit( this.values.padding_top ) ); } if ( ! this.isDefault( 'padding_right' ) ) { this.addCssProperty( this.baseSelector, 'padding-right', _.fusionGetValueWithUnit( this.values.padding_right ) ); } if ( ! this.isDefault( 'padding_bottom' ) ) { this.addCssProperty( this.baseSelector, 'padding-bottom', _.fusionGetValueWithUnit( this.values.padding_bottom ) ); } if ( ! this.isDefault( 'padding_left' ) ) { this.addCssProperty( this.baseSelector, 'padding-left', _.fusionGetValueWithUnit( this.values.padding_left ) ); } // If we have an icon and divider and changed either font or padding we need to calculate new spacing. if ( '' !== this.values.icon && 'yes' === this.values.icon_divider && ( ! this.isDefault( 'padding_' + this.values.icon_position ) || ! this.isDefault( 'font_size' ) ) ) { side_padding = ! this.isDefault( 'padding_' + this.values.icon_position ) ? this.values[ 'padding_' + this.values.icon_position ] : this.extras[ 'padding_' + this.values.icon_position ]; font_size = ! this.isDefault( 'font_size' ) ? this.values.font_size : this.extras.button_font_size; this.addCssProperty( this.baseSelector + ' .fusion-button-text-' + this.values.icon_position, 'padding-' + this.values.icon_position, 'calc( ' + side_padding + ' / 2 + ' + font_size + ' + 1px )' ); this.addCssProperty( this.baseSelector + ' .button-icon-divider-' + this.values.icon_position, 'width', 'calc( ' + side_padding + ' + ' + font_size + ' )' ); } } if ( ! this.isDefault( 'letter_spacing' ) ) { this.addCssProperty( this.baseSelector, 'letter-spacing', _.fusionGetValueWithUnit( this.values.letter_spacing ) ); } text_styles = _.fusionGetFontStyle( 'button_font', this.values, 'object' ); jQuery.each( text_styles, function( rule, value ) { self.addCssProperty( self.baseSelector, rule, value ); } ); css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Breadcrumbs view. FusionPageBuilder.fusion_breadcrumbs = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); return attributes; }, /** * Modifies the values. * * @since 2.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); }, /** * Builds output. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-breadcrumbs' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.breadcrumbs ) { output = atts.query_data.breadcrumbs; } if ( ( FusionApp.data.is_home || FusionApp.data.is_front_page ) && 1 < jQuery( jQuery.parseHTML( output ) ).filter( '.fusion-breadcrumb-item' ).length ) { output = jQuery( jQuery.parseHTML( output ) ).filter( '.fusion-breadcrumb-item' ).eq( 1 ).remove().html(); } return output; }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-breadcrumbs fusion-live-breadcrumbs fusion-breadcrumbs-' + this.model.get( 'cid' ), style: '' } ); attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( '' !== values.alignment ) { attr.style += 'text-align:' + values.alignment + ';'; } if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds styles. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var style = '<style type="text/css">'; if ( '' !== values.font_size ) { style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + '{font-size:' + values.font_size + ';}'; } if ( '' !== values.text_hover_color ) { style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + ' span a:hover{color:' + values.text_hover_color + '!important;}'; } if ( '' !== values.text_color ) { style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + ','; style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + ' a{color:' + values.text_color + ';}'; } if ( FusionApp.data.is_home || FusionApp.data.is_front_page ) { style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + ' .fusion-breadcrumb-prefix{display:none}'; style += '.fusion-breadcrumbs.fusion-breadcrumbs-' + this.model.get( 'cid' ) + ' .fusion-breadcrumb-sep{display:none}'; } style += '</style>'; return style; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp, FusionPageBuilderApp, builderConfig */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Image Frame Element View. FusionPageBuilder.fusion_imageframe = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var params = this.model.get( 'params' ), link = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-lightbox' ) ); this.$el.removeClass( 'fusion-element-alignment-right fusion-element-alignment-left' ); if ( ! this.flexDisplay() ) { if ( 'undefined' !== typeof params.align && ( 'right' === params.align || 'left' === params.align ) ) { this.$el.addClass( 'fusion-element-alignment-' + params.align ); } } if ( 'object' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox ) { if ( 'undefined' !== typeof this.iLightbox ) { this.iLightbox.destroy(); } if ( link.length ) { this.iLightbox = link.iLightBox( jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox.prepare_options( 'single' ) ); } } }, /** * Modify template attributes. * * @since 2.0 * @return {Object} */ filterTemplateAtts: function( atts ) { if ( 'undefined' !== typeof atts.values.element_content ) { this.isFlex = this.flexDisplay(); // Validate values. this.validateValues( atts.values ); // Create attribute objects this.values = atts.values; this.extras = atts.extras; atts.isFlex = this.isFlex; atts.attr = this.buildAttr( atts.values ); atts.contentAttr = this.buildContentAttr( atts.values ); atts.linkAttr = this.buildLinktAttr( atts.values ); atts.borderRadius = this.buildBorderRadius( atts.values ); atts.imgStyles = this.buildImgStyles( atts.values ); if ( this.isFlex ) { atts.responsiveAttr = this.buildResponsiveAttr( atts.values ); } this.buildElementContent( atts ); atts.liftupClasses = this.buildLiftupClasses( atts ); atts.liftupStyles = this.buildLiftupStyles( atts ); atts.captionHtml = this.generateCaption( atts ); //styles atts.maskStyles = this.buildMaskStyles( atts ); atts.aspectRatioStyles = this.buildAspectRatioStyles( atts ); atts.marginStyles = this.buildMarginStyles( atts ); // Add min height sticky. atts.stickyStyles = '' !== atts.values.sticky_max_width ? '<style>.fusion-sticky-container.fusion-sticky-transition .imageframe-cid' + this.model.get( 'cid' ) + '{ max-width:' + _.fusionGetValueWithUnit( atts.values.sticky_max_width ) + ' !important; }</style>' : false; atts.filter_style_block = _.fusionGetFilterStyleElem( atts.values, '.imageframe-cid' + this.model.get( 'cid' ), this.model.get( 'cid' ) ); } return atts; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.borderradius = _.fusionValidateAttrValue( values.borderradius, 'px' ); values.bordersize = _.fusionValidateAttrValue( values.bordersize, 'px' ); values.blur = _.fusionValidateAttrValue( values.blur, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' ); values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' ); values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); // If caption style used then disable style type. if ( -1 === jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { values.style_type = 'none'; } // If mask used disable style type. if ( values.mask ) { values.style_type = 'none'; } if ( ! values.style ) { values.style = values.style_type; } if ( values.borderradius && 'bottomshadow' === values.style ) { values.borderradius = '0'; } if ( 'round' === values.borderradius ) { values.borderradius = '50%'; } }, /** * Builds responsive container attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildResponsiveAttr: function( values ) { var attr = { style: '', class: '' }, alignLarge = values.align && 'none' !== values.align ? values.align : false, alignMedium = values.align_medium && 'none' !== values.align_medium ? values.align_medium : false, alignSmall = values.align_small && 'none' !== values.align_small ? values.align_small : false; if ( alignLarge ) { attr.style += 'text-align:' + alignLarge + ';'; } if ( alignMedium && alignLarge !== alignMedium ) { attr[ 'class' ] += ' md-text-align-' + alignMedium; } if ( alignSmall && alignLarge !== alignSmall ) { attr[ 'class' ] += ' sm-text-align-' + alignSmall; } if ( -1 !== jQuery.inArray( values.caption_style, [ 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + values.caption_style + ' awb-imageframe-style-' + this.model.get( 'cid' ); } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Main wrapper attributes var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-imageframe', style: '' } ), imgStyles, styleColorVal = values.stylecolor ? values.stylecolor : '', styleColor = ( 0 === styleColorVal.indexOf( '#' ) ) ? jQuery.AWB_Color( styleColorVal ).alpha( 0.3 ).toRgbaString() : jQuery.AWB_Color( styleColorVal ).toRgbaString(), blur = values.blur, blurRadius = ( parseInt( blur, 10 ) + 4 ) + 'px'; if ( ! this.isFlex ) { attr[ 'class' ] += ' fusion-imageframe-align-' + values.align; } attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( ! values.style ) { values.style = values.style_type; } imgStyles = ''; // Border style only if not using mask. if ( '' === values.mask ) { if ( '' != values.bordersize && '0' != values.bordersize && '0px' !== values.bordersize ) { imgStyles += 'border:' + values.bordersize + ' solid ' + values.bordercolor + ';'; } if ( '0' != values.borderradius && '0px' !== values.borderradius ) { imgStyles += '-webkit-border-radius:' + values.borderradius + ';-moz-border-radius:' + values.borderradius + ';border-radius:' + values.borderradius + ';'; if ( '50%' === values.borderradius || 100 < parseFloat( values.borderradius ) ) { imgStyles += '-webkit-mask-image: -webkit-radial-gradient(circle, white, black);'; } } } if ( 'glow' === values.style ) { imgStyles += '-moz-box-shadow: 0 0 ' + blur + ' ' + styleColor + ';-webkit-box-shadow: 0 0 ' + blur + ' ' + styleColor + ';box-shadow: 0 0 ' + blur + ' ' + styleColor + ';'; } else if ( 'dropshadow' === values.style ) { imgStyles += '-moz-box-shadow: ' + blur + ' ' + blur + ' ' + blurRadius + ' ' + styleColor + ';-webkit-box-shadow: ' + blur + ' ' + blur + ' ' + blurRadius + ' ' + styleColor + ';box-shadow: ' + blur + ' ' + blur + ' ' + blurRadius + ' ' + styleColor + ';'; } if ( '' !== imgStyles ) { attr.style += imgStyles; } attr[ 'class' ] += ' imageframe-' + values.style + ' imageframe-cid' + this.model.get( 'cid' ); if ( 'bottomshadow' === values.style ) { attr[ 'class' ] += ' element-bottomshadow'; } if ( '' !== values.mask ) { attr[ 'class' ] += ' has-mask'; } if ( '' !== values.aspect_ratio ) { attr[ 'class' ] += ' has-aspect-ratio'; } if ( 'liftup' !== values.hover_type && -1 !== jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { if ( ! this.isFlex ) { if ( 'left' === values.align ) { attr.style += 'margin-right:25px;float:left;'; } else if ( 'right' === values.align ) { attr.style += 'margin-left:25px;float:right;'; } } attr[ 'class' ] += ' hover-type-' + values.hover_type; } if ( '' !== values.max_width && '' === values.aspect_ratio ) { attr.style += 'max-width:' + _.fusionGetValueWithUnit( values.max_width ) + ''; } // Caption style. if ( -1 === jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + values.caption_style; } // Caption style. if ( -1 === jQuery.inArray( values.caption_style, [ 'off', 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + values.caption_style; } if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds link attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildLinktAttr: function( values ) { // Link Attributes var linkAttr = {}; if ( 'yes' === values.lightbox ) { // Set the lightbox image to the dedicated link if it is set. if ( '' !== values.lightbox_image ) { values.pic_link = values.lightbox_image; } linkAttr.href = values.pic_link; linkAttr[ 'class' ] = 'fusion-lightbox imageframe-shortcode-link'; if ( '' !== values.gallery_id || '0' === values.gallery_id ) { linkAttr[ 'data-rel' ] = 'iLightbox[' + values.gallery_id + ']'; } else { linkAttr[ 'data-rel' ] = 'iLightbox[image-' + this.model.get( 'cid' ) + ']'; } } else if ( values.link ) { linkAttr[ 'class' ] = 'fusion-no-lightbox'; linkAttr.href = values.link; linkAttr.target = values.linktarget; if ( '_blank' === values.linktarget ) { linkAttr.rel = 'noopener noreferrer'; } } return linkAttr; }, /** * Builds content attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildContentAttr: function( values ) { var contentAttr = {}, title = '', src = ''; // values.image_id = ''; // Could add JS to get image dimensions if necessary. if ( ! values.element_content ) { return 'no_image_set'; } // eslint-disable-next-line no-useless-escape src = values.element_content.match( /(src=["\'](.*?)["\'])/ ); if ( src && 1 < src.length ) { src = src[ 2 ]; } else if ( -1 === values.element_content.indexOf( '<img' ) && '' !== values.element_content ) { src = values.element_content; } if ( 'undefined' !== typeof src && src && '' !== src ) { src = src.replace( '×', 'x' ); contentAttr.src = src; values.pic_link = src; if ( 'no' === values.lightbox && '' !== values.link ) { contentAttr.title = title; } else { contentAttr.title = ''; } contentAttr.alt = values.alt; } if ( '' !== values.aspect_ratio ) { contentAttr[ 'class' ] = 'img-with-aspect-ratio'; } let imageIdSize, imageId, imageSize; if ( 'undefined' !== typeof values.image_id && '' !== values.image_id ) { const self = this; if ( -1 !== values.image_id.indexOf( '|' ) ) { imageIdSize = values.image_id.split( '|' ); imageId = imageIdSize[ 0 ]; imageSize = imageIdSize[ 1 ]; } else { imageId = values.image_id; } const media = wp.media.attachment( imageId ); if ( _.isUndefined( media.get( 'title' ) ) ) { media.fetch().then( function() { self.reRender(); self._refreshJs(); } ); } else if ( imageSize ) { contentAttr.width = media.attributes.sizes[ imageSize ].width; contentAttr.height = media.attributes.sizes[ imageSize ].height; } else { contentAttr.width = media.attributes.width; contentAttr.height = media.attributes.height; } } return contentAttr; }, /** * Builds border radius. * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildBorderRadius: function( values ) { var borderRadius = ''; if ( values.borderradius && '' !== values.borderradius && 0 !== values.borderradius && '0' !== values.borderradius && '0px' !== values.borderradius ) { borderRadius += '-webkit-border-radius:' + values.borderradius + ';-moz-border-radius:' + values.borderradius + ';border-radius:' + values.borderradius + ';'; } return borderRadius; }, /** * Builds image styles. * * @since 2.0 * @param {Object} atts - The atts object. * @return {string} */ buildImgStyles: function( atts ) { var imgStyles = ''; if ( atts.borderRadius ) { imgStyles = ' style="' + atts.borderRadius + '"'; } return imgStyles; }, /** * Builds element content. * * @since 2.0 * @param {Object} atts - The atts object. */ buildElementContent: function( atts ) { var imgClasses = 'img-responsive', classes = '', imageAtts = ''; if ( 'no_image_set' === atts.contentAttr ) { return; } else if ( _.FusionIsValidJSON( atts.contentAttr.src ) ) { atts.values.element_content = this.getLogoImages( atts ); } else { imageAtts = _.fusionGetAttributes( atts.contentAttr ); imageAtts = -1 === imageAtts.indexOf( 'alt=' ) ? imageAtts + ' alt' : imageAtts; atts.values.element_content = '<img ' + imageAtts + ' />'; } if ( '' !== atts.values.image_id ) { imgClasses += ' wp-image-' + atts.values.image_id; } // Get custom classes from the img tag. // eslint-disable-next-line no-useless-escape classes = atts.values.element_content.match( /(class=["\'](.*?)["\'])/ ); if ( classes && 1 < classes.length ) { imgClasses += ' ' + classes[ 2 ]; } imgClasses = 'class="' + imgClasses + '"'; // Add custom and responsive class and the needed styles to the img tag. if ( classes && 'undefined' !== typeof classes[ 0 ] ) { atts.values.element_content = atts.values.element_content.replace( classes[ 0 ], imgClasses + atts.imgStyles ); } else { atts.values.element_content = atts.values.element_content.replace( '/>', imgClasses + atts.imgStyles + '/>' ); } // Set the lightbox image to the dedicated link if it is set. if ( '' !== atts.values.lightbox_image ) { atts.values.pic_link = atts.values.lightbox_image; } if ( -1 === jQuery.inArray( atts.values.caption_style, [ 'off', 'above', 'below' ] ) ) { atts.values.element_content += this.generateCaption( atts ); } if ( 'yes' === atts.values.lightbox || atts.values.link ) { atts.values.element_content = '<a ' + _.fusionGetAttributes( atts.linkAttr ) + '>' + atts.values.element_content + '</a>'; } }, /** * Builds liftup classes. * * @since 2.0 * @param {Object} atts - The atts object. * @return {string} */ buildLiftupClasses: function( atts ) { var liftupClasses = '', cid = this.model.get( 'cid' ); if ( 'liftup' === atts.values.hover_type || ( 'bottomshadow' === atts.values.style_type && ( 'none' === atts.values.hover_type || 'zoomin' === atts.values.hover_type || 'zoomout' === atts.values.hover_type ) ) ) { if ( 'liftup' === atts.values.hover_type ) { liftupClasses = 'imageframe-liftup'; if ( '' !== atts.values.aspect_ratio ) { liftupClasses += ' liftup-with-aspect-ratio'; } if ( ! this.isFlex ) { if ( 'left' === atts.values.align ) { liftupClasses += ' fusion-imageframe-liftup-left'; } else if ( 'right' === atts.values.align ) { liftupClasses += ' fusion-imageframe-liftup-right'; } } if ( atts.borderRadius ) { liftupClasses += ' imageframe-cid' + cid; } if ( '' !== atts.values.hover_type && '' !== atts.values.mask ) { liftupClasses += ' awb-image-frame hover-with-mask'; } } else { liftupClasses += 'fusion-image-frame-bottomshadow image-frame-shadow-cid' + cid; } liftupClasses += ' imageframe-cid' + cid; } return liftupClasses; }, /** * Builds mask styles. * * @since 7.6 * @param {Object} atts - The atts object. * @return {string} */ buildMaskStyles: function( atts ) { var maskStyles = '', cid = this.model.get( 'cid' ); if ( atts.values.mask ) { const maskUrl = 'custom' === atts.values.mask ? atts.values.custom_mask : `${builderConfig.fusion_builder_plugin_dir + '/assets/images/masks/'}${atts.values.mask}.svg`; let maskStyle = hoverMaskStyle = ''; if ( atts.values.mask_size ) { const maskSize = atts.values.mask_size; if ( 'fit' === maskSize ) { maskStyle += '-webkit-mask-size: contain;'; maskStyle += 'mask-size: contain;'; if ( 'liftup' === atts.values.hover_type ) { hoverMaskStyle += 'background-size: contain;'; } } if ( 'fill' === maskSize ) { maskStyle += '-webkit-mask-size: cover;'; maskStyle += 'mask-size: cover;'; if ( 'liftup' === atts.values.hover_type ) { hoverMaskStyle += 'background-size: cover;'; } } if ( 'custom' === maskSize ) { maskStyle += '-webkit-mask-size: ' + atts.values.mask_custom_size + ';'; maskStyle += 'mask-size: ' + atts.values.mask_custom_size + ';'; if ( 'liftup' === atts.values.hover_type ) { hoverMaskStyle += 'background-size: ' + atts.values.mask_custom_size + ';'; } } } if ( atts.values.mask_position ) { const maskPosition = 'custom' !== atts.values.mask_position ? atts.values.mask_position.replace( '-', ' ' ) : atts.values.mask_custom_position; maskStyle += '-webkit-mask-position: ' + maskPosition + ';'; maskStyle += 'mask-position: ' + maskPosition + ';'; if ( 'liftup' === atts.values.hover_type ) { hoverMaskStyle += 'background-position: ' + maskPosition + ';'; } } if ( atts.values.mask_repeat ) { maskStyle += '-webkit-mask-repeat: ' + atts.values.mask_repeat + ';'; maskStyle += 'mask-repeat: ' + atts.values.mask_repeat + ';'; if ( 'liftup' === atts.values.hover_type ) { hoverMaskStyle += 'background-repeat: ' + atts.values.mask_repeat + ';'; } } maskStyles += maskUrl ? `.fusion-imageframe.imageframe-cid${cid} img { -webkit-mask-image: url(${maskUrl}); mask-image: url(${maskUrl}); ${maskStyle} }` : ''; maskStyles += maskUrl && 'liftup' === atts.values.hover_type ? `.imageframe-liftup.imageframe-cid${cid}:before { background-image: url(${maskUrl}); ${hoverMaskStyle} }` : ''; } return maskStyles; }, /** * Builds aspect ratio styles. * * @since 7.6 * @param {Object} atts - The atts object. * @return {string} */ buildAspectRatioStyles: function() { var selectors, aspectRatio, width, height; if ( '' === this.values.aspect_ratio ) { return ''; } this.dynamic_css = {}; this.baseSelector = '.fusion-imageframe.imageframe-cid' + this.model.get( 'cid' ); selectors = [ this.baseSelector + ' img' ]; // Calc Ratio if ( 'custom' === this.values.aspect_ratio && '' !== this.values.custom_aspect_ratio ) { this.addCssProperty( selectors, 'aspect-ratio', `100 / ${this.values.custom_aspect_ratio}` ); } else { aspectRatio = this.values.aspect_ratio.split( '-' ); width = aspectRatio[ 0 ] || ''; height = aspectRatio[ 1 ] || ''; this.addCssProperty( selectors, 'aspect-ratio', `${width} / ${height}` ); } //Ratio Position if ( '' !== this.values.aspect_ratio_position ) { this.addCssProperty( selectors, 'object-position', this.values.aspect_ratio_position ); } const css = this.parseCSS(); return css; }, /** * Builds liftup styles. * * @since 2.0 * @param {Object} atts - The atts object. * @return {string} */ buildLiftupStyles: function( atts ) { var liftupStyles = '<style>', cid = this.model.get( 'cid' ), styleColor; if ( atts.borderRadius ) { liftupStyles += '.imageframe-liftup.imageframe-cid' + cid + ':before{' + atts.borderRadius + '}'; } if ( '' !== atts.values.max_width && '' === atts.values.aspect_ratio ) { liftupStyles += '.imageframe-cid' + cid + '{max-width:' + _.fusionGetValueWithUnit( atts.values.max_width ) + '}'; } if ( 'liftup' === atts.values.hover_type || ( 'bottomshadow' === atts.values.style_type && ( 'none' === atts.values.hover_type || 'zoomin' === atts.values.hover_type || 'zoomout' === atts.values.hover_type ) ) ) { styleColor = ( 0 === atts.values.stylecolor.indexOf( '#' ) ) ? jQuery.AWB_Color( atts.values.stylecolor ).alpha( 0.4 ).toRgbaString() : jQuery.AWB_Color( atts.values.stylecolor ).toRgbaString(); if ( 'liftup' === atts.values.hover_type ) { if ( 'bottomshadow' === atts.values.style_type ) { liftupStyles += '.element-bottomshadow.imageframe-cid' + cid + ':before, .element-bottomshadow.imageframe-cid' + cid + ':after{'; liftupStyles += '-webkit-box-shadow: 0 17px 10px ' + styleColor + ';box-shadow: 0 17px 10px ' + styleColor + ';}'; } } else { liftupStyles += '.imageframe-cid' + cid + '{display: inline-block}'; liftupStyles += '.element-bottomshadow.imageframe-cid' + cid + ':before, .element-bottomshadow.imageframe-cid' + cid + ':after{'; liftupStyles += '-webkit-box-shadow: 0 17px 10px ' + styleColor + ';box-shadow: 0 17px 10px ' + styleColor + ';}'; } } liftupStyles += '</style>'; return liftupStyles; }, /** * Builds margin styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildMarginStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = 'div.imageframe-cid' + this.model.get( 'cid' ), responsiveStyles = ''; if ( 'liftup' !== atts.values.hover_type && 'bottomshadow' !== atts.values.style ) { elementSelector = 'span.imageframe-cid' + this.model.get( 'cid' ); } _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== atts.values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( atts.values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); responsiveStyles += this.buildCaptionStyles( atts ); return responsiveStyles; }, /** * Builds caption styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildCaptionStyles: function( atts ) { var css, media, responsive = '', selectors, font_styles, sides, marginName; this.dynamic_css = {}; this.baseSelector = '.fusion-imageframe.imageframe-cid' + this.model.get( 'cid' ); if ( 'off' === atts.values.caption_style ) { return ''; } if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { this.baseSelector = '.awb-imageframe-style.awb-imageframe-style-' + this.model.get( 'cid' ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-title' ]; // title color. if ( ! this.isDefault( 'caption_title_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_title_color, true ); } // title size. if ( ! this.isDefault( 'caption_title_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_title_size ), true ); } // title font. font_styles = _.fusionGetFontStyle( 'caption_title_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // title transform. if ( ! this.isDefault( 'caption_title_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_title_transform ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; // text color. if ( ! this.isDefault( 'caption_text_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_text_color ); } // text size. if ( ! this.isDefault( 'caption_text_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_text_size ) ); } // text font. font_styles = _.fusionGetFontStyle( 'caption_text_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // text transform. if ( ! this.isDefault( 'caption_text_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_text_transform ); } // Border color. if ( 'resa' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:before' ]; this.addCssProperty( selectors, 'border-top-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-bottom-color', atts.values.caption_border_color ); selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:after' ]; this.addCssProperty( selectors, 'border-right-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-left-color', atts.values.caption_border_color ); } if ( 'dario' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption .awb-imageframe-caption-title:after' ]; this.addCssProperty( selectors, 'background', atts.values.caption_border_color ); } // Overlay color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'dario', 'resa', 'schantel', 'dany', 'navin' ] ) ) { selectors = [ this.baseSelector ]; this.addCssProperty( selectors, 'background', atts.values.caption_overlay_color ); } // Background color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'schantel', 'dany' ] ) && ! this.isDefault( 'caption_background_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'background', atts.values.caption_background_color ); } // Caption margin. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { sides = [ 'top', 'right', 'bottom', 'left' ]; selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; _.each( sides, function( side ) { marginName = 'caption_margin_' + side; if ( ! this.isDefault( marginName ) ) { this.addCssProperty( selectors, 'margin-' + side, _.fusionGetValueWithUnit( atts.values[ marginName ] ) ); } }, this ); if ( ! this.isDefault( 'caption_title' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'margin-top', '0.5em' ); } } css = this.parseCSS(); if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { _.each( [ '', 'medium', 'small' ], function( size ) { var key = 'caption_align' + ( '' === size ? '' : '_' + size ); // Check for default value. if ( this.isDefault( key ) ) { return; } this.dynamic_css = {}; // Build responsive alignment. selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; this.addCssProperty( selectors, 'text-align', atts.values[ key ] ); if ( '' === size ) { responsive += this.parseCSS(); } else { media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; responsive += media + '{' + this.parseCSS() + '}'; } }, this ); css += responsive; } // when image max-width applied. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) && '' !== atts.values.max_width ) { _.each( [ '', 'medium', 'small' ], function( size ) { var key = 'align' + ( '' === size ? '' : '_' + size ), align, props, styles; // Check for default value. if ( this.isDefault( key ) ) { return; } align = atts.values[ key ]; if ( 'left' === align ) { align = 'right'; } else if ( 'right' === align ) { align = 'left'; } if ( 'center' === align ) { props = 'margin: 0 auto;'; } else { props = 'margin-' + align + ': auto;'; } if ( 'small' === size ) { props = 'margin: 0;'; } // Build responsive alignment. styles = this.baseSelector + ' .awb-imageframe-caption-container {' + props + '}'; if ( '' === size ) { css += styles; } else { media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; css += media + '{' + styles + '}'; } }, this ); } return css; }, /** * Generate logos images markup. * * @since 3.0 * @param {string} images - The atts object. * @return {string} */ getLogoImages: function( atts ) { var data = JSON.parse( atts.contentAttr.src ), normalUrl = data[ 'default' ] && data[ 'default' ].normal && data[ 'default' ].normal.url, stickyUrl = data.sticky && data.sticky.normal && data.sticky.normal.url, mobileUrl = data.mobile && data.mobile.normal && data.mobile.normal.url, content = ''; if ( normalUrl ) { content += this.getLogoImage( atts, data[ 'default' ], 'fusion-standard-logo' ); } if ( stickyUrl ) { content += this.getLogoImage( atts, data.sticky, 'fusion-sticky-logo' ); } if ( mobileUrl ) { content += this.getLogoImage( atts, data.mobile, 'fusion-mobile-logo' ); } return content; }, /** * Generate logos image markup. * * @since 3.0 * @param {Object} data - The data object. * @param {string} itemClass - Class for image. * @return {string} */ getLogoImage: function( atts, data, itemClass ) { var content = '', logoUrl = '', logoData = { 'url': '', 'srcset': '', 'style': '', 'retina_url': false, 'width': '', 'height': '', 'class': itemClass }, retinaUrl = ( data.retina && data.retina.url ) || ''; logoUrl = data.normal.url; logoData.srcset = logoUrl + ' 1x'; // Get retina logo, if default one is not set. if ( '' === logoUrl ) { logoUrl = retinaUrl; logoData.srcset = logoUrl + ' 1x'; logoData.url = logoUrl; logoData.width = data.retina.width; logoData.height = data.retina.height; if ( '' !== logoData.width ) { logoData.style = 'max-height:' + logoData.height + 'px;height:auto;'; } } else { logoData.url = logoUrl; logoData.width = ( data.normal && data.normal.width ) || ''; logoData.height = ( data.normal && data.normal.height ) || ''; } if ( data.normal && '' !== data.normal && '' !== logoData.width && '' !== logoData.height ) { logoData.retina_url = retinaUrl; logoData.srcset += ', ' + retinaUrl + ' 2x'; if ( '' !== logoData.width ) { logoData.style = 'max-height:' + logoData.height + 'px;height:auto;'; } } atts.attr[ 'class' ] += ' has-' + itemClass; content = '<img ' + _.fusionGetAttributes( logoData ) + ' />'; return content; }, /** * Generate caption markup. * * @since 3.5 * @param {string} atts - The atts object. * @return {string} */ generateCaption: function( atts ) { var self = this, content = '<div ' + _.fusionGetAttributes( this.buildCaptionAttr( atts.values ) ) + '><div class="awb-imageframe-caption">', title = '', caption = '', title_tag = '', image_id, media; if ( 'off' === atts.values.caption_style ) { return ''; } // Get image title & caption from attachment attribute. if ( 'undefined' !== typeof atts.values.image_id && '' !== atts.values.image_id ) { if ( -1 !== atts.values.image_id.indexOf( '|' ) ) { image_id = atts.values.image_id.split( '|' )[ 0 ]; } else { image_id = atts.values.image_id; } media = wp.media.attachment( image_id ); if ( _.isUndefined( media.get( 'title' ) ) ) { media.fetch().then( function() { self.reRender(); self._refreshJs(); } ); } else { title = media.get( 'title' ); caption = media.get( 'caption' ); } } // Otherwise get title & caption from custom option. if ( '' !== atts.values.caption_title ) { title = atts.values.caption_title; } if ( '' !== atts.values.caption_text ) { caption = atts.values.caption_text; } if ( '' !== title ) { title_tag = 'div' === atts.values.caption_title_tag ? 'div' : 'h' + atts.values.caption_title_tag; content += '<' + title_tag + ' class="awb-imageframe-caption-title">' + title + '</' + title_tag + '>'; } if ( '' !== caption ) { content += '<p class="awb-imageframe-caption-text">' + caption + '</p>'; } content += '</div></div>'; return content; }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.element_content ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ values.element_content ] ) { FusionPageBuilderApp.mediaMap.images[ values.element_content ] = true; } // Check if we have an image ID for this param. if ( 'undefined' !== typeof values.image_id && '' !== values.image_id ) { if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ values.element_content ] ) { FusionPageBuilderApp.mediaMap.images[ values.element_content ] = {}; } FusionPageBuilderApp.mediaMap.images[ values.element_content ].image_id = values.image_id; } } } }, /** * Builds caption attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildCaptionAttr: function( values ) { // Caption Attributes. var attr = { 'class': 'awb-imageframe-caption-container', 'style': '' }; if ( '' !== values.max_width && -1 !== jQuery.inArray( values.caption_style, [ 'above', 'below' ] ) && '' === values.aspect_ratio ) { attr.style += 'max-width:' + _.fusionGetValueWithUnit( values.max_width ) + ';'; } return attr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Lightbox View. FusionPageBuilder.layerslider = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { window.FusionApp.injectScripts( this.model.get( 'cid' ) ); }, filterTemplateAtts: function( atts ) { if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output ) { atts.markup.output = window.FusionApp.removeScripts( atts.markup.output, this.model.get( 'cid' ) ); } return atts; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Slider revolution View. FusionPageBuilder.rev_slider = FusionPageBuilder.ElementView.extend( { filterRenderContent: function( output ) { return this.filterDuplicates( this.disableInlineScripts( output ) ); }, filterOutput: function( output ) { return this.filterDuplicates( output ); }, filterDuplicates: function( output ) { if ( jQuery( '#fb-preview' ).contents().find( 'rs-module-wrap[data-alias="' + this.model.get( 'params' ).alias + '"]' ).length ) { return '<div class="fusion-builder-placeholder">' + window.fusionBuilderText.duplicate_slider_revolution + '</div>'; } return output; }, disableInlineScripts: function( output ) { if ( -1 !== output.indexOf( 'rev_slider_error' ) || ( -1 !== output.indexOf( 'rs_error_message' ) && -1 !== output.indexOf( '<script' ) && -1 !== output.indexOf( '</script>' ) ) ) { output = output.replace( '<script', '<!--<script' ).replace( '</script>', '</script>-->' ).replace( '<rs-module id="', '<rs-module style="dusplay: block; visibility:visible;" id="' ); } return output; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Person Element View. FusionPageBuilder.fusion_person = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var tooltips = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ).find( '[data-toggle="tooltip"]' ); if ( tooltips.length && 'function' === typeof tooltips.tooltip ) { tooltips.tooltip( 'destroy' ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var tooltips = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ).find( '[data-toggle="tooltip"]' ); setTimeout( function() { if ( tooltips.length && 'function' === typeof tooltips.tooltip ) { tooltips.tooltip( { container: 'body' } ); } }, 150 ); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Validate values and extras. this.validateValuesExtras( atts.values, atts.extras ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.imageAttr = this.buildImageAttr( atts.values ); attributes.hrefAttr = this.buildHrefAttr( atts.values ); attributes.wrapperAttr = this.buildWrapperAttr( atts.values ); attributes.imageContainerAttr = this.buildImageContainerAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); attributes.socialAttr = this.buildSocialAttr( atts.values ); attributes.descAttr = this.buildDescAttr( atts.values ); attributes.socialNetworks = this.getSocialNetworks( atts.values ); attributes.icons = _.fusionBuildSocialLinks( attributes.socialNetworks, this.personIconAttr, atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.pic_style_blur = _.fusionValidateAttrValue( values.pic_style_blur, 'px' ); values.pic_bordersize = _.fusionValidateAttrValue( values.pic_bordersize, 'px' ); values.pic_borderradius = _.fusionValidateAttrValue( values.pic_borderradius, 'px' ); values.social_icon_boxed_radius = _.fusionValidateAttrValue( values.social_icon_boxed_radius, 'px' ); values.social_icon_font_size = _.fusionValidateAttrValue( values.social_icon_font_size, 'px' ); values.social_icon_padding = _.fusionValidateAttrValue( values.social_icon_padding, 'px' ); if ( 'round' === values.pic_borderradius ) { values.pic_borderradius = '50%'; } this.stylecolor = ( '#' === values.pic_style_color.charAt( 0 ) ) ? jQuery.AWB_Color( values.pic_style_color ).alpha( 0.3 ).toRgbaString() : jQuery.AWB_Color( values.pic_style_color ).toRgbaString(); }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} extras - Extra args. * @return {void} */ validateValuesExtras: function( values, extras ) { values.linktarget = values.linktarget ? '_blank' : '_self'; values.social_media_icons = extras.social_media_icons; values.social_media_icons_icon = extras.social_media_icons.icon; values.social_media_icons_url = extras.social_media_icons.url; values.icons_boxed_radius = _.fusionValidateAttrValue( values.icons_boxed_radius, 'px' ); values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); values.boxed_padding = _.fusionValidateAttrValue( extras.boxed_padding, 'px' ); if ( '' == values.color_type ) { values.box_colors = values.social_links_box_color; values.icon_colors = values.social_links_icon_color; } }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} extras - Extra args. * @return {void} */ validateValuesExtras: function( values, extras ) { values.linktarget = values.linktarget ? '_blank' : '_self'; values.social_media_icons = extras.social_media_icons; values.social_media_icons_icon = extras.social_media_icons.icon; values.social_media_icons_url = extras.social_media_icons.url; values.icons_boxed_radius = _.fusionValidateAttrValue( values.icons_boxed_radius, 'px' ); values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); values.boxed_padding = _.fusionValidateAttrValue( extras.boxed_padding, 'px' ); if ( '' == values.color_type ) { values.box_colors = values.social_links_box_color; values.icon_colors = values.social_links_icon_color; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Person Shortcode Attributes. var cid = this.model.get( 'cid' ), personShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-person fusion-person-' + cid + ' person fusion-person-' + values.content_alignment + ' fusion-person-icon-' + values.icon_position } ); if ( '' !== values[ 'class' ] ) { personShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { personShortcode.id = values.id; } //Animation personShortcode = _.fusionAnimations( values, personShortcode ); return personShortcode; }, /** * Builds image attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildImageAttr: function( values ) { // PersonShortcodeImg Attributes. var personShortcodeImg = { class: 'person-img img-responsive', style: '' }; personShortcodeImg.src = values.picture; personShortcodeImg.alt = values.name; return personShortcodeImg; }, /** * Builds href attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildHrefAttr: function( values ) { // PersonShortcodeHref attributes. var personShortcodeHref = { href: values.pic_link }; if ( 'yes' === values.lightbox ) { personShortcodeHref[ 'class' ] = 'lightbox-shortcode'; personShortcodeHref.href = values.picture; } else { personShortcodeHref.target = values.linktarget; } return personShortcodeHref; }, /** * Builds style block * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildStyles: function( values ) { var styles = ''; if ( 'bottomshadow' === values.pic_style ) { styles += '.fusion-person-' + this.model.get( 'cid' ) + ' .element-bottomshadow:before, .fusion-person-' + this.model.get( 'cid' ) + ' .element-bottomshadow:after{'; styles += '-webkit-box-shadow: 0 17px 10px ' + this.stylecolor + ';box-shadow: 0 17px 10px ' + this.stylecolor + ';}'; } if ( 'liftup' === values.hover_type && '' !== values.pic_borderradius && values.pic_borderradius ) { styles += '.fusion-person-' + this.model.get( 'cid' ) + ' .imageframe-liftup:before{'; styles += '-webkit-border-radius:' + values.pic_borderradius + ';-moz-border-radius:' + values.pic_borderradius + ';border-radius:' + values.pic_borderradius + ';'; } styles += this.buildMarginStyles( values ); styles += this.getSocialStyle( values ); if ( '' !== styles ) { styles = '<style>' + styles + '</style>'; } return styles; }, /** * Builds styles. * * @since 3.6 * @param {Object} values - The values object. * @return {String} */ getSocialStyle: function( values ) { var css, selectors; this.baseSelector = '.fusion-person-' + this.model.get( 'cid' ); this.dynamic_css = {}; //Icon styles. if ( 'brand' !== values.social_color_type ) { selectors = [ this.baseSelector + ' .boxed-icons .fusion-social-network-icon' ]; if ( '' !== values.social_box_border_top ) { this.addCssProperty( selectors, 'border-top-width', _.fusionGetValueWithUnit( values.social_box_border_top ), true ); } if ( '' !== values.social_box_border_right ) { this.addCssProperty( selectors, 'border-right-width', _.fusionGetValueWithUnit( values.social_box_border_right ), true ); } if ( '' !== values.social_box_border_bottom ) { this.addCssProperty( selectors, 'border-bottom-width', _.fusionGetValueWithUnit( values.social_box_border_bottom ), true ); } if ( '' !== values.social_box_border_left ) { this.addCssProperty( selectors, 'border-left-width', _.fusionGetValueWithUnit( values.social_box_border_left ), true ); } if ( '' !== values.social_box_border_color ) { this.addCssProperty( selectors, 'border-color', values.social_box_border_color, true ); } selectors = [ this.baseSelector + ' .boxed-icons .fusion-social-network-icon:hover' ]; if ( '' !== values.social_box_colors_hover ) { this.addCssProperty( selectors, 'background-color', values.social_box_colors_hover, true ); } if ( '' !== values.social_box_border_color_hover ) { this.addCssProperty( selectors, 'border-color', values.social_box_border_color_hover, true ); } selectors = [ this.baseSelector + ' .fusion-social-network-icon:hover' ]; if ( '' !== values.social_icon_colors_hover ) { this.addCssProperty( selectors, 'color', values.social_icon_colors_hover, true ); } } css = this.parseCSS(); return ( css ) ? css : ''; }, /** * Builds margin styles. * * @since 3.6 * @param {Object} values - The values object. * @return {string} */ buildMarginStyles: function( values ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-person-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); return responsiveStyles; }, /** * Builds wrapper attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildWrapperAttr: function( values ) { // PersonShortcodeImageWrapper Attributes. var personShortcodeImageWrapper = { class: 'person-shortcode-image-wrapper' }; if ( 'liftup' === values.hover_type ) { personShortcodeImageWrapper[ 'class' ] += ' imageframe-liftup'; } return personShortcodeImageWrapper; }, /** * Builds image container attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildImageContainerAttr: function( values ) { // PersonShortcodeImageContainer Attributes. var personShortcodeImageContainer = { class: 'person-image-container', style: '' }, styles = '', blur = values.pic_style_blur, blurRadius = ( parseInt( blur, 10 ) + 4 ) + 'px'; if ( '' !== values.hover_type && 'liftup' !== values.hover_type ) { personShortcodeImageContainer[ 'class' ] += ' hover-type-' + values.hover_type; } if ( 'round' === values.pic_borderradius ) { values.pic_borderradius = '50%'; } if ( '0px' !== values.pic_borderradius && '' !== values.pic_borderradius && 'bottomshadow' === values.pic_style ) { values.pic_style = 'none'; } if ( 'glow' === values.pic_style ) { personShortcodeImageContainer[ 'class' ] += ' glow'; } else if ( 'dropshadow' === values.pic_style ) { personShortcodeImageContainer[ 'class' ] += ' dropshadow'; } else if ( 'bottomshadow' === values.pic_style ) { personShortcodeImageContainer[ 'class' ] += ' element-bottomshadow'; } if ( 'glow' === values.pic_style ) { styles += '-webkit-box-shadow: 0 0 ' + blur + ' ' + this.stylecolor + ';box-shadow: 0 0 ' + blur + ' ' + this.stylecolor + ';'; } else if ( 'dropshadow' === values.pic_style ) { styles += '-webkit-box-shadow: ' + blur + ' ' + blur + ' ' + blurRadius + ' ' + this.stylecolor + ';box-shadow: ' + blur + ' ' + blur + ' ' + blurRadius + ' ' + this.stylecolor + ';'; } if ( '' !== values.pic_borderradius ) { styles += '-webkit-border-radius:' + values.pic_borderradius + ';-moz-border-radius:' + values.pic_borderradius + ';border-radius:' + values.pic_borderradius + '; overflow:hidden;'; } if ( '' !== values.pic_bordersize ) { styles += 'border:' + values.pic_bordersize + ' solid ' + values.pic_bordercolor + ';'; } personShortcodeImageContainer.style += styles; return personShortcodeImageContainer; }, /** * Builds social attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildSocialAttr: function( values ) { // PersonShortcodeSocialNetworks Attributes. var personShortcodeSocialNetworks = { class: 'fusion-social-networks' }; if ( 'yes' === values.social_icon_boxed ) { personShortcodeSocialNetworks[ 'class' ] += ' boxed-icons'; } return personShortcodeSocialNetworks; }, /** * Builds description attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildDescAttr: function( values ) { // PersonDesc Attributes. var personDesc = { class: 'person-desc' }; if ( values.background_color && 'transparent' !== values.background_color && 0 !== jQuery.AWB_Color( values.background_color ).alpha() ) { personDesc.style = 'background-color:' + values.background_color + ';padding:40px;margin-top:0;'; } return personDesc; }, /** * Builds person icon attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ personIconAttr: function( args, values ) { var attr = { class: 'fusion-social-network-icon fusion-tooltip fusion-' + args.social_network }, link = '', target = '', tooltip = ''; if ( ! _.isEmpty( args.icon_mark ) ) { attr[ 'class' ] += ' ' + args.icon_mark; } else { attr[ 'class' ] += ' awb-icon-' + args.social_network; } attr[ 'aria-label' ] = 'fusion-' + args.social_network; link = args.social_link, target = values.target; if ( 'mail' === args.social_network && 'undefined' !== typeof args.social_link ) { link = 'mailto:' + args.social_link.replace( 'mailto:', '' ); target = '_self'; } if ( 'phone' === args.social_network && 'undefined' !== typeof args.social_link ) { link = 'tel:' + args.social_link.replace( 'tel:', '' ); target = '_self'; } attr.href = link; attr.target = target; if ( '_blank' === target ) { attr.rel = 'noopener noreferrer'; } attr.style = ''; if ( '' !== args.icon_color ) { attr.style = 'color:' + args.icon_color + ';'; } if ( 'yes' === values.social_icon_boxed && '' !== args.box_color ) { attr.style += 'background-color:' + args.box_color + ';border-color:' + args.box_color + ';'; } if ( ( 'yes' === values.social_icon_boxed && '' !== values.social_icon_boxed_radius ) || '0' === values.social_icon_boxed_radius ) { if ( 'round' === values.social_icon_boxed_radius ) { values.social_icon_boxed_radius = '50%'; } attr.style += 'border-radius:' + values.social_icon_boxed_radius + ';'; } if ( '' !== values.social_icon_font_size ) { attr.style += 'font-size:' + values.social_icon_font_size + ';'; } if ( 'yes' === values.social_icon_boxed && '' !== values.social_icon_padding ) { attr.style += 'padding:' + values.social_icon_padding + ';'; } attr[ 'data-placement' ] = values.social_icon_tooltip; tooltip = args.social_network; tooltip = ( 'youtube' === tooltip.toLowerCase() ) ? 'YouTube' : tooltip; attr[ 'data-title' ] = _.fusionUcFirst( tooltip ); attr.title = _.fusionUcFirst( tooltip ); if ( 'none' !== values.social_icon_tooltip ) { attr[ 'data-toggle' ] = 'tooltip'; } return attr; }, /** * Get list of social networks. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ getSocialNetworks: function( values ) { var socialNetworks = _.fusionGetSocialNetworks( values ); socialNetworks = _.fusionSortSocialNetworks( socialNetworks, values ); return socialNetworks; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Lottie Element View. FusionPageBuilder.fusion_lottie = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.isFlex = this.flexDisplay(); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.wrapperAttr = this.buildWrapperAttr( atts.values ); attributes.tag = '' !== atts.values.link ? 'a' : 'div'; attributes.styleBlock = _.fusionGetFilterStyleElem( atts.values, '.fusion-lottie-' + this.model.get( 'cid' ), this.model.get( 'cid' ) ); return attributes; }, buildAttr: function( values ) { var attr = { 'class': 'fusion-lottie-animation', 'style': '' }, alignClasses = { 'center': 'mx-auto', 'left': 'mr-auto', 'right': 'ml-auto' }, alignLarge, alignMedium, alignSmall; if ( '' !== values.json ) { attr[ 'data-path' ] = values.json; attr[ 'data-loop' ] = 'yes' === values.loop ? 1 : 0; attr[ 'data-reverse' ] = 'yes' === values.reverse ? 1 : 0; attr[ 'data-speed' ] = values.speed; attr[ 'data-trigger' ] = values.trigger; if ( 'viewport' === values.trigger ) { attr[ 'data-animationoffset' ] = values.trigger_offset; } } if ( values.max_width ) { attr.style += 'width:100%;max-width:' + values.max_width + ';'; if ( '' !== values.link ) { attr.style += 'display:block;'; } } // Link if set. if ( '' !== values.link ) { attr.href = values.link; attr.target = values.target; if ( '_blank' === values.target ) { attr.rel = 'noopener noreferrer'; } } if ( this.isFlex ) { alignLarge = values.align && 'none' !== values.align ? values.align : false, alignMedium = values.align_medium && 'none' !== values.align_medium ? values.align_medium : false, alignSmall = values.align_small && 'none' !== values.align_small ? values.align_small : false; if ( alignLarge ) { attr[ 'class' ] += ' lg-' + alignClasses[ alignLarge ]; } if ( alignMedium ) { attr[ 'class' ] += ' md-' + alignClasses[ alignMedium ]; } if ( alignSmall ) { attr[ 'class' ] += ' sm-' + alignClasses[ alignSmall ]; } } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildWrapperAttr: function( values ) { var attr = { style: '', 'class': 'fusion-lottie fusion-lottie-' + this.model.get( 'cid' ), 'data-id': this.model.get( 'cid' ) }; // Hide on mobile. attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( '' !== values.id ) { attr.id = values.id; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } attr = _.fusionAnimations( values, attr ); // Margins. if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + _.fusionValidateAttrValue( values.margin_top, 'px' ) + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + _.fusionValidateAttrValue( values.margin_right, 'px' ) + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + _.fusionValidateAttrValue( values.margin_bottom, 'px' ) + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + _.fusionValidateAttrValue( values.margin_left, 'px' ) + ';'; } return attr; } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAllElements, fusionSanitize */ var FusionPageBuilder = FusionPageBuilder || {}; ( function () { jQuery( document ).ready( function () { // Alert Element View. FusionPageBuilder.fusion_menu = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function ( atts ) { var attributes = {}; this.values = atts.values; attributes.attr = this.buildAttr(); attributes.menuMarkup = 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.menu_markup ? atts.query_data.menu_markup : 'No menu markup'; attributes.buttonMarkup = 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.button_markup ? atts.query_data.button_markup : 'No button markup'; attributes.flyoutButtonMarkup = 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.flyout_button_markup ? atts.query_data.flyout_button_markup : 'No flyout button markup'; attributes.inlineStyles = this.getStyles(); return attributes; }, addCssProperty: function ( selectors, property, value, important ) { if ( 'object' === typeof selectors ) { selectors = Object.values( selectors ); } if ( 'object' === typeof selectors ) { selectors = selectors.join( ',' ); } if ( 'object' !== typeof this.dynamic_css[ selectors ] ) { this.dynamic_css[ selectors ] = {}; } if ( 'undefined' !== typeof important && important ) { value += ' !important'; } if ( 'undefined' === typeof this.dynamic_css[ selectors ][ property ] || ( 'undefined' !== typeof important && important ) || ! this.dynamic_css[ selectors ][ property ].includes( 'important' ) ) { this.dynamic_css[ selectors ][ property ] = value; } }, isDefault: function( param ) { return this.values[ param ] === fusionAllElements.fusion_menu.defaults[ param ]; }, getStyles: function () { var selectors, gap_value, gap_unit, half_gap, value, unit, half, menuStyles = {}, self = this;; this.baseSelector = '.fusion-menu-element-wrapper[data-count="' + this.model.get('cid') + '"]'; this.dynamic_css = {}; if (!this.isDefault('font_size')) { selectors = [ this.baseSelector, this.baseSelector + ' .fusion-menu-element-list .menu-item > a' ]; this.addCssProperty(selectors, 'font-size', this.values['font_size']); } if (!this.isDefault('margin_top')) { this.addCssProperty( this.baseSelector, 'margin-top', this.values['margin_top']); } if (!this.isDefault('margin_bottom')) { this.addCssProperty( this.baseSelector, 'margin-bottom', this.values['margin_bottom']); } if (!this.isDefault('direction')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list', 'flex-direction', this.values['direction']); } if (!this.isDefault('justify_content')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list', 'justify-content', this.values['justify_content']); } if (!this.isDefault('align_items')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list', 'align-items', this.values['align_items']); } selectors = [ this.baseSelector + ' .fusion-menu-element-list', this.baseSelector + ' > .avada-menu-mobile-menu-trigger', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu .fusion-megamenu-title .awb-justify-title' ]; menuStyles = _.fusionGetFontStyle( 'typography', this.values, 'object' ); jQuery.each( menuStyles, function( rule, value ) { self.addCssProperty( selectors, rule, value ); } ); this.addCssProperty([ this.baseSelector + ' [class*="awb-icon-"]', this.baseSelector + ' [class^="awb-icon-"]' ], 'font-family', this.values['fusion_font_family_typography'], true); if (!this.isDefault('min_height')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list', 'min-height', this.values['min_height']); } if (!this.isDefault('sticky_min_height')) { this.addCssProperty('.fusion-body .fusion-sticky-container.fusion-sticky-transition ' + this.baseSelector + ' .fusion-menu-element-list', 'min-height', this.values['sticky_min_height']); } if (!this.isDefault('text_transform') ) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li,' + this.baseSelector + ' .fusion-menu-element-list .fusion-megamenu-title', 'text-transform', this.values['text_transform']); } if (!this.isDefault('letter_spacing')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li > a', 'letter-spacing', _.fusionGetValueWithUnit( this.values['letter_spacing'] )); } if (!this.isDefault('mobile_trigger_background_color')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'background-color', this.values['mobile_trigger_background_color']); } if (!this.isDefault('mobile_trigger_color')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'color', this.values['mobile_trigger_color']); } if (!this.isDefault('trigger_padding_top')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'padding-top', this.values['trigger_padding_top']); } if (!this.isDefault('trigger_padding_right')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'padding-right', this.values['trigger_padding_right']); } if (!this.isDefault('trigger_padding_bottom')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'padding-bottom', this.values['trigger_padding_bottom']); } if (!this.isDefault('trigger_padding_left')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'padding-left', this.values['trigger_padding_left']); } if (!this.isDefault('transition_time')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list', this.baseSelector + ' .fusion-menu-element-list .menu-item a', this.baseSelector + ' .fusion-menu-element-list > li', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-overlay-search', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', this.baseSelector + '.expand-method-click.direction-row > ul > li > .fusion-open-nav-submenu', this.baseSelector + ':not(.submenu-mode-flyout) .fusion-menu-element-list li:not(.fusion-mega-menu) .sub-menu', this.baseSelector + ':not(.submenu-mode-flyout) .fusion-menu-element-list .fusion-megamenu-wrapper', this.baseSelector + ' .avada-menu-mobile-menu-trigger .collapsed-nav-icon-open', this.baseSelector + ' .avada-menu-mobile-menu-trigger .collapsed-nav-icon-close', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled' ]; if ('never' !== this.values['breakpoint']) { selectors.push( this.baseSelector + '.collapse-enabled.mobile-mode-collapse-to-button > ul'); selectors.push( this.baseSelector + '.collapse-enabled .menu-item a > .fusion-button'); } this.addCssProperty(selectors, 'transition-duration', Number( this.values['transition_time']) + 'ms'); } if (!this.isDefault('gap')) { if ('column' !== this.values['direction']) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li', 'margin-left', 'calc(' + this.values['gap'] + ' / 2)'); this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li', 'margin-right', 'calc(' + this.values['gap'] + ' / 2)'); } else { this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(:last-child)', 'margin-bottom', this.values['gap'], true); } } if (!this.isDefault('bg')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default', this.baseSelector + ' .custom-menu-search-overlay ~ .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-overlay .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-dropdown' ]; this.addCssProperty(selectors, 'background-color', this.values['bg']); } if (!this.isDefault('border_radius_top_left') || !this.isDefault('border_radius_top_right') || !this.isDefault('border_radius_bottom_right') || !this.isDefault('border_radius_bottom_left')) { value = this.values['border_radius_top_left'] + ' ' + this.values['border_radius_top_right'] + ' ' + this.values['border_radius_bottom_right'] + ' ' + this.values['border_radius_bottom_left']; selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active' ]; this.addCssProperty(selectors, 'border-radius', value); } if (!this.isDefault('items_padding_top') || !this.isDefault('border_top')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) .fusion-widget-cart > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .fusion-open-nav-submenu' ]; this.addCssProperty(selectors, 'padding-top', 'calc(' + this.values['items_padding_top'] + ' + ' + this.values['border_top'] + ')'); } if (!this.isDefault('items_padding_right') || !this.isDefault('border_right')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) .fusion-widget-cart > a' ]; this.addCssProperty(selectors, 'padding-right', 'calc(' + this.values['items_padding_right'] + ' + ' + this.values['border_right'] + ')'); } if (!this.isDefault('items_padding_bottom') || !this.isDefault('border_bottom')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > a' ]; if (true) { selectors.push( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) .fusion-widget-cart > a'); } this.addCssProperty(selectors, 'padding-bottom', 'calc(' + this.values['items_padding_bottom'] + ' + ' + this.values['border_bottom'] + ')'); } if (!this.isDefault('items_padding_left') || !this.isDefault('border_left')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > a' ]; if (true) { selectors.push( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) .fusion-widget-cart > a'); } this.addCssProperty(selectors, 'padding-left', 'calc(' + this.values['items_padding_left'] + ' + ' + this.values['border_left'] + ')'); } if (!this.isDefault('items_padding_top') || !this.isDefault('active_border_top')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):hover > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).hover > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):active > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus-within > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-item > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-ancestor > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-parent > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).expanded > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):active > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus-within > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-item > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-ancestor > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-parent > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button).expanded > .fusion-open-nav-submenu' ]; if ('column' === this.values['direction']) { selectors.push( this.baseSelector + '.direction-column .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .fusion-open-nav-submenu'); } this.addCssProperty(selectors, 'padding-top', 'calc(' + this.values['items_padding_top'] + ' + ' + this.values['active_border_top'] + ')'); } selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children):hover > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children).hover > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children):focus > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children):active > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children):focus-within > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children).current-menu-item > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children).current-menu-ancestor > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children).current-menu-parent > a', this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.menu-item-has-children).expanded > a' ]; // Combined padding right and active border right. if (!this.isDefault('items_padding_right') || !this.isDefault('active_border_right')) { this.addCssProperty(selectors, 'padding-right', 'calc(' + this.values['items_padding_right'] + ' + ' + this.values['active_border_right'] + ')'); } if (!this.isDefault('items_padding_bottom') || !this.isDefault('active_border_bottom')) { this.addCssProperty(selectors, 'padding-bottom', 'calc(' + this.values['items_padding_bottom'] + ' + ' + this.values['active_border_bottom'] + ')'); if ('column' === this.values['direction']) { this.addCssProperty( this.baseSelector + '.direction-column .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .fusion-open-nav-submenu', 'padding-bottom', 'calc(' + this.values['items_padding_bottom'] + ' + ' + this.values['active_border_bottom'] + ')'); } else if ('click' === this.values['expand_method']) { this.addCssProperty( this.baseSelector + '.expand-method-click.direction-row > ul > li > .fusion-open-nav-submenu', 'padding-bottom', 'calc(' + this.values['items_padding_bottom'] + ' + ' + this.values['active_border_bottom'] + ')'); } } if (!this.isDefault('items_padding_left') || !this.isDefault('active_border_left')) { this.addCssProperty(selectors, 'padding-left', 'calc(' + this.values['items_padding_left'] + ' + ' + this.values['active_border_left'] + ')'); } if (!this.isDefault('items_padding_top')) { selectors = [ this.baseSelector + ' .fusion-menu-form-inline', this.baseSelector + ' .custom-menu-search-overlay ~ .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-overlay .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .fusion-menu-form-inline' ]; this.addCssProperty(selectors, 'padding-top', this.values['items_padding_top']); } if ('row' === this.values['direction'] && 'click' === this.values['expand_method'] && (!this.isDefault('items_padding_top') || !this.isDefault('submenu_items_padding_top'))) { this.addCssProperty( this.baseSelector + '.expand-method-click.direction-row > ul > li > .fusion-open-nav-submenu', 'padding-bottom', 'calc(' + this.values['items_padding_bottom'] + ' + ' + this.values['active_border_bottom'] + ')'); if ('yes' === this.values['dropdown_carets']) { this.addCssProperty( this.baseSelector + '.dropdown-carets-yes:not(.collapse-enabled).direction-row.expand-method-click li.menu-item-has-children:not(.fusion-menu-item-button) ul .fusion-open-nav-submenu', 'padding-top', this.values['submenu_items_padding_top']); this.addCssProperty( this.baseSelector + '.dropdown-carets-yes:not(.collapse-enabled).direction-row.expand-method-click li.menu-item-has-children:not(.fusion-menu-item-button) ul .fusion-open-nav-submenu', 'padding-bottom', this.values['submenu_items_padding_bottom']); } } if (!this.isDefault('items_padding_bottom')) { selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-form-inline', this.baseSelector + ':not(.collapse-enabled) .custom-menu-search-overlay ~ .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-overlay .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .fusion-menu-form-inline' ]; this.addCssProperty(selectors, 'padding-bottom', this.values['items_padding_bottom']); } if (!this.isDefault('items_padding_right')) { if (jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method']) { this.addCssProperty(['.ltr' + this.baseSelector + '.expand-method-click li.menu-item-has-children:not(.fusion-menu-item-button) > .fusion-open-nav-submenu' ], 'padding-right', this.values['items_padding_right']); } selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-form-inline', this.baseSelector + ':not(.collapse-enabled) .custom-menu-search-overlay ~ .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-overlay .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .fusion-menu-form-inline' ]; if (jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method'] && 'column' === this.values['direction']) { selectors.push('.ltr' + this.baseSelector + '.direction-column.expand-method-click.expand-left .menu-item-has-children > a'); } this.addCssProperty(selectors, 'padding-right', this.values['items_padding_right']); this.addCssProperty( this.baseSelector + ' .custom-menu-search-dropdown .fusion-main-menu-icon', 'padding-right', this.values['items_padding_right'], true); } if (!this.isDefault('items_padding_left')) { if (jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method']) { selectors = ['.rtl' + this.baseSelector + '.expand-method-click li.menu-item-has-children:not(.fusion-menu-item-button) > .fusion-open-nav-submenu' ]; this.addCssProperty(selectors, 'padding-left', this.values['items_padding_left']); } selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-form-inline', this.baseSelector + ':not(.collapse-enabled) .custom-menu-search-overlay ~ .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .custom-menu-search-overlay .fusion-overlay-search', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .fusion-menu-form-inline' ]; if (jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method'] && 'column' === this.values['direction']) { selectors.push('.ltr' + this.baseSelector + '.direction-column.expand-method-click.expand-left .menu-item-has-children > a'); } this.addCssProperty(selectors, 'padding-left', this.values['items_padding_left']); // Important ones. this.addCssProperty( this.baseSelector + ' .custom-menu-search-dropdown .fusion-main-menu-icon', 'padding-left', this.values['items_padding_left'], true); } if (!this.isDefault('color')) { // Ones with important. selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button) > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .fusion-open-nav-submenu' ]; this.addCssProperty(selectors, 'color', this.values['color'], true); // Ones without important. if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + '.expand-method-click li ul .fusion-open-nav-submenu'); } this.addCssProperty(selectors, 'color', this.values['color']); // Background, but why? selectors = [ this.baseSelector + ' .fusion-overlay-search .fusion-close-search:before', this.baseSelector + ' .fusion-overlay-search .fusion-close-search:after' ]; this.addCssProperty(selectors, 'background', this.values['color']); } if (!this.isDefault('active_bg')) { selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active' ]; this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'background', this.values['active_bg']); // Border top. if ('row' === this.values['direction']) { // Click method. selectors = [ this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children.expanded:after', this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:hover:after', this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children.hover:after', this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:focus:after', this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:active:after', this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:focus-within:after' ]; if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li.expanded:after'); if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-top-color', this.values['active_bg']); } if ('column' === this.values['direction']) { if ('click' === this.values['expand_method']) { selectors = [ this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after' ]; if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right > ul > li.expanded:after'); } } if ('hover' === this.values['expand_method']) { selectors = [ ]; if (false !== this.values['arrows'].includes('main')) { selectors = [ this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after', this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after', this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after', this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after', this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after' ]; } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-left-color', this.values['active_bg']); } if ('column' === this.values['direction']) { if ('click' === this.values['expand_method']) { selectors = [ this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after' ]; if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left > ul > li.expanded:after'); } } if ('hover' === this.values['expand_method']) { selectors = [ ]; if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-right-color', this.values['active_bg']); } } if (!this.isDefault('active_color')) { // Important ones. selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.custom-menu-search-overlay):hover > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).hover > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.custom-menu-search-overlay):focus > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.custom-menu-search-overlay):active > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):not(.custom-menu-search-overlay):focus-within > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-item > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-ancestor > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-parent > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).expanded > a', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):hover > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).hover > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):active > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button):focus-within > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-item > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-ancestor > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).current-menu-parent > .fusion-open-nav-submenu', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li:not(.fusion-menu-item-button).expanded > .fusion-open-nav-submenu' ]; this.addCssProperty(selectors, 'color', this.values['active_color'], true); } if (!this.isDefault('border_top')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default' ]; this.addCssProperty(selectors, 'border-top-width', this.values['border_top']); } if (!this.isDefault('border_right')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default' ]; this.addCssProperty(selectors, 'border-right-width', this.values['border_right']); } if (!this.isDefault('border_bottom')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default' ]; this.addCssProperty(selectors, 'border-bottom-width', this.values['border_bottom']); } if (!this.isDefault('border_left')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default' ]; this.addCssProperty(selectors, 'border-left-width', this.values['border_left']); } if (!this.isDefault('border_color')) { // Important ones. selectors = [ this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-default' ]; this.addCssProperty(selectors, 'border-color', this.values['border_color']); } if (!this.isDefault('active_border_top')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'border-top-width', this.values['active_border_top']); } if (!this.isDefault('active_border_right')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'border-right-width', this.values['active_border_right']); } if (!this.isDefault('active_border_bottom')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'border-bottom-width', this.values['active_border_bottom']); } if (!this.isDefault('active_border_left')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'border-left-width', this.values['active_border_left']); } if (!this.isDefault('active_border_color')) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list > li:not(.fusion-menu-item-button) > .background-active', 'border-color', this.values['active_border_color']); if ('row' === this.values['direction']) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-row.has-active-border-bottom-yes > ul > li.menu-item-has-children.expanded:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row.has-active-border-bottom-yes > ul > li.expanded:after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row.has-active-border-bottom-color-yes > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row.has-active-border-bottom-color-yes > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row.has-active-border-bottom-color-yes > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row.has-active-border-bottom-color-yes > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row.has-active-border-bottom-color-yes > ul > li.menu-item-has-children:focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row.has-active-border-bottom-yes > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-top-color', this.values['active_border_color']); } if ('column' === this.values['direction']) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-right.has-active-border-right-yes > ul > li.expanded:after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right.has-active-border-right-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-right.has-active-border-right-yes > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-left-color', this.values['active_border_color']); } if ('column' === this.values['direction']) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-column.expand-left.has-active-border-left-yes > ul > li.expanded:after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left.has-active-border-left-yes > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li:focus-within:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-item:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-ancestor:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li.current-menu-parent:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left.has-active-border-left-yes > ul > li.expanded:after'); } } this.addCssProperty(selectors, 'border-right-color', this.values['active_border_color']); } } if (!this.isDefault('submenu_space')) { if ('flyout' !== this.values['submenu_mode']) { selectors = [ this.baseSelector + ':not(.collapse-enabled):not(.submenu-mode-flyout) .fusion-menu-element-list .fusion-megamenu-wrapper', this.baseSelector + '.direction-row:not(.collapse-enabled):not(.submenu-mode-flyout) .fusion-menu-element-list > li > ul.sub-menu:not(.fusion-megamenu)' ]; this.addCssProperty(selectors, 'margin-top', this.values['submenu_space'], true); } if ('row' === this.values['direction']) { selectors = [ ]; if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click.direction-row > ul > li:after'); } if ('hover' === this.values['expand_method']) { selectors.push( this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:hover:before'); selectors.push( this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li.hover:before'); selectors.push( this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:focus:before'); selectors.push( this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:active:before'); selectors.push( this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:focus-within:before'); if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-row > ul > li:after'); } } this.addCssProperty(selectors, 'bottom', 'calc(0px - ' + this.values['submenu_space'] + ')'); if ('click' === this.values['expand_method']) { selectors = [ ]; if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children::after'); } if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children::after'); } this.addCssProperty(selectors, 'bottom', 'calc(0px - ' + this.values['submenu_space'] + ')'); } } if ('column' === this.values['direction']) { if ('hover' === this.values['expand_method']) { selectors = [ this.baseSelector + '.expand-method-hover.direction-column.expand-right li:hover:before', this.baseSelector + '.expand-method-hover.direction-column.expand-right li.hover:before', this.baseSelector + '.expand-method-hover.direction-column.expand-right li:focus:before', this.baseSelector + '.expand-method-hover.direction-column.expand-right li:active:before', this.baseSelector + '.expand-method-hover.direction-column.expand-right li:focus-within:before' ]; this.addCssProperty(selectors, 'width', this.values['submenu_space']); } this.addCssProperty( this.baseSelector + '.direction-column.expand-right .fusion-menu-element-list ul', 'margin-left', this.values['submenu_space'], true); this.addCssProperty( this.baseSelector + '.direction-column.expand-left .fusion-menu-element-list ul', 'margin-right', this.values['submenu_space'], true); selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.active-item-arrows-on.direction-column.expand-left > ul > li:after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover.direction-column.expand-left > ul > li:after'); } } this.addCssProperty(selectors, 'left', 'calc(0px - ' + this.values['submenu_space'] + ')'); } if ('row' === this.values['direction']) { if ('hover' === this.values['expand_method']) { selectors = [ this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:hover:before', this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li.hover:before', this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:focus:before', this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:active:before', this.baseSelector + '.expand-method-hover.direction-row .fusion-menu-element-list > li:focus-within:before' ]; this.addCssProperty(selectors, 'height', this.values['submenu_space']); } if ('slide_up' === this.values['expand_transition']) { this.addCssProperty([ this.baseSelector + '.submenu-transition-slide_up:not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.direction-row .fusion-menu-element-list li::after' ], 'transform', 'translateY(' + this.values['submenu_space'] + ')'); } } } if ( (!this.isDefault('submenu_space') || !this.isDefault('arrows_size_width')) && 'column' === this.values['direction']) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column > ul > li:not(.fusion-menu-item-button):after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column > ul > li:not(.fusion-menu-item-button):after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li:after'); } } this.addCssProperty(selectors, 'width', 'calc(' + this.values['submenu_space'] + ' - ' + this.values['arrows_size_width'] + ' * 2)'); } if ( (!this.isDefault('submenu_space') || !this.isDefault('arrows_size_height')) && 'row' === this.values['direction']) { if (false !== this.values['arrows'].includes('active')) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-' + this.values['expand_method'] + '.direction-row > ul > li:after' ], 'height', this.values['submenu_space']); } if ('slide_up' === this.values['expand_transition']) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled).submenu-transition-slide_up.direction-row.dropdown-arrows-parent > ul > li:after' ], 'top', 'calc(100% - ' + this.values['submenu_space'] + ')', true); } selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children.expanded:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.expanded:after'); } } if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-' + this.values['expand_method'] + '.dropdown-arrows-parent.direction-row > ul > li.menu-item-has-children:focus-within:after'); } if ('hover' === this.values['expand_method'] && false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:focus-within:after'); } this.addCssProperty(selectors, 'height', 'calc(' + this.values['submenu_space'] + ' - ' + this.values['arrows_size_height'] + ' * 2)'); if (false !== this.values['arrows'].includes('active')) { this.addCssProperty([ this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li:hover:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li.hover:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li:focus:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li:active:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li:focus-within:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li.current-menu-item:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li.current-menu-ancestor:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li.current-menu-parent:after', this.baseSelector + '.active-item-arrows-on.direction-row:not(.collapse-enabled) > ul > li.expanded:after' ], 'height', 'calc(' + this.values['submenu_space'] + ' - ' + this.values['arrows_size_height'] + ' * 2)', true); } } if (!this.isDefault('arrows_size_width')) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent > ul > li.menu-item-has-children.expanded:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child > ul > li.menu-item-has-children.expanded:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-click > ul > li:not(.fusion-menu-item-button):after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:focus-within:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover > ul > li:not(.fusion-menu-item-button):after'); } } this.addCssProperty(selectors, 'border-left-width', this.values['arrows_size_width']); this.addCssProperty(selectors, 'border-right-width', this.values['arrows_size_width']); } if (!this.isDefault('arrows_size_height')) { selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent > ul > li.menu-item-has-children.expanded:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent > ul > li.menu-item-has-children.expanded:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child > ul > li.menu-item-has-children.expanded:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child > ul > li.menu-item-has-children.expanded:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.active-item-arrows-on > ul > li:not(.fusion-menu-item-button):after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.active-item-arrows-on > ul > li:not(.fusion-menu-item-button):after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent > ul > li.menu-item-has-children:focus-within:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child > ul > li.menu-item-has-children:focus-within:after'); } if (false !== this.values['arrows'].includes('active')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover > ul > li:not(.fusion-menu-item-button):after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).active-item-arrows-on.expand-method-hover > ul > li:not(.fusion-menu-item-button):after'); } } this.addCssProperty(selectors, 'border-top-width', this.values['arrows_size_height']); this.addCssProperty(selectors, 'border-bottom-width', this.values['arrows_size_height']); selectors = [ ]; if ('click' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-parent.direction-column > ul > li:not(.fusion-menu-item-button):after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column > ul > li:not(.fusion-menu-item-button):after'); } } if ('hover' === this.values['expand_method']) { if (false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li:after'); } if (false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li:after'); } } this.addCssProperty(selectors, 'top', 'calc(50% - ' + this.values['arrows_size_height'] + ')'); } if ('flyout' !== this.values['submenu_mode']) { if ( ! this.isDefault('submenu_border_radius_top_left')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list .sub-menu', this.baseSelector + ' .fusion-menu-element-list .sub-menu > li:first-child', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .fusion-megamenu-wrapper' ]; this.addCssProperty(selectors, 'border-top-left-radius', this.values['submenu_border_radius_top_left']); } if ( ! this.isDefault('submenu_border_radius_top_right')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list .sub-menu', this.baseSelector + ' .fusion-menu-element-list .sub-menu > li:first-child', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .fusion-megamenu-wrapper' ]; this.addCssProperty(selectors, 'border-top-right-radius', this.values['submenu_border_radius_top_right']); } if ( ! this.isDefault('submenu_border_radius_bottom_left')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list .sub-menu', this.baseSelector + ' .fusion-menu-element-list .sub-menu > li:last-child', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .fusion-megamenu-wrapper' ]; this.addCssProperty(selectors, 'border-bottom-left-radius', this.values['submenu_border_radius_bottom_left']); } if ( ! this.isDefault('submenu_border_radius_bottom_right')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list .sub-menu', this.baseSelector + ' .fusion-menu-element-list .sub-menu > li:last-child', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .fusion-megamenu-wrapper' ]; this.addCssProperty(selectors, 'border-bottom-right-radius', this.values['submenu_border_radius_bottom_right']); } } selectors = [ this.baseSelector + ' .fusion-menu-element-list .sub-menu > li', this.baseSelector + ' .fusion-menu-element-list .sub-menu li a' ]; menuStyles = _.fusionGetFontStyle( 'submenu_typography', this.values, 'object' ); jQuery.each( menuStyles, function( rule, value ) { self.addCssProperty( selectors, rule, value ); } ); if (!this.isDefault('submenu_bg')) { selectors = [ this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder', this.baseSelector + ' .sub-menu .fusion-menu-cart', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents' ]; if ('flyout' === this.values['submenu_mode']) { selectors.push( this.baseSelector + '.submenu-mode-flyout .fusion-custom-menu .sub-menu'); selectors.push( this.baseSelector + '.submenu-mode-flyout .fusion-custom-menu .fusion-megamenu-wrapper'); selectors.push( this.baseSelector + '.submenu-mode-flyout .fusion-custom-menu .fusion-flyout-menu-backgrounds'); } else { selectors.push( this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button)'); selectors.push( this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled' ); } this.addCssProperty(selectors, 'background-color', this.values['submenu_bg']); if ('row' === this.values['direction']) { if (false !== this.values['arrows'].includes('submenu')) { selectors = [ ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.expanded:after'); } if ('hover' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children:focus-within:after'); } this.addCssProperty(selectors, 'border-bottom-color', this.values['submenu_bg']); } } if ('column' === this.values['direction']) { if (false !== this.values['arrows'].includes('submenu')) { selectors = [ ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after'); } if ('hover' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after'); } this.addCssProperty(selectors, 'border-right-color', this.values['submenu_bg']); } if (false !== this.values['arrows'].includes('submenu')) { selectors = [ ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu):after'); } if ('hover' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu):focus-within:after'); } this.addCssProperty(selectors, 'border-left-color', this.values['submenu_bg']); } } } if (!this.isDefault('submenu_color')) { selectors = [ this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu .fusion-megamenu-title a', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu .fusion-megamenu-icon', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu .fusion-megamenu-widgets-container .widget_text .textwidget', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled' ]; // In hover mode color is inherited from parent anchor. if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ' ul ul .fusion-open-nav-submenu'); } this.addCssProperty(selectors, 'color', this.values['submenu_color']); // Important ones. this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button) > a', 'color', this.values['submenu_color'], true); if ('click' === this.values['expand_method']) { this.addCssProperty( this.baseSelector + '.expand-method-click li .sub-menu .fusion-open-nav-submenu', 'color', this.values['submenu_color'], true); } } if (true) { this.addCssProperty([ this.baseSelector + ' .fusion-menu-cart-checkout a:before', this.baseSelector + ' .fusion-menu-cart-items a', this.baseSelector + ' ul .fusion-menu-login-box-register', this.baseSelector + ' ul .fusion-menu-cart-checkout a:before', this.baseSelector + ' .fusion-menu-cart-items a' ], 'color', this.values['submenu_color']); } if (!this.isDefault('submenu_active_bg')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu):not(.fusion-menu-searchform-dropdown) > li:not(.fusion-menu-item-button):hover', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu):not(.fusion-menu-searchform-dropdown) > li:not(.fusion-menu-item-button):focus', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu):not(.fusion-menu-searchform-dropdown) > li:not(.fusion-menu-item-button):focus-within', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu):not(.fusion-menu-searchform-dropdown) > li:not(.fusion-menu-item-button).expanded', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-item:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-parent:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-ancestor:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current_page_item:not(.fusion-menu-item-button)', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:hover', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a.hover', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:active', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus-within', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a.hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:active > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus-within > .fusion-open-nav-submenu', this.baseSelector + '.submenu-mode-dropdown li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children:focus-within .fusion-open-nav-submenu', this.baseSelector + '.submenu-mode-dropdown li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children .fusion-background-highlight:hover .fusion-open-nav-submenu', this.baseSelector + '.submenu-mode-dropdown li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children:focus-within > .fusion-background-highlight', this.baseSelector + '.submenu-mode-dropdown li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children .fusion-background-highlight:hover' ]; this.addCssProperty(selectors, 'background-color', this.values['submenu_active_bg']); if ('column' === this.values['direction']) { selectors = [ ]; if ('click' === this.values['expand_method'] && false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column.expand-right > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu).alt-arrow-child-color:after'); } if ('hover' === this.values['expand_method'] && false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-right > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:focus-within:after'); } this.addCssProperty(selectors, 'border-right-color', this.values['submenu_active_bg']); selectors = [ ]; if ('click' === this.values['expand_method'] && false !== this.values['arrows'].includes('submenu')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-column.expand-left > ul > li.menu-item-has-children.expanded:not(.fusion-megamenu-menu).alt-arrow-child-color:after'); } if ('hover' === this.values['expand_method'] && false !== this.values['arrows'].includes('main')) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-parent.direction-column.expand-left > ul > li.menu-item-has-children:not(.fusion-megamenu-menu).alt-arrow-child-color:focus-within:after'); } this.addCssProperty(selectors, 'border-left-color', this.values['submenu_active_bg']); } if ('row' === this.values['direction']) { if (false !== this.values['arrows'].includes('submenu')) { selectors = [ ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-click.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.expanded.alt-arrow-child-color:after'); } if ('hover' === this.values['expand_method']) { selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.alt-arrow-child-color:hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.alt-arrow-child-color.hover:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.alt-arrow-child-color:focus:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.alt-arrow-child-color:active:after'); selectors.push( this.baseSelector + ':not(.collapse-enabled).expand-method-hover.dropdown-arrows-child.direction-row > ul > li.menu-item-has-children.alt-arrow-child-color:focus-within:after'); } this.addCssProperty(selectors, 'border-bottom-color', this.values['submenu_active_bg']); } } } if (!this.isDefault('submenu_active_color')) { // Important ones. selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:hover > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.hover > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus-within > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button):hover > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.hover:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button):focus > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button):focus-within > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.expanded > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button).current-menu-item > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-ancestor > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-parent > a', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:hover > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.hover > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus-within > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.expanded > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button).current-menu-item > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-ancestor > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-parent > a .fusion-button', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:focus-within > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.expanded > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-item > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-ancestor > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li.current-menu-parent > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:hover', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a.hover', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:active', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus-within', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a.hover > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:active > .fusion-open-nav-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus-within > .fusion-open-nav-submenu', this.baseSelector + '.submenu-mode-dropdown li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children:focus-within .fusion-open-nav-submenu', this.baseSelector + ' li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children .fusion-background-highlight:hover .fusion-open-nav-submenu', this.baseSelector + ' li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children:focus-within > .fusion-background-highlight', this.baseSelector + ' li ul.fusion-megamenu li.menu-item-has-children .sub-menu li.menu-item-has-children .fusion-background-highlight:hover' ]; if (true) { selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout:hover .fusion-menu-cart-link a'); selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout:hover .fusion-menu-cart-checkout-link a'); selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout:hover .fusion-menu-cart-link a:before'); selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout:hover .fusion-menu-cart-checkout-link a:before'); } this.addCssProperty(selectors, 'color', this.values['submenu_active_color'], true); } if ('flyout' === this.values['submenu_mode']) { selectors = [ this.baseSelector + '.submenu-mode-flyout .fusion-close-flyout:before', this.baseSelector + '.submenu-mode-flyout .fusion-close-flyout:after' ]; this.addCssProperty(selectors, 'background-color', this.values['flyout_close_color']); selectors = [ this.baseSelector + '.submenu-mode-flyout .fusion-close-flyout:hover:before', this.baseSelector + '.submenu-mode-flyout .fusion-close-flyout:hover:after' ]; this.addCssProperty(selectors, 'background-color', this.values['flyout_active_close_color'], true); } if (!this.isDefault('submenu_max_width') && 'dropdown' === this.values['submenu_mode']) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list ul:not(.fusion-megamenu) > li' ], 'width', this.values['submenu_max_width'], true); // Don't set min width if sub menu width is explictly set. this.addCssProperty([ this.baseSelector + '.direction-row:not(.collapse-enabled) .sub-menu' ], 'min-width', '0'); } if (!this.isDefault('submenu_items_padding_top')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu .sub-menu a', this.baseSelector + ' .sub-menu .fusion-menu-cart a', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents form' ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + '.expand-method-click li ul .fusion-open-nav-submenu'); } this.addCssProperty(selectors, 'padding-top', this.values['submenu_items_padding_top']); if ('column' === this.values['direction']) { this.addCssProperty( this.baseSelector + '.direction-column .fusion-menu-element-list ul', 'top', 'calc(0.5em - ' + this.values['submenu_items_padding_top'] + ')'); } } if (!this.isDefault('submenu_items_padding_right')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu .sub-menu a', this.baseSelector + ' .sub-menu .fusion-menu-cart a', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' ul ul .fusion-open-nav-submenu:before', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents form', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents .fusion-menu-login-box-register' ]; if ('never' !== this.values['breakpoint']) { selectors.push( this.baseSelector + '.collapse-enabled .fusion-megamenu-holder'); } if ('column' === this.values['direction'] && jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method']) { selectors.push('.ltr' + this.baseSelector + '.direction-column.expand-method-click.expand-left .menu-item-has-children li a'); } if (true) { selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout'); } if ('flyout' === this.values['submenu_mode']) { selectors.push('.ltr' + this.baseSelector + '.submenu-mode-flyout:not(.collapse-enabled) .sub-menu li:not(.fusion-menu-item-button) > a'); } this.addCssProperty(selectors, 'padding-right', this.values['submenu_items_padding_right']); if (true) { this.addCssProperty('.rtl' + this.baseSelector + ' .fusion-menu-cart-link', 'padding-right', '0'); this.addCssProperty('.ltr' + this.baseSelector + ' .fusion-menu-cart-checkout-link', 'padding-right', '0'); } } if (!this.isDefault('submenu_items_padding_bottom')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu .sub-menu a', this.baseSelector + ' .sub-menu .fusion-menu-cart a', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents .fusion-menu-login-box-register' ]; if ('click' === this.values['expand_method']) { selectors.push( this.baseSelector + '.expand-method-click li ul .fusion-open-nav-submenu'); } this.addCssProperty(selectors, 'padding-bottom', this.values['submenu_items_padding_bottom']); } if (!this.isDefault('submenu_items_padding_left')) { selectors = [ this.baseSelector + ' .fusion-menu-element-list ul:not(.fusion-megamenu) > li:not(.fusion-menu-item-button) > a', this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu .sub-menu a', this.baseSelector + ' .sub-menu .fusion-menu-cart a', this.baseSelector + ' .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content', this.baseSelector + ' ul ul .fusion-open-nav-submenu:before', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents form', this.baseSelector + ' .avada-menu-login-box .avada-custom-menu-item-contents .fusion-menu-login-box-register' ]; if ('never' !== this.values['breakpoint']) { selectors.push( this.baseSelector + '.collapse-enabled .fusion-megamenu-holder'); } if ('column' === this.values['direction'] && jQuery( 'body' ).hasClass( 'rtl' ) && 'click' === this.values['expand_method']) { selectors.push('.rtl' + this.baseSelector + '.direction-column.expand-method-click.expand-right .menu-item-has-children li a'); } if (true) { selectors.push( this.baseSelector + ' .fusion-menu-cart-checkout'); } if ('flyout' === this.values['submenu_mode']) { selectors.push('.rtl' + this.baseSelector + '.submenu-mode-flyout:not(.collapse-enabled) .sub-menu li:not(.fusion-menu-item-button) > a'); } this.addCssProperty(selectors, 'padding-left', this.values['submenu_items_padding_left']); if (true) { this.addCssProperty('.rtl' + this.baseSelector + ' .fusion-menu-cart-checkout-link', 'padding-left', '0'); this.addCssProperty('.ltr' + this.baseSelector + ' .fusion-menu-cart-link', 'padding-left', '0'); } } if ( (!this.isDefault('submenu_items_padding_left') || !this.isDefault('submenu_items_padding_right')) && 'click' === this.values['expand_method']) { this.addCssProperty( this.baseSelector + '.expand-method-click li ul .fusion-open-nav-submenu', 'width', 'calc(1em + ' + this.values['submenu_items_padding_left'] + ' / 2 + ' + this.values['submenu_items_padding_right'] + ' / 2)'); } if (!this.isDefault('submenu_sep_color')) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list ul:not(.fusion-megamenu) > li' ], 'border-bottom-color', this.values['submenu_sep_color']); this.addCssProperty([ this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu', this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-submenu .fusion-megamenu-border' ], 'border-color', this.values['submenu_sep_color']); this.addCssProperty( this.baseSelector + ' .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', 'border-color', this.values['submenu_sep_color']); } if (!this.isDefault('submenu_font_size')) { selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list ul:not(.fusion-megamenu) a', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper li .fusion-megamenu-title-disabled', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a.hover', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:hover', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:active', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-submenu > a:focus-within', this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu' ]; this.addCssProperty(selectors, 'font-size', this.values['submenu_font_size']); if ('flyout' === this.values['submenu_mode']) { selectors = [ this.baseSelector + '.submenu-mode-flyout .fusion-close-flyout' ]; this.addCssProperty(selectors, 'width', this.values['submenu_font_size']); this.addCssProperty(selectors, 'height', this.values['submenu_font_size']); } } if (!this.isDefault('mobile_nav_button_align_hor')) { selectors = [ ]; if ('on' === this.values['mobile_nav_trigger_fullwidth']) { selectors.push( this.baseSelector + '.mobile-trigger-fullwidth-on > .avada-menu-mobile-menu-trigger > .inner'); } if ('never' !== this.values['breakpoint']) { selectors.push( this.baseSelector + '.collapse-enabled'); } this.addCssProperty(selectors, 'justify-content', this.values['mobile_nav_button_align_hor']); } if (!this.isDefault('mobile_nav_trigger_bottom_margin') && 'never' !== this.values['breakpoint']) { this.addCssProperty( this.baseSelector + '.collapse-enabled .fusion-menu-element-list', 'margin-top', _.fusionGetValueWithUnit( this.values['mobile_nav_trigger_bottom_margin'])); } if (!this.isDefault('submenu_text_transform') ) { this.addCssProperty( this.baseSelector + ' .fusion-menu-element-list ul', 'text-transform', this.values['submenu_text_transform']); } if (!this.isDefault('icons_size')) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled) li.menu-item > .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) li.menu-item > a > .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) li.menu-item > a.fusion-menu-icon-search' ], 'font-size', _.fusionGetValueWithUnit( this.values['icons_size'])); } if (!this.isDefault('icons_color')) { this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item > .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item > a > .fusion-megamenu-icon' ], 'color', this.values['icons_color']); this.addCssProperty([ this.baseSelector + ' .custom-menu-search-dropdown .fusion-main-menu-icon', this.baseSelector + ' .custom-menu-search-overlay .fusion-menu-icon-search.trigger-overlay', this.baseSelector + ' .custom-menu-search-overlay ~ .fusion-overlay-search' ], 'color', this.values['icons_color'], true); } this.addCssProperty([ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item:hover > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item.hover > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item:focus > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item:active > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item:focus-within > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item.current-menu-item > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item.current-menu-ancestor > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item.current-menu-parent > a .fusion-megamenu-icon', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list > li.menu-item.expanded > a .fusion-megamenu-icon' ], 'color', this.values['icons_hover_color']); this.addCssProperty([ this.baseSelector + ' .custom-menu-search-dropdown:hover .fusion-main-menu-icon', this.baseSelector + ' .custom-menu-search-overlay:hover .fusion-menu-icon-search.trigger-overlay', this.baseSelector + ' .custom-menu-search-overlay:hover ~ .fusion-overlay-search' ], 'color', this.values['icons_hover_color'], true); // Thumbnail size. if (!this.isDefault('thumbnail_size_width')) { this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-title .fusion-megamenu-image > img', 'width', this.values['thumbnail_size_width']); this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-title .fusion-megamenu-thumbnail > img', 'width', this.values['thumbnail_size_width']); } if (!this.isDefault('thumbnail_size_height')) { this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-title .fusion-megamenu-image > img', 'height', this.values['thumbnail_size_height']); this.addCssProperty( this.baseSelector + ':not(.collapse-enabled) .fusion-megamenu-title .fusion-megamenu-thumbnail > img', 'height', this.values['thumbnail_size_width']); } if (!this.isDefault('justify_title')) { this.addCssProperty( this.baseSelector + ' .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu .fusion-megamenu-submenu .fusion-megamenu-title .awb-justify-title', 'justify-content', this.values['justify_title']); } if (!this.isDefault('mobile_trigger_font_size')) { this.addCssProperty( this.baseSelector + ' > .avada-menu-mobile-menu-trigger', 'font-size', this.values['mobile_trigger_font_size']); } if ('never' !== this.values['breakpoint']) { // Mobile background. if ( ! this.isDefault('mobile_bg')) { selectors = [ this.baseSelector + '.collapse-enabled ul li > a', this.baseSelector + '.collapse-enabled ul li:hover .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.hover .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:focus .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:active .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:focus-within .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-item .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-parent .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.expanded .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.custom-menu-search-inline', this.baseSelector + '.collapse-enabled ul .fusion-menu-form-inline', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button', this.baseSelector + '.collapse-enabled ul', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li' ]; this.addCssProperty(selectors, 'background', this.values['mobile_bg'], true); } if ( ! this.isDefault('mobile_color')) { selectors = [ this.baseSelector + '.collapse-enabled ul li > a', this.baseSelector + '.collapse-enabled ul li > a .fusion-button', this.baseSelector + '.collapse-enabled ul li > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:hover .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.hover .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:focus .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:active .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li:focus-within .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-item .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.current-menu-parent .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled ul li.expanded .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded) a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li .awb-justify-title' ]; this.addCssProperty(selectors, 'color', this.values['mobile_color'], true); } if ( ! this.isDefault('mobile_active_bg')) { selectors = [ this.baseSelector + '.collapse-enabled ul li:hover > a', this.baseSelector + '.collapse-enabled ul li.hover > a', this.baseSelector + '.collapse-enabled ul li:focus > a', this.baseSelector + '.collapse-enabled ul li:active > a', this.baseSelector + '.collapse-enabled ul li:focus-within > a', this.baseSelector + '.collapse-enabled ul li.current-menu-item > a', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor > a', this.baseSelector + '.collapse-enabled ul li.current-menu-parent > a', this.baseSelector + '.collapse-enabled ul li.expanded > a', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button:hover', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button.hover', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button:focus', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button:active', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button:focus-within', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button.current-menu-item', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button.current-menu-ancestor', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button.current-menu-parent', this.baseSelector + '.collapse-enabled ul li.fusion-menu-item-button.expanded', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):hover a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded).hover a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):focus a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):active a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):focus-within a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li.current-menu-item', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:hover', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:active', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus-within' ]; this.addCssProperty(selectors, 'background', this.values['mobile_active_bg'], true); } if ( ! this.isDefault('mobile_active_color')) { selectors = [ this.baseSelector + '.collapse-enabled ul li:hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li.hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:focus > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:active > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:focus-within > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:hover > a', this.baseSelector + '.collapse-enabled ul li.hover > a', this.baseSelector + '.collapse-enabled ul li:focus > a', this.baseSelector + '.collapse-enabled ul li:active > a', this.baseSelector + '.collapse-enabled ul li:focus-within > a', this.baseSelector + '.collapse-enabled ul li.current-menu-item > a', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor > a', this.baseSelector + '.collapse-enabled ul li.current-menu-parent > a', this.baseSelector + '.collapse-enabled ul li.expanded > a', this.baseSelector + '.collapse-enabled ul li:hover > a .fusion-button', this.baseSelector + '.collapse-enabled ul li.hover > a .fusion-button', this.baseSelector + '.collapse-enabled ul li:focus > a .fusion-button', this.baseSelector + '.collapse-enabled ul li:active > a .fusion-button', this.baseSelector + '.collapse-enabled ul li:focus-within > a .fusion-button', this.baseSelector + '.collapse-enabled ul li.current-menu-item > a .fusion-button', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor > a .fusion-button', this.baseSelector + '.collapse-enabled ul li.current-menu-parent > a .fusion-button', this.baseSelector + '.collapse-enabled ul li.expanded > a .fusion-button', this.baseSelector + '.collapse-enabled ul li:hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li.hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:focus > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:active > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li:focus-within > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li.current-menu-item > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li.current-menu-parent > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li.current-menu-ancestor > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-ancestor > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-parent > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.expanded > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):hover a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded).hover a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):focus a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):active a', this.baseSelector + '.collapse-enabled ul li .sub-menu li:not(.current-menu-item):not(.current-menu-ancestor):not(.current-menu-parent):not(.expanded):focus-within a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:active > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus-within > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:hover > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.hover > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:active > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus-within > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-item > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-ancestor > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-parent > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.expanded > a', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:hover > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.hover > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:active > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus-within > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-item > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-ancestor > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-parent > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.expanded > a:hover', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.hover > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:active > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li:focus-within > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-item > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-ancestor > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.current-menu-parent > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled ul.sub-menu.sub-menu li.expanded > .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li.current-menu-item a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:hover a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:active a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus-within a', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:hover .fusion-megamenu-title', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:hover .fusion-megamenu-title .awb-justify-title', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:active .fusion-megamenu-title', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:active .fusion-megamenu-title .awb-justify-title', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus .fusion-megamenu-title', this.baseSelector + '.collapse-enabled .fusion-megamenu-menu .fusion-megamenu-wrapper .fusion-megamenu-holder ul li:focus .fusion-megamenu-title .awb-justify-title' ]; this.addCssProperty(selectors, 'color', this.values['mobile_active_color'], true); } if ( ! this.isDefault('mobile_sep_color')) { selectors = [ this.baseSelector + '.collapse-enabled li:not(:last-child)', this.baseSelector + '.collapse-enabled li.menu-item.expanded .fusion-megamenu-wrapper ul.fusion-megamenu li.menu-item-has-children .fusion-megamenu-title', this.baseSelector + '.collapse-enabled li.menu-item:not(.expanded)' ]; this.addCssProperty(selectors, 'border-bottom-color', this.values['mobile_sep_color'], true); this.addCssProperty( this.baseSelector + '.collapse-enabled li.menu-item.expanded .fusion-megamenu-wrapper', 'border-top-color', this.values['mobile_sep_color']); this.addCssProperty( this.baseSelector + '.collapse-enabled li.menu-item.menu-item-has-children ul.sub-menu li.menu-item-has-children.expanded>ul.sub-menu', 'border-top-color', this.values['mobile_sep_color']); } if ( ! this.isDefault('mobile_nav_items_height')) { selectors = [ this.baseSelector + '.collapse-enabled ul li > a', this.baseSelector + '.collapse-enabled .fusion-open-nav-submenu-on-click:before', this.baseSelector + '.collapse-enabled li.menu-item' ]; this.addCssProperty(selectors, 'min-height', _.fusionGetValueWithUnit( this.values['mobile_nav_items_height'])); } if ( ! this.isDefault('mobile_sticky_max_height') ) { selectors = [ '.fusion-body .fusion-sticky-container.fusion-sticky-transition ' + this.baseSelector + '.collapse-enabled.mobile-size-column-absolute:not(.mobile-mode-always-expanded).expanded>ul', '.fusion-body .fusion-sticky-container.fusion-sticky-transition ' + this.baseSelector + '.collapse-enabled.mobile-size-full-absolute:not(.mobile-mode-always-expanded).expanded>ul' ]; this.addCssProperty(selectors, 'max-height', _.fusionGetValueWithUnit( this.values['mobile_sticky_max_height'] ) ); } if ( ! this.isDefault('mobile_font_size')) { this.addCssProperty([ this.baseSelector + '.collapse-enabled .fusion-menu-element-list li a', this.baseSelector + '.collapse-enabled .fusion-menu-element-list li a .fusion-button', this.baseSelector + '.collapse-enabled .fusion-menu-element-list li .fusion-open-nav-submenu:before', this.baseSelector + '.collapse-enabled .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu-submenu .fusion-megamenu-title a' ], 'font-size', this.values['mobile_font_size']); } selectors = [ this.baseSelector + '.collapse-enabled', this.baseSelector + '.collapse-enabled ul li > a', this.baseSelector + '.collapse-enabled ul li > a .fusion-button', this.baseSelector + '.collapse-enabled .fusion-megamenu-wrapper .fusion-megamenu-holder .fusion-megamenu-submenu .fusion-megamenu-title a' ]; menuStyles = _.fusionGetFontStyle( 'mobile_typography', this.values, 'object' ); jQuery.each( menuStyles, function( rule, value ) { self.addCssProperty( selectors, rule, value ); } ); } if (!this.isDefault('box_shadow')) { selectors = [ this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list ul', this.baseSelector + ':not(.collapse-enabled) .fusion-menu-element-list .fusion-megamenu-wrapper', this.baseSelector + ':not(.collapse-enabled) .custom-menu-search-dropdown .fusion-menu-searchform-dropdown .fusion-search-form-content' ]; this.addCssProperty(selectors, 'box-shadow', _.fusionGetBoxShadowStyle( this.values)); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; }, parseCSS: function () { var css = ''; if ( 'object' !== typeof this.dynamic_css ) { return ''; } _.each( this.dynamic_css, function ( properties, selector ) { if ( 'object' === typeof properties ) { css += selector + '{'; _.each( properties, function ( value, property ) { css += property + ':' + value + ';'; } ); css += '}'; } } ); return css; }, /** * Builds attributes. * * @since 3.0 * @return {Object} */ buildAttr: function () { var hasActiveBorderBottom = !this.values.active_border_bottom || '' === this.values.active_border_bottom || 0 === parseInt( this.values.active_border_bottom ) ? 'no' : 'yes', hasActiveBorderLeft = !this.values.active_border_left || '' === this.values.active_border_left || 0 === parseInt( this.values.active_border_left ) ? 'no' : 'yes', hasActiveBorderRight = !this.values.active_border_right || '' === this.values.active_border_right || 0 === parseInt( this.values.active_border_right ) ? 'no' : 'yes', expandTransition = 'row' !== this.values.direction ? 'opacity' : this.values.expand_transition, attr = { class: [ 'fusion-menu-element-wrapper', 'direction-' + this.values.direction, 'mode-' + this.values.collapsed_mode, 'expand-method-' + this.values.expand_method, 'submenu-mode-' + this.values.submenu_mode, 'mobile-mode-' + this.values.mobile_nav_mode, 'mobile-size-' + this.values.mobile_nav_size, 'icons-position-' + this.values.icons_position, 'dropdown-carets-' + this.values.dropdown_carets, 'has-active-border-bottom-' + hasActiveBorderBottom, 'has-active-border-left-' + hasActiveBorderLeft, 'has-active-border-right-' + hasActiveBorderRight, 'mobile-trigger-fullwidth-' + this.values.mobile_nav_trigger_fullwidth, 'mobile-indent-' + this.values.mobile_indent_submenu, 'mobile-justify-' + this.values.mobile_justify_content, 'main-justify-' + this.values.main_justify_content, ].join( ' ' ), style: '' }; if ( 0 <= this.values.arrows.indexOf( 'active' ) ) { attr[ 'class' ] += ' active-item-arrows-on'; } if ( 0 <= this.values.arrows.indexOf( 'main' ) ) { attr[ 'class' ] += ' dropdown-arrows-parent'; } if ( 0 <= this.values.arrows.indexOf( 'submenu' ) ) { attr[ 'class' ] += ' dropdown-arrows-child'; } if ( 'flyout' === this.values.submenu_mode ) { attr[ 'class' ] += ' submenu-flyout-direction-' + this.values.submenu_flyout_direction; } if ( 'flyout' !== this.values.submenu_mode ) { attr[ 'class' ] += ' expand-' + this.values.expand_direction; } if ( 'dropdown' === this.values.submenu_mode ) { attr[ 'class' ] += ' submenu-transition-' + expandTransition; } attr[ 'data-count' ] = this.model.get( 'cid' ); this.addUnitsWhereRequired(); if ( 'small' === this.values.breakpoint ) { attr[ 'data-breakpoint' ] = FusionApp.settings.visibility_small; } else if ( 'medium' === this.values.breakpoint ) { attr[ 'data-breakpoint' ] = FusionApp.settings.visibility_medium; } else if ( 'large' === this.values.breakpoint ) { attr[ 'data-breakpoint' ] = 10000; } else if ( 'custom' === this.values.breakpoint ) { attr[ 'data-breakpoint' ] = parseInt( this.values.custom_breakpoint ); } attr[ 'class' ] += _.fusionGetStickyClass( this.values.sticky_display ); attr[ 'data-transition-type' ] = this.values.transition_type; if ( '' !== this.values[ 'class' ] ) { attr[ 'class' ] += ' ' + this.values[ 'class' ]; } if ( '' !== this.values.id ) { attr.id = this.values.id; } attr = _.fusionAnimations( this.values, attr ); attr = _.fusionVisibilityAtts( this.values.hide_on_mobile, attr ); return attr; }, /** * Modify values. * * @since 3.0 * @param {Object} atts - The attributes object. * @return {Object} */ addUnitsWhereRequired: function () { var values = this.values; _.each( [ 'margin_top', 'margin_bottom', 'items_padding_top', 'items_padding_bottom', 'items_padding_left', 'items_padding_right', 'gap', 'font_size', 'min_height', 'border_top', 'border_bottom', 'border_left', 'border_right', 'active_border_top', 'active_border_bottom', 'active_border_left', 'active_border_right', 'border_radius_top_left', 'border_radius_top_right', 'border_radius_bottom_right', 'border_radius_bottom_left', 'submenu_border_radius_top_left', 'submenu_border_radius_top_right', 'submenu_border_radius_bottom_right', 'submenu_border_radius_bottom_left', 'submenu_space', 'arrows_size_width', 'arrows_size_height', 'submenu_items_padding_top', 'submenu_items_padding_bottom', 'submenu_items_padding_left', 'submenu_items_padding_right', 'submenu_font_size', 'box_shadow_horizontal', 'box_shadow_spread', 'box_shadow_vertical', 'thumbnail_size_width', 'thumbnail_size_height', 'trigger_padding_top', 'trigger_padding_right', 'trigger_padding_bottom', 'trigger_padding_left', 'mobile_trigger_font_size', ], function ( param ) { if ( 'undefined' !== typeof values[ param ] && '' !== values[ param ] && !isNaN( values[ param ] ) ) { values[ param ] = values[ param ].trim() + 'px'; } } ); this.values = values; }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.menu ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.menus[ values.menu ] ) { FusionPageBuilderApp.mediaMap.menus[ values.menu ] = true; } } } }, } ); } ); }( jQuery ) ); ;/* jshint -W024 */ /* global fusionAllElements, FusionApp, FusionPageBuilderApp, awbPalette */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Video View. FusionPageBuilder.fusion_video = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.1 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.1 * @return {void} */ afterPatch: function() { var params = this.model.get( 'params' ); var video = this.$el.find( 'video' ); this.$el.removeClass( 'fusion-element-alignment-right fusion-element-alignment-left' ); if ( 'undefined' !== typeof params.alignment && ( 'right' === params.alignment || 'left' === params.alignment ) ) { this.$el.addClass( 'fusion-element-alignment-' + params.alignment ); } this.refreshVideo( video, params ); }, /** * Refreshes video functions. * * @since 2.1 * @param {Object} video - The video object. * @param {Object} params - The params. * @return {void} */ refreshVideo: function( video, params ) { if ( video.length && 'undefined' !== typeof video.get( 0 ) ) { // Source change. video.get( 0 ).load(); // Auto play. ( 'yes' === params.autoplay ) ? video.get( 0 ).play() : video.get( 0 ).pause(); // Mute. video.get( 0 ).muted = ( 'yes' === params.mute ) ? true : false; } }, /** * Modify template attributes. * * @since 2.1 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); attributes.attr = this.buildAttr( atts.values ); attributes.wrapperAttr = this.buildWrapperAttr( atts.values ); attributes.videoAttr = this.buildVideoAttr( atts.values ); attributes.video_webm = atts.values.video_webm; attributes.video = atts.values.video; return attributes; }, /** * Validates values. * * @since 2.1 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { var borderRadiusTopLeft = 'undefined' !== typeof values.border_radius_top_left && '' !== values.border_radius_top_left ? _.fusionGetValueWithUnit( values.border_radius_top_left ) : '0px', borderRadiusTopRight = 'undefined' !== typeof values.border_radius_top_right && '' !== values.border_radius_top_right ? _.fusionGetValueWithUnit( values.border_radius_top_right ) : '0px', borderRadiusBottomRight = 'undefined' !== typeof values.border_radius_bottom_right && '' !== values.border_radius_bottom_right ? _.fusionGetValueWithUnit( values.border_radius_bottom_right ) : '0px', borderRadiusBottomLeft = 'undefined' !== typeof values.border_radius_bottom_left && '' !== values.border_radius_bottom_left ? _.fusionGetValueWithUnit( values.border_radius_bottom_left ) : '0px'; values.border_radius = borderRadiusTopLeft + ' ' + borderRadiusTopRight + ' ' + borderRadiusBottomRight + ' ' + borderRadiusBottomLeft; values.border_radius = ( '0px 0px 0px 0px' === values.border_radius ) ? '' : values.border_radius; // Box shadow. if ( 'yes' === values.box_shadow ) { values.box_shadow = _.fusionGetBoxShadowStyle( values ) + ';'; } }, /** * Builds attributes. * * @since 2.1 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var attr = { class: 'fusion-video fusion-selfhosted-video fusion-video-' + this.model.get( 'cid' ), style: '' }; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( '' !== values.alignment ) { attr[ 'class' ] += ' fusion-align' + values.alignment; } if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + _.fusionGetValueWithUnit( values.margin_top ) + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + _.fusionGetValueWithUnit( values.margin_bottom ) + ';'; } if ( '' !== values.width ) { attr.style += 'max-width:' + values.width + ';'; } // Add custom class. if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } // Add custom id. if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds wrapper attributes. * * @since 2.1 * @param {Object} values - The values. * @return {Object} */ buildWrapperAttr: function( values ) { var alpha = 1, attr = { class: 'video-wrapper', style: 'width:100%;' }; if ( values.border_radius && '' !== values.border_radius ) { attr.style += 'border-radius:' + values.border_radius + ';'; } if ( 'no' !== values.box_shadow ) { attr.style += 'box-shadow:' + values.box_shadow + ';'; } if ( '' !== values.overlay_color ) { values.overlay_color = awbPalette.getRealColor( values.overlay_color ); alpha = jQuery.AWB_Color( values.overlay_color ).alpha(); if ( 1 === alpha ) { values.overlay_color = jQuery.AWB_Color( values.overlay_color ).alpha( 0.5 ).toRgbaString(); } attr[ 'class' ] += ' fusion-video-overlay'; attr.style += 'background-color:' + values.overlay_color + ';'; } return attr; }, /** * Builds video attributes. * * @since 2.1 * @param {Object} values - The values. * @return {Object} */ buildVideoAttr: function( values ) { var attr = { playsinline: 'true', width: '100%', style: 'object-fit: cover;' }; if ( 'yes' === values.autoplay ) { attr.autoplay = 'true'; } if ( 'yes' === values.mute ) { attr.muted = 'true'; } if ( 'yes' === values.loop ) { attr.loop = 'true'; } if ( '' !== values.preview_image ) { attr.poster = values.preview_image; } if ( '' !== values.preload ) { attr.preload = values.preload; } if ( 'yes' === values.controls ) { attr.controls = true; } return attr; }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.video ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.videos[ values.video ] ) { FusionPageBuilderApp.mediaMap.videos[ values.video ] = true; } } } } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.fusion_views_counter = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.5 * @param {Object} atts - The attributes. * @returns {Object} */ filterTemplateAtts: function( atts ) { // Variables we will pass to the template. var templateVariables = {}; templateVariables.cid = this.model.get( 'cid' ); // Attributes for our wrapping element. templateVariables.wrapperAttributes = this.buildWrapperAtts( atts.values ); templateVariables.contentAttributes = this.buildContentAtts( atts.values ); templateVariables.mainContent = this.getViewsText( atts.values, atts.extras ); templateVariables.styleTag = this.getElementStyle( atts.values ); return templateVariables; }, /** * Get the text that is displaying the views. * * @since 3.5 * @param {Object} atts - The values. * @param {Object} extras - The extras variables. * @return {string} */ getViewsText: function( atts, extras ) { var self = this, viewsToDisplay = atts.views_displayed.split( ',' ), text = '', separator = '<span class="awb-views-counter-separator">' + atts.separator + '</span>', isLastItem, totalViews, todayViews, viewsText, label; _.each( viewsToDisplay, function( viewType, index, list ) { isLastItem = ( list.length - 1 === index ? true : false ); if ( isLastItem ) { separator = ''; } if ( 'total_views' === viewType ) { totalViews = extras.total_views; label = _.isEmpty( atts.total_views_label ) ? self.getTranslationText( viewType, atts, extras ) : atts.total_views_label; if ( 'before' === atts.labels ) { viewsText = label + totalViews; } else if ( 'after' === atts.labels ) { viewsText = totalViews + label; } else { viewsText = totalViews; } text += '<span class="awb-views-counter-total-views">' + viewsText + '</span>' + separator; } if ( 'today_views' === viewType ) { todayViews = extras.today_views; label = _.isEmpty( atts.today_views_label ) ? self.getTranslationText( viewType, atts, extras ) : atts.today_views_label; if ( 'before' === atts.labels ) { viewsText = label + todayViews; } else if ( 'after' === atts.labels ) { viewsText = todayViews + label; } else { viewsText = todayViews; } text += '<span class="awb-views-counter-today-views">' + viewsText + '</span>' + separator; } } ); return text; }, /** * Get the correct punctuation for the texts. * * @since 3.5 * @param {Object} values - The values. * @param {string} extras - The extras. * @returns {string} */ getTranslationText: function( viewType, values, extras ) { var translation_text = ''; if ( 'total_views' === viewType ) { if ( 'before' === values.labels ) { translation_text = extras.default_total_views_before_text; } else if ( 'after' === values.labels ) { translation_text = extras.default_total_views_after_text; } } else if ( 'today_views' === viewType ) { if ( 'before' === values.labels ) { translation_text = extras.default_today_views_before_text; } else if ( 'after' === values.labels ) { translation_text = extras.default_today_views_after_text; } } return translation_text; }, /** * Builds attributes. * * @since 3.5 * @param {Object} values - The values. * @returns {Object} */ buildWrapperAtts: function( values ) { var wrapperAttributes = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'awb-views-counter awb-views-counter-' + this.model.get( 'cid' ), style: '' } ); if ( values[ 'class' ] ) { wrapperAttributes[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { wrapperAttributes.id = values.id; } wrapperAttributes = _.fusionAnimations( values, wrapperAttributes ); return wrapperAttributes; }, /** * Builds content attributes. * * @since 3.5 * @param {Object} values - The values. * @returns {Object} */ buildContentAtts: function( values ) { var contentAttributes = { 'class': 'awb-views-counter-content' }; if ( 'stacked' === values.layout ) { contentAttributes[ 'class' ] += ' awb-views-counter-content-stacked'; } return contentAttributes; }, /** * Create the element styles. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getElementStyle: function( values ) { var style = '', baseClassName = '.awb-views-counter-' + this.model.get( 'cid' ), wrapperSelector = baseClassName + '.awb-views-counter', contentSelector = baseClassName + ' .awb-views-counter-content'; this.dynamic_css = {}; this.values = values; if ( values.color ) { this.addCssProperty( contentSelector, 'color', values.color ); } if ( values.background ) { this.addCssProperty( wrapperSelector, 'background-color', values.background ); } if ( values.alignment_floated && 'floated' === values.layout ) { this.addCssProperty( contentSelector, 'justify-content', values.alignment_floated ); } if ( values.alignment_stacked && 'stacked' === values.layout ) { this.addCssProperty( contentSelector, 'align-items', values.alignment_stacked ); } if ( values.font_size ) { this.addCssProperty( contentSelector, 'font-size', values.font_size ); } if ( values.padding_top ) { this.addCssProperty( wrapperSelector, 'padding-top', values.padding_top ); } if ( values.padding_bottom ) { this.addCssProperty( wrapperSelector, 'padding-bottom', values.padding_bottom ); } if ( values.padding_left ) { this.addCssProperty( wrapperSelector, 'padding-left', values.padding_left ); } if ( values.padding_right ) { this.addCssProperty( wrapperSelector, 'padding-right', values.padding_right ); } if ( values.margin_top ) { this.addCssProperty( wrapperSelector, 'margin-top', values.margin_top ); } if ( values.margin_bottom ) { this.addCssProperty( wrapperSelector, 'margin-bottom', values.margin_bottom ); } if ( values.margin_left ) { this.addCssProperty( wrapperSelector, 'margin-left', values.margin_left ); } if ( values.margin_right ) { this.addCssProperty( wrapperSelector, 'margin-right', values.margin_right ); } if ( values.border_radius_top_left ) { this.addCssProperty( wrapperSelector, 'border-top-left-radius', values.border_radius_top_left ); } if ( values.border_radius_top_right ) { this.addCssProperty( wrapperSelector, 'border-top-right-radius', values.border_radius_top_right ); } if ( values.border_radius_bottom_right ) { this.addCssProperty( wrapperSelector, 'border-bottom-right-radius', values.border_radius_bottom_right ); } if ( values.border_radius_bottom_left ) { this.addCssProperty( wrapperSelector, 'border-bottom-left-radius', values.border_radius_bottom_left ); } if ( 'yes' === values.box_shadow ) { this.addCssProperty( wrapperSelector, 'box-shadow', _.fusionGetBoxShadowStyle( values ).replace( ';', '' ) ); } style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* eslint no-useless-escape: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Vimeo Element View. FusionPageBuilder.fusion_vimeo = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values, atts.params ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrSrc = this.buildAttrSrc( atts.values ); attributes.title_attribute = ! _.isEmpty( atts.values.title_attribute ) ? atts.values.title_attribute : 'Vimeo video player ' + this.model.get( 'cid' ); attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values, params ) { // Make sure only the video ID is passed to the iFrame. var regExp = /(?:https?:\/\/)?(?:www\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|)(\d+)(?:$|\/|\?)/, match = values.id.match( regExp ); if ( match && 2 < match.length ) { values.id = match[ 3 ]; } // Make videos 16:9 by default, values.width already set to params.width. if ( 'undefined' !== typeof params.width && '' !== params.width && ( 'undefined' === typeof params.height || '' === params.height ) ) { values.height = Math.round( parseInt( params.width ) * 9 / 16 ); } // values.height already set to params.height. if ( 'undefined' !== typeof params.height && '' !== params.height && ( 'undefined' === typeof params.width || '' === params.width ) ) { values.width = Math.round( parseInt( params.height ) * 16 / 9 ); } values.height = _.fusionValidateAttrValue( values.height, '' ); values.width = _.fusionValidateAttrValue( values.width, '' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Attributes. var attrVimeo = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-video fusion-vimeo', style: '' } ); if ( 'yes' === values.center ) { attrVimeo[ 'class' ] += ' center-video'; } else { attrVimeo.style += 'max-width:' + values.width + 'px;max-height:' + values.height + 'px;'; } if ( '' !== values.alignment ) { attrVimeo[ 'class' ] += ' fusion-align' + values.alignment; attrVimeo.style += ' width:100%'; } if ( 'true' == values.autoplay || 'yes' === values.autoplay ) { attrVimeo[ 'data-autoplay' ] = '1'; } if ( '' !== values[ 'class' ] ) { attrVimeo[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.css_id ) { attrVimeo.id = values.css_id; } return attrVimeo; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttrSrc: function( values ) { var videoSCAttr = { class: 'video-shortcode' }; if ( 'yes' === values.center ) { videoSCAttr.style = 'max-width:' + values.width + 'px;max-height:' + values.height + 'px;'; } return videoSCAttr; } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAppConfig */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Post Slider Element View. FusionPageBuilder.fusion_postslider = FusionPageBuilder.ElementView.extend( { /** * Vars for the flexslider initialization. * * @since 2.0 */ flexsliderVars: {}, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-post-slider.fusion-flexslider' ) ); // Get the flexslider init vars, so that we can re-init after DOM patch. if ( 'undefined' !== typeof element.data( 'flexslider' ) ) { this.flexsliderVars = element.data( 'flexslider' ).vars; element.flexslider( 'destroy' ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var self = this, element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-post-slider.fusion-flexslider' ) ), smoothHeight = '0' === FusionApp.settings.slideshow_smooth_height ? false : true; // Needed in case the layout was changed. if ( ! _.isEmpty( self.flexsliderVars ) ) { self.flexsliderVars.controlNav = ( 'attachments' === self.model.attributes.params.layout ) ? 'thumbnails' : true; } self.flexsliderVars.smoothHeight = smoothHeight; if ( 0 < element.length ) { // Re-init flexslider. setTimeout( function() { if ( 'undefined' !== typeof element.flexslider ) { element.flexslider( self.flexsliderVars ); } }, 300 ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.sliderAttr = this.buildSliderAttr( atts.values ); if ( 'undefined' !== typeof atts.query_data ) { attributes.datasets = this.buildDatasetAttr( atts.values, atts.query_data ); } attributes.thumbAttr = this.buildThumbAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.query_data = atts.query_data; attributes.values = atts.values; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSliderAttr: function( values ) { // FlexsliderShortcode Attributes. var flexsliderShortcode = { class: 'fusion-flexslider fusion-post-slider fusion-flexslider-loading flexslider-' + values.layout }; flexsliderShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, flexsliderShortcode ); if ( 'yes' === values.lightbox && 'attachments' === values.layout ) { flexsliderShortcode[ 'class' ] += ' flexslider-lightbox'; } if ( '' !== values[ 'class' ] ) { flexsliderShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { flexsliderShortcode.id = values.id; } return flexsliderShortcode; }, /** * Builds image attributes. * * @since 2.0 * @param {Object} values - The values. * @param {Object} queryData - The AJAX query data. * @return {Object} */ buildDatasetAttr: function( values, queryData ) { var view = this, datasetAttr = {}; _.each( queryData.datasets, function( dataset, index ) { datasetAttr[ index ] = {}; datasetAttr[ index ].link_attributes = view.buildLinkAttr( dataset, values.layout ); datasetAttr[ index ].image_attributes = view.buildImageAttr( dataset ); if ( 'attachments' === values.layout ) { datasetAttr[ index ].li_attributes = view.buildListElementAttr( dataset ); } else { datasetAttr[ index ].title_link_attributes = view.buildTitleLinkAttr( dataset ); } } ); return datasetAttr; }, /** * Builds link attributes. * * @since 2.0 * @param {Object} dataset - The dataset values. * @param string layout - The slider layout. * @return {Object} */ buildLinkAttr: function( dataset, layout ) { var linkAttr = {}; if ( 'attachments' === layout ) { linkAttr.href = dataset.image; linkAttr[ 'data-title' ] = dataset.title; linkAttr[ 'data-caption' ] = dataset.caption; linkAttr.title = dataset.title; linkAttr[ 'data-rel' ] = 'prettyPhoto[flex_' + this.model.get( 'cid' ) + ']'; } else if ( 'posts' === layout || 'posts-with-excerpt' === layout ) { linkAttr.href = dataset.permalink; linkAttr[ 'data-title' ] = dataset.title_attribute; } return linkAttr; }, /** * Builds image attributes. * * @since 2.0 * @param {Object} dataset - The dataset values. * @return {Object} */ buildImageAttr: function( dataset ) { var imageAttr = {}; imageAttr.src = dataset.image; imageAttr.alt = dataset.alt; return imageAttr; }, /** * Builds list elemet attributes. * * @since 2.0 * @param {Object} dataset - The dataset values. * @return {Object} */ buildListElementAttr: function( dataset ) { var liElementAttr = {}; liElementAttr[ 'data-thumb' ] = dataset.thumb; return liElementAttr; }, /** * Builds title link attributes. * * @since 2.0 * @param {Object} dataset - The dataset values. * @return {Object} */ buildTitleLinkAttr: function( dataset ) { var titleLinkAttr = {}; titleLinkAttr.href = dataset.permalink; return titleLinkAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildThumbAttr: function( values ) { // FlexsliderShortcodeThumbnails Attributes. var flexsliderShortcodeThumbnails = { class: 'flexslider' }; if ( 'attachments' === values.layout ) { flexsliderShortcodeThumbnails[ 'class' ] += ' fat'; } return flexsliderShortcodeThumbnails; } } ); } ); _.extend( FusionPageBuilder.Callback.prototype, { fusion_post_slider_query: function( name, value, modelData, args, cid, action, model, view ) { // jshint ignore: line // First update value in model. view.changeParam( name, value ); modelData.params.post_id = ''; if ( 'attachments' === modelData.params.layout ) { modelData.params.post_id = FusionApp.data.postDetails.post_id; } // Send this data with ajax or rest. jQuery.ajax( { url: fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_fusion_post_slider', params: modelData.params } } ) .done( function( response ) { model.set( 'query_data', response ); view.reRender(); } ); } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // User Login Element View. FusionPageBuilder.fusion_login = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { this.extras = atts.extras; atts.values.action = 'login'; // Create attribute objects. atts.loginShortCodeAttr = this.buildLoginShortCodeAttr( atts.values ); atts.loginShortcodeFormAttr = this.buildLoginShortcodeFormAttr( atts.values ); atts.loginShortcodeButton = this.buildLoginShortcodeButtonAttr( atts.values ); atts.loggedIn = true; atts.styles = this.buildLoginStyle( atts.values ); // Any extras that need passed on. atts.cid = this.model.get( 'cid' ); return atts; }, /** * Builds login attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortCodeAttr: function( values ) { var loginShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-login-box fusion-login-box-cid' + this.model.get( 'cid' ) + ' fusion-login-box-' + values.action + ' fusion-login-align-' + values.text_align + ' fusion-login-field-layout-' + values.form_field_layout } ); if ( '' !== values[ 'class' ] ) { loginShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { loginShortcode.id = values.id; } return loginShortcode; }, /** * Builds login form attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeFormAttr: function( values ) { // LoginShortcodeForm Attributes. var loginShortcodeForm = { class: 'fusion-login-form' }; if ( '' !== values.form_background_color ) { loginShortcodeForm.style = 'background-color:' + values.form_background_color + ';'; } loginShortcodeForm.name = values.action + 'form'; loginShortcodeForm.id = values.action + 'form'; loginShortcodeForm.method = 'post'; loginShortcodeForm.action = ''; return loginShortcodeForm; }, /** * Builds button attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeButtonAttr: function( values ) { // LoginShortcodeButton Attributes. var loginShortcodeButton = { class: 'fusion-login-button fusion-button button-default fusion-button-default-size' }; if ( 'yes' !== values.button_fullwidth ) { loginShortcodeButton[ 'class' ] += ' fusion-login-button-no-fullwidth'; } loginShortcodeButton.type = 'submit'; loginShortcodeButton.name = 'wp-submit'; return loginShortcodeButton; }, /** * Builds login styles. * * @since 2.0 * @param {Object} values - The values. * @return {Sting} */ buildLoginStyle: function( values ) { var styles = '', cid = this.model.get( 'cid' ); if ( '' !== values.heading_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-heading{color:' + values.heading_color + ';}'; } if ( '' !== values.caption_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-caption{color:' + values.caption_color + ';}'; } if ( '' !== values.link_color ) { styles += '.fusion-login-box-cid' + cid + ' a{color:' + values.link_color + ';}'; } if ( '' !== styles ) { styles = '<style type="text/css">' + styles + '</style>'; } values.label_class = 'yes' === values.show_labels ? 'fusion-login-label' : 'fusion-hidden-content'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // User Register Element View. FusionPageBuilder.fusion_register = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { this.extras = atts.extras; atts.values.action = 'register'; // Create attribute objects. atts.loginShortCodeAttr = this.buildLoginShortCodeAttr( atts.values ); atts.loginShortcodeFormAttr = this.buildLoginShortcodeFormAttr( atts.values ); atts.loginShortcodeButton = this.buildLoginShortcodeButtonAttr( atts.values ); atts.loggedIn = true; atts.styles = this.buildRegisterStyles( atts.values ); // Any extras that need passed on. atts.cid = this.model.get( 'cid' ); return atts; }, /** * Builds login attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortCodeAttr: function( values ) { // LoginShortcode Attributes. var loginShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-login-box fusion-login-box-cid' + this.model.get( 'cid' ) + ' fusion-login-box-' + values.action + ' fusion-login-align-' + values.text_align + ' fusion-login-field-layout-' + values.form_field_layout } ); if ( '' !== values[ 'class' ] ) { loginShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { loginShortcode.id = values.id; } return loginShortcode; }, /** * Builds form attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeFormAttr: function( values ) { // LoginShortcodeForm Attributes. var loginShortcodeForm = { class: 'fusion-login-form' }; if ( '' !== values.form_background_color ) { loginShortcodeForm.style = 'background-color:' + values.form_background_color + ';'; } loginShortcodeForm.name = values.action + 'form'; loginShortcodeForm.id = values.action + 'form'; loginShortcodeForm.method = 'post'; loginShortcodeForm.action = ''; return loginShortcodeForm; }, /** * Builds button attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeButtonAttr: function( values ) { // LoginShortcodeButton Attributes. var loginShortcodeButton = { class: 'fusion-login-button fusion-button button-default fusion-button-default-size' }; if ( 'yes' !== values.button_fullwidth ) { loginShortcodeButton[ 'class' ] += ' fusion-login-button-no-fullwidth'; } loginShortcodeButton.type = 'submit'; loginShortcodeButton.name = 'wp-submit'; return loginShortcodeButton; }, /** * Builds register Styles. * * @since 2.0 * @param {Object} values - The attributes. * @return {Sting} */ buildRegisterStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ); if ( '' !== values.heading_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-heading{color:' + values.heading_color + ';}'; } if ( '' !== values.caption_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-caption{color:' + values.caption_color + ';}'; } if ( '' !== values.link_color ) { styles += '.fusion-login-box-cid' + cid + ' a{color:' + values.link_color + ';}'; } if ( '' !== styles ) { styles = '<style type="text/css">' + styles + '</style>'; } values.label_class = 'yes' === values.show_labels ? 'fusion-login-label' : 'fusion-hidden-content'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // User Lost Password Element View. FusionPageBuilder.fusion_lost_password = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { this.extras = atts.extras; atts.values.action = 'lostpassword'; // Create attribute objects. atts.loginShortCodeAttr = this.buildLoginShortCodeAttr( atts.values ); atts.loginShortcodeFormAttr = this.buildLoginShortcodeFormAttr( atts.values ); atts.loginShortcodeButton = this.buildLoginShortcodeButtonAttr( atts.values ); atts.loggedIn = true; atts.styles = this.buildForgotPassStyles( atts.values ); // Any extras that need passed on. atts.cid = this.model.get( 'cid' ); return atts; }, /** * Builds login attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortCodeAttr: function( values ) { var loginShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-login-box fusion-login-box-cid' + this.model.get( 'cid' ) + ' fusion-login-box-' + values.action + ' fusion-login-align-' + values.text_align } ); if ( '' !== values[ 'class' ] ) { loginShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { loginShortcode.id = values.id; } return loginShortcode; }, /** * Builds form attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeFormAttr: function( values ) { // LoginShortcodeForm Attributes. var loginShortcodeForm = { class: 'fusion-login-form' }; if ( '' !== values.form_background_color ) { loginShortcodeForm.style = 'background-color:' + values.form_background_color + ';'; } loginShortcodeForm.name = values.action + 'form'; loginShortcodeForm.id = values.action + 'form'; loginShortcodeForm.method = 'post'; loginShortcodeForm.action = ''; return loginShortcodeForm; }, /** * Builds button attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLoginShortcodeButtonAttr: function( values ) { // LoginShortcodeButton Attributes. var loginShortcodeButton = { class: 'fusion-login-button fusion-button button-default fusion-button-default-size' }; if ( 'yes' !== values.button_fullwidth ) { loginShortcodeButton[ 'class' ] += ' fusion-login-button-no-fullwidth'; } loginShortcodeButton.type = 'submit'; loginShortcodeButton.name = 'wp-submit'; return loginShortcodeButton; }, /** * Builds forgot password Styles. * * @since 2.0 * @param {Object} values - The attributes. * @return {Sting} */ buildForgotPassStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ); if ( '' !== values.heading_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-heading{color:' + values.heading_color + ';}'; } if ( '' !== values.caption_color ) { styles += '.fusion-login-box-cid' + cid + ' .fusion-login-caption{color:' + values.caption_color + ';}'; } if ( '' !== values.link_color ) { styles += '.fusion-login-box-cid' + cid + ' a{color:' + values.link_color + ';}'; } if ( '' !== styles ) { styles = '<style type="text/css">' + styles + '</style>'; } values.label_class = 'yes' === values.show_labels ? 'fusion-login-label' : 'fusion-hidden-content'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Featured Product Slider View. FusionPageBuilder.fusion_featured_products_slider = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects. attributes.wooFeaturedProductsSliderShortcode = {}; attributes.wooFeaturedProductsSliderShortcodeCarousel = {}; attributes.product_list = false; attributes.placeholder = false; if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.products ) { attributes.wooFeaturedProductsSliderShortcode = this.buildWooFeaturedProductsSliderShortcodeAttr( atts.values ); attributes.wooFeaturedProductsSliderShortcodeCarousel = this.buildWooFeaturedProductsSliderShortcodeCarousel( atts.values ); attributes.product_list = this.buildProductList( atts.values, atts.extras, atts.query_data ); } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.placeholder ) { attributes.placeholder = atts.query_data.placeholder; } // Any extras that need passed on. attributes.show_nav = atts.values.show_nav; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.column_spacing = _.fusionValidateAttrValue( values.column_spacing, '' ); }, /** * Builds main attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildWooFeaturedProductsSliderShortcodeAttr: function( values ) { // WooFeaturedProductsSliderShortcode attributes. var wooFeaturedProductsSliderShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-featured-products-slider fusion-woo-slider' } ); if ( '' !== values[ 'class' ] ) { wooFeaturedProductsSliderShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { wooFeaturedProductsSliderShortcode.id = values.id; } return wooFeaturedProductsSliderShortcode; }, /** * Builds carousel attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildWooFeaturedProductsSliderShortcodeCarousel: function( values ) { // WooFeaturedProductsSliderShortcodeCarousel Attributes. var wooFeaturedProductsSliderShortcodeCarousel = { class: 'fusion-carousel' }; if ( 'title_below_image' === values.carousel_layout ) { wooFeaturedProductsSliderShortcodeCarousel[ 'class' ] += ' fusion-carousel-title-below-image'; wooFeaturedProductsSliderShortcodeCarousel[ 'data-metacontent' ] = 'yes'; } else { wooFeaturedProductsSliderShortcodeCarousel[ 'class' ] += ' fusion-carousel-title-on-rollover'; } wooFeaturedProductsSliderShortcodeCarousel[ 'data-autoplay' ] = values.autoplay; wooFeaturedProductsSliderShortcodeCarousel[ 'data-columns' ] = values.columns; wooFeaturedProductsSliderShortcodeCarousel[ 'data-itemmargin' ] = values.column_spacing; wooFeaturedProductsSliderShortcodeCarousel[ 'data-itemwidth' ] = 180; wooFeaturedProductsSliderShortcodeCarousel[ 'data-touchscroll' ] = values.mouse_scroll; wooFeaturedProductsSliderShortcodeCarousel[ 'data-imagesize' ] = values.picture_size; wooFeaturedProductsSliderShortcodeCarousel[ 'data-scrollitems' ] = values.scroll_items; return wooFeaturedProductsSliderShortcodeCarousel; }, /** * Builds the product list and returns the HTML. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra args. * @param {Object} queryData - The query data. * @return {string} */ buildProductList: function( values, extras, queryData ) { var showCats = ( 'yes' === values.show_cats ) ? 'enable' : 'disable', showPrice = ( 'yes' === values.show_price ), showButtons = ( 'yes' === values.show_buttons ), designClass = 'fusion-' + extras.design_class + '-product-image-wrapper', featuredImageSize = ( 'fixed' === values.picture_size ) ? 'shop_single' : 'full', productList = ''; _.each( queryData.products, function( product ) { var imageData = product.image_data, inCart = jQuery.inArray( product.id, queryData.items_in_cart ), image = ''; imageData.image_size = featuredImageSize; imageData.display_woo_sale = 'yes' === values.show_sale; // Title on rollover layout. if ( 'title_on_rollover' === values.carousel_layout ) { imageData.image_size = featuredImageSize; imageData.display_woo_price = showPrice; imageData.display_woo_buttons = showButtons; imageData.display_post_categories = showCats; imageData.display_post_title = 'enable'; imageData.display_rollover = 'yes'; image = _.fusionFeaturedImage( imageData ); } else { imageData.image_size = featuredImageSize; imageData.display_woo_price = false; imageData.display_woo_buttons = showButtons; imageData.display_post_categories = 'disable'; imageData.display_post_title = 'disable'; imageData.display_rollover = 'yes'; if ( 'yes' === values.show_buttons ) { image = _.fusionFeaturedImage( imageData ); } else { imageData.display_rollover = 'no'; image = _.fusionFeaturedImage( imageData ); } // Get the post title. image += '<h4 class="fusion-carousel-title">'; image += '<a href="' + product.permalink + '" target="_self">' + product.title + '</a>'; image += '</h4>'; image += '<div class="fusion-carousel-meta">'; // Get the terms. if ( true === showCats || 'enable' === showCats ) { image += product.terms; } // Check if we should render the woo product price. if ( true === showPrice || 'enable' === showPrice ) { image += '<div class="fusion-carousel-price">' + product.price + '</div>'; } image += '</div>'; } if ( -1 !== inCart ) { productList += '<li class="fusion-carousel-item"><div class="' + designClass + ' fusion-item-in-cart"><div class="fusion-carousel-item-wrapper">' + image + '</div></div></li>'; } else { productList += '<li class="fusion-carousel-item"><div class="' + designClass + '"><div class="fusion-carousel-item-wrapper">' + image + '</div></div></li>'; } } ); return productList; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Highlight Element View. FusionPageBuilder.fusion_highlight = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} - Return the attributes object. */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.output = atts.values.element_content; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} - Return the attributes object. */ buildAttr: function( values ) { var highlightShortcode = { class: 'fusion-highlight', style: '' }, brightnessLevel = jQuery.AWB_Color( values.color ).lightness() * 100; if ( values.text_color ) { highlightShortcode[ 'class' ] += ' custom-textcolor'; } else { highlightShortcode[ 'class' ] += ( 50 < brightnessLevel ) ? ' light' : ' dark'; } if ( '' !== values[ 'class' ] ) { highlightShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { highlightShortcode.id = values.id; } if ( 'black' === values.color ) { highlightShortcode[ 'class' ] += ' highlight2'; } else { highlightShortcode[ 'class' ] += ' highlight1'; } if ( 'no' !== values.background ) { if ( 'full' === values.background_style ) { highlightShortcode[ 'class' ] += ' awb-highlight-background'; highlightShortcode.style += 'background-color:' + values.color + ';'; if ( 'yes' === values.rounded ) { highlightShortcode[ 'class' ] += ' rounded'; } } else { highlightShortcode.style += 'background:linear-gradient(to top, ' + values.color + ' 40%, transparent 40%);'; } } else if ( 'yes' === values.gradient_font ) { highlightShortcode.style += _.getGradientFontString( values ); highlightShortcode[ 'class' ] += ' awb-gradient-text'; } if ( values.text_color ) { highlightShortcode.style += 'color:' + values.text_color + ';'; } return highlightShortcode; } } ); } ); }( jQuery ) ); ;/* global */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Button Element View. FusionPageBuilder.fusion_search = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.formAttr = this.buildFormAttr( atts.values ); attributes.formStyles = this.buildStyles( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); // Any extras that need passed on. attributes.values = atts.values; return attributes; }, /** * Validates the values. * * @since 3.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { // Old value check. if ( values.border_width ) { values.border_width = _.fusionValidateAttrValue( values.border_width, 'px' ); values.border_size_top = '' !== values.border_size_top ? values.border_width : values.border_size_top; values.border_size_right = '' !== values.border_size_right ? values.border_width : values.border_size_right; values.border_size_bottom = '' !== values.border_size_bottom ? values.border_width : values.border_size_bottom; values.border_size_left = '' !== values.border_size_left ? values.border_width : values.border_size_left; delete values.border_width; } values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' ); values.input_height = _.fusionValidateAttrValue( values.input_height, 'px' ); values.border_radius = _.fusionValidateAttrValue( values.border_radius, 'px' ); }, buildFormAttr: function( values ) { var attr = { class: 'searchform fusion-search-form fusion-live-search' }; if ( values.design ) { attr[ 'class' ] += ' fusion-search-form-' + values.design; } return attr; }, buildStyles: function( values ) { var styles = '<style type="text/css">'; if ( '' !== values.input_height ) { styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input,'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-button input[type=submit] {'; styles += 'height: ' + values.input_height + ';'; styles += '}'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-button input[type=submit] {'; styles += 'line-height: ' + values.input_height + ';'; styles += '}'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform.fusion-search-form-clean .fusion-search-form-content .fusion-search-field input {'; styles += 'padding-left: ' + values.input_height + ';'; styles += '}'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-button input[type=submit] {'; styles += 'width: ' + values.input_height + ';'; styles += '}'; } if ( '' !== values.text_color ) { styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input,'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input::placeholder,'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform.fusion-search-form-clean .fusion-search-form-content .fusion-search-button input[type=submit] {'; styles += 'color: ' + values.text_color + ';'; styles += '}'; } if ( '' !== values.focus_border_color ) { styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input:focus {'; styles += 'border-color: ' + values.focus_border_color + ';'; styles += '}'; } if ( '' !== values.text_size ) { styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input,'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform.fusion-search-form-clean .fusion-search-form-content .fusion-search-button input[type=submit] {'; styles += 'font-size: ' + values.text_size + ';'; styles += '}'; } styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform .fusion-search-form-content .fusion-search-field input {'; if ( '' !== values.bg_color ) { styles += 'background-color: ' + values.bg_color + ';'; } if ( '' !== values.border_size_top ) { styles += 'border-top-width:' + _.fusionGetValueWithUnit( values.border_size_top ) + ';'; } if ( '' !== values.border_size_right ) { styles += 'border-right-width:' + _.fusionGetValueWithUnit( values.border_size_right ) + ';'; } if ( '' !== values.border_size_bottom ) { styles += 'border-bottom-width:' + _.fusionGetValueWithUnit( values.border_size_bottom ) + ';'; } if ( '' !== values.border_size_left ) { styles += 'border-left-width:' + _.fusionGetValueWithUnit( values.border_size_left ) + ';'; } if ( '' !== values.border_color ) { styles += 'border-color: ' + values.border_color + ';'; } styles += '}'; if ( '' !== values.border_radius ) { styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .searchform.fusion-search-form-classic .fusion-search-form-content, .fusion-search-form-classic .searchform:not(.fusion-search-form-clean) .fusion-search-form-content {'; styles += 'border-radius: ' + values.border_radius + ';'; styles += 'overflow: hidden;'; styles += '}'; styles += '.fusion-search-element-' + this.model.get( 'cid' ) + ' .fusion-search-form-content input.s {'; styles += 'border-radius: ' + values.border_radius + ';'; styles += '}'; } styles += '</style>'; return styles; }, buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-search-element fusion-search-element-' + this.model.get( 'cid' ), style: '' } ); attr[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } attr.id = values.id; attr = _.fusionAnimations( values, attr ); return attr; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Syntax Highlighter Element View. FusionPageBuilder.fusion_syntax_highlighter = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { var self = this; setTimeout( function() { self.fusionSyntaxHighlighter( self.$el.find( 'textarea' )[ 0 ] ); }, 500 ); }, /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { this.syntaxHighlighter.toTextArea(); this.$el.find( '.CodeMirror' ).remove(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { jQuery( this.$el.find( 'textarea' )[ 0 ] ).val( this.output ); this.fusionSyntaxHighlighter( this.$el.find( 'textarea' )[ 0 ] ); }, /** * Init highlighter. * * @since 2.0 * @param {Object} syntaxHighlighterTextarea - selector object. * @return {void} */ fusionSyntaxHighlighter: function( syntaxHighlighterTextarea ) { var syntaxHighlighter, syntaxHighlighterSettings; // Set settings to empty for each highlighter. syntaxHighlighterSettings = {}; // Set custom values as per the settings set by user. syntaxHighlighterSettings.readOnly = ( 'undefined' !== typeof jQuery( syntaxHighlighterTextarea ).attr( 'data-readonly' ) ) ? jQuery( syntaxHighlighterTextarea ).attr( 'data-readonly' ) : false; syntaxHighlighterSettings.lineNumbers = ( 'undefined' !== typeof jQuery( syntaxHighlighterTextarea ).attr( 'data-linenumbers' ) ) ? jQuery( syntaxHighlighterTextarea ).attr( 'data-linenumbers' ) : false; syntaxHighlighterSettings.lineWrapping = ( 'undefined' !== typeof jQuery( syntaxHighlighterTextarea ).attr( 'data-linewrapping' ) ) ? jQuery( syntaxHighlighterTextarea ).attr( 'data-linewrapping' ) : false; syntaxHighlighterSettings.theme = ( 'undefined' !== typeof jQuery( syntaxHighlighterTextarea ).attr( 'data-theme' ) ) ? jQuery( syntaxHighlighterTextarea ).attr( 'data-theme' ) : 'default'; syntaxHighlighterSettings.mode = ( 'undefined' !== typeof jQuery( syntaxHighlighterTextarea ).attr( 'data-mode' ) ) ? jQuery( syntaxHighlighterTextarea ).attr( 'data-mode' ) : 'text/html'; // Instantiate new CodeMirror for each highlighter. syntaxHighlighter = wp.CodeMirror.fromTextArea( syntaxHighlighterTextarea, syntaxHighlighterSettings ); jQuery( syntaxHighlighterTextarea ).addClass( 'code-mirror-initialized' ); jQuery( syntaxHighlighterTextarea ).data( 'code-mirror', syntaxHighlighter ); // Make sure the highlighter don't add extra lines. syntaxHighlighter.setSize( '100%', 'auto' ); jQuery( document ).trigger( 'resize' ); jQuery( syntaxHighlighterTextarea ).closest( '.fusion-syntax-highlighter-container' ).css( 'opacity', '1' ); this.syntaxHighlighter = syntaxHighlighter; }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.extras = atts.extras; // Create attribute objects attributes.syntaxAttr = this.buildSyntaxAttr( atts.values ); attributes.textareaAttr = this.buildTextareaAttr( atts.values ); attributes.syntaxHighlighterCopyCodeTitleAttr = this.buildSyntaxHighlighterCopyCodeTitleAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.output = atts.values.element_content; this.output = atts.values.element_content; attributes.wp_enqueue_code_editor = atts.extras.wp_enqueue_code_editor; attributes.copy_to_clipboard = atts.values.copy_to_clipboard; attributes.copy_to_clipboard_text = atts.values.copy_to_clipboard_text; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { // Validate margin values. values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); values.margin_left = _.fusionValidateAttrValue( values.margin_left, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_right = _.fusionValidateAttrValue( values.margin_right, 'px' ); // Validate border size value. values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); // Validate font size value. values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); // Set background color to TO value if theme is set to TO default. if ( '' === values.theme ) { values.background_color = this.extras.syntax_highlighter_background_color; } if ( 'undefined' !== typeof values.element_content && '' !== values.element_content ) { if ( values.element_content && FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( values.element_content ) ) === values.element_content ) { values.element_content = FusionPageBuilderApp.base64Decode( values.element_content ); } // Remove br tags added by WP from the code. values.element_content = values.element_content.replace( /<br \/>/g, '' ); } }, /** * Builds main attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSyntaxAttr: function( values ) { var theme = '', syntaxAttr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-syntax-highlighter-container', style: '' } ); syntaxAttr[ 'class' ] += ' fusion-syntax-highlighter-cid' + this.model.get( 'cid' ); theme = ( 'default' === values.theme || 'elegant' === values.theme ) ? 'light' : 'dark'; syntaxAttr[ 'class' ] += ' fusion-syntax-highlighter-theme-' + theme; if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { syntaxAttr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { syntaxAttr.id = values.id; } if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { syntaxAttr.style += 'margin-top:' + values.margin_top + ';'; } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { syntaxAttr.style += 'margin-left:' + values.margin_left + ';'; } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { syntaxAttr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { syntaxAttr.style += 'margin-right:' + values.margin_right + ';'; } if ( 'undefined' !== typeof values.font_size && '' !== values.font_size ) { syntaxAttr.style += 'font-size:' + values.font_size + ';'; } if ( 'undefined' !== typeof values.border_size && '' !== values.border_size ) { syntaxAttr.style += 'border-width:' + values.border_size + ';'; if ( '' !== values.border_style ) { syntaxAttr.style += 'border-style:' + values.border_style + ';'; } if ( '' !== values.border_color ) { syntaxAttr.style += 'border-color:' + values.border_color + ';'; } } // Compatibility for WP < 4.9. if ( ! this.extras.wp_enqueue_code_editor && '' !== values.background_color ) { syntaxAttr.style += 'background-color:' + values.background_color + ';'; syntaxAttr.style += 'padding: 0 1em'; } return syntaxAttr; }, /** * Builds text area attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildTextareaAttr: function( values ) { // Text area attr. var textareaAttr = { class: 'fusion-syntax-highlighter-textarea', id: 'fusion_syntax_highlighter_' + this.model.get( 'cid' ), style: '' }, languageType, settings = { readOnly: 'nocursor', lineNumbers: 'yes' === values.line_numbers ? true : '', lineWrapping: 'break' === values.line_wrapping ? true : '', theme: values.theme }; if ( '' !== values.language ) { languageType = 'json' === values.language || 'xml' === values.language ? 'application' : 'text'; settings.mode = languageType + '/' + values.language; } _.each( settings, function( value, setting ) { textareaAttr[ 'data-' + setting ] = value; } ); return textareaAttr; }, /** * Builds copy code area attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSyntaxHighlighterCopyCodeTitleAttr: function( values ) { var syntaxHighlighterCopyCodeTitle = { class: 'syntax-highlighter-copy-code-title', style: '' }; syntaxHighlighterCopyCodeTitle[ 'data-id' ] = 'fusion_syntax_highlighter_' + this.model.get( 'cid' ); if ( values.font_size ) { syntaxHighlighterCopyCodeTitle.style += 'font-size:' + values.font_size + ';'; } return syntaxHighlighterCopyCodeTitle; }, /** * Builds styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildStyles: function( values ) { var style = '<style type="text/css" scopped="scopped">', cid = this.model.get( 'cid' ); if ( values.background_color && '' !== values.background_color ) { style += '.fusion-syntax-highlighter-cid' + cid + ' > .CodeMirror, .fusion-syntax-highlighter-cid' + cid + ' > .CodeMirror .CodeMirror-gutters { background-color:' + values.background_color + ';}'; } if ( 'no' !== values.line_numbers ) { style += '.fusion-syntax-highlighter-cid' + cid + ' > .CodeMirror .CodeMirror-gutters { background-color: ' + values.line_number_background_color + '; }'; style += '.fusion-syntax-highlighter-cid' + cid + ' > .CodeMirror .CodeMirror-linenumber { color: ' + values.line_number_text_color + '; }'; } style += '</style>'; return style; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Tabs View. FusionPageBuilder.fusion_tabs = FusionPageBuilder.ParentElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var $this = this; jQuery( window ).on( 'load', function() { $this._refreshJs(); } ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var self = this, children = window.FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); this.appendChildren( '.nav-tabs' ); _.each( children, function( child ) { self.appendContents( child ); } ); this._refreshJs(); }, refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_tabs', this.model.attributes.cid ); this.checkActiveTab(); }, /** * Find the active tab. * * @since 2.0 * @return {void} */ getActiveTab: function() { var self = this, children = window.FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); _.each( children, function( child ) { if ( child.$el.hasClass( 'active' ) ) { self.model.set( 'activeTab', child.model.get( 'cid' ) ); } } ); }, /** * Set tab as active. * * @since 2.0 * @return {void} */ checkActiveTab: function() { var self = this, children = window.FusionPageBuilderViewManager.getChildViews( this.model.get( 'cid' ) ); if ( 'undefined' !== typeof this.model.get( 'activeTab' ) ) { _.each( children, function( child ) { child.checkActive(); } ); self.$el.find( '.fusion-extra-' + this.model.get( 'activeTab' ) ).addClass( 'active in' ); } else { _.each( children, function( child ) { if ( child.isFirstChild() ) { self.$el.find( '.fusion-extra-' + child.model.get( 'cid' ) ).addClass( 'active in' ); } } ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} - Returns the attributes. */ filterTemplateAtts: function( atts ) { // Create attribute objects. atts.tabsShortcode = this.buildTabsShortcodeAttrs( atts.values ); atts.styleTag = this.buildStyleTag( atts.values ); atts.justifiedClass = this.setJustifiedClass( atts.values ); this.model.set( 'first', true ); atts.cid = this.model.get( 'cid' ); return atts; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} - Returns the shortcode object. */ buildTabsShortcodeAttrs: function( values ) { // TabsShortcode Attributes. var tabsShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-tabs fusion-tabs-cid' + this.model.get( 'cid' ) + ' ' + values.design } ); if ( 'yes' !== values.justified && 'vertical' !== values.layout ) { tabsShortcode[ 'class' ] += ' nav-not-justified'; } if ( '' !== values.icon_position ) { tabsShortcode[ 'class' ] += ' icon-position-' + values.icon_position; } if ( '' !== values[ 'class' ] ) { tabsShortcode[ 'class' ] += ' ' + values[ 'class' ]; } tabsShortcode[ 'class' ] += ( 'vertical' === values.layout ) ? ' vertical-tabs' : ' horizontal-tabs'; if ( 'no' == values.show_tab_titles ) { tabsShortcode[ 'class' ] += ' woo-tabs-hide-headings'; } if ( '' !== values.id ) { tabsShortcode.id = values.id; } return tabsShortcode; }, /** * Builds styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} - Returns styles as a string. */ buildStyleTag: function( values ) { var cid = this.model.get( 'cid' ), styles = '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li a.tab-link{border-top-color:' + values.inactivecolor + ';background-color:' + values.inactivecolor + ';}'; if ( 'clean' !== values.design ) { styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs{background-color:' + values.backgroundcolor + ';}'; styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link,.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link:hover,.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link:focus{border-right-color:' + values.backgroundcolor + ';}'; } else { styles = '#wrapper .fusion-tabs.fusion-tabs-cid' + cid + '.clean .nav-tabs li a.tab-link{border-color:' + values.bordercolor + ';}.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li a.tab-link{background-color:' + values.inactivecolor + ';}'; } styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link,.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link:hover,.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li.active a.tab-link:focus{background-color:' + values.backgroundcolor + ';}'; styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs li a.tab-link:hover{background-color:' + values.backgroundcolor + ';border-top-color:' + values.backgroundcolor + ';}'; styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .tab-pane{background-color:' + values.backgroundcolor + ';}'; styles += '.fusion-tabs.fusion-tabs-cid' + cid + ' .nav,.fusion-tabs.fusion-tabs-cid' + cid + ' .nav-tabs,.fusion-tabs.fusion-tabs-cid' + cid + ' .tab-content .tab-pane{border-color:' + values.bordercolor + ';}'; styles = '<style type="text/css">' + styles + '</style>'; return styles; }, /** * Set class. * * @since 2.0 * @param {Object} values - The values. * @return {string} - Returns a string containing the CSS classes. */ setJustifiedClass: function( values ) { var justifiedClass = ''; if ( 'yes' === values.justified && 'vertical' !== values.layout ) { justifiedClass = ' nav-justified'; } return justifiedClass; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderElements, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Tabs child View FusionPageBuilder.fusion_tab = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentView.getActiveTab(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); this.updateExtraContents(); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Using non debounced version for smoothness. this.refreshJs(); parentView._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { atts.tabsShortcodeTab = this.buildTabsShortcodeTabAttr( atts.values ); atts.tabsShortcodeIcon = this.buildTabsShortcodeIconAttr( atts ); atts.tabsShortcodeLink = this.buildTabsShortcodeLinkAttr( atts.values ); atts.justifiedClass = this.setJustifiedClass( atts.values ); atts.cid = this.model.get( 'cid' ); atts.parent = this.model.get( 'parent' ); atts.parentValues = this.getParentValues( atts ); atts.output = atts.values.element_content; return atts; }, /** * Check for the active tab. * * @since 2.0 * @return {void} */ checkActive: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof parentView.model.get( 'activeTab' ) ) { if ( parentView.model.get( 'activeTab' ) === this.model.get( 'cid' ) ) { this.$el.addClass( 'active' ); } else { this.$el.removeClass( 'active' ); } } }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildTabsShortcodeTabAttr: function() { var tabsShortcodeTab; tabsShortcodeTab = { class: 'tab-pane fade fusion-extra-' + this.model.get( 'cid' ) }; tabsShortcodeTab.id = 'tabcid' + this.model.get( 'cid' ); return tabsShortcodeTab; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildTabsShortcodeIconAttr: function( atts ) { var parentValues = atts.parentValues, values = atts.values, // TabsShortcodeIcon Attributes. tabsShortcodeIcon = { class: 'fontawesome-icon ' + _.fusionFontAwesome( values.icon ), 'aria-hidden': 'true' }; if ( parentValues.icon_size ) { tabsShortcodeIcon.style = 'font-size: ' + parentValues.icon_size + 'px'; } return tabsShortcodeIcon; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildTabsShortcodeLinkAttr: function( values ) { // TabsShortcodeLink Attributes. var tabsShortcodeLink = { class: 'tab-link' }, sanitizedTitle = 'string' === typeof values.title ? values.title.replace( /\s+/g, '' ).toLowerCase() : ''; tabsShortcodeLink[ 'data-toggle' ] = 'tab'; tabsShortcodeLink.id = 'fusion-tab-' + sanitizedTitle; tabsShortcodeLink.href = '#tabcid' + this.model.get( 'cid' ); return tabsShortcodeLink; }, /** * Set class. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ setJustifiedClass: function( values ) { var justifiedClass = ''; if ( 'yes' === values.justified && 'vertical' !== values.layout ) { justifiedClass = ' nav-justified'; } return justifiedClass; }, /** * Get parent values. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ getParentValues: function( atts ) { var parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == atts.parent; } ); var parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_tabs.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); return parentValues; } } ); } ); }( jQuery ) ); ;/* eslint-disable dot-notation */ /* eslint no-loop-func: 0 */ /* eslint no-unused-vars: ["error", {"args": "none"}] */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Table Element View. FusionPageBuilder.fusion_table = FusionPageBuilder.ElementView.extend( { /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var params = this.model.get( 'params' ), content, styleNew, styleOld, tableDOM; content = 'undefined' === typeof this.$el.find( '[data-param="element_content"]' ).html() ? params.element_content : this.$el.find( '[data-param="element_content"]' ).html(); tableDOM = jQuery.parseHTML( content.trim() ); styleOld = jQuery( tableDOM ).attr( 'class' ).replace( /[^\d.]/g, '' ); styleNew = params.fusion_table_type; if ( styleOld !== styleNew ) { tableDOM = this.generateTable( tableDOM ); window.FusionPageBuilderApp.setContent( 'element_content', jQuery( tableDOM ).prop( 'outerHTML' ) ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, values = atts.params, tableElementAtts = this.buildAttr( values ), tableDOM, tr, rowsOld, tdOld, thTdOld, columnsOld; if ( 'undefined' !== typeof values.fusion_table_type && '' !== values.fusion_table_type ) { values.element_content = values.element_content.replace( /<div .*?">/g, '<div ' + _.fusionGetAttributes( tableElementAtts ) + '>' ); } // Fix user input error where the amount of cols in element params is larger than actual table markup. if ( ! this.renderedYet ) { tableDOM = jQuery.parseHTML( values.element_content.trim() ); tr = jQuery( tableDOM ).find( 'tbody > tr' ); rowsOld = tr.length + 1; thTdOld = jQuery( tableDOM ).find( 'th' ).length; tdOld = tr.first().children( 'td' ).length; columnsOld = Math.max( thTdOld, tdOld ); if ( 'undefined' !== typeof values.fusion_table_columns && values.fusion_table_columns !== columnsOld ) { values.fusion_table_columns = columnsOld; this.model.set( 'params', values ); } if ( 'undefined' !== typeof values.fusion_table_rows || values.fusion_table_rows !== rowsOld ) { values.fusion_table_rows = rowsOld; this.model.set( 'params', values ); } } // Table is newly created. if ( 'undefined' !== typeof values.fusion_table_columns && '' === values.fusion_table_columns && 'undefined' !== typeof values.fusion_table_rows && '' === values.fusion_table_rows ) { values.fusion_table_columns = 2; values.fusion_table_rows = 2; } if ( 'undefined' !== typeof values.fusion_table_columns && '' !== values.fusion_table_columns ) { tableDOM = jQuery.parseHTML( values.element_content.trim() ); tableDOM = this.generateTable( tableDOM ); values.element_content = jQuery( tableDOM ).prop( 'outerHTML' ); this.model.set( 'params', values ); } // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.element_content = values.element_content; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = {}, tableStyle; if ( 'undefined' !== typeof values.fusion_table_type && '' !== values.fusion_table_type ) { tableStyle = values.element_content.charAt( 19 ); if ( ( '1' === tableStyle || '2' === tableStyle ) && tableStyle !== values.fusion_table_type ) { values.fusion_table_type = tableStyle; } attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'table-' + values.fusion_table_type } ); attr = _.fusionAnimations( values, attr ); if ( '' !== values.class ) { attr.class += ' ' + values.class; } if ( '' !== values.id ) { attr.id = values.id; } } return attr; }, /** * Generates table HTML. * * @since 2.0.0 * @param {string} tableDOM - The existing DOM. * @return {string} */ generateTable: function( tableDOM ) { var i, j, params = this.model.get( 'params' ), rowsNew = 'undefined' !== typeof params.fusion_table_rows ? parseInt( params.fusion_table_rows, 10 ) : 0, columnsNew = parseInt( params.fusion_table_columns, 10 ), tr = jQuery( tableDOM ).find( 'tbody > tr' ), thTdOld = jQuery( tableDOM ).find( 'th' ).length, tdOld = tr.first().children( 'td' ).length, rowsOld = tr.length + 1, columnsOld = Math.max( thTdOld, tdOld ), rowMarkup = ''; if ( rowsNew > rowsOld ) { for ( i = rowsOld; i < rowsNew; i++ ) { rowMarkup = ''; for ( j = 1; j <= columnsNew; j++ ) { rowMarkup += '<td align="left">Column ' + j + ' Value ' + i + '</td>'; } jQuery( tableDOM ).find( 'tbody' ).append( '<tr>' + rowMarkup + '</tr>' ); } } else if ( rowsNew < rowsOld && 0 !== rowsNew ) { for ( i = rowsNew + 1; i <= rowsOld; i++ ) { jQuery( tableDOM ).find( 'tbody > tr' ).last().remove(); } } if ( columnsNew > columnsOld ) { for ( i = columnsOld + 1; i <= columnsNew; i++ ) { jQuery( tableDOM ).find( 'thead tr' ).append( '<th align="left">Column ' + i + '</th>' ); jQuery( tableDOM ).find( 'tbody tr' ).each( function( index ) { var rowIndex = ( 0 < index ) ? ' ' + ( index + 1 ) : ''; jQuery( this ).append( '<td align="left">Column ' + i + ' Value' + rowIndex + '</td>' ); } ); } } else if ( columnsNew < columnsOld ) { for ( i = columnsNew + 1; i <= columnsOld; i++ ) { jQuery( tableDOM ).find( 'thead th' ).last().remove(); jQuery( tableDOM ).find( 'tbody tr' ).each( function() { jQuery( this ).find( 'td' ).last().remove(); } ); } } return tableDOM; }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {string} paramName - The name of the parameter that changed. * @param {mixed} paramValue - The value of the option that changed. * @param {Object} event - The event triggering the option change. * @return {void} */ onOptionChange: function( paramName, paramValue, event ) { var tableDOM; switch ( paramName ) { case 'fusion_table_rows': case 'fusion_table_columns': this.model.attributes.params[ paramName ] = paramValue; tableDOM = jQuery.parseHTML( this.model.attributes.params.element_content.trim() ); tableDOM = this.generateTable( tableDOM ); window.FusionPageBuilderApp.setContent( 'element_content', jQuery( tableDOM ).prop( 'outerHTML' ) ); break; } } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionBuilderGetContent */ /* eslint no-unused-vars: off */ /* eslint no-loop-func: off */ jQuery( document ).ready( function() { jQuery( 'body' ).on( 'change', '#fusion_table_type, #sliderfusion_table_rows, #sliderfusion_table_columns', function() { var types = [ '', 'table-1', 'table-2' ], tableOptions = jQuery( this ).closest( '.fusion_table' ), type = tableOptions.find( '#fusion_table_type' ).val(), rows = tableOptions.find( '#sliderfusion_table_rows' ).val(), columns = tableOptions.find( '#sliderfusion_table_columns' ).val(), oldContent, newContent, i, j, tableDOM; if ( true === FusionPageBuilderApp.shortcodeGenerator ) { oldContent = fusionBuilderGetContent( 'generator_element_content' ); } else { oldContent = fusionBuilderGetContent( 'element_content' ); } tableDOM = jQuery.parseHTML( oldContent.trim() ); tableDOM = generateTable( tableDOM, tableOptions ); newContent = jQuery( tableDOM ).prop( 'outerHTML' ); setTimeout( function() { if ( true === FusionPageBuilderApp.shortcodeGenerator ) { FusionPageBuilderApp.fusionBuilderSetContent( 'generator_element_content', newContent ); } else { FusionPageBuilderApp.fusionBuilderSetContent( 'element_content', newContent ); } }, 100 ); } ); /** * Generates table HTML. * * @since 2.0.0 * @param {string} tableDOM - The existing DOM. * @return {string} */ function generateTable( tableDOM, tableOptions ) { var i, j, styleNew = tableOptions.find( '#fusion_table_type' ).val(), rowsNew = parseInt( tableOptions.find( '#sliderfusion_table_rows' ).val() ), columnsNew = parseInt( tableOptions.find( '#sliderfusion_table_columns' ).val() ), styleOld = jQuery( tableDOM ).attr( 'class' ).replace( /[^\d.]/g, '' ), tr = jQuery( tableDOM ).find( 'tbody > tr' ), thTdOld = jQuery( tableDOM ).find( 'th' ).length, tdOld = tr.first().children( 'td' ).length, rowsOld = tr.length + 1, columnsOld = Math.max( thTdOld, tdOld ), rowMarkup = ''; if ( styleOld !== styleNew ) { jQuery( tableDOM ).attr( 'class', jQuery( tableDOM ).attr( 'class' ).replace( styleOld, styleNew ) ); } if ( rowsNew > rowsOld ) { if ( ! jQuery( tableDOM ).find( 'tbody' ).length ) { jQuery( tableDOM ).find( 'thead' ).after( '<tbody></tbod>' ); } for ( i = rowsOld; i < rowsNew; i++ ) { rowMarkup = ''; for ( j = 1; j <= columnsNew; j++ ) { rowMarkup += '<td align="left">Column ' + j + ' Value ' + i + '</td>'; } jQuery( tableDOM ).find( 'tbody' ).append( '<tr>' + rowMarkup + '</tr>' ); } } else if ( rowsNew < rowsOld && 0 !== rowsNew ) { for ( i = rowsNew + 1; i <= rowsOld; i++ ) { jQuery( tableDOM ).find( 'tbody > tr' ).last().remove(); } } if ( columnsNew > columnsOld ) { for ( i = columnsOld + 1; i <= columnsNew; i++ ) { jQuery( tableDOM ).find( 'thead tr' ).append( '<th align="left">Column ' + i + '</th>' ); jQuery( tableDOM ).find( 'tbody tr' ).each( function( index ) { var rowIndex = ( 0 < index ) ? ' ' + ( index + 1 ) : ''; jQuery( this ).append( '<td align="left">Column ' + i + ' Value' + rowIndex + '</td>' ); } ); } } else if ( columnsNew < columnsOld ) { for ( i = columnsNew + 1; i <= columnsOld; i++ ) { jQuery( tableDOM ).find( 'thead th' ).last().remove(); jQuery( tableDOM ).find( 'tbody tr' ).each( function() { jQuery( this ).find( 'td' ).last().remove(); } ); } } return tableDOM; } } ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Progress Bar Element View. FusionPageBuilder.fusion_progress = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrBar = this.buildBarAttr( atts.values ); attributes.attrSpan = this.buildSpanAttr( atts.values, atts.extras ); attributes.attrEditor = this.buildInlineEditorAttr( atts.values ); attributes.attrContent = this.buildContentAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; attributes.percentage = this.sanitizePercentage( atts.values.percentage ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.filledbordersize = _.fusionValidateAttrValue( values.filledbordersize, 'px' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-progressbar', style: '' } ); if ( 'above_bar' === values.text_position ) { attr[ 'class' ] += ' fusion-progressbar-text-above-bar'; } else if ( 'below_bar' === values.text_position ) { attr[ 'class' ] += ' fusion-progressbar-text-below-bar'; } else { attr[ 'class' ] += ' fusion-progressbar-text-on-bar'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } if ( values.text_align ) { attr.style += 'text-align:' + values.text_align; } return attr; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildInlineEditorAttr: function() { var attr = { class: 'fusion-progressbar-text', id: 'awb-progressbar-label-' + this.model.get( 'cid' ) }; attr = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), 'disable-return': true, 'disable-extra-spaces': true, toolbar: 'simple' }, attr ); return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildContentAttr: function( values ) { var attr = { class: 'progress progress-bar-content', role: 'progressbar', style: '' }; attr.style += 'width:' + this.sanitizePercentage( values.percentage ) + '%;'; attr.style += 'background-color:' + values.filledcolor + ';'; if ( '' !== values.filledbordersize && '' !== values.filledbordercolor ) { attr.style += 'border: ' + values.filledbordersize + ' solid ' + values.filledbordercolor + ';'; } if ( '' !== values.border_radius_top_left ) { attr.style += 'border-top-left-radius:' + values.border_radius_top_left + ';'; } if ( '' !== values.border_radius_top_right ) { attr.style += 'border-top-right-radius:' + values.border_radius_top_right + ';'; } if ( '' !== values.border_radius_bottom_left ) { attr.style += 'border-bottom-left-radius:' + values.border_radius_bottom_left + ';'; } if ( '' !== values.border_radius_bottom_right ) { attr.style += 'border-bottom-right-radius:' + values.border_radius_bottom_right + ';'; } attr.role = 'progressbar'; attr[ 'aria-labelledby' ] = 'awb-progressbar-label-' + this.model.get( 'cid' ); attr[ 'aria-valuemin' ] = '0'; attr[ 'aria-valuemax' ] = '100'; attr[ 'aria-valuenow' ] = values.percentage; return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildBarAttr: function( values ) { var attr = { class: 'fusion-progressbar-bar progress-bar', style: '' }; attr.style += 'background-color:' + values.unfilledcolor + ';'; if ( 'yes' === values.striped ) { attr[ 'class' ] += ' progress-striped'; } if ( 'yes' === values.animated_stripes ) { attr[ 'class' ] += ' active'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } if ( '' !== values.height ) { attr.style += 'height:' + values.height + ';'; } if ( '' !== values.border_radius_top_left ) { attr.style += 'border-top-left-radius:' + values.border_radius_top_left + ';'; } if ( '' !== values.border_radius_top_right ) { attr.style += 'border-top-right-radius:' + values.border_radius_top_right + ';'; } if ( '' !== values.border_radius_bottom_left ) { attr.style += 'border-bottom-left-radius:' + values.border_radius_bottom_left + ';'; } if ( '' !== values.border_radius_bottom_right ) { attr.style += 'border-bottom-right-radius:' + values.border_radius_bottom_right + ';'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildSpanAttr: function( values, extras ) { var attr = { class: 'progress-title', style: '' }; var empty_percentage = 0; attr.style += 'color:' + values.textcolor + ';'; if ( 'on_bar' === values.text_position ) { empty_percentage = 100 - this.sanitizePercentage( values.percentage ); if ( 66 > empty_percentage ) { if ( ! extras.is_rtl ) { attr.style += 'right: calc(15px + ' + empty_percentage + '%);'; } else { attr.style += 'left: calc(15px + ' + empty_percentage + '%);'; } } } attr.style += _.fusionGetFontStyle( 'text_font', values ); return attr; }, /** * Sanitize the percentage value, because this can come also from a * dynamic data which can be a string or a float. * * @since 3.6 * @param {Object} values - The values object. * @return {Object} */ sanitizePercentage: function( percentage ) { percentage = parseFloat( percentage ); // percentage can be NaN if parseFloat failed. if ( ! percentage ) { percentage = 0; } percentage = Math.round( percentage ); if ( 0 > percentage ) { percentage = 0; } if ( 100 < percentage ) { percentage = 100; } return percentage; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Scroll Progress Element View. FusionPageBuilder.fusion_scroll_progress = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.getStyles(); attributes.position = atts.values.position; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; return attributes; }, /** * Modify values. * * @since 3.3 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { var borderRadius = values.border_radius_top_left + ' ' + values.border_radius_top_right + ' ' + values.border_radius_bottom_right + ' ' + values.border_radius_bottom_left; values.border_radius = ( '0px 0px 0px 0px' === borderRadius ) ? '' : borderRadius; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-scroll-progress fusion-scroll-progress-' + this.model.get( 'cid' ), max: '100', value: '' } ); if ( 'flow' !== values.position ) { attr[ 'class' ] += ' fusion-fixed-' + values.position; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds inline styles. * * @since 3.3 * @return {Object} */ getStyles: function () { var css; this.baseSelector = '.fusion-scroll-progress-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( ! _.isEmpty( this.values.z_index ) && 'flow' !== this.values.position ) { this.addCssProperty( this.baseSelector, 'z-index', this.values.z_index, true ); } if ( ! _.isEmpty( this.values.height ) ) { this.addCssProperty( this.baseSelector, 'height', this.values.height ); this.addCssProperty( this.baseSelector + '::-moz-progress-bar', 'height', this.values.height ); this.addCssProperty( this.baseSelector + '::-webkit-progress-bar', 'height', this.values.height ); this.addCssProperty( this.baseSelector + '::-webkit-progress-value', 'height', this.values.height ); } if ( ! _.isEmpty( this.values.background_color ) ) { this.addCssProperty( this.baseSelector, 'background-color', this.values.background_color ); this.addCssProperty( this.baseSelector + '::-webkit-progress-bar', 'background-color', this.values.background_color ); } if ( ! _.isEmpty( this.values.progress_color ) ) { this.addCssProperty( this.baseSelector + '::-moz-progress-bar', 'background-color', this.values.progress_color ); this.addCssProperty( this.baseSelector + '::-webkit-progress-value', 'background-color', this.values.progress_color ); } if ( ! _.isEmpty( this.values.border_size ) && ! _.isEmpty( this.values.border_color ) ) { this.addCssProperty( this.baseSelector + '::-moz-progress-bar', 'border', _.fusionGetValueWithUnit( this.values.border_size ) + ' solid ' + this.values.border_color ); this.addCssProperty( this.baseSelector + '::-webkit-progress-value', 'border', _.fusionGetValueWithUnit( this.values.border_size ) + ' solid ' + this.values.border_color ); } if ( ! _.isEmpty( this.values.border_radius ) ) { this.addCssProperty( this.baseSelector, 'border-radius', this.values.border_radius ); this.addCssProperty( this.baseSelector + '::-moz-progress-bar', 'border-radius', this.values.border_radius ); this.addCssProperty( this.baseSelector + '::-webkit-progress-bar', 'border-radius', this.values.border_radius ); this.addCssProperty( this.baseSelector + '::-webkit-progress-value', 'border-radius', this.values.border_radius ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Accordion View. FusionPageBuilder.fusion_recent_posts = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ onRender: function() { var self = this; jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( document ).ready( function() { self.afterPatch(); } ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var elements = this.$el.find( '.fusion-recent-posts .flexslider' ); _.each( elements, function( element ) { element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( element ); if ( 'undefined' !== typeof element.data( 'flexslider' ) ) { element.flexslider( 'destroy' ); } } ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var elements = this.$el.find( '.fusion-recent-posts .flexslider' ); // Re-init flexsliders. setTimeout( function() { _.each( elements, function( element ) { element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( element ); // TODO: check timing here, after patch shouldn't really fire on initial load, otherwise duplicate flexislider. if ( 'function' === typeof element.flexslider ) { element.flexslider(); } } ); }, 300 ); }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { // Deprecated 5.2.1 hide value, mapped to no. values.excerpt = 'hide' === values.excerpt ? 'no' : values.excerpt; }, /** * Modify template attributes. * * @since 2.0.0 * @return {Object} */ filterTemplateAtts: function( atts ) { var columns = 3, attributes = {}, recentPostsShortcode = {}, recentPostsShortcodeColumn = {}, recentPostsShortcodeImgLink = {}, recentPostsShortcodeSection = {}, recentPostsShortcodeSlideshow = { class: 'fusion-flexslider flexslider' }; this.validateValues( atts.values ); if ( 'undefined' !== typeof this.model.attributes.query_data && 'undefined' !== typeof this.model.attributes.query_data.posts ) { if ( '' !== atts.values.columns ) { columns = 12 / parseInt( atts.values.columns, 10 ); } recentPostsShortcodeColumn[ 'class' ] = 'fusion-column column col col-lg-' + columns + ' col-md-' + columns + ' col-sm-' + columns + ''; if ( '5' === atts.values.columns ) { recentPostsShortcodeColumn[ 'class' ] = 'fusion-column column col-lg-2 col-md-2 col-sm-2'; } recentPostsShortcodeColumn = _.fusionAnimations( atts.values, recentPostsShortcodeColumn ); if ( 'thumbnails-on-side' === atts.values.layout ) { recentPostsShortcodeSlideshow[ 'class' ] += ' floated-slideshow'; } if ( '' !== atts.values.hover_type ) { recentPostsShortcodeSlideshow[ 'class' ] += ' flexslider-hover-type-' + atts.values.hover_type; } if ( '' !== atts.values.hover_type ) { recentPostsShortcodeImgLink[ 'class' ] = 'hover-type-' + atts.values.hover_type; } // recentPostsShortcode Attributes. recentPostsShortcode = _.fusionVisibilityAtts( atts.values.hide_on_mobile, { class: 'fusion-recent-posts avada-container layout-' + atts.values.layout + ' layout-columns-' + atts.values.columns } ); if ( '' !== atts.values[ 'class' ] ) { recentPostsShortcode[ 'class' ] += ' ' + atts.values[ 'class' ]; } if ( '' !== atts.values.id ) { recentPostsShortcode.id = atts.values.id; } // recentPostsShortcodeSection Attributes. recentPostsShortcodeSection[ 'class' ] = 'fusion-columns columns fusion-columns-' + atts.values.columns + ' columns-' + atts.values.columns; } if ( 'auto' === atts.values.picture_size ) { atts.values.image_size = 'full'; } else if ( 'default' === atts.values.layout ) { atts.values.image_size = 'recent-posts'; } else { atts.values.image_size = 'portfolio-five'; } attributes.metaInfoSettings = {}; attributes.metaInfoSettings.post_meta = ( 'yes' === atts.values.meta ); attributes.metaInfoSettings.post_meta_author = ( 'yes' === atts.values.meta_author ); attributes.metaInfoSettings.post_meta_date = ( 'yes' === atts.values.meta_date ); attributes.metaInfoSettings.post_meta_cats = ( 'yes' === atts.values.meta_categories ); attributes.metaInfoSettings.post_meta_tags = ( 'yes' === atts.values.meta_tags ); attributes.metaInfoSettings.post_meta_comments = ( 'yes' === atts.values.meta_comments ); attributes.metaInfoSettings.disable_date_rich_snippet_pages = atts.extras.disable_date_rich_snippet_pages; attributes.query_data = atts.query_data; attributes.extras = atts.extras; attributes.values = atts.values; attributes.recentPostsShortcode = recentPostsShortcode; attributes.recentPostsShortcodeColumn = recentPostsShortcodeColumn; attributes.recentPostsShortcodeImgLink = recentPostsShortcodeImgLink; attributes.recentPostsShortcodeSection = recentPostsShortcodeSection; attributes.recentPostsShortcodeSlideshow = recentPostsShortcodeSlideshow; return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Product Slider View. FusionPageBuilder.fusion_products_slider = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.wooProductSliderShortcode = {}; attributes.wooProductSliderShortcodeCarousel = {}; attributes.productList = false; attributes.placeholder = false; attributes.showNav = atts.values.show_nav; // Validate values. this.validateValues( atts.values ); // Create attribute objects. if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.products ) { attributes.wooProductSliderShortcode = this.buildWooProductSliderShortcodeAttr( atts.values ); attributes.wooProductSliderShortcodeCarousel = this.buildWooProductSliderShortcodeCarousel( atts.values ); attributes.productList = this.buildProductList( atts.values, atts.extras, atts.query_data ); } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.placeholder ) { attributes.placeholder = atts.query_data.placeholder; } return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.column_spacing = _.fusionValidateAttrValue( values.column_spacing, '' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildWooProductSliderShortcodeAttr: function( values ) { var wooProductSliderShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-product-slider fusion-woo-slider' } ); if ( '' !== values[ 'class' ] ) { wooProductSliderShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { wooProductSliderShortcode.id = values.id; } return wooProductSliderShortcode; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildWooProductSliderShortcodeCarousel: function( values ) { var wooProductSliderShortcodeCarousel = { class: 'fusion-carousel' }; if ( 'title_below_image' === values.carousel_layout ) { wooProductSliderShortcodeCarousel[ 'class' ] += ' fusion-carousel-title-below-image'; wooProductSliderShortcodeCarousel[ 'data-metacontent' ] = 'yes'; } else { wooProductSliderShortcodeCarousel[ 'class' ] += ' fusion-carousel-title-on-rollover'; } wooProductSliderShortcodeCarousel[ 'data-autoplay' ] = values.autoplay; wooProductSliderShortcodeCarousel[ 'data-columns' ] = values.columns; wooProductSliderShortcodeCarousel[ 'data-itemmargin' ] = values.column_spacing; wooProductSliderShortcodeCarousel[ 'data-itemwidth' ] = 180; wooProductSliderShortcodeCarousel[ 'data-touchscroll' ] = values.mouse_scroll; wooProductSliderShortcodeCarousel[ 'data-imagesize' ] = values.picture_size; wooProductSliderShortcodeCarousel[ 'data-scrollitems' ] = values.scroll_items; return wooProductSliderShortcodeCarousel; }, /** * Builds the product list and returns the HTML. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra args. * @param {Object} queryData - The query data. * @return {string} */ buildProductList: function( values, extras, queryData ) { var productList = '', designClass = 'fusion-' + extras.box_design + '-product-image-wrapper', featuredImageSize = 'full', showCats, showPrice, showButtons; ( 'yes' === values.show_cats ) ? ( showCats = 'enable' ) : ( showCats = 'disable' ); ( 'yes' === values.show_price ) ? ( showPrice = true ) : ( showPrice = false ); ( 'yes' === values.show_buttons ) ? ( showButtons = true ) : ( showButtons = false ); if ( 'fixed' === values.picture_size ) { featuredImageSize = 'portfolio-five'; } _.each( queryData.products, function( product ) { var inCart = jQuery.inArray( product.id, queryData.items_in_cart ), image = '', imageData = product.image_data; imageData.image_size = featuredImageSize; imageData.display_woo_sale = 'yes' === values.show_sale; // Title on rollover layout. if ( 'title_on_rollover' === values.carousel_layout ) { imageData.image_size = featuredImageSize; imageData.display_woo_price = showPrice; imageData.display_woo_buttons = showButtons; imageData.display_post_categories = showCats; imageData.display_post_title = 'enable'; imageData.display_rollover = 'yes'; image = _.fusionFeaturedImage( imageData ); // Title below image layout. } else { imageData.image_size = featuredImageSize; imageData.display_woo_price = false; imageData.display_woo_buttons = showButtons; imageData.display_post_categories = 'disable'; imageData.display_post_title = 'disable'; imageData.display_rollover = 'yes'; if ( 'yes' === values.show_buttons ) { image = _.fusionFeaturedImage( imageData ); } else { imageData.display_rollover = 'no'; image = _.fusionFeaturedImage( imageData ); } // Get the post title. image += '<h4 class="fusion-carousel-title">'; image += '<a href="' + product.permalink + '" target="_self">' + product.title + '</a>'; image += '</h4>'; image += '<div class="fusion-carousel-meta">'; // Get the terms. if ( true === showCats || 'enable' === showCats ) { image += product.terms; } // Check if we should render the woo product price. if ( true === showPrice || 'enable' === showPrice ) { image += '<div class="fusion-carousel-price">' + product.price + '</div>'; } image += '</div>'; } if ( -1 !== inCart ) { productList += '<li class="fusion-carousel-item"><div class="' + designClass + ' fusion-item-in-cart"><div class="fusion-carousel-item-wrapper">' + image + '</div></div></li>'; } else { productList += '<li class="fusion-carousel-item"><div class="' + designClass + '"><div class="fusion-carousel-item-wrapper">' + image + '</div></div></li>'; } } ); return productList; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Product Component View. FusionPageBuilder.fusion_woo_product_grid = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.productsLoop = this.buildOutput( atts ); attributes.productsAttrs = this.buildProductsAttrs( atts.values ); attributes.pagination = this.buildPagination( atts ); attributes.paginationAttrs = this.buildPaginationAttrs(); attributes.query_data = atts.query_data; // add placeholder. attributes.query_data.placeholder = this.getComponentPlaceholder(); attributes.values = atts.values; attributes.loadMoreText = atts.extras.load_more_text; return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-product-grid fusion-product-archive fusion-woo-product-grid-' + this.model.get( 'cid' ) } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( this.isSpacingOff() ) { attr[ 'class' ] += ' fusion-woo-product-grid-spacing-off'; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds carousel nav. * * @since 3.2 * @return {string} */ buildCarouselNav: function() { var output = ''; output += '<div class="fusion-carousel-nav">'; output += '<span class="fusion-nav-prev"></span>'; output += '<span class="fusion-nav-next"></span>'; output += '</div>'; return output; }, /** * Builds carousel attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildCarouselAttrs: function( values ) { var attr = { class: 'fusion-carousel' }; /** * Set the autoplay variable. */ attr[ 'data-autoplay' ] = values.products_autoplay; /** * Set the touch scroll variable. */ attr[ 'data-touchscroll' ] = values.products_swipe; attr[ 'data-columns' ] = values.products_columns; attr[ 'data-itemmargin' ] = parseInt( values.products_column_spacing ) + 'px'; attr[ 'data-itemwidth' ] = 180; attr[ 'data-scrollitems' ] = ( 0 == values.products_swipe_items ) ? '' : values.products_swipe_items; return attr; }, /** * Builds products UL attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildProductsAttrs: function( values ) { var attr = { class: 'products products-' + values.columns }; return attr; }, /** * Builds pagination attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildPaginationAttrs: function() { var attr = { class: 'fusion-woo-product-grid-pagination fusion-clearfix' }; if ( this.isLoadMore() ) { attr[ 'class' ] += ' infinite-scroll infinite-scroll-hide'; } return attr; }, /** * Check is load more. * * @since 3.2 * @return {boolean} */ isLoadMore: function() { return -1 !== jQuery.inArray( this.values.scrolling, [ 'infinite', 'load_more_button' ] ); }, /** * Check if spacing should be off. * * @since 3.3 * @return {boolean} */ isSpacingOff: function() { return ! this.isDefault( 'show_price' ) && ! this.isDefault( 'show_rating' ); }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.loop_product ) { output = atts.query_data.loop_product; } return output; }, /** * Builds pagination. * * @since 3.2 * @param {Object} atts - The atts object. * @return {String} */ buildPagination: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.pagination ) { output = atts.query_data.pagination; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, selectors, column_spacing, colors, gradient, gradient_after; this.baseSelector = '.fusion-woo-product-grid.fusion-woo-product-grid-' + this.model.get( 'cid' ); this.dynamic_css = {}; // Grid Box styles. selectors = [ this.baseSelector + ' .products li.product .fusion-product-wrapper' ]; if ( ! this.isDefault( 'grid_box_color' ) ) { this.addCssProperty( selectors, 'background-color', values.grid_box_color ); } if ( ! this.isDefault( 'grid_border_color' ) ) { this.addCssProperty( selectors, 'border-color', values.grid_border_color ); } // Separators styles. selectors = [ this.baseSelector + ' .fusion-content-sep' ]; if ( ! this.isDefault( 'grid_separator_color' ) ) { if ( 'shadow' !== values.grid_separator_style_type ) { this.addCssProperty( selectors, 'border-color', values.grid_separator_color ); } else { colors = jQuery.AWB_Color( values.grid_separator_color ); gradient = 'linear-gradient(to left, rgba({1}, {2}, {3}, 0) 0%, rgba({1}, {2}, {3}, 0) 15%, rgba({1}, {2}, {3}, 0.65) 50%, rgba({1}, {2}, {3}, 0) 85%, rgba({1}, {2}, {3}, 0) 100%)'; gradient = gradient.replace( /\{1\}/g, colors.red() ).replace( /\{2\}/g, colors.green() ).replace( /\{3\}/g, colors.blue() ); gradient_after = 'radial-gradient(ellipse at 50% -50%, rgba({1}, {2}, {3}, 0.5) 0, rgba(255, 255, 255, 0) 65%)'; gradient_after = gradient_after.replace( /\{1\}/g, colors.red() ).replace( /\{2\}/g, colors.green() ).replace( /\{3\}/g, colors.blue() ); this.addCssProperty( selectors, 'background', gradient ); this.addCssProperty( [ this.baseSelector + ' .fusion-content-sep:after' ], 'background', gradient_after ); } } // Hide styles. selectors = [ this.baseSelector + ' .product-title' ]; if ( ! this.isDefault( 'show_title' ) ) { this.addCssProperty( selectors, 'display', 'none' ); } selectors = [ this.baseSelector + ' .fusion-price-rating .price' ]; if ( ! this.isDefault( 'show_price' ) ) { this.addCssProperty( selectors, 'display', 'none' ); } selectors = [ this.baseSelector + ' .fusion-price-rating .star-rating', this.baseSelector + ' .fusion-rollover .star-rating' ]; if ( ! this.isDefault( 'show_rating' ) ) { this.addCssProperty( selectors, 'display', 'none' ); } selectors = [ this.baseSelector + ' .product-buttons', this.baseSelector + ' .fusion-product-buttons' ]; if ( ! this.isDefault( 'show_buttons' ) ) { this.addCssProperty( selectors, 'display', 'none' ); } selectors = [ this.baseSelector + ' .fusion-product-content' ]; if ( ! this.isDefault( 'show_title' ) && ! this.isDefault( 'show_price' ) && ! this.isDefault( 'show_rating' ) && ! this.isDefault( 'show_buttons' ) ) { this.addCssProperty( selectors, 'display', 'none' ); } selectors = [ this.baseSelector + ' .infinite-scroll-hide' ]; if ( this.isLoadMore() ) { this.addCssProperty( selectors, 'display', 'none' ); } this.addCssProperty( [ this.baseSelector + '.fusion-woo-product-grid-spacing-off .product .product-buttons' ], 'padding-top', '0' ); this.addCssProperty( [ this.baseSelector + '.fusion-woo-product-grid-spacing-off .product-details-container' ], 'min-height', '0' ); if ( ! this.isDefault( 'column_spacing' ) && 1 < parseInt( values.columns ) ) { selectors = [ this.baseSelector + ' ul.products' ]; column_spacing = _.fusionGetValueWithUnit( values.column_spacing ); this.addCssProperty( selectors, 'margin-top', 'calc((' + column_spacing + ')/ -2)' ); this.addCssProperty( selectors, 'margin-right', 'calc((' + column_spacing + ')/ -2)' ); this.addCssProperty( selectors, 'margin-left', 'calc((' + column_spacing + ')/ -2)' ); selectors = [ this.baseSelector + ' ul.products .product' ]; this.addCssProperty( selectors, 'padding', 'calc((' + column_spacing + ')/ 2)' ); } selectors = [ this.baseSelector ]; // Margin styles. if ( ! this.isDefault( 'margin_top' ) ) { this.addCssProperty( selectors, 'margin-top', values.margin_top ); } if ( ! this.isDefault( 'margin_right' ) ) { this.addCssProperty( selectors, 'margin-right', values.margin_right ); } if ( ! this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( selectors, 'margin-bottom', values.margin_bottom ); } if ( ! this.isDefault( 'margin_left' ) ) { this.addCssProperty( selectors, 'margin-left', values.margin_left ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Sorting Component View. FusionPageBuilder.fusion_woo_sorting = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); attributes.query_data = atts.query_data; attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'catalog-ordering fusion-woo-sorting fusion-woo-sorting-' + this.model.get( 'cid' ) } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.output ) { output = atts.query_data.output; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, selectors; this.baseSelector = '.fusion-woo-sorting.fusion-woo-sorting-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectors = [ this.baseSelector ]; // Fix z-index issue. this.addCssProperty( selectors, 'z-index', '100' ); this.addCssProperty( selectors, 'position', 'relative' ); // Margin styles. if ( ! this.isDefault( 'margin_top' ) ) { this.addCssProperty( selectors, 'margin-top', values.margin_top ); } if ( ! this.isDefault( 'margin_right' ) ) { this.addCssProperty( selectors, 'margin-right', values.margin_right ); } if ( ! this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( selectors, 'margin-bottom', values.margin_bottom ); } else { this.addCssProperty( selectors, 'margin-bottom', '0px' ); } if ( ! this.isDefault( 'margin_left' ) ) { this.addCssProperty( selectors, 'margin-left', values.margin_left ); } selectors = [ this.baseSelector + ' .order-dropdown .current-li', this.baseSelector + ' .order-dropdown ul li a:not(:hover)', this.baseSelector + '.catalog-ordering .order li a:not(:hover)', this.baseSelector + ' .fusion-grid-list-view li:not(.active-view):not(:hover)' ]; // Dropdown bg color. if ( ! this.isDefault( 'dropdown_bg_color' ) ) { this.addCssProperty( selectors, 'background-color', values.dropdown_bg_color ); } selectors = [ this.baseSelector + ' .order-dropdown ul li a:hover', this.baseSelector + '.catalog-ordering .order li a:hover', this.baseSelector + ' .fusion-grid-list-view li:hover', this.baseSelector + ' .fusion-grid-list-view li.active-view' ]; // Dropdown hover / active bg color. if ( ! this.isDefault( 'dropdown_hover_bg_color' ) ) { this.addCssProperty( selectors, 'background-color', values.dropdown_hover_bg_color ); } selectors = [ this.baseSelector + ' .order-dropdown', this.baseSelector + ' .order-dropdown a', this.baseSelector + ' .order-dropdown ul li a', this.baseSelector + ' .order-dropdown a:hover', this.baseSelector + ' .order-dropdown > li:after', this.baseSelector + ' .order-dropdown ul li a:hover', this.baseSelector + '.catalog-ordering .order li a', this.baseSelector + ' .fusion-grid-list-view a', this.baseSelector + ' .fusion-grid-list-view li:hover', this.baseSelector + ' .fusion-grid-list-view li.active-view a i' ]; // Dropdown text color. if ( ! this.isDefault( 'dropdown_text_color' ) ) { this.addCssProperty( selectors, 'color', values.dropdown_text_color ); } selectors = [ this.baseSelector + ' .order-dropdown > li:after', this.baseSelector + ' .order-dropdown .current-li', this.baseSelector + ' .order-dropdown ul li a', this.baseSelector + '.catalog-ordering .order li a', this.baseSelector + ' .fusion-grid-list-view', this.baseSelector + ' .fusion-grid-list-view li' ]; // Dropdown border color. if ( ! this.isDefault( 'dropdown_border_color' ) ) { this.addCssProperty( selectors, 'border-color', values.dropdown_border_color ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Slider parent View. FusionPageBuilder.fusion_slider = FusionPageBuilder.ParentElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { // TODO: save DOM and apply instead of generating this.generateChildElements(); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, slides = window.FusionPageBuilderApp.findShortcodeMatches( atts.params.element_content, 'fusion_slide' ), slideElement; this.model.attributes.showPlaceholder = false; if ( 1 <= slides.length ) { slideElement = slides[ 0 ].match( window.FusionPageBuilderApp.regExpShortcode( 'fusion_slide' ) ); this.model.attributes.showPlaceholder = ( 'undefined' === typeof slideElement[ 5 ] || '' === slideElement[ 5 ] || 'undefined' === slideElement[ 5 ] ) ? true : false; } // Validate values. this.validateValues( atts.values ); // Create attribute objects. attributes.sliderShortcode = this.buildSliderAttr( atts.values ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.width = _.fusionValidateAttrValue( values.width, 'px' ); values.height = _.fusionValidateAttrValue( values.height, 'px' ); if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } values.slideshow_autoplay = ( 'yes' === values.slideshow_autoplay || '1' === values.slideshow_autoplay ) ? true : false; values.slideshow_smooth_height = ( 'yes' === values.slideshow_smooth_height || '1' === values.slideshow_smooth_height ) ? true : false; }, buildSliderAttr: function( values ) { var sliderShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-slider-sc flexslider' } ); if ( true === this.model.attributes.showPlaceholder ) { sliderShortcode[ 'class' ] += ' fusion-show-placeholder'; } if ( '' !== values.hover_type ) { sliderShortcode[ 'class' ] += ' flexslider-hover-type-' + values.hover_type; } if ( '' !== values.alignment ) { sliderShortcode[ 'class' ] += ' fusion-align' + values.alignment; } if ( -1 !== values.width.indexOf( 'px' ) && -1 !== values.height.indexOf( 'px' ) ) { sliderShortcode[ 'class' ] += ' fusion-slider-sc-cover'; } if ( '' !== values.slideshow_autoplay ) { sliderShortcode[ 'data-slideshow_autoplay' ] = values.slideshow_autoplay ? '1' : '0'; } if ( '' !== values.slideshow_smooth_height ) { sliderShortcode[ 'data-slideshow_smooth_height' ] = values.slideshow_smooth_height ? '1' : '0'; } if ( '' !== values.slideshow_speed ) { sliderShortcode[ 'data-slideshow_speed' ] = values.slideshow_speed; } sliderShortcode.style = 'max-width:' + values.width + ';height:' + values.height + ';'; if ( values.margin_top ) { sliderShortcode.style += 'margin-top:' + values.margin_top + ';'; } if ( values.margin_right ) { sliderShortcode.style += 'margin-right:' + values.margin_right + ';'; } if ( values.margin_bottom ) { sliderShortcode.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( values.margin_left ) { sliderShortcode.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { sliderShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { sliderShortcode.id = values.id; } return sliderShortcode; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionPageBuilderElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Slide child View. FusionPageBuilder.fusion_slide = FusionPageBuilder.ChildElementView.extend( { /** * Runs just before view is removed. * * @since 2.0.0 * @return null */ beforeRemove: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'undefined' !== typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.closest( '.flexslider:not(.tfs-slider)' ) ).data( 'flexslider' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.closest( '.flexslider:not(.tfs-slider)' ) ).flexslider( 'destroy' ); } if ( false === parentView.model.attributes.showPlaceholder && 1 === parentView.model.children.length ) { this.$el.closest( '.fusion-slider-sc' ).addClass( 'fusion-show-placeholder' ); parentView.model.attributes.showPlaceholder = true; } }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.model.attributes.selectors[ 'class' ] += ( 'video' === this.model.attributes.params.type ) ? ' video' : ' image'; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.model.attributes.selectors[ 'class' ] += ( 'video' === this.model.attributes.params.type ) ? ' video' : ' image'; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } this._refreshJs(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( true === parentView.model.attributes.showPlaceholder && ( ( 'undefined' !== this.model.attributes.params.image && '' !== this.model.attributes.params.image ) || ( 'undefined' !== this.model.attributes.params.video && '' !== this.model.attributes.params.video ) ) ) { this.$el.closest( '.fusion-slider-sc' ).removeClass( 'fusion-show-placeholder' ); parentView.model.attributes.showPlaceholder = false; } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values and extras. this.validateValues( atts.values ); // Create attribute objects. attributes.sliderShortcodeSlideLink = this.buildSlideLinkAttr( atts.values ); attributes.sliderShortcodeSlideLi = this.buildLiAttr( atts.values ); attributes.sliderShortcodeSlideImg = this.buildImgAttr( atts.values ); attributes.sliderShortcodeSlideImgWrapper = this.buildSlideImgWrapperAttr( atts.values ); attributes.link = atts.values.link; attributes.type = atts.values.type; attributes.video = atts.values.video; attributes.elementContent = atts.values.element_content; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.alt = ''; values.title = ''; values.src = values.element_content ? values.element_content.replace( '×', 'x' ) : ''; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSlideLinkAttr: function( values ) { var sliderShortcodeSlideLink = {}; if ( 'yes' === values.lightbox ) { sliderShortcodeSlideLink[ 'class' ] = 'lightbox-enabled'; sliderShortcodeSlideLink[ 'data-rel' ] = 'prettyPhoto[gallery_slider_' + this.model.get( 'cid' ) + ']'; } sliderShortcodeSlideLink.href = values.link; sliderShortcodeSlideLink.target = values.linktarget; if ( '_blank' === sliderShortcodeSlideLink.target ) { sliderShortcodeSlideLink.rel = 'noopener noreferrer'; } sliderShortcodeSlideLink.title = values.title; return sliderShortcodeSlideLink; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLiAttr: function( values ) { var sliderShortcodeSlideLi = { class: ( 'video' === values.type ) ? 'video' : 'image' }; this.model.set( 'selectors', sliderShortcodeSlideLi ); return sliderShortcodeSlideLi; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildImgAttr: function( values ) { var sliderShortcodeSlideImg = { src: values.image, alt: values.alt }; return sliderShortcodeSlideImg; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildSlideImgWrapperAttr: function() { var sliderShortcodeSlideImgWrapper = {}, parent = this.model.get( 'parent' ), parentModel, parentValues; if ( parent ) { parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ); parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_slider.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); if ( '' !== parentValues.hover_type ) { sliderShortcodeSlideImgWrapper = { class: 'fusion-image-hover-element hover-type-' + parentValues.hover_type }; } } return sliderShortcodeSlideImgWrapper; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Image Hotspots View. FusionPageBuilder.fusion_image_hotspots = FusionPageBuilder.ParentElementView.extend( { /** * Modify template attributes. * * @since 3.5 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.hotspotImage = this.getImageHtml( atts.values ); attributes.cid = this.model.get( 'cid' ); attributes.elementAttr = this.elementAttr( atts.values ); attributes.styleTag = this.getStyleElement( atts.values ); return attributes; }, /** * Create the image element. * * @since 3.5 * @param {Object} values - The options. * @return {Object} */ getImageHtml: function( values ) { var imgAttr = '', imageData; if ( ! values.image ) { return ''; } if ( _.FusionIsValidJSON( values.image ) ) { imageData = this.getLogoImage( values.image ); values.image = imageData.url; } // There is no width/height/alt/title attributes like in php file. imgAttr = 'src="' + values.image + '"'; imgAttr += ' class="awb-image-hotspots-image"'; return '<img ' + imgAttr + '/>'; }, /** * Create the element attributes. * * @since 3.5 * @param {Object} values - The options. * @return {Object} */ elementAttr: function( values ) { var atts = { 'class': 'awb-image-hotspots' }, alignmentLarge, alignmentMedium, alignmentSmall; atts[ 'class' ] += ' ' + this.getBaseClass(); atts = _.fusionVisibilityAtts( values.hide_on_mobile, atts ); if ( values[ 'class' ] ) { atts[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { atts.id = values.id; } atts = _.fusionAnimations( values, atts ); alignmentLarge = values.alignment; if ( ! _.isEmpty( alignmentLarge ) ) { atts.style = 'justify-content:' + alignmentLarge + ';'; } alignmentMedium = ! _.isEmpty( values.alignment_medium ) ? values.alignment_medium : false; if ( alignmentMedium && alignmentLarge !== alignmentMedium ) { atts[ 'class' ] += ' md-flex-align-' + alignmentMedium; } alignmentSmall = ! _.isEmpty( values.alignment_small ) ? values.alignment_small : false; if ( alignmentSmall && alignmentLarge !== alignmentSmall ) { atts[ 'class' ] += ' sm-flex-align-' + alignmentSmall; } return atts; }, /** * Create the style HTML element. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getStyleElement: function( values ) { var style, baseSelector = '.awb-image-hotspots.' + this.getBaseClass(), imageWrapperSelector = baseSelector + ' .awb-image-hotspots-wrapper', popoverSelector = baseSelector + ' .popover', popoverHeadingSelector = baseSelector + ' .popover-title', popoverContentSelector = baseSelector + ' .popover-content', popoverBorderColorSelectors = [ popoverSelector, popoverHeadingSelector, popoverContentSelector ], popoverBorderColorArrowRight = [ baseSelector + ' .popover.right .arrow', baseSelector + ' .popover.right .arrow:after' ], popoverBorderColorArrowLeft = [ baseSelector + ' .popover.left .arrow', baseSelector + ' .popover.left .arrow:after' ], popoverBorderColorArrowTop = [ baseSelector + ' .popover.top .arrow', baseSelector + ' .popover.top .arrow:after' ], popoverBorderColorArrowBottom = [ baseSelector + ' .popover.bottom .arrow', baseSelector + ' .popover.bottom .arrow:after' ]; this.dynamic_css = {}; this.values = values; if ( ! _.isEmpty( values.image_max_width ) ) { this.addCssProperty( imageWrapperSelector, 'max-width', values.image_max_width ); } if ( ! _.isEmpty( values.popover_heading_background_color ) ) { this.addCssProperty( popoverHeadingSelector, 'background-color', values.popover_heading_background_color ); this.addCssProperty( popoverBorderColorArrowBottom, 'border-bottom-color', values.popover_heading_background_color ); } if ( ! _.isEmpty( values.popover_content_background_color ) ) { this.addCssProperty( popoverContentSelector, 'background-color', values.popover_content_background_color ); this.addCssProperty( popoverBorderColorArrowRight, 'border-right-color', values.popover_content_background_color ); this.addCssProperty( popoverBorderColorArrowLeft, 'border-left-color', values.popover_content_background_color ); this.addCssProperty( popoverBorderColorArrowTop, 'border-top-color', values.popover_content_background_color ); } if ( ! _.isEmpty( values.popover_text_color ) ) { this.addCssProperty( [ popoverHeadingSelector, popoverContentSelector ], 'color', values.popover_text_color ); } if ( ! _.isEmpty( values.popover_border_color ) ) { this.addCssProperty( popoverSelector, 'background-color', values.popover_border_color ); this.addCssProperty( popoverBorderColorSelectors, 'border-color', values.popover_border_color ); } if ( ! _.isEmpty( values.margin_top ) ) { this.addCssProperty( baseSelector, 'margin-top', values.margin_top ); } if ( ! _.isEmpty( values.margin_right ) ) { this.addCssProperty( baseSelector, 'margin-right', values.margin_right ); } if ( ! _.isEmpty( values.margin_bottom ) ) { this.addCssProperty( baseSelector, 'margin-bottom', values.margin_bottom ); } if ( ! _.isEmpty( values.margin_left ) ) { this.addCssProperty( baseSelector, 'margin-left', values.margin_left ); } style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; }, /** * Get the class name with an unique id among elements. * * @since 3.5 * @return {string} */ getBaseClass: function() { return 'awb-image-hotspots-' + this.model.get( 'cid' ); }, /** * Get the logo src. * * @since 3.5 * @param {string} logo_json * @return {string} */ getLogoImage: function( logo_json ) { var data = { 'id': '', 'url': '', 'srcset': '' }, i, keys_to_verify = [ 'default', 'sticky', 'mobile' ], is_url, is_retina_url, key; logo_json = JSON.parse( logo_json ); for ( i = 0; 3 > i; i++ ) { key = keys_to_verify[ i ]; if ( ! logo_json || ! logo_json[ key ] || ! logo_json[ key ].normal ) { continue; // eslint-disable-line no-continue } is_url = ( ! _.isEmpty( logo_json[ key ].normal.url ) && ! _.isEmpty( logo_json[ key ].normal.id ) ); is_retina_url = ( ! _.isEmpty( logo_json[ key ].retina.url ) && ! _.isEmpty( logo_json[ key ].retina.id ) ); if ( is_url ) { data.url = logo_json[ key ].normal.url; data.id = logo_json[ key ].normal.id; data.srcset = data.url + ' 1x'; if ( is_retina_url ) { data.srcset += ', ' + logo_json[ key ].retina.url + ' 2x'; } return data; } if ( is_retina_url ) { data.url = logo_json[ key ].retina.url; data.id = logo_json[ key ].retina.id; data.srcset = data.url + ' 1x'; return data; } } return data; }, /** * Run after the element has been patched. * * @since 3.5 * @return {void} */ afterPatch: function() { var popover = ''; // Call the parent afterPatch. FusionPageBuilder.ParentElementView.prototype.afterPatch.bind( this )(); popover = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.el ).find( '[data-awb-toggle-image-hotspot-popover="true"]' ); popover.popover( 'destroy' ); popover.popover(); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionPageBuilderElements, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Toggle child View FusionPageBuilder.fusion_image_hotspot_point = FusionPageBuilder.ChildElementView.extend( { /** * Modify template attributes. * * @since 3.5 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ); this.parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_image_hotspots.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); this.values = atts.values; attributes.cid = this.model.get( 'cid' ); attributes.hotspotItemText = atts.values.title; attributes.icon = atts.values.icon; attributes.iconAttr = this.childElemIconAttr( atts.values ); attributes.styleTag = this.getChildrenStyleElement( atts.values ); this.childElemAttr( atts.values ); return attributes; }, /** * Create the style tag. * * @since 3.5 * @param {Object} values - The options. * @return {Object} */ getChildrenStyleElement: function( values ) { var style = '', baseClassId = '.awb-image-hotspots-hotspot-' + this.model.get( 'cid' ), baseClassName = '.awb-image-hotspots-hotspot' + baseClassId, hoveredBaseClass = [ baseClassName + ':hover', baseClassName + ':focus' ], animationClassName; this.dynamic_css = {}; this.values = values; if ( ! _.isEmpty( values.pos_x ) ) { this.addCssProperty( baseClassName, 'left', values.pos_x + '%' ); } if ( ! _.isEmpty( values.pos_y ) ) { this.addCssProperty( baseClassName, 'top', values.pos_y + '%' ); } if ( ! _.isEmpty( values.font_size ) ) { this.addCssProperty( baseClassName, 'font-size', values.font_size ); } if ( ! _.isEmpty( values.hotspot_text_color ) ) { this.addCssProperty( baseClassName, 'color', values.hotspot_text_color ); } if ( ! _.isEmpty( values.hotspot_background_color ) ) { this.addCssProperty( baseClassName, 'background-color', values.hotspot_background_color ); if ( 'sonar' === this.parentValues.items_animation ) { animationClassName = baseClassId + '.' + this.animationToClassName( this.parentValues.items_animation ); this.addCssProperty( animationClassName, 'border-color', values.hotspot_background_color ); } } if ( ! _.isEmpty( values.hotspot_hover_text_color ) ) { this.addCssProperty( hoveredBaseClass, 'color', values.hotspot_hover_text_color ); } if ( ! _.isEmpty( values.hotspot_hover_background_color ) ) { this.addCssProperty( hoveredBaseClass, 'background-color', values.hotspot_hover_background_color ); if ( 'sonar' === this.parentValues.items_animation ) { animationClassName = [ baseClassId + ':hover.' + this.animationToClassName( this.parentValues.items_animation ), baseClassId + ':focus.' + this.animationToClassName( this.parentValues.items_animation ) ]; this.addCssProperty( animationClassName, 'border-color', values.hotspot_hover_background_color ); } } if ( ! _.isEmpty( values.padding_top ) ) { this.addCssProperty( baseClassName, 'padding-top', values.padding_top ); } if ( ! _.isEmpty( values.padding_right ) ) { this.addCssProperty( baseClassName, 'padding-right', values.padding_right ); } if ( ! _.isEmpty( values.padding_bottom ) ) { this.addCssProperty( baseClassName, 'padding-bottom', values.padding_bottom ); } if ( ! _.isEmpty( values.padding_left ) ) { this.addCssProperty( baseClassName, 'padding-left', values.padding_left ); } if ( ! _.isEmpty( values.border_radius_top_left ) ) { this.addCssProperty( baseClassName, 'border-top-left-radius', values.border_radius_top_left ); } if ( ! _.isEmpty( values.border_radius_top_right ) ) { this.addCssProperty( baseClassName, 'border-top-right-radius', values.border_radius_top_right ); } if ( ! _.isEmpty( values.border_radius_bottom_right ) ) { this.addCssProperty( baseClassName, 'border-bottom-right-radius', values.border_radius_bottom_right ); } if ( ! _.isEmpty( values.border_radius_bottom_left ) ) { this.addCssProperty( baseClassName, 'border-bottom-left-radius', values.border_radius_bottom_left ); } style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; }, /** * Create the child element attributes. * * @since 3.5 * @param {Object} values - The options. * @return {Object} */ childElemAttr: function( values ) { // Using the style attribute, because jQuery methods auto-corrects invalid values. var style = '', placement = '', animationClass = '', textArea, title, popoverContent = values.long_text; this.$el.addClass( 'awb-image-hotspots-hotspot' ); this.$el.addClass( 'awb-image-hotspots-hotspot-' + this.model.get( 'cid' ) ); animationClass = this.animationToClassName( this.parentValues.items_animation ); if ( animationClass ) { this.$el.addClass( animationClass ); } this.$el.attr( 'style', style ); try { if ( popoverContent && '' !== popoverContent && FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( popoverContent ) ) === popoverContent ) { popoverContent = FusionPageBuilderApp.base64Decode( popoverContent ); } } catch ( error ) { console.log( error ); // jshint ignore:line } // Remove the attributes, because this element is not totally replaced. this.$el.removeAttr( 'role' ); this.$el.removeAttr( 'tabindex' ); this.$el.removeAttr( 'href' ); this.$el.removeAttr( 'title' ); this.$el.removeAttr( 'target' ); this.$el.removeAttr( 'data-awb-toggle-image-hotspot-popover' ); this.$el.removeAttr( 'data-trigger' ); this.$el.removeAttr( 'data-title' ); this.$el.removeAttr( 'data-content' ); this.$el.removeAttr( 'data-placement' ); if ( 'link' === values.button_action ) { this.$el.attr( 'href', values.link ); if ( values.link_title ) { this.$el.attr( 'title', values.link_title ); } if ( 'new_tab' === values.link_open_method ) { this.$el.attr( 'target', '_blank' ); } } else { // The title needs to be decoded for special characters. textArea = document.createElement( 'textarea' ); textArea.innerHTML = String( values.long_title ).trim(); title = textArea.value; if ( ! _.isString( title ) ) { title = ''; } this.$el.attr( 'role', 'button' ); this.$el.attr( 'href', '#' ); this.$el.attr( 'tabindex', '0' ); this.$el.attr( 'data-awb-toggle-image-hotspot-popover', 'true' ); this.$el.attr( 'data-trigger', this.parentValues.popover_trigger ); this.$el.attr( 'data-title', title ); this.$el.attr( 'data-content', String( popoverContent ).trim() ); placement = 'auto'; if ( 'auto' !== values.popover_placement ) { placement += ' ' + values.popover_placement; } this.$el.attr( 'data-placement', placement ); } }, /** * Create the child icon element attributes. * * @since 3.5 * @param {Object} values - The options. * @return {Object} */ childElemIconAttr: function( values ) { var atts = { 'class': _.fusionFontAwesome( values.icon ) }, isRtl = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'rtl' ); if ( values.icon_distance ) { if ( isRtl ) { atts.style = 'margin-left:' + values.icon_distance + ';'; } else { atts.style = 'margin-right:' + values.icon_distance + ';'; } } return atts; }, /** * Get the animation class corresponding with the animation id. * * @since 3.5 * @param {string} animationName - The animation name. * @return {string} - Empty string if do not exist. */ animationToClassName: function( animationName ) { if ( 'pumping' === animationName ) { return 'awb-image-hotspots-hotspot-anim-pumping'; } if ( 'pulsating' === animationName ) { return 'awb-image-hotspots-hotspot-anim-pulsating'; } if ( 'showing' === animationName ) { return 'awb-image-hotspots-hotspot-anim-showing'; } if ( 'sonar' === animationName ) { return 'awb-image-hotspots-hotspot-anim-sonar'; } if ( 'pumping_showing' === animationName ) { return 'awb-image-hotspots-hotspot-anim-pump-showing'; } return ''; }, /** * Run after the element has been patched. * * @since 3.5 * @return {void} */ afterPatch: function() { var popover = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el ), textArea, title, popoverData; if ( 'link' === this.values.button_action ) { popover.popover( 'destroy' ); } else { popover.popover(); // Change popover placement, via jquery data. popoverData = popover.data( 'bs.popover' ); if ( popoverData && popoverData.options && popover.attr( 'data-placement' ) ) { popoverData.options.placement = popover.attr( 'data-placement' ); } // Popover title needs to change manually also. if ( popoverData && popoverData.options ) { // The title needs to be decoded for special characters. textArea = document.createElement( 'textarea' ); textArea.innerHTML = popover.attr( 'data-title' ); title = textArea.value; if ( ! _.isString( title ) ) { title = ''; } popoverData.options.title = title; } popover.data( 'bs.popover', popoverData ); } }, onSettingsOpen: function() { var self = this; setTimeout( function() { self.draggable(); }, 100 ); }, onSettingsClose: function() { var $el = this.$el; if ( ! $el ) { return; } $el.draggable( 'destroy' ); }, /** * Make the hotspots draggable. * * @since 3.5 * @return {void} */ draggable: function() { var self = this, $el = this.$el, elWidth, elHeight, imageWidth, imageHeight; if ( ! $el ) { return; } $el.draggable( { zIndex: 999999, delay: 100, cursorAt: { top: 15, left: 15 }, scroll: false, containment: $el.parent(), start: function() { $el.parent().css( 'overflow', 'hidden' ); elWidth = Math.ceil( $el.outerWidth() ); elHeight = Math.ceil( $el.outerHeight() ); imageWidth = Math.floor( $el.parent().width() ); imageHeight = Math.floor( $el.parent().height() ); }, drag: function( event, ui ) { ui.position.left = Math.min( imageWidth - elWidth, ui.position.left ); ui.position.top = Math.min( imageHeight - elHeight, ui.position.top ); self.updateDragSettings( '#pos_x', Math.round( ui.position.left / imageWidth * 1000 ) / 10 ); self.updateDragSettings( '#pos_y', Math.round( ui.position.top / imageHeight * 1000 ) / 10 ); }, stop: function() { // Remove relative position CSS set by jQuery. $el.css( { 'left': '', 'top': '', 'z-index': '' } ); $el.parent().css( 'overflow', '' ); } } ); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Image Carousel Parent View. FusionPageBuilder.fusion_images = FusionPageBuilder.ParentElementView.extend( { /** * Image map of child element images and thumbs. * * @since 2.0 */ imageMap: {}, /** * Initial data has run. * * @since 2.0 */ initialData: false, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.appendChildren( '.fusion-carousel-holder' ); this._refreshJs(); }, onRender: function() { var columnView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); setTimeout( function() { if ( columnView && 'function' === typeof columnView._equalHeights ) { columnView._equalHeights(); } }, 500 ); }, /** * Modify template attributes. * * @since 2.0 * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, images = window.FusionPageBuilderApp.findShortcodeMatches( atts.params.element_content, 'fusion_image' ), imageElement, imageElementAtts; this.model.attributes.showPlaceholder = false; if ( 1 <= images.length ) { imageElement = images[ 0 ].match( window.FusionPageBuilderApp.regExpShortcode( 'fusion_image' ) ); imageElementAtts = '' !== imageElement[ 3 ] ? window.wp.shortcode.attrs( imageElement[ 3 ] ) : ''; this.model.attributes.showPlaceholder = ( 'undefined' === typeof imageElementAtts.named || 'undefined' === typeof imageElementAtts.named.image ) ? true : false; } // Validate values. this.validateValues( atts.values ); this.extras = atts.extras; this.values = atts.values; // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrCarousel = this.buildCarouselAttr( atts.values ); attributes.captionStyles = this.buildCaptionStyles( atts ); // Whether it has a dynamic data stream. attributes.usingDynamic = 'undefined' !== typeof atts.values.multiple_upload && 'Select Images' !== atts.values.multiple_upload; // Any extras that need passed on. attributes.show_nav = atts.values.show_nav; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.column_spacing = _.fusionValidateAttrValue( values.column_spacing, 'px' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-image-carousel fusion-image-carousel-' + this.model.get( 'cid' ), style: '' } ); attr[ 'class' ] += ' fusion-image-carousel-' + values.picture_size; if ( true === this.model.attributes.showPlaceholder ) { attr[ 'class' ] += ' fusion-show-placeholder'; } if ( 'yes' === values.lightbox ) { attr[ 'class' ] += ' lightbox-enabled'; } if ( 'yes' === values.border ) { attr[ 'class' ] += ' fusion-carousel-border'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( -1 !== jQuery.inArray( values.caption_style, [ 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-image-carousel-top-below-caption awb-imageframe-style awb-imageframe-style-' + values.caption_style + ' awb-imageframe-style-' + this.model.get( 'cid' ); } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildCarouselAttr: function( values ) { var attr = { class: 'fusion-carousel', style: '' }; attr[ 'data-autoplay' ] = values.autoplay; attr[ 'data-columns' ] = values.columns; attr[ 'data-itemmargin' ] = values.column_spacing.toString(); attr[ 'data-itemwidth' ] = '180'; attr[ 'data-touchscroll' ] = values.mouse_scroll; attr[ 'data-imagesize' ] = values.picture_size; attr[ 'data-scrollitems' ] = values.scroll_items; return attr; }, /** * Extendable function for when child elements get generated. * * @since 2.0.0 * @param {Object} modules An object of modules that are not a view yet. * @return {void} */ onGenerateChildElements: function( modules ) { this.addImagesToImageMap( modules, false, false ); }, /** * Add images to the view's image map. * * @since 2.0 * @param {Object} childrenData - The children for which images need added to the map. * @param bool async - Determines if the AJAX call should be async. * @param bool async - Determines if the view should be re-rendered. * @return void */ addImagesToImageMap: function( childrenData, async, reRender ) { var view = this, queryData = {}; async = ( 'undefined' === typeof async ) ? true : async; reRender = ( 'undefined' === typeof reRender ) ? true : reRender; view.initialData = true; _.each( childrenData, function( child ) { var params = ( 'undefined' !== typeof child.get ) ? child.get( 'params' ) : child.params, cid = ( 'undefined' !== typeof child.get ) ? child.get( 'cid' ) : child.cid, image = params.image; if ( 'undefined' === typeof view.imageMap[ image ] && image ) { queryData[ cid ] = params; } } ); // Send this data with ajax or rest. if ( ! _.isEmpty( queryData ) ) { jQuery.ajax( { async: async, url: window.fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_fusion_image_carousel_children_data', children: queryData, fusion_load_nonce: window.fusionAppConfig.fusion_load_nonce } } ) .done( function( response ) { view.updateImageMap( response ); _.each( response, function( imageSizes, image ) { if ( 'undefined' === typeof view.imageMap[ image ] ) { view.imageMap[ image ] = imageSizes; } } ); view.model.set( 'query_data', response ); if ( reRender ) { view.reRender(); } } ); } else if ( reRender ) { view.reRender(); } }, /** * Update the view's image map. * * @since 2.0 * @param {Object} images - The images object to inject. * @return void */ updateImageMap: function( images ) { var imageMap = this.imageMap; _.each( images, function( imageSizes, image ) { if ( 'undefined' === typeof imageMap[ image ] ) { imageMap[ image ] = imageSizes; } } ); }, /** * Builds caption styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildCaptionStyles: function( atts ) { var selectors, font_styles, sides, marginName, css, media, responsive = ''; this.dynamic_css = {}; this.baseSelector = '.fusion-image-carousel.fusion-image-carousel-' + this.model.get( 'cid' ); if ( 'off' === atts.values.caption_style ) { return ''; } if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { this.baseSelector = '.awb-imageframe-style.awb-imageframe-style-' + this.model.get( 'cid' ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-title' ]; // title color. if ( ! this.isDefault( 'caption_title_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_title_color, true ); } // title size. if ( ! this.isDefault( 'caption_title_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_title_size ), true ); } // title font. font_styles = _.fusionGetFontStyle( 'caption_title_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // title transform. if ( ! this.isDefault( 'caption_title_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_title_transform ); } selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; // text color. if ( ! this.isDefault( 'caption_text_color' ) ) { this.addCssProperty( selectors, 'color', atts.values.caption_text_color ); } // text size. if ( ! this.isDefault( 'caption_text_size' ) ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( atts.values.caption_text_size ) ); } // text font. font_styles = _.fusionGetFontStyle( 'caption_text_font', atts.values, 'object' ); for ( rule in font_styles ) { // eslint-disable-line var value = font_styles[ rule ]; // eslint-disable-line this.addCssProperty( selectors, rule, value, true ); // eslint-disable-line } // text transform. if ( ! this.isDefault( 'caption_text_transform' ) ) { this.addCssProperty( selectors, 'text-transform', atts.values.caption_text_transform ); } // Border color. if ( 'resa' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:before' ]; this.addCssProperty( selectors, 'border-top-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-bottom-color', atts.values.caption_border_color ); selectors = [ this.baseSelector + ' .awb-imageframe-caption-container:after' ]; this.addCssProperty( selectors, 'border-right-color', atts.values.caption_border_color ); this.addCssProperty( selectors, 'border-left-color', atts.values.caption_border_color ); } if ( 'dario' === atts.values.caption_style && ! this.isDefault( 'caption_border_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption .awb-imageframe-caption-title:after' ]; this.addCssProperty( selectors, 'background', atts.values.caption_border_color ); } // Overlay color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'dario', 'resa', 'schantel', 'dany', 'navin' ] ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-style' ]; this.addCssProperty( selectors, 'background', atts.values.caption_overlay_color ); } // Background color. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'schantel', 'dany' ] ) && ! this.isDefault( 'caption_background_color' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'background', atts.values.caption_background_color ); } // Caption margin. if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { sides = [ 'top', 'right', 'bottom', 'left' ]; selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; _.each( sides, function( side ) { marginName = 'caption_margin_' + side; if ( ! this.isDefault( marginName ) ) { this.addCssProperty( selectors, 'margin-' + side, _.fusionGetValueWithUnit( atts.values[ marginName ] ) ); } }, this ); if ( ! this.isDefault( 'caption_title' ) ) { selectors = [ this.baseSelector + ' .awb-imageframe-caption-container .awb-imageframe-caption-text' ]; this.addCssProperty( selectors, 'margin-top', '0.5em' ); } } css = this.parseCSS(); if ( -1 !== jQuery.inArray( atts.values.caption_style, [ 'above', 'below' ] ) ) { _.each( [ '', 'medium', 'small' ], function( size ) { var key = 'caption_align' + ( '' === size ? '' : '_' + size ); // Check for default value. if ( this.isDefault( key ) ) { return; } this.dynamic_css = {}; // Build responsive alignment. selectors = [ this.baseSelector + ' .awb-imageframe-caption-container' ]; this.addCssProperty( selectors, 'text-align', atts.values[ key ] ); if ( '' === size ) { responsive += this.parseCSS(); } else { media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; responsive += media + '{' + this.parseCSS() + '}'; } }, this ); css += responsive; } return ( css ) ? '<style>' + css + '</style>' : ''; } } ); // Image carousel children data callback. _.extend( FusionPageBuilder.Callback.prototype, { fusion_carousel_images: function( name, value, modelData, args, cid, action, model, view ) { // jshint ignore: line view.model.attributes.params[ name ] = value; // TODO: on initial load we shouldn't really need to re-render, but may cause issues. view.addImagesToImageMap( view.model.children.models, true, view.initialData ); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderViewManager */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Image Carousel Child View. FusionPageBuilder.fusion_image = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var parentView, queryData = this.model.get( 'query_data' ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Update the parent image map with latest query data images. if ( 'undefined' !== typeof queryData ) { parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentView.updateImageMap( queryData ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), queryData = this.model.get( 'query_data' ); if ( true === parentView.model.attributes.showPlaceholder && 'undefined' !== this.model.attributes.params.image && '' !== this.model.attributes.params.image ) { this.$el.closest( '.fusion-image-carousel' ).removeClass( 'fusion-show-placeholder' ); parentView.model.attributes.showPlaceholder = false; } // Update the parent image map with latest query data images. if ( 'undefined' !== typeof queryData ) { parentView.updateImageMap( queryData ); } }, /** * Runs before element is removed. * * @since 2.0 * @return {void} */ beforeRemove: function() { var parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( false === parentView.model.attributes.showPlaceholder && 1 === parentView.model.children.length ) { this.$el.closest( '.fusion-image-carousel' ).addClass( 'fusion-show-placeholder' ); parentView.model.attributes.showPlaceholder = true; } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var parentCid = this.model.get( 'parent' ), parentView, queryData = this.model.get( 'query_data' ); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Force re-render for child option changes. setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_images', parentCid ); }, 10 ); // Update the parent image map with latest query data images. if ( 'undefined' !== typeof queryData ) { parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentView.updateImageMap( queryData ); } // Using non debounced version for smoothness. this.refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.buildAttr( atts.values ); this.extras = atts.extras; // Set selectors. this.wrapperSelector(); // Create attribute objects attributes.attrCarouselLink = this.buildCarouselLinkAttr( atts ); attributes.attrImageWrapper = this.buildImageWrapperAttr( atts ); attributes.attrItemWrapper = this.buildItemWrapperAttr( atts ); attributes.imageElement = this.buildImageElement( atts ); attributes.parentValues = atts.parentValues; attributes.captionHtml = this.generateCaption( atts.parentValues, atts.values, atts.query_data ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); attributes.output = atts.values.element_content; attributes.mouseScroll = atts.values.mouse_scroll; attributes.link = atts.values.link; attributes.lightbox = atts.parentValues.lightbox; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { // Make sure the title text is not wrapped with an unattributed p tag. if ( 'undefined' !== typeof values.element_content ) { values.element_content = values.element_content.trim(); values.element_content = values.element_content.replace( /(<p[^>]+?>|<p>|<\/p>)/img, '' ); } }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildAttr: function() { var attr = { class: 'fusion-carousel-item' }; this.model.set( 'selectors', attr ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildItemWrapperAttr: function( atts ) { var attr = { class: 'fusion-carousel-item-wrapper' }, parentValues = atts.parentValues; if ( -1 !== jQuery.inArray( parentValues.caption_style, [ 'off', 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + parentValues.caption_style; } return attr; }, /** * Set image element. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildImageElement: function( atts ) { var html = '', imageSize = 'full', values = atts.values, parentValues = atts.parentValues, queryData = atts.query_data, parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); if ( 'fixed' === parentValues.picture_size ) { imageSize = 'portfolio-two'; if ( '6' === parentValues.columns || '5' === parentValues.columns || '4' === parentValues.columns ) { imageSize = 'blog-medium'; } } if ( 'undefined' !== typeof queryData && 'undefined' !== typeof queryData[ values.image ] ) { html = queryData[ values.image ][ imageSize ]; } else if ( 'undefined' !== typeof parentView.imageMap[ values.image ] ) { html = parentView.imageMap[ values.image ][ imageSize ]; } else { html = '<img src="' + values.image + '" alt="' + values.alt + '"/>'; } if ( -1 === jQuery.inArray( parentValues.caption_style, [ 'off', 'above', 'below' ] ) ) { html += this.generateCaption( parentValues, values, queryData ); } return html; }, /** * Set selectors. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ wrapperSelector: function() { var wrapperSelector = { class: 'fusion-carousel-item' }; this.model.set( 'selectors', wrapperSelector ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildCarouselLinkAttr: function( atts ) { var attr = {}, values = atts.values, parentValues = atts.parentValues, queryData = atts.query_data; if ( 'yes' === parentValues.lightbox ) { if ( ! values.link || null === values.link ) { values.link = values.image; } attr[ 'data-rel' ] = 'iLightbox[image_carousel_' + this.model.get( 'parent' ) + ']'; if ( 'undefined' !== typeof queryData && 'undefined' !== typeof queryData.image_data ) { attr[ 'data-caption' ] = queryData.image_data.caption; attr[ 'data-title' ] = queryData.image_data.title; attr[ 'aria-label' ] = queryData.image_data.title; } } attr.href = values.link; attr.target = values.linktarget; if ( '_blank' === values.linktarget ) { attr.rel = 'noopener noreferrer'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildImageWrapperAttr: function( atts ) { var attr = { class: 'fusion-image-wrapper' }, parentValues = atts.parentValues; if ( parentValues.hover_type && -1 !== jQuery.inArray( parentValues.caption_style, [ 'off', 'above', 'below' ] ) ) { attr[ 'class' ] += ' hover-type-' + parentValues.hover_type; } // Caption style. if ( -1 === jQuery.inArray( parentValues.caption_style, [ 'off', 'above', 'below' ] ) ) { attr[ 'class' ] += ' awb-imageframe-style awb-imageframe-style-' + parentValues.caption_style; } return attr; }, /** * Generate caption markup. * * @since 3.5 * @param {string} values - The values object. * @return {string} */ generateCaption: function( values, childValues, queryData ) { // eslint-disable-line no-unused-vars var content = '<div class="awb-imageframe-caption-container"><div class="awb-imageframe-caption">', parentView, image, title = '', caption = '', title_tag = ''; if ( 'off' === values.caption_style ) { return ''; } parentView = FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), image = parentView.imageMap[ childValues.image ]; if ( 'undefined' === typeof image || 'undefined' === typeof image.image_data ) { return ''; } // from image data. if ( image.image_data.title ) { title = image.image_data.title; } if ( image.image_data.caption ) { caption = image.image_data.caption; } // from element data. if ( '' !== childValues.image_title ) { title = childValues.image_title; } if ( '' !== childValues.image_caption ) { caption = childValues.image_caption; } if ( '' !== title ) { title_tag = 'div' === values.caption_title_tag ? 'div' : 'h' + values.caption_title_tag; content += '<' + title_tag + ' class="awb-imageframe-caption-title">' + title + '</' + title_tag + '>'; } if ( '' !== caption ) { content += '<p class="awb-imageframe-caption-text">' + caption + '</p>'; } content += '</div></div>'; return content; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // One Page Link view. FusionPageBuilder.fusion_one_page_text_link = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects. attributes.onePageTextLinkShortcode = this.buildShortcodeAttr( atts.values ); attributes.elementContent = atts.values.element_content; attributes.inline = 'undefined' !== typeof atts.inlineElement; attributes.cid = atts.cid; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildShortcodeAttr: function( values ) { var onePageTextLinkShortcode = { class: 'fusion-one-page-text-link' }; if ( '' !== values[ 'class' ] ) { onePageTextLinkShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { onePageTextLinkShortcode.id = values.id; } onePageTextLinkShortcode.href = values.link; return onePageTextLinkShortcode; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Dropcap Element View. FusionPageBuilder.fusion_dropcap = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} - Returns the attributes. */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.output = atts.values.element_content; return attributes; }, /** * Modifies values. * * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { // Make sure the title text is not wrapped with an unattributed p tag. if ( 'undefined' !== typeof values.element_content ) { values.element_content = values.element_content.trim(); values.element_content = values.element_content.replace( /(<p[^>]+?>|<p>|<\/p>)/img, '' ); } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} - Returns the element attributes. */ buildAttr: function( values ) { var params = this.model.get( 'params' ), attr = { class: 'fusion-dropcap dropcap', style: '' }, usingDefaultColor = ( 'undefined' !== typeof params.color && '' === params.color ) || 'undefined' === typeof params.color; if ( 'yes' === values.boxed ) { attr[ 'class' ] += ' dropcap-boxed'; if ( values.boxed_radius || '0' === values.boxed_radius ) { values.boxed_radius = ( 'round' === values.boxed_radius ) ? '50%' : values.boxed_radius; attr.style = 'border-radius:' + values.boxed_radius + ';'; } if ( ! usingDefaultColor ) { attr.style += 'background-color:' + values.color + ';'; attr.style += 'color:' + values.text_color + ';'; } } else if ( ! usingDefaultColor ) { attr.style += 'color:' + values.color + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter circle child View FusionPageBuilder.fusion_flip_boxes = FusionPageBuilder.ParentElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.generateChildElements(); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var flipBoxesShortcode = this.computeAtts( atts.values ); atts = {}; atts.flipBoxesShortcode = flipBoxesShortcode; return atts; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ computeAtts: function( values ) { var flipBoxesShortcode; // Backwards compatibility for when we had image width and height params. if ( 'undefined' !== typeof values.image_width ) { values.image_width = values.image_width ? values.image_width : '35'; } else { values.image_width = values.image_max_width; } values.columns = Math.min( 6, values.columns ); flipBoxesShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-flip-boxes flip-boxes row fusion-columns-' + values.columns } ); flipBoxesShortcode[ 'class' ] += ' flip-effect-' + values.flip_effect; if ( 'yes' === values.equal_heights ) { flipBoxesShortcode[ 'class' ] += ' equal-heights'; } if ( '' !== values[ 'class' ] ) { flipBoxesShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { flipBoxesShortcode.id += ' ' + values.id; } flipBoxesShortcode.style = ''; if ( '' !== values.margin_top ) { flipBoxesShortcode.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { flipBoxesShortcode.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { flipBoxesShortcode.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { flipBoxesShortcode.style += 'margin-left:' + values.margin_left + ';'; } flipBoxesShortcode[ 'class' ] += ' fusion-child-element'; flipBoxesShortcode[ 'data-empty' ] = this.emptyPlaceholderText; return flipBoxesShortcode; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionPageBuilderElements */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter flip box view FusionPageBuilder.fusion_flip_box = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Using non debounced version for smoothness. this.refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var computedAtts = this.computeAtts( atts.values ); atts.cid = this.model.get( 'cid' ); atts.parent = this.model.get( 'parent' ); atts.flipBoxShortcodeBackBox = computedAtts.flipBoxShortcodeBackBox; atts.flipBoxAttributes = computedAtts.flipBoxAttributes; atts.flipBoxShortcodeFrontBox = computedAtts.flipBoxShortcodeFrontBox; atts.icon_output = computedAtts.icon_output; atts.title_front_output = computedAtts.title_front_output; atts.title_back_output = computedAtts.title_back_output; atts.icon_output = computedAtts.icon_output; return atts; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ computeAtts: function( values ) { var parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ), parentValues = 'undefined' !== typeof parentModel ? jQuery.extend( true, {}, fusionAllElements.fusion_flip_boxes.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ) : {}, params = this.model.get( 'params' ), style = '', flipBoxAttributes = '', flipBoxShortcode, flipBoxShortcodeIcon = { 'aria-hidden': 'true' }, iconOutput = '', animations = '', flipBoxShortcodeGrafix = '', flipBoxShortcodeHeadingFront = '', titleFrontOutput = '', flipBoxShortcodeHeadingBack = '', flipBoxShortcodeBackBox = '', titleBackOutput = '', frontInner = '', columns = '', flipBoxShortcodeFrontBox, atts, alpha; values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.border_radius = _.fusionValidateAttrValue( values.border_radius, 'px' ); // Case when image is set on parent element and icon on child element. if ( ( 'undefined' === typeof params.image || '' === params.image ) && ( 'undefined' !== typeof params.icon && '' !== params.icon ) ) { values.image = ''; } // Backwards compatibility for when we had image width and height params. if ( 'undefined' !== typeof params.image_width && params.image_width ) { values.image_width = params.image_width; } else { values.image_width = values.image_max_width; } values.image_width = _.fusionValidateAttrValue( values.image_width, '' ); if ( 'undefined' !== typeof values.image && ( '' !== values.image || '' !== values.image_id ) ) { if ( -1 === parseInt( values.image_width ) ) { values.image_width = '35'; } values.image_height = values.image_width; } else { values.image_width = '' === values.image_width ? '35' : values.image_width; values.image_height = '35'; } if ( 'round' === values.border_radius ) { values.border_radius = '50%'; } style = ''; iconOutput = ''; titleFrontOutput = ''; titleBackOutput = ''; flipBoxAttributes = { class: 'fusion-flip-box', tabindex: 0 }; flipBoxAttributes[ 'class' ] += ' flip-' + values.flip_direction; if ( values.animation_type ) { flipBoxAttributes = _.fusionAnimations( values, flipBoxAttributes ); } if ( values.image && '' !== values.image ) { iconOutput = '<img src="' + values.image + '" width="' + values.image_width + '" height="' + values.image_height + '" alt="' + values.alt + '" />'; } else if ( values.icon ) { if ( values.image ) { flipBoxShortcodeIcon[ 'class' ] = 'image'; } else if ( values.icon ) { flipBoxShortcodeIcon[ 'class' ] = _.fusionFontAwesome( values.icon ); } if ( values.icon_color ) { flipBoxShortcodeIcon.style = 'color:' + values.icon_color + ';'; } if ( values.icon_flip ) { flipBoxShortcodeIcon[ 'class' ] += ' fa-flip-' + values.icon_flip; } if ( values.icon_rotate ) { flipBoxShortcodeIcon[ 'class' ] += ' fa-rotate-' + values.icon_rotate; } if ( 'yes' === values.icon_spin ) { flipBoxShortcodeIcon[ 'class' ] += ' fa-spin'; } iconOutput = '<i ' + _.fusionGetAttributes( flipBoxShortcodeIcon ) + '></i>'; } if ( '' !== iconOutput ) { flipBoxShortcodeGrafix = { class: 'flip-box-grafix' }; if ( ! values.image ) { if ( 'yes' === values.circle ) { flipBoxShortcodeGrafix[ 'class' ] += ' flip-box-circle'; if ( values.circle_color ) { flipBoxShortcodeGrafix.style = 'background-color:' + values.circle_color + ';'; } if ( values.circle_border_color ) { flipBoxShortcodeGrafix.style += 'border-color:' + values.circle_border_color + ';'; } } else { flipBoxShortcodeGrafix[ 'class' ] += ' flip-box-no-circle'; } } else { flipBoxShortcodeGrafix[ 'class' ] += ' flip-box-image'; } iconOutput = '<div ' + _.fusionGetAttributes( flipBoxShortcodeGrafix ) + '>' + iconOutput + '</div>'; } if ( '' !== values.title_front ) { flipBoxShortcodeHeadingFront = { class: 'flip-box-heading' }; if ( ! values.text_front ) { flipBoxShortcodeHeadingFront[ 'class' ] += ' without-text'; } if ( values.title_front_color ) { flipBoxShortcodeHeadingFront.style = 'color:' + values.title_front_color + ';'; } titleFrontOutput = '<h2 ' + _.fusionGetAttributes( flipBoxShortcodeHeadingFront ) + '>' + values.title_front + '</h2>'; } if ( '' !== values.title_back ) { flipBoxShortcodeHeadingBack = { class: 'flip-box-heading-back' }; if ( values.title_back_color ) { flipBoxShortcodeHeadingBack.style = 'color:' + values.title_back_color + ';'; } titleBackOutput = '<h3 ' + _.fusionGetAttributes( flipBoxShortcodeHeadingBack ) + '>' + values.title_back + '</h3>'; } frontInner = '<div class="flip-box-front-inner">' + iconOutput + titleFrontOutput + values.text_front + '</div>'; // flipBoxShortcodeFrontBox Attributes. flipBoxShortcodeFrontBox = { class: 'flip-box-front', style: '' }; if ( values.background_color_front ) { flipBoxShortcodeFrontBox.style += 'background-color:' + values.background_color_front + ';'; } if ( values.border_color ) { flipBoxShortcodeFrontBox.style += 'border-color:' + values.border_color + ';'; } if ( values.border_radius ) { flipBoxShortcodeFrontBox.style += 'border-radius:' + values.border_radius + ';'; } if ( values.border_size ) { flipBoxShortcodeFrontBox.style += 'border-style:solid;border-width:' + values.border_size + ';'; } if ( values.text_front_color ) { flipBoxShortcodeFrontBox.style += 'color:' + values.text_front_color + ';'; } if ( parentValues.flip_duration ) { flipBoxShortcodeFrontBox.style += 'transition-duration:' + parentValues.flip_duration + 's;'; } if ( values.background_image_front ) { flipBoxShortcodeFrontBox.style += 'background-image: url(\'' + values.background_image_front + '\');'; if ( values.background_color_front ) { alpha = jQuery.AWB_Color( values.background_color_front ).alpha(); if ( 1 > alpha && 0 !== alpha ) { flipBoxShortcodeFrontBox.style += 'background-blend-mode: overlay;'; } } } // flipBoxShortcodeBackBox Attributes. flipBoxShortcodeBackBox = { class: 'flip-box-back', style: '' }; if ( values.background_color_back ) { flipBoxShortcodeBackBox.style += 'background-color:' + values.background_color_back + ';'; } if ( values.border_color ) { flipBoxShortcodeBackBox.style += 'border-color:' + values.border_color + ';'; } if ( values.border_radius ) { flipBoxShortcodeBackBox.style += 'border-radius:' + values.border_radius + ';'; } if ( values.border_size ) { flipBoxShortcodeBackBox.style += 'border-style:solid;border-width:' + values.border_size + ';'; } if ( values.text_back_color ) { flipBoxShortcodeBackBox.style += 'color:' + values.text_back_color + ';'; } if ( parentValues.flip_duration ) { flipBoxShortcodeBackBox.style += 'transition-duration:' + parentValues.flip_duration + 's;'; } if ( values.background_image_back ) { flipBoxShortcodeBackBox.style += 'background-image: url(\'' + values.background_image_back + '\');'; if ( values.background_color_back ) { alpha = jQuery.AWB_Color( values.background_color_back ).alpha(); if ( 1 > alpha && 0 !== alpha ) { flipBoxShortcodeBackBox.style += 'background-blend-mode: overlay;'; } } } // flipBoxShortcode Attributes. columns = 1; if ( parentValues.columns ) { columns = 12 / parseInt( parentValues.columns, 10 ); } flipBoxShortcode = { class: 'fusion-flip-box-wrapper fusion-column col-lg-' + columns + ' col-md-' + columns + ' col-sm-' + columns }; if ( 5 === parseInt( parentValues.columns, 10 ) ) { flipBoxShortcode[ 'class' ] = 'fusion-flip-box-wrapper col-lg-2 col-md-2 col-sm-2'; } if ( '' !== values[ 'class' ] ) { flipBoxShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { flipBoxShortcode.id = values.id; } this.model.set( 'selectors', flipBoxShortcode ); atts = {}; atts.flipBoxShortcodeBackBox = flipBoxShortcodeBackBox; atts.flipBoxAttributes = flipBoxAttributes; atts.flipBoxShortcodeFrontBox = flipBoxShortcodeFrontBox; atts.icon_output = iconOutput; atts.title_front_output = titleFrontOutput; atts.title_back_output = titleBackOutput; atts.icon_output = iconOutput; return atts; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Accordion View. FusionPageBuilder.fusion_accordion = FusionPageBuilder.ParentElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); // Create attribute objects. attributes.toggleShortcode = this.buildToggleAttr( atts.values ); attributes.toggleShortcodePanelGroup = this.buildPanelGroupAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.icon_size = _.fusionValidateAttrValue( values.icon_size, 'px' ); values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.title_font_size = _.fusionValidateAttrValue( values.title_font_size, 'px' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildToggleAttr: function( values ) { var toggleShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'accordian fusion-accordian' } ); if ( ' ' !== values[ 'class' ] ) { toggleShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { toggleShortcode.id = values.id; } return toggleShortcode; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildPanelGroupAttr: function( values ) { var toggleShortcodePanelGroup = { class: 'panel-group fusion-child-element', id: 'accordion-cid' + this.model.get( 'cid' ) }; if ( 'right' === values.icon_alignment ) { toggleShortcodePanelGroup[ 'class' ] += ' fusion-toggle-icon-right'; } if ( '0' === values.icon_boxed_mode || 'no' === values.icon_boxed_mode ) { toggleShortcodePanelGroup[ 'class' ] += ' fusion-toggle-icon-unboxed'; } toggleShortcodePanelGroup[ 'data-empty' ] = this.emptyPlaceholderText; return toggleShortcodePanelGroup; }, /** * Builds the stylesheet. * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildStyles: function( values ) { var styles = '', title_styles, cid = this.model.get( 'cid' ); // Title typography. styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a {'; if ( '' !== values.title_font_size ) { styles += 'font-size: ' + values.title_font_size + ';'; } if ( ! _.isEmpty( values.title_color ) ) { styles += 'color:' + values.title_color + ';'; } title_styles = _.fusionGetFontStyle( 'title_font', values, 'object' ); jQuery.each( title_styles, function( rule, value ) { styles += rule + ':' + value + ';'; } ); styles += '}'; // Content typography. styles += '.fusion-accordian #accordion-cid' + cid + ' .toggle-content {'; if ( '' !== values.content_font_size ) { styles += 'font-size: ' + values.content_font_size + ';'; } if ( ! _.isEmpty( values.content_color ) ) { styles += 'color:' + values.content_color + ';'; } title_styles = _.fusionGetFontStyle( 'content_font', values, 'object' ); jQuery.each( title_styles, function( rule, value ) { styles += rule + ':' + value + ';'; } ); styles += '}'; if ( '' !== values.icon_size ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a .fa-fusion-box:before{ font-size: ' + values.icon_size + '; width: ' + values.icon_size + ';}'; } if ( '' !== values.icon_color ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a .fa-fusion-box{ color: ' + values.icon_color + ';}'; } if ( 'right' === values.icon_alignment ) { styles += '.fusion-accordian #accordion-cid' + cid + '.fusion-toggle-icon-right .fusion-toggle-heading{ margin-right: ' + ( parseInt( values.icon_size, 10 ) + 18 ) + 'px;}'; } if ( ( '1' === values.icon_boxed_mode || 'yes' === values.icon_boxed_mode ) && ! _.isEmpty( values.icon_box_color ) ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .fa-fusion-box { background-color: ' + values.icon_box_color + ';border-color: ' + values.icon_box_color + ';}'; } if ( ! _.isEmpty( values.toggle_hover_accent_color ) ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a:not(.active):hover, #accordion-cid' + cid + ' .fusion-toggle-boxed-mode:hover .panel-title a { color: ' + values.toggle_hover_accent_color + ';}'; styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a:not(.active).hover, #accordion-cid' + cid + ' .fusion-toggle-boxed-mode.hover .panel-title a { color: ' + values.toggle_hover_accent_color + ';}'; if ( '1' === values.icon_boxed_mode || 'yes' === values.icon_boxed_mode ) { if ( _.isEmpty( values.toggle_active_accent_color ) ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title .active .fa-fusion-box,'; } styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a:not(.active):hover .fa-fusion-box { background-color: ' + values.toggle_hover_accent_color + '!important;border-color: ' + values.toggle_hover_accent_color + '!important;}'; styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a:not(.active).hover .fa-fusion-box { background-color: ' + values.toggle_hover_accent_color + '!important;border-color: ' + values.toggle_hover_accent_color + '!important;}'; } else { styles += '.fusion-accordian #accordion-cid' + cid + ' .fusion-toggle-boxed-mode:hover .panel-title a .fa-fusion-box{ color: ' + values.toggle_hover_accent_color + ';}'; styles += '.fusion-accordian #accordion-cid' + cid + '.fusion-toggle-icon-unboxed .fusion-panel .panel-title a:not(.active):hover .fa-fusion-box{ color: ' + values.toggle_hover_accent_color + ' !important;}'; styles += '.fusion-accordian #accordion-cid' + cid + ' .fusion-toggle-boxed-mode.hover .panel-title a .fa-fusion-box{ color: ' + values.toggle_hover_accent_color + ';}'; styles += '.fusion-accordian #accordion-cid' + cid + '.fusion-toggle-icon-unboxed .fusion-panel .panel-title a:not(.active).hover .fa-fusion-box{ color: ' + values.toggle_hover_accent_color + ' !important;}'; } } if ( '1' == values.boxed_mode || 'yes' === values.boxed_mode ) { if ( '' !== values.hover_color ) { styles += '#accordion-cid' + cid + ' .fusion-panel:hover, #accordion-cid' + cid + ' .fusion-panel.hover{ background-color: ' + values.hover_color + ' }'; } styles += '#accordion-cid' + cid + ' .fusion-panel {'; if ( '' !== values.border_color ) { styles += ' border-color:' + values.border_color + ';'; } if ( '' !== values.border_size ) { styles += ' border-width:' + values.border_size + ';'; } if ( '' !== values.background_color ) { styles += ' background-color:' + values.background_color + ';'; } styles += ' }'; } else if ( '0' !== values.divider_line || 0 !== values.divider_line || 'no' !== values.divider_line ) { if ( ! _.isEmpty( values.divider_hover_color ) ) { styles += '#accordion-cid' + cid + ' .fusion-panel:hover{ border-color: ' + values.divider_hover_color + ' }'; } styles += ' #accordion-cid' + cid + ' .fusion-panel {'; if ( ! _.isEmpty( values.divider_color ) ) { styles += ' border-color:' + values.divider_color + ';'; } styles += ' }'; } if ( ! _.isEmpty( values.toggle_active_accent_color ) ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title a.active{ color: ' + values.toggle_active_accent_color + ' !important;}'; if ( '1' === values.icon_boxed_mode || 'yes' === values.icon_boxed_mode ) { styles += '.fusion-accordian #accordion-cid' + cid + ' .panel-title .active .fa-fusion-box { background-color: ' + values.toggle_active_accent_color + '!important;border-color: ' + values.toggle_active_accent_color + '!important;}'; } else { styles += '.fusion-accordian #accordion-cid' + cid + '.fusion-toggle-icon-unboxed .fusion-panel .panel-title a.active .fa-fusion-box{ color: ' + values.toggle_active_accent_color + ' !important;}'; } } return styles; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderElements, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Toggle child View. FusionPageBuilder.fusion_toggle = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Using non debounced version for smoothness. this.refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ), parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_accordion.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); // Validate values. this.validateValues( atts.values ); // Create attribute objects. attributes.toggleShortcodeCollapse = this.buildCollapseAttr( atts.values ); attributes.toggleShortcodeDataToggle = this.buildDataToggleAttr( atts.values, parentValues, parentModel ); attributes.headingAttr = this.buildHeadingAttr( atts.values ); attributes.contentAttr = this.buildContentAttr( atts.values ); attributes.title = atts.values.title; attributes.elementContent = atts.values.element_content; attributes.activeIcon = '' !== parentValues.active_icon ? parentValues.active_icon : 'awb-icon-minus'; attributes.inActiveIcon = '' !== parentValues.inactive_icon ? parentValues.inactive_icon : 'awb-icon-plus'; attributes.childStyles = this.buildStyles( atts.values ); // Set selectors. this.buildPanelAttr( atts.values, parentValues ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.toggle_class = ( 'yes' === values.open ) ? 'in' : ''; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildCollapseAttr: function( values ) { var collapseID = '#accordion-' + this.model.get( 'cid' ), toggleShortcodeCollapse = { id: collapseID.replace( '#', '' ), class: 'panel-collapse collapse ' + values.toggle_class }; return toggleShortcodeCollapse; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} parentValues - The parent object values. * @return {Object} */ buildPanelAttr: function( values, parentValues ) { var toggleShortcodePanel = { class: 'fusion-panel panel-default' }; if ( ' ' !== values[ 'class' ] ) { toggleShortcodePanel[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { toggleShortcodePanel.id = values.id; } toggleShortcodePanel[ 'class' ] += ' panel-' + this.model.get( 'cid' ); if ( '1' == parentValues.boxed_mode || 'yes' === parentValues.boxed_mode ) { toggleShortcodePanel[ 'class' ] += ' fusion-toggle-no-divider fusion-toggle-boxed-mode'; } else if ( '0' == parentValues.divider_line || 'no' === parentValues.divider_line ) { toggleShortcodePanel[ 'class' ] += ' fusion-toggle-no-divider'; } this.model.set( 'selectors', toggleShortcodePanel ); return toggleShortcodePanel; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} parentValues - The parent values object. * @param {Object} parentModel - The parent element model. * @return {Object} */ buildDataToggleAttr: function( values, parentValues, parentModel ) { var toggleShortcodeDataToggle = {}, collapseID = '#accordion-' + this.model.get( 'cid' ); if ( 'yes' === values.open ) { toggleShortcodeDataToggle[ 'class' ] = 'active'; } // Accessibility enhancements. toggleShortcodeDataToggle[ 'aria-expanded' ] = ( 'yes' === values.open ) ? 'true' : 'false'; toggleShortcodeDataToggle[ 'aria-controls' ] = collapseID; toggleShortcodeDataToggle.role = 'button'; toggleShortcodeDataToggle[ 'data-toggle' ] = 'collapse'; if ( 'toggles' !== parentValues.type ) { toggleShortcodeDataToggle[ 'data-parent' ] = '#accordion-cid' + parentModel.attributes.cid; } toggleShortcodeDataToggle[ 'data-target' ] = collapseID; toggleShortcodeDataToggle.href = collapseID; return toggleShortcodeDataToggle; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildHeadingAttr: function() { var that = this, headingAttr = { class: 'fusion-toggle-heading' }; headingAttr = _.fusionInlineEditor( { cid: that.model.get( 'cid' ), param: 'title', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, headingAttr ); return headingAttr; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildContentAttr: function() { var that = this, contentAttr = { class: 'panel-body toggle-content fusion-clearfix' }; contentAttr = _.fusionInlineEditor( { cid: that.model.get( 'cid' ) }, contentAttr ); return contentAttr; }, /** * Builds the stylesheet. * * @since 3.6 * @param {Object} values - The values object. * @return {string} */ buildStyles: function( values ) { var styles = '', parentCID = this.model.get( 'parent' ), cid = this.model.get( 'cid' ), title_styles; // Title typography. styles += '.fusion-accordian #accordion-cid' + parentCID + ' .panel-' + cid + ' .panel-title a {'; if ( '' !== values.title_font_size ) { styles += 'font-size: ' + values.title_font_size + ';'; } if ( ! _.isEmpty( values.title_color ) ) { styles += 'color:' + values.title_color + ';'; } title_styles = _.fusionGetFontStyle( 'title_font', values, 'object' ); jQuery.each( title_styles, function( rule, value ) { styles += rule + ':' + value + ';'; } ); styles += '}'; // Content typography. styles += '.fusion-accordian #accordion-cid' + parentCID + ' .panel-' + cid + ' .toggle-content {'; if ( '' !== values.content_font_size ) { styles += 'font-size: ' + values.content_font_size + ';'; } if ( ! _.isEmpty( values.content_color ) ) { styles += 'color:' + values.content_color + ';'; } title_styles = _.fusionGetFontStyle( 'content_font', values, 'object' ); jQuery.each( title_styles, function( rule, value ) { styles += rule + ':' + value + ';'; } ); styles += '}'; return styles; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Chart View. FusionPageBuilder.fusion_chart = FusionPageBuilder.ParentElementView.extend( { /** * Chart Datasets. */ chartDatasets: [], /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { this.$el.find( 'canvas' ).replaceWith( '<canvas width="100" height="100"></canvas>' ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { // TODO: save DOM and apply instead of generating this.generateChildElements(); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.chartDatasets = FusionPageBuilderApp.findShortcodeMatches( atts.params.element_content, 'fusion_chart_dataset' ); attributes.showPlaceholder = 0 === this.chartDatasets.length ? true : false; if ( ! attributes.showPlaceholder ) { // Validate values. this.validateValues( atts.values ); } else { // Set placeholder values; atts.values.type = 'bar'; this.model.attributes.params.type = 'bar'; atts.values.x_axis_labels = 'Val 1|Val 2|Val 3'; this.model.attributes.params.x_axis_labels = 'Val 1|Val 2|Val 3'; atts.values.legend_text_colors = '#ffffff|#ffffff|#ffffff'; this.model.attributes.params.legend_text_colors = '#ffffff|#ffffff|#ffffff'; atts.values.bg_colors = '#03a9f4|#8bc34a|#ff9800'; this.model.attributes.params.bg_colors = '#03a9f4|#8bc34a|#ff9800'; atts.values.border_colors = '#03a9f4|#8bc34a|#ff9800'; this.model.attributes.params.border_colors = '#03a9f4|#8bc34a|#ff9800'; this.model.attributes.params.element_content = '[fusion_chart_dataset title="Data Set 1" legend_text_color="#ffffff" background_color="#00bcd4" border_color="#00bcd4" values="5|7|9"][/fusion_chart_dataset]'; } // Create attribute objects. attributes.chartShortcode = this.buildChartAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); attributes.title = atts.values.title; attributes.chartLegendPosition = atts.values.chart_legend_position; return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { values.chart_padding = { top: 'undefined' !== typeof values.padding_top && '' !== values.padding_top ? values.padding_top : 0, right: 'undefined' !== typeof values.padding_right && '' !== values.padding_right ? values.padding_right : 0, bottom: 'undefined' !== typeof values.padding_bottom && '' !== values.padding_bottom ? values.padding_bottom : 0, left: 'undefined' !== typeof values.padding_left && '' !== values.padding_left ? values.padding_left : 0 }; if ( '' === values.chart_type ) { values.chart_type = 'bar'; } // validate bg_colors. if ( values.bg_colors ) { values.bg_colors = this.validateGlobalColors( values.bg_colors ); } // validate border_colors. if ( values.border_colors ) { values.border_colors = this.validateGlobalColors( values.border_colors ); } }, /** * Validate global color variable. * * @since 3.6 * @param {String} value - The value. * @return {Object|String} */ validateGlobalColors: function( value ) { var colors = value.split( '|' ), newColors = []; if ( colors ) { _.each( colors, function( v ) { var newValue = '' !== v ? jQuery.AWB_Color( v ).toRgbaString() : ''; newColors.push( newValue ); } ); return newColors.join( '|' ); } return value; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildChartAttr: function( values ) { var chartShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { id: 'fusion-chart-cid' + this.model.get( 'cid' ), class: 'fusion-chart fusion-child-element' } ); if ( values.chart_type && -1 !== [ 'bar', 'horizontalBar', 'line', 'pie', 'doughnut', 'radar', 'polarArea' ].indexOf( values.chart_type ) ) { chartShortcode[ 'data-type' ] = values.chart_type; } else { chartShortcode[ 'data-type' ] = this.$el.find( '#' + chartShortcode.id ).data( 'type' ); } if ( '' !== values.chart_legend_position && 'off' !== values.chart_legend_position ) { chartShortcode[ 'class' ] += ' legend-' + values.chart_legend_position; chartShortcode[ 'data-chart_legend_position' ] = values.chart_legend_position; } if ( '' !== values.x_axis_labels ) { chartShortcode[ 'data-x_axis_labels' ] = values.x_axis_labels; } if ( '' !== values.x_axis_label ) { chartShortcode[ 'data-x_axis_label' ] = values.x_axis_label; } if ( '' !== values.y_axis_label ) { chartShortcode[ 'data-y_axis_label' ] = values.y_axis_label; } if ( '' !== values.show_tooltips ) { chartShortcode[ 'data-show_tooltips' ] = values.show_tooltips; } if ( '' !== values.bg_colors ) { chartShortcode[ 'data-bg_colors' ] = values.bg_colors; } if ( '' !== values.border_colors ) { chartShortcode[ 'data-border_colors' ] = values.border_colors; } if ( '' !== values.legend_labels ) { chartShortcode[ 'data-legend_labels' ] = values.legend_labels; } if ( '' !== values.chart_border_size ) { chartShortcode[ 'data-border_size' ] = values.chart_border_size; } if ( '' !== values.chart_border_type ) { chartShortcode[ 'data-border_type' ] = values.chart_border_type; } if ( '' !== values.chart_fill ) { chartShortcode[ 'data-chart_fill' ] = values.chart_fill; } if ( '' !== values.chart_point_style ) { chartShortcode[ 'data-chart_point_style' ] = values.chart_point_style; } if ( '' !== values.chart_point_size ) { chartShortcode[ 'data-chart_point_size' ] = values.chart_point_size; } if ( '' !== values.chart_point_bg_color ) { chartShortcode[ 'data-chart_point_bg_color' ] = jQuery.AWB_Color( values.chart_point_bg_color ).toRgbaString(); } if ( '' !== values.chart_point_border_color ) { chartShortcode[ 'data-chart_point_border_color' ] = jQuery.AWB_Color( values.chart_point_border_color ).toRgbaString(); } if ( '' !== values.chart_axis_text_color ) { chartShortcode[ 'data-chart_axis_text_color' ] = jQuery.AWB_Color( values.chart_axis_text_color ).toRgbaString(); } if ( '' !== values.chart_gridline_color ) { chartShortcode[ 'data-chart_gridline_color' ] = jQuery.AWB_Color( values.chart_gridline_color ).toRgbaString(); } if ( '' !== values[ 'class' ] ) { chartShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { chartShortcode.id = values.id; } return chartShortcode; }, /** * Builds the styles. * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildStyles: function( values ) { var styles = '', childrenCount = 0, childLegendTextColors = [], cid = this.model.get( 'cid' ), colors, colorCount, i, chartDatasetElement, chartDatasetAtts; if ( '' !== values.chart_bg_color ) { styles += '#fusion-chart-cid' + cid + '{background-color: ' + values.chart_bg_color + ';}'; } if ( values.chart_padding && 'object' === typeof values.chart_padding ) { styles += '#fusion-chart-cid' + cid + '{padding: ' + values.chart_padding.top + ' ' + values.chart_padding.right + ' ' + values.chart_padding.bottom + ' ' + values.chart_padding.left + ';}'; } if ( 'undefined' !== typeof this.model && 'undefined' !== typeof this.model.children ) { childrenCount = this.model.children.length; if ( childrenCount ) { _.each( this.model.children.models, function( child, key ) { childLegendTextColors[ key ] = child.attributes.params.legend_text_color; } ); } else if ( 'undefined' !== typeof this.model.attributes.params.element_content ) { // Render on page load, children are not generated yet. _.each( this.chartDatasets, function( chartDataset ) { chartDatasetElement = chartDataset.match( FusionPageBuilderApp.regExpShortcode( 'fusion_chart_dataset' ) ); chartDatasetAtts = '' !== chartDatasetElement[ 3 ] ? window.wp.shortcode.attrs( chartDatasetElement[ 3 ] ) : ''; childLegendTextColors.push( chartDatasetAtts.named.legend_text_color ); } ); childrenCount = this.chartDatasets.length; } } if ( '' !== values.legend_text_colors ) { if ( 'pie' === values.chart_type || 'doughnut' === values.chart_type || 'polarArea' === values.chart_type || ( ( 'bar' === values.chart_type || 'horizontalBar' === values.chart_type ) && 1 === childrenCount ) ) { colors = values.legend_text_colors.split( '|' ); } else { colors = childLegendTextColors; } colorCount = colors.length; for ( i = 0; i < colorCount; i++ ) { if ( '' !== colors[ i ] ) { styles += '#fusion-chart-cid' + cid + ' .fusion-chart-legend-wrap li:nth-child(' + ( i + 1 ) + ') span{color: ' + colors[ i ] + ';}'; } } } return styles; } } ); } ); _.extend( FusionPageBuilder.Callback.prototype, { chartShortcodeFilter: function( name, value, args, view ) { var shortcode = '', table = false, labels = [], bgColors = [], borderColors = [], legendTextColors = [], params = {}, changes = []; if ( ! view ) { return; } table = jQuery( '[data-cid="' + view.model.get( 'cid' ) + '"] .fusion-table-builder' ); params = jQuery.extend( true, {}, view.model.get( 'params' ) ); // Table head (X axis labels). table.find( 'thead tr:first-child th' ).each( function( i ) { var val = jQuery( this ).find( 'input' ).val(); if ( 1 < i ) { labels.push( val ); } } ); if ( params.x_axis_labels !== labels.join( '|' ) ) { changes.push( { id: 'x_axis_labels', value: labels.join( '|' ), label: fusionBuilderText.x_axis_label } ); } // Table head (label text colors). table.find( 'thead tr:nth-child(2) th' ).each( function( i ) { if ( 3 < i ) { legendTextColors.push( jQuery( this ).find( '.fusion-builder-option:first-child input' ).val() ); bgColors.push( jQuery( this ).find( '.fusion-builder-option:nth-child(2) input' ).val() ); borderColors.push( jQuery( this ).find( '.fusion-builder-option:nth-child(3) input' ).val() ); } } ); if ( 'undefined' !== typeof params.legend_text_colors && params.legend_text_colors !== legendTextColors.join( '|' ) ) { changes.push( { id: 'legend_text_colors', value: legendTextColors.join( '|' ), label: fusionBuilderText.legend_text_color } ); } if ( 'undefined' !== typeof params.bg_colors && params.bg_colors !== bgColors.join( '|' ) ) { changes.push( { id: 'bg_colors', value: bgColors.join( '|' ), label: fusionBuilderText.background_color } ); } if ( 'undefined' !== typeof params.border_colors && params.border_colors !== borderColors.join( '|' ) ) { changes.push( { id: 'border_colors', value: borderColors.join( '|' ), label: fusionBuilderText.border_color } ); } // Table body (each row is data set). table.find( 'tbody tr' ).each( function() { var $thisTr = jQuery( this ), values = []; shortcode += '[fusion_chart_dataset'; // Table rows (data set title, colors, values). $thisTr.find( 'td' ).each( function( i ) { var $thisRow = jQuery( this ), val = $thisRow.find( 'input' ).val(); switch ( i ) { case 0: shortcode += ' title="' + val + '"'; break; case 1: shortcode += ' legend_text_color="' + val + '"'; break; case 2: shortcode += ' background_color="' + val + '"'; break; case 3: shortcode += ' border_color="' + val + '"'; break; default: values.push( val ); } } ); shortcode += ' values="' + values.join( '|' ) + '" /]'; } ); if ( params.element_content.trim() !== shortcode.trim() ) { changes.push( { id: 'element_content', value: shortcode, label: fusionBuilderText.chart_dataset } ); } _.each( changes, function( change ) { view.changeParam( change.id, change.value, change.label ); } ); return { render: true }; } } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Chart Dataset child View. FusionPageBuilder.fusion_chart_dataset = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Using non debounced version for smoothness. this.refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, element = window.fusionAllElements[ this.model.get( 'element_type' ) ]; atts.values = jQuery.extend( true, {}, element.defaults, _.fusionCleanParameters( atts.params ) ); attributes.chartDatasetShortcode = this.buildDatasetAttr( atts.values ); return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildDatasetAttr: function( values ) { var chartDatasetShortcode = { class: 'fusion-chart-dataset' }; if ( values.title ) { chartDatasetShortcode[ 'data-label' ] = values.title; } else { chartDatasetShortcode[ 'data-label' ] = ' '; } if ( '' !== values.values ) { chartDatasetShortcode[ 'data-values' ] = values.values; } if ( '' !== values.background_color ) { chartDatasetShortcode[ 'data-background_color' ] = jQuery.AWB_Color( values.background_color ).toRgbaString(); } if ( '' !== values.border_color ) { chartDatasetShortcode[ 'data-border_color' ] = jQuery.AWB_Color( values.border_color ).toRgbaString(); } return chartDatasetShortcode; } } ); } ); }( jQuery ) ); ;/* global FusionEvents, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Image Before After Element View. FusionPageBuilder.fusion_image_before_after = FusionPageBuilder.ElementView.extend( { /** * Runs when element is first ini. * * @since 2.0.0 * @return {void} */ onInit: function() { this.listenTo( FusionEvents, 'fusion-preview-toggle', this.previewToggle ); this.listenTo( FusionEvents, 'fusion-wireframe-toggle', this.previewToggle ); this.listenTo( FusionEvents, 'fusion-iframe-loaded', this.initElement ); }, /** * Init Element. * * @since 2.0.0 * @return {void} */ initElement: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_image_before_after', this.model.attributes.cid ); }, /** * Preview mode toggled.. * * @since 2.0.0 * @return {void} */ previewToggle: function() { if ( ! FusionPageBuilderApp.wireframeActive ) { if ( jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'fusion-builder-preview-mode' ) ) { this.disableDroppableElement(); } else { this.enableDroppableElement(); } } }, /** * Runs before view DOM is patched. * * @since 2.0.0 * @return {void} */ beforePatch: function() { this.$el.css( 'min-height', this.$el.outerHeight() + 'px' ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var self = this; this._refreshJs(); setTimeout( function() { self.$el.css( 'min-height', '0px' ); }, 300 ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; if ( '' !== atts.values.before_image || '' !== atts.values.after_image ) { // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrWrapper = this.buildWrapperAttr( atts.values ); attributes.attrLink = this.buildLinkAttr( atts.values ); attributes.attrBeforeImage = this.buildBeforeImageAttr( atts.values ); attributes.attrAfterImage = this.buildAfterImageAttr( atts.values ); attributes.attrOverlay = this.buildOverlayAttr( atts.values ); attributes.attrHandle = this.buildHandleAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); // Any extras that need passed on. attributes.values = atts.values; } return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.offset = parseInt( values.offset, 10 ) / 100; values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); values.borderradius = _.fusionValidateAttrValue( values.borderradius, 'px' ); values.bordersize = _.fusionValidateAttrValue( values.bordersize, 'px' ); values.max_width = _.fusionValidateAttrValue( values.max_width, 'px' ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-image-before-after-element', style: '' } ), cid = this.model.get( 'cid' ); if ( 'switch' === values.type ) { attr[ 'class' ] += ' fusion-image-switch'; } else if ( 'before_after' === values.type ) { attr[ 'class' ] += ' fusion-image-before-after fusion-image-before-after-container'; if ( values.offset || 0 == values.offset ) { attr[ 'data-offset' ] = values.offset.toString(); } if ( values.orientation ) { attr[ 'data-orientation' ] = values.orientation; } if ( values.handle_movement ) { if ( 'drag_click' === values.handle_movement ) { attr[ 'data-move-with-handle-only' ] = 'true'; attr[ 'data-click-to-move' ] = 'true'; } else if ( 'drag' === values.handle_movement ) { attr[ 'data-move-with-handle-only' ] = 'true'; } else if ( 'hover' === values.handle_movement ) { attr[ 'data-move-slider-on-hover' ] = 'true'; } } } if ( '' !== values.max_width ) { attr.style += 'max-width:' + values.max_width + ''; } attr[ 'class' ] += ' fusion-image-before-after-cid' + cid; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildWrapperAttr: function( values ) { var attr = { class: 'fusion-image-before-after-wrapper' }, cid = this.model.get( 'cid' ); if ( values.orientation ) { attr[ 'class' ] += ' fusion-image-before-after-' + values.orientation; } attr[ 'class' ] += ' fusion-image-before-after-wrapper-cid' + cid; return attr; }, /** * Builds link attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildLinkAttr: function( values ) { var attr = { class: 'fusion-image-switch-link', href: values.link, target: values.target, rel: '' }; if ( '_blank' === values.target ) { attr.rel = 'noopener noreferrer'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildBeforeImageAttr: function( values ) { var attr = { class: 'before_after' === values.type ? 'fusion-image-before-after-before' : 'fusion-image-switch-before', src: values.before_image, alt: '' }; return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAfterImageAttr: function( values ) { var attr = { class: 'before_after' === values.type ? 'fusion-image-before-after-after' : 'fusion-image-switch-after', src: values.after_image, alt: '' }; return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildOverlayAttr: function( values ) { var attr = { class: 'fusion-image-before-after-overlay' }; if ( values.label_placement && '' !== values.label_placement ) { attr[ 'class' ] += ' before-after-overlay-' + values.label_placement; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildHandleAttr: function( values ) { var attr = { class: 'fusion-image-before-after-handle' }; if ( values.handle_type && 'default' !== values.handle_type ) { attr[ 'class' ] += ' fusion-image-before-after-handle-' + values.handle_type; } return attr; }, /** * Builds the styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildStyles: function( values ) { var styles = '', color = '', colorObj = '', bgColor = '', cid = this.model.get( 'cid' ); if ( '' !== values.handle_color && 'before_after' === values.type ) { color = values.handle_color; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle {'; styles += 'border-color:' + color + ';'; styles += '}'; if ( 'horizontal' === values.orientation ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-left-arrow {'; styles += 'border-right-color:' + color + ';'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-right-arrow {'; styles += 'border-left-color:' + color + ';'; styles += '}'; if ( values.handle_type && '' !== values.handle_type && 'diamond' === values.handle_type ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-diamond .fusion-image-before-after-left-arrow::before {'; styles += 'border-color:' + color + ' !important;'; styles += '}'; } else if ( values.handle_type && '' !== values.handle_type && 'circle' === values.handle_type ) { colorObj = jQuery.AWB_Color( color ); styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle {'; styles += 'background:' + color + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-left-arrow::before {'; styles += 'border-color:' + colorObj.alpha( 0.6 ).toRgbaString() + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-left-arrow {'; styles += 'border-right-color:' + _.fusionAutoCalculateAccentColor( color ) + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-right-arrow {'; styles += 'border-left-color:' + _.fusionAutoCalculateAccentColor( color ) + ' !important;'; styles += '}'; } } else if ( 'vertical' === values.orientation ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-up-arrow {'; styles += 'border-bottom-color:' + color + ';'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-down-arrow {'; styles += 'border-top-color:' + color + ';'; styles += '}'; if ( values.handle_type && '' !== values.handle_type && 'diamond' === values.handle_type ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-diamond .fusion-image-before-after-left-arrow::before {'; styles += 'border-color:' + color + ' !important;'; styles += '}'; } else if ( values.handle_type && '' !== values.handle_type && 'circle' === values.handle_type ) { colorObj = jQuery.AWB_Color( color ); styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle {'; styles += 'background:' + color + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-down-arrow::before {'; styles += 'border-color:' + colorObj.alpha( 0.6 ).toRgbaString() + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-up-arrow {'; styles += 'border-bottom-color:' + _.fusionAutoCalculateAccentColor( color ) + ' !important;'; styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle-circle .fusion-image-before-after-down-arrow {'; styles += 'border-top-color:' + _.fusionAutoCalculateAccentColor( color ) + ' !important;'; styles += '}'; } } styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle::after {'; styles += 'background:' + color + ';'; if ( 'vertical' !== values.orientation ) { styles += 'box-shadow: 0 3px 0 ' + color + ', 0 0 12px rgba(51,51,51,.5);'; } styles += '}'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle::before {'; styles += 'background:' + color + ';'; if ( 'vertical' !== values.orientation ) { styles += 'box-shadow: 0 3px 0 ' + color + ', 0 0 12px rgba(51,51,51,.5);'; } styles += '}'; } if ( values.handle_bg && '' !== values.handle_bg && 'before_after' === values.type ) { bgColor = values.handle_bg; if ( 'circle' !== values.handle_type && 'arrows' !== values.handle_type ) { if ( 'diamond' !== values.handle_type ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-handle {'; styles += 'background:' + bgColor + ';'; styles += '}'; } else { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-down-arrow:before,'; styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-left-arrow:before {'; styles += 'background:' + bgColor + ';'; styles += '}'; } } } if ( values.font_size && '' !== values.font_size && 'before_after' === values.type ) { styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-before-label:before'; styles += ',.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-after-label:before'; if ( 'out-image-up-down' === values.label_placement ) { styles += ',.fusion-image-before-after-wrapper-cid' + cid + ' .fusion-image-before-after-before-label:before'; styles += ',.fusion-image-before-after-wrapper-cid' + cid + ' .fusion-image-before-after-after-label:before'; } styles += '{'; styles += 'font-size:' + values.font_size + ';'; styles += '}'; } if ( values.accent_color && '' !== values.accent_color && 'before_after' === values.type ) { color = values.accent_color; colorObj = jQuery.AWB_Color( color ); styles += '.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-before-label:before'; styles += ',.fusion-image-before-after-cid' + cid + ' .fusion-image-before-after-after-label:before'; if ( 'out-image-up-down' === values.label_placement ) { styles += ',.fusion-image-before-after-wrapper-cid' + cid + ' .fusion-image-before-after-before-label:before'; styles += ',.fusion-image-before-after-wrapper-cid' + cid + ' .fusion-image-before-after-after-label:before'; } styles += '{'; styles += 'color:' + color + ';'; if ( 'out-image-up-down' !== values.label_placement ) { styles += 'background:' + colorObj.alpha( 0.15 ).toRgbaString() + ';'; } styles += '}'; } if ( 'switch' === values.type && values.transition_time ) { styles += '.fusion-image-switch.fusion-image-before-after-cid' + cid + ' img{'; styles += 'transition: ' + values.transition_time + 's ease-in-out;'; styles += '}'; if ( -1 !== values.before_image.indexOf( '.png' ) && -1 !== values.after_image.indexOf( '.png' ) ) { styles += '.fusion-image-switch.fusion-image-before-after-cid' + cid + ':hover img:first-child{'; styles += 'opacity: 1;'; styles += '}'; } } if ( '0' !== values.bordersize && 0 !== values.bordersize && '0px' !== values.bordersize ) { styles += '.fusion-image-before-after-cid' + cid + ':not(.fusion-image-switch).initialized,'; styles += '.fusion-image-before-after-cid' + cid + '.fusion-image-switch img{'; styles += 'border: ' + values.bordersize + ' solid ' + values.bordercolor + ';'; if ( '0' !== values.borderradius && 0 !== values.borderradius && '0px' !== values.borderradius ) { styles += '-webkit-border-radius:' + values.borderradius + ';-moz-border-radius:' + values.borderradius + ';border-radius:' + values.borderradius + ';'; } styles += '}'; } return styles; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter box parent View FusionPageBuilder.fusion_counters_box = FusionPageBuilder.ParentElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.appendChildren( '.fusion-counters-box' ); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var countersBoxShortcode; // Validate values. this.validateValues( atts.values, atts.params ); countersBoxShortcode = this.buildAtts( atts.values ); // Reset attribute objet. atts = {}; // Recreate attribute object. atts.countersBoxShortcode = countersBoxShortcode; return atts; }, /** * Modifies values. * * @since 2.0 * @param {Object} values - The values. * @param {Object} params - The parameters. * @return {void} */ validateValues: function( values, params ) { values = jQuery.extend( true, {}, fusionAllElements.fusion_counters_box.defaults, _.fusionCleanParameters( params ) ); values.title_size = _.fusionValidateAttrValue( values.title_size, '' ); values.icon_size = _.fusionValidateAttrValue( values.icon_size, '' ); values.body_size = _.fusionValidateAttrValue( values.body_size, '' ); values.columns = Math.min( 6, values.columns ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAtts: function( values ) { var countersBoxShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-counters-box counters-box row fusion-clearfix fusion-columns-' + values.columns } ); if ( '' !== values[ 'class' ] ) { countersBoxShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { countersBoxShortcode.id += ' ' + values.id; } countersBoxShortcode[ 'class' ] += ' fusion-child-element'; countersBoxShortcode[ 'data-empty' ] = this.emptyPlaceholderText; return countersBoxShortcode; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderElements, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Counter box child View FusionPageBuilder.fusion_counter_box = FusionPageBuilder.ChildElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.model.attributes.selectors[ 'class' ] += ( 'video' === this.model.attributes.params.type ) ? ' video' : ' image'; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.model.attributes.selectors[ 'class' ] += ( 'video' === this.model.attributes.params.type ) ? ' video' : ' image'; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var counterBoxContainer, elementContent = atts.values.element_content, parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ), parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_counters_box.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ), counterBoxShortcodeContent, counterWrapper; // Validate values and extras. this.validateValues( atts.values, atts.params ); this.validateParentValues( parentValues ); counterBoxContainer = this.buildContainerAtts( atts.values, parentValues ); counterWrapper = this.buildCounterWrapper( atts.values, parentValues ); counterBoxShortcodeContent = this.buildContentAttr( parentValues ); this.setSelectors( atts.values, parentValues ); // Reset attribute objet. atts = {}; // Create attribute objects. atts.counterBoxContainer = counterBoxContainer; atts.counterWrapper = counterWrapper; atts.counterBoxShortcodeContent = counterBoxShortcodeContent; // Any extras that need passed on. atts.cid = this.model.get( 'cid' ); atts.parent = parent; atts.output = elementContent; return atts; }, /** * Modifies values. * * @since 2.0 * @param {Object} values - The values. * @param {Object} params - The parameters. * @return {void} */ validateValues: function( values, params ) { values = jQuery.extend( true, {}, fusionAllElements.fusion_counter_box.defaults, _.fusionCleanParameters( params ) ); values.value = values.value.replace( ',', '.' ); values[ 'float' ] = values.value.split( '.' ); if ( 'undefined' !== typeof values[ 'float' ][ 1 ] ) { values.decimals = values[ 'float' ][ 1 ].length; } }, /** * Modifies parent values. * * @since 2.0 * @param {Object} parentValues - The parent values. * @return {void} */ validateParentValues: function( parentValues ) { parentValues.title_size = _.fusionValidateAttrValue( parentValues.title_size, '' ); parentValues.icon_size = _.fusionValidateAttrValue( parentValues.icon_size, '' ); parentValues.body_size = _.fusionValidateAttrValue( parentValues.body_size, '' ); parentValues.columns = Math.min( 6, parentValues.columns ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @param {Object} parentValues - The parent element values. * @return {Object} */ buildContainerAtts: function( values, parentValues ) { var counterBoxContainer = { class: 'counter-box-container' }; counterBoxContainer.style = 'border: 1px solid ' + parentValues.border_color + ';'; return counterBoxContainer; }, /** * Builds the HTML for the wrapper element. * * @since 2.0 * @param {Object} values - The values. * @param {Object} parentValues - The parent element values. * @return {string} */ buildCounterWrapper: function( values, parentValues ) { var unitOutput = values.unit ? '<span class="unit">' + values.unit + '</span>' : '', initValue = ( 'up' === values.direction ) ? 0 : values.value, iconOutput = '', decimals = 0, counter, selectedIcon, counterBoxShortcodeCounter, counterBoxShortcodeCounterContainer, counterBoxShortcodeIcon, decimalsValue; values.value = values.value.replace( ',', '.' ); decimalsValue = values.value.split( '.' ); if ( 'undefined' !== typeof decimalsValue[ 1 ] ) { decimals = decimalsValue[ 1 ].length; } // counterBoxShortcodeCounter Attributes. counterBoxShortcodeCounter = { class: 'display-counter', 'data-value': values.value, 'data-delimiter': values.delimiter, 'data-direction': values.direction, 'data-decimals': decimals }; // Make value editable. counterBoxShortcodeCounter = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), param: 'value', toolbar: false, 'disable-return': true, 'disable-extra-spaces': true }, counterBoxShortcodeCounter ); counter = '<span ' + _.fusionGetAttributes( counterBoxShortcodeCounter ) + '>' + initValue + '</span>'; if ( values.icon || parentValues.icon ) { selectedIcon = ( values.icon ) ? values.icon : parentValues.icon; counterBoxShortcodeIcon = { class: 'counter-box-icon fontawesome-icon ' + _.fusionFontAwesome( selectedIcon ), style: 'font-size:' + parentValues.icon_size + 'px;', 'aria-hidden': 'true' }; iconOutput = '<i ' + _.fusionGetAttributes( counterBoxShortcodeIcon ) + '></i>'; } counter = ( 'prefix' === values.unit_pos ) ? iconOutput + unitOutput + counter : iconOutput + counter + unitOutput; // counterBoxShortcodeCounterContainer Atributes. counterBoxShortcodeCounterContainer = { class: 'content-box-percentage content-box-counter', style: 'color:' + parentValues.color + ';font-size:' + parentValues.title_size + 'px;line-height:normal;' }; return '<div ' + _.fusionGetAttributes( counterBoxShortcodeCounterContainer ) + '>' + counter + '</div>'; }, /** * Builds attributes. * * @since 2.0 * @param {Object} parentValues - The parent element values. * @return {Object} */ buildContentAttr: function( parentValues ) { var counterBoxShortcodeContent = { class: 'counter-box-content', style: 'color:' + parentValues.body_color + ';font-size:' + parentValues.body_size + 'px;' }; // Make content editable. counterBoxShortcodeContent = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), param: 'element_content', toolbar: 'simple', 'disable-return': true, 'disable-extra-spaces': true }, counterBoxShortcodeContent ); return counterBoxShortcodeContent; }, /** * Sets selectors in the model. * * @since 2.0 * @param {Object} values - The values. * @param {Object} parentValues - The parent element values. * @return {void} */ setSelectors: function( values, parentValues ) { var columns = 1, counterBoxShortcode = {}, animations; if ( 'undefined' !== typeof parentValues.columns && '' !== parentValues.columns && 0 !== parentValues.columns ) { columns = 12 / parentValues.columns; } counterBoxShortcode[ 'class' ] = 'fusion-counter-box fusion-column col-counter-box counter-box-wrapper col-lg-' + columns + ' col-md-' + columns + ' col-sm-' + columns; if ( '5' === parentValues.columns || 5 === parentValues.columns ) { counterBoxShortcode[ 'class' ] = 'fusion-counter-box fusion-column col-counter-box counter-box-wrapper col-lg-2 col-md-2 col-sm-2'; } if ( 'yes' === parentValues.icon_top ) { counterBoxShortcode[ 'class' ] += ' fusion-counter-box-icon-top'; } if ( '' !== values[ 'class' ] ) { counterBoxShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { counterBoxShortcode.id = values.id; } if ( parentValues.animation_type ) { animations = _.fusionGetAnimations( { offset: parentValues.animation_offset } ); counterBoxShortcode = jQuery.extend( counterBoxShortcode, animations ); counterBoxShortcode[ 'class' ] += ' ' + counterBoxShortcode.animation_class; delete counterBoxShortcode.animation_class; } this.model.set( 'selectors', counterBoxShortcode ); } } ); } ); }( jQuery ) ); ;/* global FusionApp */ /* eslint no-unused-vars: 0 */ /* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Widget Area Element View. FusionPageBuilder.fusion_widget_area = FusionPageBuilder.ElementView.extend( { /** * Fires during element render() function. * * @since 2.0.4 * @param {Object} atts - The attributes. * @return {Object} */ onRender: function() { var elementContent = this.$el.html(); this.$el.html( FusionApp.removeScripts( elementContent ) ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, name = 'undefined' !== typeof atts.values.name ? atts.values.name.replace( /-/g, '_' ) : ''; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyling( atts.values ); attributes.widgetArea = false; if ( 'undefined' !== atts.query_data && 'undefined' !== typeof atts.query_data[ name ] ) { attributes.widgetArea = atts.query_data[ name ]; } return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values = _.fusionGetPadding( values ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-widget-area fusion-content-widget-area', style: '' } ), cid = this.model.get( 'cid' ); attr[ 'class' ] += ' fusion-widget-area-cid' + cid; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildStyling: function( values ) { var styles = '', padding = '', cid = this.model.get( 'cid' ); if ( '' !== values.background_color ) { styles += '.fusion-widget-area-cid' + cid + ' {background-color:' + values.background_color + ';}'; } if ( '' !== values.padding ) { if ( -1 === values.padding.indexOf( '%' ) && -1 === values.padding.indexOf( 'px' ) ) { values.padding = values.padding + 'px'; } padding = _.fusionGetValueWithUnit( values.padding ); styles += '.fusion-widget-area-cid' + cid + ' {padding:' + padding + ';}'; } if ( '' !== values.title_color ) { styles += '.fusion-widget-area-cid' + cid + ' .widget h4 {color:' + values.title_color + ';}'; styles += '.fusion-widget-area-cid' + cid + ' .widget .heading h4 {color:' + values.title_color + ';}'; } if ( '' !== values.title_size ) { styles += '.fusion-widget-area-cid' + cid + ' .widget h4 {font-size:' + values.title_size + ';}'; styles += '.fusion-widget-area-cid' + cid + ' .widget .heading h4 {font-size:' + values.title_size + ';}'; } return styles; } } ); // Widget Area Callback. _.extend( FusionPageBuilder.Callback.prototype, { fusion_widget_area: function( name, value, modelData, args, cid, action, model, view ) { // jshint ignore: line var queryName, params = jQuery.extend( true, {}, modelData.params ), ajaxData = {}; if ( 'undefined' !== typeof name && ! args.skip ) { params[ name ] = value; } ajaxData.params = jQuery.extend( true, {}, window.fusionAllElements[ modelData.element_type ].defaults, _.fusionCleanParameters( params ) ); if ( 'undefined' !== typeof name && 'undefined' !== typeof value ) { queryName = value.replace( /-/g, '_' ); } if ( 'undefined' !== typeof model.query_data && 'undefined' !== typeof model.query_data[ queryName ] && 'undefined' !== typeof view ) { view.reRender(); return true; } // Send this data with ajax or rest. jQuery.ajax( { url: window.fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_widget_area', model: ajaxData, fusion_load_nonce: window.fusionAppConfig.fusion_load_nonce } } ) .done( function( response ) { var queryData; if ( 'undefined' !== typeof model && 'undefined' !== typeof model.get( 'query_data' ) ) { queryData = model.get( 'query_data' ); queryData[ queryName ] = response[ queryName ]; } else { queryData = response; } model.set( 'query_data', queryData ); if ( ! args.skip && 'undefined' !== typeof name ) { view.changeParam( name, value ); } if ( 'generated_element' !== model.get( 'type' ) ) { view.reRender(); } } ); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Content Boxes Parent View. FusionPageBuilder.fusion_content_boxes = FusionPageBuilder.ParentElementView.extend( { /** * Image map of child element images and thumbs. * * @since 2.0 */ imageMap: {}, /** * Initial data has run. * * @since 2.0 */ initialData: false, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this.generateChildElements(); this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects. attributes.attr = this.buildAttr( atts.values ); // Build styles. attributes.styles = this.buildStyles( atts.values ); return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { // Backwards compatibility for when we had image width and height params. if ( 'undefined' !== typeof values.image_width ) { values.image_width = values.image_width ? values.image_width : '35'; } else { values.image_width = values.image_max_width; } values.title_size = _.fusionValidateAttrValue( values.title_size, 'px', false ); values.icon_circle_radius = _.fusionValidateAttrValue( values.icon_circle_radius, 'px' ); values.icon_size = _.fusionValidateAttrValue( values.icon_size, 'px' ); values.margin_top = _.fusionValidateAttrValue( values.margin_top, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.margin_bottom = _.fusionValidateAttrValue( values.margin_bottom, 'px' ); values.circlebordersize = _.fusionValidateAttrValue( values.circlebordersize, 'px' ); values.outercirclebordersize = _.fusionValidateAttrValue( values.outercirclebordersize, 'px' ); if ( values.linktarget ) { values.link_target = values.linktarget; } if ( 'timeline-vertical' === values.layout ) { values.columns = 1; } if ( 'timeline-vertical' === values.layout || 'timeline-horizontal' === values.layout ) { values.animation_delay = 350; values.animation_speed = 0.25; values.animation_type = 'fade'; values.animation_direction = ''; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-content-boxes content-boxes', style: '' } ), cid = this.model.get( 'cid' ), totalNumOfColumns = 'undefined' !== typeof values.element_content ? values.element_content.match( /\[fusion_content_box ((.|\n|\r)*?)\]/g ) : 1, numOfColumns; totalNumOfColumns = null !== totalNumOfColumns ? totalNumOfColumns.length : 1; numOfColumns = values.columns; if ( '' === numOfColumns || '0' === numOfColumns ) { numOfColumns = totalNumOfColumns; numOfColumns = Math.max( 6, numOfColumns ); } else if ( 6 < numOfColumns ) { numOfColumns = 6; } values.columns = numOfColumns; attr[ 'class' ] += ' columns row'; attr[ 'class' ] += ' fusion-columns-' + numOfColumns; attr[ 'class' ] += ' fusion-columns-total-' + totalNumOfColumns; attr[ 'class' ] += ' fusion-content-boxes-cid' + cid; attr[ 'class' ] += ' content-boxes-' + values.layout; attr[ 'class' ] += ' content-' + values.icon_align; if ( 'timeline-horizontal' === values.layout || 'clean-vertical' === values.layout ) { attr[ 'class' ] += ' content-boxes-icon-on-top'; } if ( 'timeline-vertical' === values.layout ) { attr[ 'class' ] += ' content-boxes-icon-with-title'; } if ( 'clean-horizontal' === values.layout ) { attr[ 'class' ] += ' content-boxes-icon-on-side'; } if ( '' !== values.animation_delay ) { attr[ 'data-animation-delay' ] = values.animation_delay; attr[ 'class' ] += ' fusion-delayed-animation'; } attr[ 'class' ] += ' fusion-child-element'; attr.style += 'margin-top:' + values.margin_top + ';'; attr.style += 'margin-bottom:' + values.margin_bottom + ';'; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ), circleHoverAccentColor = ''; if ( '' !== values.title_color ) { styles += '.fusion-content-boxes-cid' + cid + ' .heading .content-box-heading{color:' + values.title_color + ';}'; } styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .content-box-heading, .fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .heading-link .content-box-heading,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover .heading .content-box-heading,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover .heading .heading-link .content-box-heading,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover.link-area-box .fusion-read-more,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover.link-area-box .fusion-read-more::after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover.link-area-box .fusion-read-more::before,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .fusion-read-more:hover:after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .fusion-read-more:hover:before,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .fusion-read-more:hover,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover.link-area-box .fusion-read-more,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover.link-area-box .fusion-read-more::after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover.link-area-box .fusion-read-more::before,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .icon .circle-no, .fusion-content-boxes-cid' + cid + ' .heading .heading-link:hover .content-box-heading { color: ' + values.hover_accent_color + ';}'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover .icon .circle-no {color: ' + values.hover_accent_color + ' !important;}'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box.link-area-box-hover .fusion-content-box-button {'; styles += 'background: ' + fusionAllElements.fusion_button.defaults.button_gradient_top_color_hover + ';'; styles += 'color: ' + fusionAllElements.fusion_button.defaults.button_accent_hover_color + ';'; if ( fusionAllElements.fusion_button.defaults.button_gradient_top_color_hover !== fusionAllElements.fusion_button.defaults.button_gradient_bottom_color_hover ) { styles += 'background-image: -webkit-gradient( linear, left bottom, left top, from( ' + fusionAllElements.fusion_button.defaults.button_gradient_bottom_color_hover + ' ), to( ' + fusionAllElements.fusion_button.defaults.button_gradient_top_color_hover + ' ) );'; styles += 'background-image: linear-gradient( to top, ' + fusionAllElements.fusion_button.defaults.button_gradient_bottom_color_hover + ', ' + fusionAllElements.fusion_button.defaults.button_gradient_top_color_hover + ' )'; } styles += '}'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box.link-area-box-hover .fusion-content-box-button .fusion-button-text {'; styles += 'color: ' + fusionAllElements.fusion_button.defaults.button_accent_hover_color + ';'; styles += '}'; circleHoverAccentColor = values.hover_accent_color; if ( 'transparent' === values.circlecolor || 0 === jQuery.AWB_Color( values.circlecolor ).alpha() || 'no' === values.icon_circle ) { circleHoverAccentColor = 'transparent'; } styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .icon > span,'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .icon i.circle-yes { background-color: ' + circleHoverAccentColor + ' !important;}'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover .heading .icon > span,'; styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .icon i.circle-yes { border-color: ' + values.hover_accent_color + ' !important; }'; if ( 'pulsate' === values.icon_hover_type && '' !== values.hover_accent_color ) { styles += '.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover.icon-hover-animation-pulsate .fontawesome-icon:after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover.icon-hover-animation-pulsate .fontawesome-icon:after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-link-icon-hover.icon-wrapper-hover-animation-pulsate .icon span:after,.fusion-content-boxes-cid' + cid + ' .fusion-content-box-hover .link-area-box-hover.icon-wrapper-hover-animation-pulsate .icon span:after {-webkit-box-shadow:0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.hover_accent_color + ', 0 0 0 10px rgba(255,255,255,0.5);-moz-box-shadow:0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.hover_accent_color + ', 0 0 0 10px rgba(255,255,255,0.5);box-shadow: 0 0 0 2px rgba(255,255,255,0.1), 0 0 10px 10px ' + values.hover_accent_color + ', 0 0 0 10px rgba(255,255,255,0.5);}'; } if ( 'clean-horizontal' === values.layout || 'clean-vertical' === values.layout ) { styles += '.fusion-content-boxes-cid' + cid + '.fusion-columns-' + values.columns + ' .content-box-column:nth-of-type(' + values.columns + 'n) {border-right-width:1px;}'; } return styles; }, /** * Extendable function for when child elements get generated. * * @since 2.0.0 * @param {Object} modules An object of modules that are not a view yet. * @return {void} */ onGenerateChildElements: function( modules ) { this.addImagesToImageMap( modules, false, false ); }, /** * Add images to the view's image map. * * @since 2.0 * @param {Object} childrenData - The children for which images need added to the map. * @param bool async - Determines if the AJAX call should be async. * @param bool async - Determines if the view should be re-rendered. * @return void */ addImagesToImageMap: function( childrenData, async, reRender ) { var view = this, queryData = {}; async = ( 'undefined' === typeof async ) ? true : async; reRender = ( 'undefined' === typeof reRender ) ? true : reRender; view.initialData = true; _.each( childrenData, function( child ) { var params = ( 'undefined' !== typeof child.get ) ? child.get( 'params' ) : child.params, cid = ( 'undefined' !== typeof child.get ) ? child.get( 'cid' ) : child.cid, imageId = 'undefined' !== typeof params.image_id && '' !== params.image_id ? params.image_id : false, image = 'undefined' !== typeof params.image && '' !== params.image ? params.image : false; // Has neither url or ID set. if ( ! imageId && ! image ) { return; } // if it has image id set and available, no need to progress. if ( imageId && 'undefined' !== typeof view.imageMap[ imageId ] ) { return; } // if it has image url set and available, no need to progress. if ( image && 'undefined' !== typeof view.imageMap[ image ] ) { return; } // Made it this far we need to get image data. queryData[ cid ] = params; } ); // Send this data with ajax or rest. if ( ! _.isEmpty( queryData ) ) { jQuery.ajax( { async: async, url: window.fusionAppConfig.ajaxurl, type: 'post', dataType: 'json', data: { action: 'get_fusion_content_boxes_children_data', children: queryData, fusion_load_nonce: window.fusionAppConfig.fusion_load_nonce } } ) .done( function( response ) { view.updateImageMap( response ); if ( reRender ) { view.reRender(); } } ); } else if ( reRender ) { view.reRender(); } }, /** * Update the view's image map. * * @since 2.0 * @param {Object} images - The images object to inject. * @return void */ updateImageMap: function( images ) { var self = this; _.each( images, function( imageData, image ) { if ( 'undefined' === typeof self.imageMap[ image ] ) { self.imageMap[ image ] = imageData; } } ); } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Content Boxes Child View. FusionPageBuilder.fusion_content_box = FusionPageBuilder.ChildElementView.extend( { resetTypography: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-typography-reset', this.model.get( 'cid' ) ); if ( 800 > jQuery( '#fb-preview' ).width() ) { setTimeout( function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'resize' ); }, 50 ); } }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var parentView, queryData = this.model.get( 'query_data' ); // Update the parent image map with latest query data images. if ( 'undefined' !== typeof queryData ) { parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentView.updateImageMap( queryData ); } if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var parentView, queryData = this.model.get( 'query_data' ); // Update the parent image map with latest query data images. if ( 'undefined' !== typeof queryData ) { parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ); parentView.updateImageMap( queryData ); } this.resetTypography(); if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } // Using non debounced version for smoothness. this.refreshJs(); }, onCancel: function() { this.resetTypography(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts ); this.extras = atts.extras; // Create attribute objects. this.buildAttr( atts ); attributes.attrShortcodeIcon = this.buildShortcodeIconAttr( atts ); attributes.attrShortcodeIconParent = this.buildShortcodeIconParentAttr( atts ); attributes.attrShortcodeIconWrapper = this.buildShortcodeIconWrapperAttr( atts ); attributes.attrContentBoxHeading = this.buildContentBoxHeadingAttr( atts ); attributes.attrHeadingWrapper = this.buildContentBoxHeadingWrapperAttr( atts ); attributes.attrContentContainer = this.buildContentContainerAttr( atts ); attributes.attrShortcodeTimeline = this.buildShortcodeTimelineAttr( atts ); attributes.attrContentWrapper = this.buildContentWrapperAttr( atts ); attributes.attrHeadingLink = this.contentBoxShortcodeAttrs( false, 'heading-link', atts ); attributes.attrReadMore = this.contentBoxShortcodeAttrs( true, 'fusion-read-more', atts ); attributes.attrButton = this.contentBoxShortcodeAttrs( true, false, atts ); // Build styles. attributes.styles = this.buildStyles( atts ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.output = atts.values.element_content; attributes.parentCid = atts.parent; attributes.values = atts.values; attributes.parentValues = atts.parentValues; return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} atts - The attributes. * @return {void} */ validateValues: function( atts ) { var values = atts.values, parentValues = atts.parentValues, params = this.model.get( 'params' ), queryData = atts.query_data, parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), imageData = false; // Case when image is set on parent element and icon on child element. if ( ( 'undefined' === typeof params.image || '' === params.image ) && ( 'undefined' !== typeof params.icon && '' !== params.icon ) ) { values.image = ''; } // Backwards compatibility for when we had image width and height params. if ( 'undefined' !== typeof params.image_width && params.image_width ) { values.image_width = params.image_width; } else { values.image_width = values.image_max_width; } values.image_width = _.fusionValidateAttrValue( values.image_width, '' ); if ( 'undefined' !== typeof values.image && ( '' !== values.image || '' !== values.image_id ) ) { if ( 'undefined' !== typeof queryData && 'undefined' !== typeof queryData[ values.image ] ) { imageData = queryData[ values.image ]; } else if ( 'undefined' !== typeof queryData && 'undefined' !== typeof queryData[ values.image_id ] ) { imageData = queryData[ values.image_id ]; } else if ( 'undefined' !== typeof parentView.imageMap[ values.image ] ) { imageData = parentView.imageMap[ values.image ]; } else if ( 'undefined' !== typeof parentView.imageMap[ values.image_id ] ) { imageData = parentView.imageMap[ values.image_id ]; } if ( imageData ) { if ( -1 === parseInt( values.image_width ) || '' === values.image_width ) { values.image_width = 'undefined' !== typeof imageData.width ? imageData.width : '35'; } values.image_height = 'undefined' !== typeof imageData.width ? Math.round( ( parseFloat( values.image_width ) / parseFloat( imageData.width ) ) * parseFloat( imageData.height ) * 100 ) / 100 : values.image_width; } else { if ( -1 === parseInt( values.image_width ) ) { values.image_width = '35'; } values.image_height = values.image_width; } } else { values.image_width = '' === values.image_width ? '35' : values.image_width; values.image_height = '35'; } if ( values.linktarget ) { values.link_target = values.linktarget; } if ( 'parent' === parentValues.settings_lvl ) { values.backgroundcolor = parentValues.backgroundcolor; values.circlecolor = parentValues.circlecolor; values.circlebordercolor = parentValues.circlebordercolor; values.circlebordersize = parentValues.circlebordersize; values.outercirclebordercolor = parentValues.outercirclebordercolor; values.outercirclebordersize = parentValues.outercirclebordersize; values.iconcolor = parentValues.iconcolor; values.animation_type = parentValues.animation_type; values.animation_direction = parentValues.animation_direction; values.animation_speed = parentValues.animation_speed; values.link_target = parentValues.link_target; } if ( 'timeline-vertical' === parentValues.layout ) { parentValues.columns = 1; } if ( 'timeline-vertical' === parentValues.layout || 'timeline-horizontal' === parentValues.layout ) { values.animation_speed = 0.25; values.animation_type = 'fade'; values.animation_direction = ''; } values.circlebordersize = _.fusionValidateAttrValue( values.circlebordersize, 'px' ); }, /** * Set attributes in the model. * * @since 2.0 * @param {Object} atts - The attributes. * @return {void} */ buildAttr: function( atts ) { var attr = { class: 'fusion-column content-box-column', style: '' }, cid = this.model.get( 'cid' ), values = atts.values, parentValues = atts.parentValues, rowCounter = 1, numOfColumns = parentValues.columns, columns = '', borderColor = ''; if ( '' === numOfColumns || '0' === numOfColumns ) { numOfColumns = 1; } else if ( 6 < numOfColumns ) { numOfColumns = 6; } numOfColumns = parseInt( numOfColumns, 10 ); columns = 12 / numOfColumns; if ( rowCounter > numOfColumns ) { rowCounter = 1; } attr[ 'class' ] += ' content-box-column content-box-column-cid-' + cid; attr[ 'class' ] += ' col-lg-' + columns; attr[ 'class' ] += ' col-md-' + columns; attr[ 'class' ] += ' col-sm-' + columns; if ( 5 === numOfColumns ) { attr[ 'class' ] = 'fusion-column content-box-column content-box-column-cid-' + cid + ' col-lg-2 col-md-2 col-sm-2'; } attr[ 'class' ] += ' fusion-content-box-hover '; if ( 'timeline-vertical' === parentValues.layout || 'timeline-horizontal' === parentValues.layout ) { attr[ 'class' ] += ' fusion-appear'; } if ( values.circlebordercolor ) { borderColor = values.circlebordercolor; } if ( values.outercirclebordercolor ) { borderColor = values.outercirclebordercolor; } if ( ! values.circlebordercolor && ! values.outercirclebordercolor ) { borderColor = '#f6f6f6'; } if ( 1 === parseFloat( cid ) / parseFloat( numOfColumns ) ) { attr[ 'class' ] += ' content-box-column-first-in-row'; } if ( atts.last ) { attr[ 'class' ] += ' content-box-column-last'; } if ( parseFloat( cid ) === parseFloat( numOfColumns ) ) { attr[ 'class' ] += ' content-box-column-last-in-row'; } if ( borderColor && -1 !== jQuery.inArray( parentValues.layout, [ 'clean-vertical', 'clean-horizontal' ] ) ) { attr.style += 'border-color:' + borderColor + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } this.model.set( 'selectors', attr ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildShortcodeIconAttr: function( atts ) { var attr = { class: '', style: '', 'aria-hidden': 'true' }, values = atts.values, parentValues = atts.parentValues; if ( values.image ) { attr[ 'class' ] = 'image'; if ( 'icon-boxed' === parentValues.layout && values.image_width && values.image_height ) { attr.style = 'margin-left:-' + ( parseFloat( values.image_width ) / 2 ) + 'px;'; attr.style += 'top:-' + ( ( parseFloat( values.image_height ) / 2 ) + 50 ) + 'px;'; } } else if ( values.icon ) { attr[ 'class' ] = 'fontawesome-icon ' + _.fusionFontAwesome( values.icon ); // Set parent values if child values are unset to get downwards compatibility. if ( ! values.circle ) { values.circle = parentValues.circle; } if ( 'yes' === parentValues.icon_circle ) { attr[ 'class' ] += ' circle-yes'; if ( values.circlebordercolor ) { attr.style += 'border-color:' + values.circlebordercolor + ';'; } if ( values.circlebordersize ) { attr.style += 'border-width:' + values.circlebordersize + ';'; } if ( values.circlecolor ) { attr.style += 'background-color:' + values.circlecolor + ';'; } attr.style += 'height:' + ( parseFloat( parentValues.icon_size ) * 2 ) + 'px;width:' + ( parseFloat( parentValues.icon_size ) * 2 ) + 'px;line-height:' + ( parseFloat( parentValues.icon_size ) * 2 ) + 'px;'; if ( 'icon-boxed' === parentValues.layout && ( '' === values.outercirclebordercolor || '' === values.outercirclebordersize || '' !== parseFloat( values.outercirclebordersize ) ) ) { attr.style += 'top:-' + ( 50 + parseFloat( parentValues.icon_size ) ) + 'px;margin-left:-' + parseFloat( parentValues.icon_size ) + 'px;'; } if ( 'round' === parentValues.icon_circle_radius ) { parentValues.icon_circle_radius = '100%'; } attr.style += 'border-radius:' + parentValues.icon_circle_radius + ';'; if ( values.outercirclebordercolor && values.outercirclebordersize && 0 !== parseFloat( values.outercirclebordersize ) ) { // If there is a thick border, kill border width and make it center aligned positioned. attr.style += 'position:relative;'; attr.style += 'top:auto;'; attr.style += 'left:auto;'; attr.style += 'margin:0;'; attr.style += 'box-sizing: content-box;'; } } else { attr[ 'class' ] += ' circle-no'; attr.style += 'background-color:transparent;border-color:transparent;height:auto;width: ' + _.fusionGetValueWithUnit( parentValues.icon_size ) + ';line-height:normal;'; if ( 'icon-boxed' === parentValues.layout ) { attr.style += 'position:relative;left:auto;right:auto;top:auto;margin-left:auto;margin-right:auto;'; } } if ( values.iconcolor ) { attr.style += 'color:' + values.iconcolor + ';'; } if ( values.iconflip ) { attr[ 'class' ] += ' fa-flip-' + values.iconflip; } if ( values.iconrotate ) { attr[ 'class' ] += ' fa-rotate-' + values.iconrotate; } if ( 'yes' === values.iconspin ) { attr[ 'class' ] += ' fa-spin'; } attr.style += 'font-size:' + parentValues.icon_size + ';'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildShortcodeIconParentAttr: function( atts ) { var attr = { class: 'icon', style: '' }, values = atts.values, parentValues = atts.parentValues, animationDelay = ''; if ( 'yes' !== parentValues.icon_circle && 'icon-boxed' === parentValues.layout ) { attr.style += 'position:absolute;width: 100%;top:-' + ( 50 + ( parseFloat( parentValues.icon_size ) / 2 ) ) + 'px;'; } if ( 'timeline-vertical' === parentValues.layout && 'right' === parentValues.icon_align && ( ! values.outercirclebordercolor || ! values.circlebordersize ) ) { attr.style += 'padding-left:20px;'; } if ( parentValues.animation_delay ) { animationDelay = parentValues.animation_delay; attr.style += '-webkit-animation-duration: ' + animationDelay + 'ms;'; attr.style += 'animation-duration: ' + animationDelay + 'ms;'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildShortcodeIconWrapperAttr: function( atts ) { var attr = { class: 'icon', style: '' }, values = atts.values, parentValues = atts.parentValues, marginDirection = '', margin = '', transparentCircle = 'transparent' === values.circlecolor || 0 === jQuery.AWB_Color( values.circlecolor ).alpha(); if ( values.icon ) { attr[ 'class' ] = ''; if ( 'yes' === parentValues.icon_circle ) { attr.style += 'height:' + ( ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) ) * 2 ) + 'px;'; attr.style += 'width:' + ( ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) ) * 2 ) + 'px;'; attr.style += 'line-height:' + ( parseFloat( parentValues.icon_size ) + ( parseFloat( values.circlebordersize ) * 2 ) ) + 'px;'; if ( values.outercirclebordercolor ) { attr.style += 'border-color:' + values.outercirclebordercolor + ';'; } if ( values.outercirclebordersize && 0 !== parseFloat( values.outercirclebordersize ) ) { attr.style += 'border-width:' + parseFloat( values.outercirclebordersize ) + 'px;'; } attr.style += 'border-style:solid;'; if ( values.circlebordercolor && 0 !== parseFloat( values.circlebordersize ) ) { attr.style += 'background-color:' + values.circlebordercolor + ';'; } else if ( values.outercirclebordersize && 0 !== parseFloat( values.outercirclebordersize ) && ! transparentCircle ) { attr.style += 'background-color:' + values.outercirclebordercolor + ';'; } if ( 'icon-boxed' === parentValues.layout ) { attr.style += 'position:absolute;'; attr.style += 'top:-' + ( 50 + parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) ) + 'px;'; attr.style += 'margin-left:-' + ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) ) + 'px;'; } if ( 'round' === parentValues.icon_circle_radius ) { parentValues.icon_circle_radius = '100%'; } if ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'timeline-vertical', 'clean-horizontal' ] ) ) { marginDirection = 'margin-right'; if ( 'right' === parentValues.icon_align ) { marginDirection = 'margin-left'; } margin = '20px'; if ( 'timeline-vertical' === parentValues.layout && 'right' === parentValues.icon_align ) { margin = '10px'; } attr.style += marginDirection + ':' + margin + ';'; } attr.style += 'box-sizing:content-box;'; attr.style += 'border-radius:' + parentValues.icon_circle_radius + ';'; } } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildContentBoxHeadingAttr: function( atts ) { var attr = { class: 'content-box-heading' }, values = atts.values, parentValues = atts.parentValues, fontSize = '', fullIconSize = ''; if ( parentValues.title_size ) { fontSize = parseFloat( parentValues.title_size ); attr.style = 'font-size:' + fontSize + 'px;line-height:' + ( fontSize + 5 ) + 'px;'; attr[ 'data-fontsize' ] = fontSize; attr[ 'data-lineheight' ] = ( fontSize + 5 ); attr[ 'data-inline-fontsize' ] = fontSize + 'px'; attr[ 'data-inline-lineheight' ] = ( fontSize + 5 ) + 'px'; } if ( 'right' === parentValues.icon_align && '' !== attr.style && ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'icon-with-title', 'timeline-vertical', 'clean-horizontal' ] ) ) ) { attr.style += ' text-align:' + parentValues.icon_align + ';'; } else if ( 'left' === parentValues.icon_align && jQuery( 'body' ).hasClass( 'rtl' ) && '' === attr.style && ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'icon-with-title', 'timeline-vertical', 'clean-horizontal' ] ) ) ) { attr.style += ' text-align:' + parentValues.icon_align + ';'; } if ( 'icon-on-side' === parentValues.layout || 'clean-horizontal' === parentValues.layout ) { if ( '' !== values.image && '' !== values.image_width && '' !== values.image_height ) { if ( 'right' === parentValues.icon_align ) { attr.style += 'padding-right:' + ( parseFloat( values.image_width ) + 20 ) + 'px;'; } else { attr.style += 'padding-left:' + ( parseFloat( values.image_width ) + 20 ) + 'px;'; } } else if ( '' !== values.icon ) { if ( 'yes' === parentValues.icon_circle ) { fullIconSize = ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parentValues.icon_size; } if ( 'right' === parentValues.icon_align ) { attr.style += 'padding-right:' + ( parseFloat( fullIconSize ) + 20 ) + 'px;'; } else { attr.style += 'padding-left:' + ( parseFloat( fullIconSize ) + 20 ) + 'px;'; } } } attr = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), param: 'title', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, attr ); return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildContentBoxHeadingWrapperAttr: function( atts ) { var attr = { class: 'heading' }, values = atts.values, parentValues = atts.parentValues; if ( '' !== values.icon || '' !== values.image ) { attr[ 'class' ] += ' heading-with-icon'; } if ( '' !== parentValues.icon_align ) { attr[ 'class' ] += ' icon-' + parentValues.icon_align; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildContentContainerAttr: function( atts ) { var attr = { class: 'content-container', style: '' }, values = atts.values, parentValues = atts.parentValues, imageHeight = '', fullIconSize = ''; if ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'timeline-vertical', 'clean-horizontal' ] ) && values.image && values.image_width && values.image_height ) { if ( 'right' === parentValues.icon_align ) { attr.style += 'padding-right:' + ( parseFloat( values.image_width ) + 20 ) + 'px;'; } else { attr.style += 'padding-left:' + ( parseFloat( values.image_width ) + 20 ) + 'px;'; } if ( 'timeline-vertical' === parentValues.layout ) { imageHeight = values.image_height; if ( imageHeight > parseFloat( parentValues.title_size ) && 0 < imageHeight - parseFloat( parentValues.title_size ) - 15 ) { attr.style += 'margin-top:-' + ( imageHeight - parseFloat( parentValues.title_size ) ) + 'px;'; } } } else if ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'timeline-vertical', 'clean-horizontal' ] ) && values.icon ) { if ( 'yes' === parentValues.icon_circle ) { fullIconSize = ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parentValues.icon_size; } if ( 'right' === parentValues.icon_align ) { attr.style += 'padding-right:' + ( parseFloat( fullIconSize ) + 20 ) + 'px;'; } else { attr.style += 'padding-left:' + ( parseFloat( fullIconSize ) + 20 ) + 'px;'; } if ( 'timeline-vertical' === parentValues.layout ) { if ( fullIconSize > parseFloat( parentValues.title_size ) && 0 < fullIconSize - parseFloat( parentValues.title_size ) - 15 ) { if ( 'timeline-vertical' === parentValues.layout ) { attr.style += 'margin-top:-' + ( ( parseFloat( fullIconSize ) - parseFloat( parentValues.title_size ) ) / 2 ) + 'px;'; } else { attr.style += 'margin-top:-' + ( parseFloat( fullIconSize ) - parseFloat( parentValues.title_size ) ) + 'px;'; } } } } if ( 'right' === parentValues.icon_align && '' !== attr.style && ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'icon-with-title', 'timeline-vertical', 'clean-horizontal' ] ) ) ) { attr.style += ' text-align:' + parentValues.icon_align + ';'; } else if ( 'right' === parentValues.icon_align && '' === attr.style && ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'icon-with-title', 'timeline-vertical', 'clean-horizontal' ] ) ) ) { attr.style += ' text-align:' + parentValues.icon_align + ';'; } if ( parentValues.body_color ) { attr.style += 'color:' + parentValues.body_color + ';'; } attr = _.fusionInlineEditor( { cid: this.model.get( 'cid' ) }, attr ); return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildShortcodeTimelineAttr: function( atts ) { var attr = { class: '' }, values = atts.values, parentValues = atts.parentValues, borderColor = '', fullIconSize = '', positionTop = '', positionHorizontal = '', animationDelay = ''; if ( 'timeline-horizontal' === parentValues.layout ) { attr[ 'class' ] = 'content-box-shortcode-timeline'; attr.style = ''; if ( 'yes' === parentValues.icon_circle ) { if ( 0 !== parseFloat( values.outercirclebordersize ) ) { fullIconSize = ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parseFloat( parentValues.icon_size ) * 2; } } else { fullIconSize = parseFloat( parentValues.icon_size ); } positionTop = fullIconSize / 2; if ( values.backgroundcolor && 'transparent' !== values.backgroundcolor && 0 !== jQuery.AWB_Color( values.backgroundcolor ).alpha() ) { positionTop += 35; } if ( values.circlebordercolor ) { borderColor = values.circlebordercolor; } if ( values.outercirclebordercolor && values.outercirclebordersize ) { borderColor = values.outercirclebordercolor; } if ( ! values.circlebordercolor && ! values.outercirclebordercolor ) { borderColor = '#f6f6f6'; } if ( borderColor ) { attr.style += 'border-color:' + borderColor + ';'; } if ( positionTop ) { attr.style += 'top:' + parseFloat( positionTop ) + 'px;'; } } else if ( 'timeline-vertical' === parentValues.layout ) { attr[ 'class' ] = 'content-box-shortcode-timeline-vertical'; attr.style = ''; if ( 'yes' === parentValues.icon_circle ) { if ( parseFloat( values.outercirclebordersize ) ) { fullIconSize = ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parseFloat( parentValues.icon_size ) * 2; } } else { fullIconSize = parseFloat( parentValues.icon_size ); } positionTop = fullIconSize; positionHorizontal = fullIconSize / 2; if ( values.backgroundcolor && 'transparent' !== values.backgroundcolor && 0 !== jQuery.AWB_Color( values.backgroundcolor ).alpha() ) { positionTop += 35; positionHorizontal += 35; } if ( values.circlebordercolor ) { borderColor = values.circlebordercolor; } if ( values.outercirclebordercolor && values.outercirclebordersize ) { borderColor = values.outercirclebordercolor; } if ( ! values.circlebordercolor && ! values.outercirclebordercolor ) { borderColor = '#f6f6f6'; } if ( borderColor ) { attr.style += 'border-color:' + borderColor + ';'; } if ( positionHorizontal ) { if ( 'right' === parentValues.icon_align ) { attr.style += 'right:' + parseFloat( positionHorizontal ) + 'px;'; } else { attr.style += 'left:' + parseFloat( positionHorizontal ) + 'px;'; } } if ( positionTop ) { attr.style += 'top:' + positionTop + 'px;'; } } if ( parentValues.animationDelay ) { animationDelay = parentValues.animation_delay; attr.style += '-webkit-transition-duration: ' + animationDelay + 'ms;'; attr.style += 'animation-duration: ' + animationDelay + 'ms;'; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildContentWrapperAttr: function( atts ) { var attr = { class: 'col content-box-wrapper content-wrapper' }, values = atts.values, parentValues = atts.parentValues; // Set parent values if child values are unset to get downwards compatibility. if ( ! values.backgroundcolor ) { values.backgroundcolor = parentValues.backgroundcolor; } if ( values.backgroundcolor ) { attr.style = 'background-color:' + values.backgroundcolor + ';'; if ( 'transparent' !== values.backgroundcolor && 0 !== jQuery.AWB_Color( values.backgroundcolor ).alpha() ) { attr[ 'class' ] += '-background'; } } if ( 'icon-boxed' === parentValues.layout ) { attr[ 'class' ] += ' content-wrapper-boxed'; } if ( values.link && 'box' === parentValues.link_area ) { attr[ 'data-link' ] = values.link; attr[ 'data-link-target' ] = values.link_target; } attr[ 'class' ] += ' link-area-' + parentValues.link_area; if ( values.link && parentValues.link_type ) { attr[ 'class' ] += ' link-type-' + parentValues.link_type; } if ( values.outercirclebordercolor && values.outercirclebordersize && parseFloat( values.outercirclebordersize ) ) { attr[ 'class' ] += ' content-icon-wrapper-yes'; } if ( values.outercirclebordercolor && values.outercirclebordersize && 0 !== parseFloat( values.outercirclebordersize ) && 'pulsate' === parentValues.icon_hover_type ) { attr[ 'class' ] += ' icon-wrapper-hover-animation-' + parentValues.icon_hover_type; } else { attr[ 'class' ] += ' icon-hover-animation-' + parentValues.icon_hover_type; } if ( values.textcolor ) { attr.style += 'color:' + values.textcolor + ';'; } if ( 'none' !== values.animation_type ) { if ( 'undefined' !== typeof values.animation_class ) { attr[ 'class' ] += ' ' + values.animation_class; } } if ( '' === values.animation_type ) { attr = _.fusionAnimations( parentValues, attr ); } else { attr = _.fusionAnimations( values, attr ); } return attr; }, /** * Builds styles. * * @since 2.0 * @param {Object} atts - The attributes. * @return {string} */ buildStyles: function( atts ) { var styles = '', cid = this.model.get( 'cid' ), // eslint-disable-line no-unused-vars values = atts.values, parentValues = atts.parentValues, parentCid = atts.parentCid, circleHoverAccentColor = '', transparentChild = '', hoverAccentColor = ''; if ( 'transparent' === values.circlecolor || 0 === jQuery.AWB_Color( values.backgroundcolor ).alpha() || 'no' === parentValues.icon_circle ) { transparentChild = true; } if ( true === transparentChild ) { hoverAccentColor = parentValues.hover_accent_color; circleHoverAccentColor = 'transparent'; styles += '.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .heading-link:hover .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-box:hover .heading-link .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-box-hover .heading .icon i.circle-yes { background-color: ' + circleHoverAccentColor + ' !important; border-color: ' + hoverAccentColor + ' !important;}'; } else if ( false === transparentChild ) { hoverAccentColor = parentValues.hover_accent_color; styles += '.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .heading-link:hover .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-box:hover .heading-link .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-link-icon-hover .heading .icon i.circle-yes,.fusion-content-boxes-cid' + parentCid + ' .fusion-content-box-hover .link-area-box-hover .heading .icon i.circle-yes {background-color: ' + hoverAccentColor + ' !important;border-color: ' + hoverAccentColor + ' !important;}'; } return styles; }, /** * Builds attributes. * * @since 2.0 * @param {boolean} readmore - Whether we want a readmore link or not. * @param {string} extraClass - Any extra classes that we want to add. * @param {Object} atts - The attributes. * @return {Object} */ contentBoxShortcodeAttrs: function( readmore, extraClass, atts ) { // contentBoxShortcodeLink Attributes. var contentBoxShortcodeLink = { class: '', style: '' }, additionMargin = '', fullIconSize = '', values = atts.values, parentValues = atts.parentValues, extras = atts.extras; if ( values.link ) { contentBoxShortcodeLink.href = values.link; } if ( values.link_target ) { contentBoxShortcodeLink.target = values.link_target; } if ( '_blank' === values.link_target ) { contentBoxShortcodeLink.rel = 'noopener noreferrer'; } if ( readmore ) { if ( 'text' === parentValues.link_type || 'button-bar' === parentValues.link_type ) { contentBoxShortcodeLink[ 'class' ] += ' fusion-read-more'; if ( 'button-bar' === parentValues.link_type ) { contentBoxShortcodeLink[ 'class' ] += ' fusion-button-bar'; } } else if ( 'button' === parentValues.link_type ) { contentBoxShortcodeLink[ 'class' ] += 'fusion-read-more-button fusion-content-box-button fusion-button button-default fusion-button-default-size button-' + extras.button_type.toLowerCase(); } } if ( 'button-bar' === parentValues.link_type && 'timeline-vertical' === parentValues.layout && readmore ) { additionMargin = 20 + 15; if ( values.backgroundcolor && 'transparent' !== values.backgroundcolor && 0 !== jQuery.AWB_Color( values.backgroundcolor ).alpha() ) { additionMargin += 35; } if ( values.image && values.image_width && values.image_height ) { fullIconSize = values.image_width; } else if ( values.icon ) { if ( 'yes' === parentValues.icon_circle ) { fullIconSize = ( parentValues.icon_size + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parentValues.icon_size; } } if ( 'right' === parentValues.icon_align ) { contentBoxShortcodeLink.style += 'margin-right:' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px;'; } else { contentBoxShortcodeLink.style += 'margin-left:' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px;'; } contentBoxShortcodeLink.style += 'width:calc(100% - ' + ( fullIconSize + additionMargin + 15 ) + 'px);'; } else if ( -1 !== jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'clean-horizontal', 'timeline-vertical' ] ) && -1 !== jQuery.inArray( parentValues.link_type, [ 'text', 'button' ] ) && readmore ) { additionMargin = 20; if ( values.image && values.image_width && values.mage_height ) { fullIconSize = values.image_width; } else if ( values.icon ) { if ( 'yes' === parentValues.icon_circle ) { fullIconSize = ( parseFloat( parentValues.icon_size ) + parseFloat( values.circlebordersize ) + parseFloat( values.outercirclebordersize ) ) * 2; } else { fullIconSize = parentValues.icon_size; } } if ( 'text' === parentValues.link_type || 'button' === parentValues.link_type ) { if ( 'right' === parentValues.icon_align ) { contentBoxShortcodeLink.style += 'float:' + parentValues.icon_align + ';'; contentBoxShortcodeLink.style += 'margin-right:' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px;'; } else { contentBoxShortcodeLink.style += 'margin-left:' + ( parseFloat( fullIconSize ) + additionMargin ) + 'px;'; } if ( 'yes' === parentValues.button_span ) { contentBoxShortcodeLink.style += 'width:calc( 100% - ' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px );'; } } else if ( 'right' === parentValues.icon_align ) { contentBoxShortcodeLink.style += 'margin-right:' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px;'; } else { contentBoxShortcodeLink.style += 'margin-left:' + ( parseFloat( fullIconSize ) + parseFloat( additionMargin ) ) + 'px;'; } } else if ( 'icon-with-title' === parentValues.layout ) { contentBoxShortcodeLink.style += 'float:' + parentValues.icon_align + ';'; } if ( -1 === jQuery.inArray( parentValues.layout, [ 'icon-on-side', 'clean-horizontal', 'timeline-vertical' ] ) && 'button' === parentValues.link_type && 'yes' === parentValues.button_span ) { contentBoxShortcodeLink.style += 'width: 100%;'; } if ( extraClass ) { contentBoxShortcodeLink[ 'class' ] += ' ' + extraClass; } return contentBoxShortcodeLink; } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Social Links View. FusionPageBuilder.fusion_social_links = FusionPageBuilder.ElementView.extend( { /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var tooltips = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-tooltip' ) ); tooltips.tooltip( 'destroy' ); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var socialLinksShortcode, socialLinksShortcodeSocialNetworks, icons; this.counter = this.model.get( 'cid' ); this.values = atts.values; // Validate values and extras. this.validateValuesExtras( atts.values, atts.extras ); // Create attribute objects. socialLinksShortcode = this.buildShortcodeAttr( atts.values ); socialLinksShortcodeSocialNetworks = this.buildSocialNetworksAttr( atts.values ); icons = this.buildIcons( atts.values ); // Reset attributes. atts = {}; atts.socialLinksShortcode = socialLinksShortcode; atts.socialLinksShortcodeSocialNetworks = socialLinksShortcodeSocialNetworks; atts.icons = icons; atts.styles = this.buildStyleBlock(); return atts; }, /** * Builds styles. * * @since 2.4 * @return {String} */ buildStyleBlock: function( ) { var css, selectors; this.baseSelector = '.fusion-social-links-' + this.counter; this.dynamic_css = {}; //Icon styles. if ( 'brand' !== this.values.color_type ) { selectors = [ this.baseSelector + ' .boxed-icons .fusion-social-network-icon' ]; if ( '' !== this.values.box_border_top ) { this.addCssProperty( selectors, 'border-top-width', _.fusionGetValueWithUnit( this.values.box_border_top ), true ); } if ( '' !== this.values.box_border_right ) { this.addCssProperty( selectors, 'border-right-width', _.fusionGetValueWithUnit( this.values.box_border_right ), true ); } if ( '' !== this.values.box_border_bottom ) { this.addCssProperty( selectors, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.box_border_bottom ), true ); } if ( '' !== this.values.box_border_left ) { this.addCssProperty( selectors, 'border-left-width', _.fusionGetValueWithUnit( this.values.box_border_left ), true ); } if ( '' !== this.values.box_border_color ) { this.addCssProperty( selectors, 'border-color', this.values.box_border_color, true ); } selectors = [ this.baseSelector + ' .boxed-icons .fusion-social-network-icon:hover' ]; if ( '' !== this.values.box_colors_hover ) { this.addCssProperty( selectors, 'background-color', this.values.box_colors_hover, true ); } if ( '' !== this.values.box_border_color_hover ) { this.addCssProperty( selectors, 'border-color', this.values.box_border_color_hover, true ); } selectors = [ this.baseSelector + ' .fusion-social-network-icon:hover' ]; if ( '' !== this.values.icon_colors_hover ) { this.addCssProperty( selectors, 'color', this.values.icon_colors_hover, true ); } } if ( ! this.isDefault( 'alignment' ) ) { this.addCssProperty( [ this.baseSelector ], 'text-align', this.values.alignment, true ); } css = this.parseCSS(); if ( ! this.isDefault( 'alignment' ) ) { this.addCssProperty( [ this.baseSelector ], 'text-align', this.values.alignment, true ); } if ( ! this.isDefault( 'alignment_medium' ) ) { this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector ], 'text-align', this.values.alignment_medium, true ); css += '@media only screen and (max-width:' + FusionApp.settings.visibility_medium + 'px){' + this.parseCSS() + ' }'; } if ( ! this.isDefault( 'alignment_small' ) ) { this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector ], 'text-align', this.values.alignment_small, true ); css += '@media only screen and (max-width:' + FusionApp.settings.visibility_small + 'px){' + this.parseCSS() + ' }'; } css += this.buildMarginStyles( this.values ); return ( css ) ? '<style type="text/css">' + css + '</style>' : ''; }, /** * Builds margin styles. * * @since 3.6 * @param {Object} values - The values object. * @return {string} */ buildMarginStyles: function( values ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-social-links-' + this.counter, responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); return responsiveStyles; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @param {Object} extras - Extra args. * @return {void} */ validateValuesExtras: function( values, extras ) { values.linktarget = values.linktarget ? '_blank' : '_self'; values.social_media_icons = extras.social_media_icons; values.social_media_icons_icon = extras.social_media_icons.icon; values.social_media_icons_url = extras.social_media_icons.url; values.icons_boxed_radius = _.fusionValidateAttrValue( values.icons_boxed_radius, 'px' ); values.font_size = _.fusionValidateAttrValue( values.font_size, 'px' ); values.boxed_padding = _.fusionValidateAttrValue( extras.boxed_padding, 'px' ); if ( '' == values.color_type ) { values.box_colors = values.social_links_box_color; values.icon_colors = values.social_links_icon_color; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildShortcodeAttr: function( values ) { var socialLinksShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-social-links fusion-social-links-' + this.counter } ); socialLinksShortcode[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( '' !== values[ 'class' ] ) { socialLinksShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { socialLinksShortcode.id = values.id; } //Animation socialLinksShortcode = _.fusionAnimations( values, socialLinksShortcode ); return socialLinksShortcode; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildSocialNetworksAttr: function( values ) { var socialLinksShortcodeSocialNetworks = { class: 'fusion-social-networks' }; if ( 'yes' === values.icons_boxed ) { socialLinksShortcodeSocialNetworks[ 'class' ] += ' boxed-icons'; } return socialLinksShortcodeSocialNetworks; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildIcons: function( values ) { var socialIcons = _.fusionGetSocialNetworks( values ), icons; socialIcons = _.fusionSortSocialNetworks( socialIcons, values ); icons = _.fusionBuildSocialLinks( socialIcons, this.socialLinksIconAttr, values ); return icons; }, /** * Builds attributes. * * @since 2.0 * @param {Object} args - The arguments. * @param {Object} values - The values. * @return {Object} */ socialLinksIconAttr: function( args, values ) { var tooltip, link, attr = { class: 'fusion-social-network-icon fusion-tooltip fusion-' + args.social_network, style: '' }; tooltip = _.fusionUcFirst( args.social_network ); if ( 'custom_' === args.social_network.substr( 0, 7 ) ) { attr[ 'class' ] += 'custom '; tooltip = args.social_network.replace( 'custom_', '' ); args.social_network = tooltip.toLowerCase(); } else if ( ! _.isEmpty( args.icon_mark ) ) { attr[ 'class' ] += ' ' + args.icon_mark; } else { attr[ 'class' ] += ' awb-icon-' + args.social_network; } attr[ 'aria-label' ] = 'fusion-' + args.social_network; link = args.social_link; attr.target = values.linktarget; if ( '_blank' === values.linktarget ) { attr.rel = 'noopener noreferrer'; } if ( 'mail' === args.social_network ) { link = ( 'http' === args.social_link.substr( 0, 4 ) ) ? args.social_link : 'mailto:' + args.social_link.replace( 'mailto:', '' ); attr.target = '_self'; } if ( 'phone' === args.social_network ) { link = 'tel:' + args.social_link.replace( 'tel:', '' ); attr.target = '_self'; } attr.href = link; if ( 'undefined' !== typeof args.icon_color && '' !== args.icon_color ) { attr.style = 'color:' + args.icon_color + ';'; } if ( 'yes' === values.icons_boxed && 'undefined' !== typeof args.box_color ) { attr.style += 'background-color:' + args.box_color + ';border-color:' + args.box_color + ';'; } if ( ( 'yes' === values.icons_boxed && values.icons_boxed_radius ) || '0' === values.icons_boxed_radius ) { values.icons_boxed_radius = ( 'round' === values.icons_boxed_radius ) ? '50%' : values.icons_boxed_radius; attr.style += 'border-radius:' + values.icons_boxed_radius + ';'; } if ( values.font_size ) { attr.style += 'font-size:' + values.font_size + ';'; if ( 'yes' === values.icons_boxed ) { attr.style += 'width:calc(' + values.font_size + ' + (2 * (' + values.boxed_padding + ')) + 2px + ' + _.fusionGetValueWithUnit( values.box_border_right ) + ' + ' + _.fusionGetValueWithUnit( values.box_border_left ) + ');'; } } if ( 'none' !== values.tooltip_placement.toLowerCase() ) { attr[ 'data-placement' ] = values.tooltip_placement.toLowerCase(); tooltip = ( 'youtube' === tooltip.toLowerCase() ) ? 'YouTube' : tooltip; attr[ 'data-title' ] = tooltip; attr[ 'data-toggle' ] = 'tooltip'; } attr.title = tooltip; return attr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Star Rating Element View. FusionPageBuilder.fusion_star_rating = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @returns {Object} */ filterTemplateAtts: function( atts ) { // Variables we will pass to the template. var attributes = {}; attributes.cid = this.model.get( 'cid' ); attributes.elementAttr = this.getElementAttr( atts.values ); attributes.style = this.getStyleTag( atts.values, atts.extras ); attributes.iconsHtml = this.getIconsHtml( atts.values ); attributes.ratingTextHtml = this.getRatingTextHtml( atts.values ); attributes.displayRatingText = ( 'yes' === atts.values.display_rating_text ? true : false ); return attributes; }, /** * Get the HTML of the icons. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getIconsHtml: function( values ) { var html = '', rating = this.getRating( values ), maximumRating = values.maximum_rating, isPerfectRoundRating, currentStar = 1; if ( '0decimals' === values.rating_number_rounding && 'yes' === values.display_rating_text ) { rating = parseInt( rating.toFixed( 0 ) ); } isPerfectRoundRating = ( parseInt( rating ) === rating ); while ( currentStar <= maximumRating ) { html += '<i ' + _.fusionGetAttributes( this.getIconAttributes( values, currentStar ) ) + '>'; if ( ! isPerfectRoundRating && ( parseInt( rating ) + 1 ) === currentStar ) { html += '<i ' + _.fusionGetAttributes( this.getPartialIconAttributes( values, currentStar ) ) + '></i>'; } html += '</i>'; currentStar++; } return html; }, /** * Get the HTML of the rating text. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getRatingTextHtml: function( values ) { var html = '', rating = this.getRating( values ), maximumRating = values.maximum_rating; if ( rating > maximumRating ) { rating = maximumRating; } rating = Number( rating ).toFixed( this.getNumberToRound( values, rating ) ); html += '<span>' + rating + '</span> / <span>' + maximumRating + '</span>'; return html; }, getNumberToRound: function( values, rating ) { var numParts, numToRound; if ( '0decimals' === values.rating_number_rounding ) { return 0; } else if ( '1decimal' === values.rating_number_rounding ) { return 1; } else if ( '2decimals' === values.rating_number_rounding ) { return 2; } // 'rating_number_rounding' is set to 'auto' if here. if ( Math.floor( rating ) === rating ) { return 0; } numParts = rating.toString().trimEnd( '0' ).split( '.' ); if ( numParts[ 1 ] ) { numToRound = numParts[ 1 ].length || 0; } else { numToRound = 0; } if ( 0 === numToRound ) { return 0; } else if ( 1 === numToRound ) { return 1; } return 2; }, /** * Get the attributes of the main HTML element. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getElementAttr: function( values ) { var attr = { 'class': 'awb-stars-rating ' + this.getBaseClassName() }; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( 'no' === values.display_rating_text ) { attr[ 'class' ] += ' awb-stars-rating-no-text'; } if ( values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Get the attributes of the icon HTML tag. * * @since 3.5 * @param {Object} values - The values. * @param {Object} current_icon_num - The number of the current icon. * @returns {string} */ getIconAttributes: function( values, currentIconNum ) { var attr = { 'class': _.fusionFontAwesome( values.icon ) }, rating = this.getRating( values ), isPerfectRoundRating, iconIsPartiallyFilled; if ( '0decimals' === values.rating_number_rounding && 'yes' === values.display_rating_text ) { rating = parseInt( rating.toFixed( 0 ) ); } isPerfectRoundRating = ( parseInt( rating ) === rating ), iconIsPartiallyFilled = ( ( parseInt( rating ) + 1 ) === currentIconNum ); if ( currentIconNum <= rating ) { attr[ 'class' ] += ' awb-stars-rating-filled-icon'; } else if ( ! isPerfectRoundRating && iconIsPartiallyFilled ) { attr[ 'class' ] += ' awb-stars-rating-partial-icon-wrapper'; } else { attr[ 'class' ] += ' awb-stars-rating-empty-icon'; } return attr; }, /** * Get the attributes of the partial filled icon HTML tag. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getPartialIconAttributes: function( values ) { var attr = { 'class': _.fusionFontAwesome( values.icon ) + ' awb-stars-rating-partial-icon' }, rating = this.getRating( values ), decimals = rating - parseInt( rating ), widthPercent = parseInt( decimals * 100 ) + '%'; attr.style = 'width:' + widthPercent + ';'; return attr; }, /** * Create the style HTML element. * * @since 3.5 * @param {Object} values - The values. * @returns {string} */ getStyleTag: function( values, extras ) { var style, baseSelector = '.' + this.getBaseClassName(), baseClassSelector = [ baseSelector + '.awb-stars-rating' ], allRelativeIconsSelector = [ baseSelector + ' .awb-stars-rating-filled-icon', baseSelector + ' .awb-stars-rating-empty-icon', baseSelector + ' .awb-stars-rating-partial-icon-wrapper' ], allIconsThatHaveActiveColor = [ baseSelector + ' .awb-stars-rating-filled-icon', baseSelector + ' .awb-stars-rating-partial-icon' ], iconsWrapperSelector = [ baseSelector + ' .awb-stars-rating-icons-wrapper' ], rtlIconsWrapperSelector = [ '.rtl ' + baseSelector + ' .awb-stars-rating-icons-wrapper' ], textWrapperSelector = [ baseSelector + ' .awb-stars-rating-text' ]; this.dynamic_css = {}; this.values = values; if ( ! this.isDefault( 'icons_distance' ) && ! _.isEmpty( values.icons_distance ) ) { this.addCssProperty( allRelativeIconsSelector, 'margin-right', values.icons_distance ); } if ( ! this.isDefault( 'active_color' ) && ! _.isEmpty( values.active_color ) ) { this.addCssProperty( allIconsThatHaveActiveColor, 'color', values.active_color ); } if ( ! this.isDefault( 'inactive_color' ) && ! _.isEmpty( values.inactive_color ) ) { this.addCssProperty( iconsWrapperSelector, 'color', values.inactive_color ); } if ( ! this.isDefault( 'icon_font_size' ) && ! _.isEmpty( values.icon_font_size ) ) { this.addCssProperty( iconsWrapperSelector, 'font-size', values.icon_font_size ); } if ( 'yes' === values.display_rating_text ) { if ( ! this.isDefault( 'text_font_size' ) && ! _.isEmpty( values.text_font_size ) ) { this.addCssProperty( textWrapperSelector, 'font-size', values.text_font_size ); } if ( ! this.isDefault( 'text_font_color' ) && ! _.isEmpty( values.text_font_color ) ) { this.addCssProperty( textWrapperSelector, 'color', values.text_font_color ); } if ( ! this.isDefault( 'icons_text_distance' ) && ! _.isEmpty( values.icons_text_distance ) ) { if ( ! extras.is_rtl ) { this.addCssProperty( iconsWrapperSelector, 'margin-right', values.icons_text_distance ); } else { this.addCssProperty( rtlIconsWrapperSelector, 'margin-left', values.icons_text_distance ); } } } if ( ! this.isDefault( 'alignment' ) && ! _.isEmpty( values.alignment ) ) { this.addCssProperty( baseClassSelector, 'justify-content', values.alignment ); } if ( ! this.isDefault( 'margin_top' ) && ! _.isEmpty( values.margin_top ) ) { this.addCssProperty( baseClassSelector, 'margin-top', values.margin_top ); } if ( ! this.isDefault( 'margin_right' ) && ! _.isEmpty( values.margin_right ) ) { this.addCssProperty( baseClassSelector, 'margin-right', values.margin_right ); } if ( ! this.isDefault( 'margin_bottom' ) && ! _.isEmpty( values.margin_bottom ) ) { this.addCssProperty( baseClassSelector, 'margin-bottom', values.margin_bottom ); } if ( ! this.isDefault( 'margin_left' ) && ! _.isEmpty( values.margin_left ) ) { this.addCssProperty( baseClassSelector, 'margin-left', values.margin_left ); } style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; }, /** * Get the rating number. * * @since 3.5 * @returns {Number} */ getRating: function( values ) { var avg = values.rating; // Let the users use ',' as decimal separator. if ( _.isString( avg ) ) { avg = avg.replace( ',', '.' ); } if ( ! isNaN( avg ) ) { avg = Number( avg ); } else { avg = 0; } avg = Number( avg ); return avg; }, /** * Get the class name with an unique id among elements. * * @since 3.5 * @returns {string} */ getBaseClassName: function() { return 'awb-stars-rating-' + this.model.get( 'cid' ); } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Modal Text Link View. FusionPageBuilder.fusion_modal_text_link = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.modalTextShortcode = this.buildShortcodeAttr( atts.values ); // Any extras that need passed on. attributes.output = atts.values.element_content; attributes.name = atts.values.name; attributes.inline = 'undefined' !== typeof atts.inlineElement; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; attributes.cid = this.model.get( 'cid' ); return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildShortcodeAttr: function( values ) { var modalTextShortcode = { class: 'fusion-modal-text-link' }; if ( '' !== values.name ) { modalTextShortcode[ 'data-toggle' ] = 'modal'; modalTextShortcode[ 'data-target' ] = '.fusion-modal.' + values.name; } if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { modalTextShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { modalTextShortcode.id = values.id; } modalTextShortcode.href = '#'; // Additional attributes for editable. modalTextShortcode = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), 'disable-return': true, 'disable-extra-spaces': true, toolbar: true }, modalTextShortcode ); return modalTextShortcode; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.fusion_news_ticker = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.5 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.animationDuration = this.$el.find( '.awb-news-ticker-item-list' ).css( 'animation-duration' ); this.values = atts.values; attributes.tickerTitle = atts.values.ticker_title; attributes.tickerSpeed = atts.values.ticker_speed; attributes.tickerAttr = this.buildTickerAttr( atts.values ); attributes.titleAttr = this.buildTickerTitleAttr( atts.values ); attributes.barAttr = this.buildTickerBarAttr( atts.values ); attributes.itemsListAttr = this.buildTickerItemsListAttr( atts.values ); attributes.titleShape = atts.values.title_shape; attributes.styleTag = this.getStyleTag( atts.values, atts.extras ); attributes.tickerItems = atts.query_data; attributes.carouselButtons = this.getCarouselButtonsIfNecessary( atts.values ); return attributes; }, /** * Build the ticker element attributes. * * @since 3.5 * @param {Object} values * @return {Object} */ buildTickerAttr: function( values ) { var attr = { 'class': 'awb-news-ticker awb-news-ticker-' + this.model.get( 'cid' ), 'role': 'marquee' }; if ( 'marquee' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-marquee'; } else if ( 'carousel' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-carousel'; } attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Build the ticker title attributes. * * @since 3.5 * @param {Object} values * @return {Object} */ buildTickerTitleAttr: function( values ) { var attr = { 'class': 'awb-news-ticker-title' }; if ( 'rounded' === values.title_shape ) { attr[ 'class' ] += ' awb-news-ticker-title-rounded'; } return attr; }, /** * Build the ticker bar attributes. * * @since 3.5 * @param {Object} values * @return {Object} */ buildTickerBarAttr: function( values ) { var attr = { 'class': 'awb-news-ticker-bar' }; if ( 'marquee' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-bar-marquee'; } else if ( 'carousel' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-bar-carousel'; } return attr; }, /** * Build the items list wrapper attributes. * * @since 3.5 * @param {object} values * @return {object} */ buildTickerItemsListAttr: function( values ) { var attr = { 'class': 'awb-news-ticker-item-list' }, marginLeftClass; if ( 'marquee' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-item-list-run'; attr[ 'data-awb-ticker-speed' ] = values.ticker_speed; } else if ( 'carousel' === values.ticker_type ) { attr[ 'class' ] += ' awb-news-ticker-item-list-carousel'; marginLeftClass = ' awb-news-ticker-item-list-margin-small'; if ( 'triangle' === values.title_shape ) { marginLeftClass = ' awb-news-ticker-item-list-margin-medium'; } attr[ 'class' ] += marginLeftClass; attr[ 'data-awb-news-ticker-display-time' ] = values.carousel_display_time; } return attr; }, /** * Get style element. * * @since 3.5 * @param {object} values * @param {object} extras * @return string */ getStyleTag: function( values, extras ) { var style, uniqueClassSelector = '.awb-news-ticker-' + this.model.get( 'cid' ), baseSelector = uniqueClassSelector + '.awb-news-ticker', baseHoverSelector = uniqueClassSelector + '.awb-news-ticker:hover', baseHoverCarouselBtns = uniqueClassSelector + ':hover .awb-news-ticker-items-buttons', titleSelector = uniqueClassSelector + ' .awb-news-ticker-title', itemSeparatorSelector = uniqueClassSelector + ' .awb-news-ticker-item-separator', linkSelector = uniqueClassSelector + ' .awb-news-ticker-link', linkHoverSelector = uniqueClassSelector + ' .awb-news-ticker-link:hover, ' + uniqueClassSelector + ' .awb-news-ticker-link:focus', triangleDecoratorSelector = uniqueClassSelector + ' .awb-news-ticker-title-decorator-triangle', carouselListSelector = uniqueClassSelector + ' .awb-news-ticker-item-list-carousel', carouselBtnWrapSelector = uniqueClassSelector + ' .awb-news-ticker-items-buttons', carouselBtnsSelector = uniqueClassSelector + ' .awb-news-ticker-prev-btn, ' + uniqueClassSelector + ' .awb-news-ticker-next-btn', carouselBtnsHoverSelector = uniqueClassSelector + ' .awb-news-ticker-prev-btn:hover, ' + uniqueClassSelector + ' .awb-news-ticker-next-btn:hover', carouselBtnsFocusSelector = uniqueClassSelector + ' .awb-news-ticker-prev-btn:focus, ' + uniqueClassSelector + ' .awb-news-ticker-next-btn:focus', carouselIndicatorSelector = uniqueClassSelector + ' .awb-news-ticker-carousel-indicator', sidePadding; this.dynamic_css = {}; this.values = values; if ( values.posts_distance && 'marquee' === values.ticker_type ) { sidePadding = ( values.posts_distance / 2 ).toFixed( 1 ) + 'px'; this.addCssProperty( itemSeparatorSelector, 'padding', '0 ' + sidePadding ); } if ( values.font_size ) { this.addCssProperty( baseSelector, '--awb-news-ticker-font-size', values.font_size ); } if ( values.line_height && ! this.isDefault( 'line_height' ) ) { this.addCssProperty( baseSelector, '--awb-news-ticker-line-height', values.line_height ); } if ( values.title_font_color ) { this.addCssProperty( titleSelector, 'color', values.title_font_color ); } if ( values.title_background_color ) { this.addCssProperty( titleSelector, 'background-color', values.title_background_color ); if ( 'triangle' === values.title_shape ) { this.addCssProperty( triangleDecoratorSelector, 'color', values.title_background_color ); } } if ( values.ticker_font_color ) { this.addCssProperty( itemSeparatorSelector, 'color', values.ticker_font_color ); this.addCssProperty( linkSelector, 'color', values.ticker_font_color ); } if ( values.ticker_hover_font_color ) { this.addCssProperty( linkHoverSelector, 'color', values.ticker_hover_font_color ); } if ( values.ticker_background_color ) { this.addCssProperty( baseSelector, 'background-color', values.ticker_background_color ); this.addCssProperty( carouselBtnWrapSelector, 'background-color', values.ticker_background_color ); } if ( values.ticker_background_hover_color ) { this.addCssProperty( baseHoverSelector, 'background-color', values.ticker_background_hover_color ); this.addCssProperty( baseHoverCarouselBtns, 'background-color', values.ticker_background_hover_color ); } if ( values.ticker_indicators_color ) { this.addCssProperty( carouselBtnsSelector, 'color', values.ticker_indicators_color ); this.addCssProperty( carouselIndicatorSelector, 'background-color', values.ticker_indicators_color ); } if ( values.ticker_indicators_hover_color ) { this.addCssProperty( carouselBtnsHoverSelector, 'color', values.ticker_indicators_hover_color ); this.addCssProperty( carouselBtnsFocusSelector, 'color', values.ticker_indicators_hover_color ); } if ( values.carousel_bar_height && ! this.isDefault( 'carousel_bar_height' ) ) { this.addCssProperty( carouselIndicatorSelector, 'height', values.carousel_bar_height + 'px' ); } if ( values.carousel_btn_border_radius && 'border' === values.carousel_arrows_style ) { this.addCssProperty( carouselBtnsSelector, 'border-radius', values.carousel_btn_border_radius ); } if ( values.title_padding_right ) { this.addCssProperty( titleSelector, 'padding-right', values.title_padding_right ); } if ( values.title_padding_left ) { this.addCssProperty( titleSelector, 'padding-left', values.title_padding_left ); } if ( values.ticker_padding_right ) { if ( ! extras.is_rtl ) { this.addCssProperty( carouselBtnWrapSelector, 'padding-right', values.ticker_padding_right ); } else { this.addCssProperty( carouselListSelector, 'padding-right', values.ticker_padding_right ); } } if ( values.ticker_padding_left ) { if ( ! extras.is_rtl ) { this.addCssProperty( carouselListSelector, 'padding-left', values.ticker_padding_left ); } else { this.addCssProperty( carouselBtnWrapSelector, 'padding-left', values.ticker_padding_left ); } } if ( values.margin_top ) { this.addCssProperty( baseSelector, 'margin-top', values.margin_top ); } if ( values.margin_right ) { this.addCssProperty( baseSelector, 'margin-right', values.margin_right ); } if ( values.margin_bottom ) { this.addCssProperty( baseSelector, 'margin-bottom', values.margin_bottom ); } if ( values.margin_left ) { this.addCssProperty( baseSelector, 'margin-left', values.margin_left ); } if ( values.border_radius_top_left ) { this.addCssProperty( baseSelector, 'border-top-left-radius', values.border_radius_top_left ); } if ( values.border_radius_top_right ) { this.addCssProperty( baseSelector, 'border-top-right-radius', values.border_radius_top_right ); } if ( values.border_radius_bottom_right ) { this.addCssProperty( baseSelector, 'border-bottom-right-radius', values.border_radius_bottom_right ); } if ( values.border_radius_bottom_left ) { this.addCssProperty( baseSelector, 'border-bottom-left-radius', values.border_radius_bottom_left ); } if ( values.carousel_display_time ) { this.addCssProperty( carouselIndicatorSelector, 'animation-duration', values.carousel_display_time + 's' ); } if ( 'yes' === values.box_shadow ) { this.addCssProperty( baseSelector, 'box-shadow', _.fusionGetBoxShadowStyle( values ).replace( ';', '' ) ); } style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; }, /** * Get the carousel buttons HTML if necessary. * * @since 3.5 * @param {object} values * @return string */ getCarouselButtonsIfNecessary: function( values ) { var html = '', additionalBtnClasses; if ( 'carousel' === values.ticker_type ) { additionalBtnClasses = ''; if ( 'border' === values.carousel_arrows_style ) { additionalBtnClasses = ' awb-news-ticker-btn-border'; } html += '<div class="awb-news-ticker-items-buttons">'; html += '<div class="awb-news-ticker-btn-wrapper"><button class="awb-news-ticker-prev-btn' + additionalBtnClasses + '"></button></div>'; html += '<div class="awb-news-ticker-btn-wrapper"><button class="awb-news-ticker-next-btn' + additionalBtnClasses + '"></button></div>'; html += '</div>'; html += '<div class="awb-news-ticker-carousel-indicator"></div>'; } return html; }, /** * Init. * * @since 3.5 * @return {void} */ onInit: function() { // Also refresh on init, since the onPageLoad event don't trigger sometimes. var previewBody = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); previewBody.trigger( 'fusion-element-render-fusion_news_ticker', this.model.attributes.cid ); }, /** * Runs after view DOM is patched. * * @since 3.5 * @return {void} */ afterPatch: function() { var previewBody = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); previewBody.trigger( 'fusion-element-render-fusion_news_ticker', this.model.attributes.cid ); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Tooltip View FusionPageBuilder.fusion_popover = FusionPageBuilder.ElementView.extend( { /** * Runs before view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var $popover = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '[data-toggle~="popover"]' ) ); $popover.removeData(); $popover.remove(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.attr = this.computeAttr( atts.values ); attributes.styles = this.computeStyles( atts.values ); attributes.cid = this.model.get( 'cid' ); attributes.parent = this.model.get( 'parent' ); attributes.inline = 'undefined' !== typeof atts.inlineElement; attributes.content = atts.values.element_content; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; attributes.popover = atts.values.popover; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ computeAttr: function( values ) { var cid = this.model.get( 'cid' ), atts = { class: 'fusion-popover popover-' + cid }, popoverContent = values.content; if ( 'default' === values.placement ) { values.placement = fusionAllElements.fusion_popover.defaults.placement; } if ( '' !== values[ 'class' ] ) { atts[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { atts.id = values.id; } try { if ( popoverContent && '' !== popoverContent && FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( popoverContent ) ) === popoverContent ) { popoverContent = FusionPageBuilderApp.base64Decode( popoverContent ); } } catch ( error ) { console.log( error ); // jshint ignore:line } atts[ 'data-animation' ] = values.animation; atts[ 'data-class' ] = 'fusion-popover-' + cid; atts[ 'data-delay' ] = values.delay; atts[ 'data-placement' ] = values.placement.toLowerCase(); atts[ 'data-title' ] = values.title; atts[ 'data-toggle' ] = 'popover'; atts[ 'data-trigger' ] = values.trigger; values.popover = popoverContent; return atts; }, /** * Builds the styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ computeStyles: function( values ) { var cid = this.model.get( 'cid' ), styles, arrowColor; if ( 'default' === values.placement ) { values.placement = fusionAllElements.fusion_popover.defaults.placement; } arrowColor = values.content_bg_color; if ( 'bottom' === values.placement ) { arrowColor = values.title_bg_color; } styles = '<style type="text/css">'; if ( '' !== values.bordercolor ) { styles += '.popover.fusion-popover-' + cid + '.' + values.placement + ' .arrow{border-' + values.placement + '-color:' + values.bordercolor + ';}'; styles += '.popover.fusion-popover-' + cid + '{border-color:' + values.bordercolor + ';}'; } styles += '.popover.fusion-popover-' + cid + ' .popover-title{'; if ( '' !== values.title_bg_color ) { styles += 'background-color:' + values.title_bg_color + ';'; } if ( '' !== values.textcolor ) { styles += 'color:' + values.textcolor + ';'; } if ( '' !== values.bordercolor ) { styles += 'border-color:' + values.bordercolor + ';'; } styles += '}'; styles += '.popover.fusion-popover-' + cid + ' .popover-content{'; if ( '' !== values.content_bg_color ) { styles += 'background-color:' + values.content_bg_color + ';'; } if ( '' !== values.textcolor ) { styles += 'color:' + values.textcolor + ';'; } styles += '}'; if ( '' !== arrowColor ) { styles += '.popover.fusion-popover-' + cid + '.' + values.placement + ' .arrow:after{border-' + values.placement + '-color:' + arrowColor + ';}'; } styles += '</style>'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Events Element View. FusionPageBuilder.fusion_events = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrEventsColumn = this.buildattrEventsColumn( atts.values ); attributes.eventsList = {}; if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.posts ) { attributes.eventsList = this.buildEventsList( atts ); } if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.max_num_pages && 'undefined' !== typeof atts.query_data.paged ) { attributes.paginationCode = this.buildPagination( atts ); } // Any extras that need passed on. attributes.query_data = atts.query_data; attributes.load_more_text = atts.extras.load_more_text; attributes.load_more = atts.values.load_more && -1 != atts.values.posts_per_page; return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { // eslint-disable-line no-unused-vars values = _.fusionGetPadding( values ); // eslint-disable-line no-unused-vars }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-events-shortcode', style: '' } ); if ( 'no' !== values.pagination ) { attr[ 'class' ] += ' fusion-events-pagination-' + values.pagination.replace( '_', '-' ); } if ( '-1' !== values.column_spacing ) { attr.style += 'margin-left: -' + ( values.column_spacing / 2 ) + 'px;'; attr.style += 'margin-right: -' + ( values.column_spacing / 2 ) + 'px;'; } if ( values.content_alignment ) { attr[ 'class' ] += ' fusion-events-layout-' + values.content_alignment; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds the pagination. * * @since 2.0 * @param {Object} atts - The attributes. * @return {string} */ buildPagination: function( atts ) { var globalPagination = atts.extras.pagination_global, globalStartEndRange = atts.extras.pagination_start_end_range_global, range = atts.extras.pagination_range_global, paged = '', pages = '', paginationCode = '', queryData = atts.query_data, values = atts.values; if ( -1 == values.number_posts ) { values.pagination = 'no'; } values.load_more = false; if ( 'no' !== values.pagination ) { if ( 'load_more_button' === values.pagination ) { values.load_more = true; values.pagination = 'infinite'; } } if ( 'no' !== values.pagination ) { paged = queryData.paged; pages = queryData.max_num_pages; paginationCode = _.fusionPagination( pages, paged, range, values.pagination, globalPagination, globalStartEndRange ); } return paginationCode; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildattrEventsColumn: function( values ) { var columnClass = '', attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-layout-column', style: '' } ); switch ( values.columns ) { case '1': columnClass = 'full-one'; break; case '2': columnClass = 'one-half'; break; case '3': columnClass = 'one-third'; break; case '4': columnClass = 'one-fourth'; break; case '5': columnClass = 'one-fifth'; break; case '6': columnClass = 'one-sixth'; break; } columnClass += ( '-1' !== values.column_spacing ) ? ' fusion-spacing-no' : ' fusion-spacing-yes'; if ( '-1' !== values.column_spacing || -1 !== values.column_spacing ) { attr.style += 'padding: ' + ( values.column_spacing / 2 ) + 'px;'; } attr[ 'class' ] += ' fusion-' + columnClass; return attr; }, /** * Builds the events list HTML. * * @since 2.0 * @param {Object} atts - The values. * @return {string} */ buildEventsList: function( atts ) { var html = '', queryData = atts.query_data, values = atts.values, last = false, lastClass = '', stripHTML = ( 'yes' === values.strip_html ), columns = parseInt( values.columns, 10 ), i = 1, attrEventsColumn = {}, $this = this; _.each( queryData.posts, function( post ) { attrEventsColumn = $this.buildattrEventsColumn( atts.values ); if ( i === columns ) { last = true; } if ( i > columns ) { i = 1; last = false; } if ( 1 === columns ) { last = true; } lastClass = last ? ' fusion-column-last' : ''; if ( '' !== lastClass ) { attrEventsColumn[ 'class' ] += lastClass; } html += '<div ' + _.fusionGetAttributes( attrEventsColumn ) + '>'; html += '<div class="fusion-column-wrapper">'; html += '<div class="fusion-events-thumbnail hover-type-' + queryData.ec_hover_type + '">'; html += '<a href="' + post.permalink + '" class="url" rel="bookmark" aria-label="' + post.title + '">'; html += post.thumbnail; html += '</a>'; html += '</div>'; html += '<div class="fusion-events-content-wrapper" style="padding:' + values.padding + ';">'; html += '<div class="fusion-events-meta">'; html += '<h2><a href="' + post.permalink + '" class="url" rel="bookmark">' + post.title + '</a></h2>'; html += '<h4>' + post.tribe_events_event_schedule_details + '</h4>'; html += '</div>'; if ( 'no_text' !== values.content_length ) { html += '<div class="fusion-events-content">'; if ( 'excerpt' === values.content_length ) { html += _.fusionGetFixedContent( post.content, 'yes', values.excerpt_length, stripHTML ); } else { html += _.fusionGetFixedContent( post.content, 'no' ); } html += '</div>'; } html += '</div>'; html += '</div>'; html += '</div>'; if ( last ) { html += '<div class="fusion-clearfix"></div>'; last = false; } i++; } ); return html; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Countdown view FusionPageBuilder.fusion_countdown = FusionPageBuilder.ElementView.extend( { /** * Init. * * @since 2.2 * @return {void} */ onInit: function() { this.deprecatedParams(); }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var that = this; jQuery( window ).on( 'load', function() { that.afterPatch(); } ); }, /** * Runs before element is removed. * * @since 2.0 * @return {void} */ beforeRemove: function() { this.beforePatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ beforePatch: function() { var countdown = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-countdown-counter-wrapper' ) ); countdown.stopCountDown(); countdown.removeData(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var countdown = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-countdown-counter-wrapper' ) ); setTimeout( function() { countdown.stopCountDown(); countdown.fusion_countdown(); }, 300 ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var wrapperAttributes = {}, counterAttributes = {}, countdownShortcodeLink = {}, headingAttr = {}, subHeadingAttr = {}, dashhtml = '', styles = '', headingText = '', subheadingText = '', linkUrl = '', linkText = '', elementContent = ''; // Validate values. this.validateValues( atts.values ); // Create attribute objects wrapperAttributes = this.buildWrapperAtts( atts.values ); counterAttributes = this.buildCounterAtts( atts.values, atts.extras ); countdownShortcodeLink = this.buildLinkAtts( atts.values, atts.extras ); dashhtml = this.buildDashHtml( atts.values, atts.extras ); styles = this.buildStyles( atts.values ); headingAttr = this.buildHeadingAttr( atts.values ); subHeadingAttr = this.buildSubHeadingAttr( atts.values ); headingText = atts.values.heading_text; subheadingText = atts.values.subheading_text; linkUrl = atts.values.link_url; linkText = atts.values.link_text; elementContent = atts.values.element_content; // Reset atts. atts = {}; // Build attributes. atts.wrapperAttributes = wrapperAttributes; atts.counterAttributes = counterAttributes; atts.countdownShortcodeLink = countdownShortcodeLink; atts.dashhtml = dashhtml; atts.styles = styles; atts.headingAttr = headingAttr; atts.subHeadingAttr = subHeadingAttr; atts.heading_text = headingText; atts.subheading_text = subheadingText; atts.link_url = linkUrl; atts.link_text = linkText; atts.element_content = elementContent; // Any extras that need passed on. atts.cid = this.model.get( 'cid' ); return atts; }, /** * Modify the values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { values.border_radius = _.fusionValidateAttrValue( values.border_radius, 'px' ); values.counter_border_size = _.fusionValidateAttrValue( values.counter_border_size, 'px' ); values.counter_border_radius = _.fusionValidateAttrValue( values.counter_border_radius, 'px' ); if ( 'default' === values.link_target ) { values.link_target = fusionAllElements.fusion_countdown.link_target; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildWrapperAtts: function( values ) { var wrapperAttributes = { class: 'countdown-shortcode fusion-countdown fusion-countdown-cid' + this.model.get( 'cid' ) + ' fusion-countdown-' + values.layout + ' fusion-countdown-label-' + values.label_position }, bgColor; if ( values.heading_text || values.subheading_text ) { wrapperAttributes[ 'class' ] += ' fusion-countdown-has-heading'; } if ( values.link_text ) { wrapperAttributes[ 'class' ] += ' fusion-countdown-has-link'; } wrapperAttributes = _.fusionVisibilityAtts( values.hide_on_mobile, wrapperAttributes ); bgColor = jQuery.AWB_Color( values.background_color ); if ( ! values.background_image && ( ! values.background_color || 0 === bgColor.alpha() || 'transparent' === values.background_color ) ) { wrapperAttributes[ 'class' ] += ' fusion-no-bg'; } if ( values[ 'class' ] ) { wrapperAttributes[ 'class' ] += ' ' + values[ 'class' ]; } if ( values.id ) { wrapperAttributes.id = values.id; } return wrapperAttributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra params. * @return {Object} */ buildCounterAtts: function( values, extras ) { var counterAttributes = { class: 'fusion-countdown-counter-wrapper countdown-shortcode-counter-wrapper', id: 'fusion-countdown-cid' + this.model.get( 'cid' ) }, s, date, month; if ( ! values.subheading_text && ! values.heading_text && ! values.link_url ) { counterAttributes.style = 'flex-grow: 1;'; } if ( 'site_time' === values.timezone ) { counterAttributes[ 'data-gmt-offset' ] = extras.gmt_offset; } function pad( num, size ) { s = '000000000' + num; return s.substr( s.length - size ); } if ( 'object' === typeof values.countdown_end && 'string' === typeof values.countdown_end.date ) { values.countdown_end = values.countdown_end.date; } if ( values.countdown_end ) { date = new Date( values.countdown_end ); month = pad( date.getMonth() + 1, 2 ); counterAttributes[ 'data-timer' ] = date.getFullYear() + '-' + month + '-' + date.getDate() + '-' + date.getHours() + '-' + date.getMinutes() + '-' + date.getSeconds(); } counterAttributes[ 'data-omit-weeks' ] = ( 'yes' === values.show_weeks ) ? '0' : '1'; return counterAttributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildLinkAtts: function( values ) { var countdownShortcodeLink = { class: 'fusion-countdown-link', target: values.link_target, href: values.link_url }; if ( '_blank' === values.link_target ) { countdownShortcodeLink.rel = 'noopener noreferrer'; } return countdownShortcodeLink; }, /** * Builds the HTML. * * @since 2.0 * @param {Object} values - The values. * @param {Object} extras - Extra args. * @return {string} */ buildDashHtml: function( values, extras ) { var dashClass = '', dashhtml = '', counterBoxColor, dashes = [ { show: values.show_weeks, class: 'weeks', shortname: extras.weeks_text, longname: extras.weeks_text }, { show: 'yes', class: 'days', shortname: extras.days_text, longname: extras.days_text }, { show: 'yes', class: 'hours', shortname: extras.hrs_text, longname: extras.hours_text }, { show: 'yes', class: 'minutes', shortname: extras.min_text, longname: extras.minutes_text }, { show: 'yes', class: 'seconds', shortname: extras.sec_text, longname: extras.seconds_text } ]; if ( 'text_flow' !== values.label_position ) { values.dash_titles = 'long'; } counterBoxColor = jQuery.AWB_Color( values.counter_box_color ); if ( ! values.counter_box_color || 0 === counterBoxColor.alpha() || 'transparent' === values.counter_box_color ) { dashClass = ' fusion-no-bg'; } jQuery.each( dashes, function( index, dash ) { if ( 'yes' === dash.show ) { dashhtml += '<div class="fusion-dash-wrapper ' + dashClass + '">'; dashhtml += '<div class="fusion-dash fusion-dash-' + dash[ 'class' ] + '">'; dashhtml += '<div class="fusion-digit-wrapper">'; if ( 'days' === dash[ 'class' ] ) { dashhtml += '<div class="fusion-thousand-digit fusion-digit">0</div>'; } if ( 'weeks' === dash[ 'class' ] || 'days' === dash[ 'class' ] ) { dashhtml += '<div class="fusion-hundred-digit fusion-digit">0</div>'; } dashhtml += '<div class="fusion-digit">0</div><div class="fusion-digit">0</div>'; dashhtml += '</div>'; dashhtml += '<div class="fusion-dash-title">' + dash[ values.dash_titles + 'name' ] + '</div>'; dashhtml += '</div></div>'; } } ); return dashhtml; }, /** * Builds styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ buildStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ), counterBoxSpacing; if ( values.background_image ) { styles += '.fusion-countdown-cid' + cid + ' {'; styles += 'background:url(' + values.background_image + ') ' + values.background_position + ' ' + values.background_repeat + ' ' + values.background_color + ';'; if ( 'no-repeat' === values.background_repeat ) { styles += '-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;'; } styles += '}'; } else if ( values.background_color ) { styles += '.fusion-countdown-cid' + cid + ' {background-color:' + values.background_color + ';}'; } if ( values.border_radius ) { styles += '.fusion-countdown-cid' + cid + ', .fusion-countdown-cid' + cid + ' .fusion-dash {border-radius:' + values.border_radius + ';}'; } if ( values.counter_box_spacing ) { counterBoxSpacing = parseFloat( values.counter_box_spacing ); styles += '.fusion-countdown-cid' + cid + ' .fusion-dash-wrapper {padding:' + ( counterBoxSpacing / 2 ) + values.counter_box_spacing.replace( counterBoxSpacing, '' ) + ';}'; styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-counter-wrapper {margin: 0 calc(7.5px - ' + ( counterBoxSpacing / 2 ) + values.counter_box_spacing.replace( counterBoxSpacing, '' ) + ');}'; } if ( values.counter_box_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-dash {background-color:' + values.counter_box_color + ';}'; } styles += '.fusion-countdown-cid' + cid + ' .fusion-dash {padding:' + values.counter_padding_top + ' ' + values.counter_padding_right + ' ' + values.counter_padding_bottom + ' ' + values.counter_padding_left + ';}'; if ( 0 !== parseInt( values.counter_border_size ) ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-dash {border:' + values.counter_border_size + ' solid ' + values.counter_border_color + ';}'; } if ( values.counter_border_radius ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-dash {border-radius:' + values.counter_border_radius + ';}'; } if ( values.counter_font_size ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-counter-wrapper {font-size:' + values.counter_font_size + ';}'; } if ( values.counter_text_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-counter-wrapper {color:' + values.counter_text_color + ';}'; } if ( values.label_font_size ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-dash-title {font-size:' + values.label_font_size + ';}'; } if ( values.label_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-dash-title {color:' + values.label_color + ';}'; } if ( values.heading_font_size ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-heading {font-size:' + values.heading_font_size + ';}'; } if ( values.heading_text_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-heading {color:' + values.heading_text_color + ';}'; } if ( values.subheading_font_size ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-subheading {font-size:' + values.subheading_font_size + ';}'; } if ( values.subheading_text_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-subheading {color:' + values.subheading_text_color + ';}'; } if ( values.link_text_color ) { styles += '.fusion-countdown-cid' + cid + ' .fusion-countdown-link {color:' + values.link_text_color + ';}'; } if ( values.element_margin_top ) { styles += '.fusion-countdown-cid' + cid + ' {margin-top:' + values.element_margin_top + ';}'; } if ( values.element_margin_bottom ) { styles += '.fusion-countdown-cid' + cid + ' {margin-bottom:' + values.element_margin_bottom + ';}'; } if ( values.element_margin_left ) { styles += '.fusion-countdown-cid' + cid + ' {margin-left:' + values.element_margin_left + ';}'; } if ( values.element_margin_right ) { styles += '.fusion-countdown-cid' + cid + ' {margin-right:' + values.element_margin_right + ';}'; } return styles; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildHeadingAttr: function() { var self = this; return _.fusionInlineEditor( { cid: self.model.get( 'cid' ), param: 'heading_text', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, { class: 'fusion-countdown-heading' } ); }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildSubHeadingAttr: function() { var self = this; return _.fusionInlineEditor( { cid: self.model.get( 'cid' ), param: 'subheading_text', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, { class: 'fusion-countdown-subheading' } ); }, /** * Updates now deprecated params and adds BC checks. * * @since 2.2 * @return {void} */ deprecatedParams: function() { var params = this.model.get( 'params' ); // Correct old combined border radius setting. if ( 'undefined' === typeof params.counter_border_radius && 'string' === typeof params.border_radius ) { params.counter_border_radius = params.border_radius; } // Correct the label text color. if ( 'undefined' === typeof params.label_color && 'string' === typeof params.counter_text_color ) { params.label_color = params.counter_text_color; } this.model.set( 'params', params ); } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Menu Anchor Element View. FusionPageBuilder.fusion_menu_anchor = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.name = atts.values.name; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = { class: 'fusion-menu-anchor', id: values.name }; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } return attr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Accordion View. FusionPageBuilder.fusion_checklist = FusionPageBuilder.ParentElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.validateValues( atts.values ); this.values = atts.values; // Create attribute objects. attributes.checklistShortcode = this.buildChecklistAttr( atts.values ); // Add computed values that child uses. this.buildExtraVars( atts.values ); // Any extras that need passed on. attributes.values = atts.values; attributes.cid = this.model.get( 'cid' ); attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.size = _.fusionValidateAttrValue( values.size, 'px' ); // Fallbacks for old size parameter and 'px' check+ if ( 'small' === values.size ) { values.size = '13px'; } else if ( 'medium' === values.size ) { values.size = '18px'; } else if ( 'large' === values.size ) { values.size = '40px'; } else if ( -1 === values.size.indexOf( 'px' ) ) { values.size = values.size + 'px'; } values.circle = ( 1 == values.circle ) ? 'yes' : values.circle; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildChecklistAttr: function( values ) { // Main Attributes var checklistShortcode = {}; checklistShortcode[ 'class' ] = 'fusion-checklist fusion-checklist-' + this.model.get( 'cid' ); checklistShortcode = _.fusionVisibilityAtts( values.hide_on_mobile, checklistShortcode ); this.font_size = parseFloat( values.size ); this.line_height = this.font_size * 1.7; checklistShortcode.style = 'font-size:' + this.font_size + 'px;line-height:' + this.line_height + 'px;'; if ( 'yes' === values.divider ) { checklistShortcode[ 'class' ] += ' fusion-checklist-divider'; } if ( '' !== values[ 'class' ] ) { checklistShortcode[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { checklistShortcode.id = values.id; } checklistShortcode[ 'class' ] += ' fusion-child-element'; checklistShortcode[ 'data-empty' ] = this.emptyPlaceholderText; return checklistShortcode; }, /** * Sets extra args in the model. * * @since 2.0 * @return {void} */ buildExtraVars: function() { var extras = {}; extras.font_size = this.font_size; extras.line_height = this.line_height; extras.circle_yes_font_size = extras.font_size * 0.88; extras.icon_margin = extras.font_size * 0.7; extras.icon_margin_position = ( jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'left' : 'right'; extras.content_margin = extras.line_height + extras.icon_margin; extras.content_margin_position = ( jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'right' : 'left'; this.model.set( 'extras', extras ); }, /** * Builds styles. * * @since 3.5 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, selectors; this.baseSelector = '.fusion-checklist-' + this.model.get( 'cid' ); this.dynamic_css = {}; // Divider. selectors = [ this.baseSelector + '.fusion-checklist-divider .fusion-li-item' ]; if ( 'yes' === values.divider ) { this.addCssProperty( selectors, 'border-bottom-color', values.divider_color, true ); } // Row Odd & Even BG Color. selectors = [ this.baseSelector + ' .fusion-li-item:nth-child(odd)' ]; if ( '' !== values.odd_row_bgcolor ) { this.addCssProperty( selectors, 'background-color', values.odd_row_bgcolor ); } selectors = [ this.baseSelector + ' .fusion-li-item:nth-child(even)' ]; if ( '' !== values.even_row_bgcolor ) { this.addCssProperty( selectors, 'background-color', values.even_row_bgcolor ); } // Padding. selectors = [ this.baseSelector + '.fusion-checklist-divider .fusion-li-item', this.baseSelector + ' .fusion-li-item' ]; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { var key = 'item_padding_' + direction; if ( ! this.isDefault( key ) ) { this.addCssProperty( selectors, 'padding-' + direction, values[ key ], true ); } }, this ); // Text color. selectors = [ this.baseSelector + ' .fusion-li-item .fusion-li-item-content' ]; if ( '' !== values.textcolor ) { this.addCssProperty( selectors, 'color', values.textcolor ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionPageBuilderElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Toggle child View FusionPageBuilder.fusion_li_item = FusionPageBuilder.ChildElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, parent = this.model.get( 'parent' ), parentModel = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) == parent; } ); this.parentValues = jQuery.extend( true, {}, fusionAllElements.fusion_checklist.defaults, _.fusionCleanParameters( parentModel.get( 'params' ) ) ); this.parentExtras = parentModel.get( 'extras' ); // Create attribute objects. attributes.checklistShortcodeSpan = this.buildChecklistShortcodeSpanAttr( atts.values ); attributes.checklistShortcodeIcon = this.buildChecklistShortcodeIconAttr( atts.values ); attributes.checklistShortcodeItemContent = this.buildChecklistShortcodeItemContentAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.parent = parent; attributes.output = atts.values.element_content; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildChecklistShortcodeSpanAttr: function( values ) { var checklistShortcodeSpan = { style: '' }, circleClass = 'circle-no', circlecolor; this.parentValues.circle = ( 1 == this.parentValues.circle ) ? 'yes' : this.parentValues.circle; if ( 'yes' === values.circle || ( 'yes' === this.parentValues.circle && 'no' !== values.circle ) ) { circleClass = 'circle-yes'; if ( ! values.circlecolor || '' === values.circlecolor ) { circlecolor = this.parentValues.circlecolor; } else { circlecolor = values.circlecolor; } checklistShortcodeSpan.style = 'background-color:' + circlecolor + ';'; checklistShortcodeSpan.style += 'font-size:' + this.parentExtras.circle_yes_font_size + 'px;'; } checklistShortcodeSpan[ 'class' ] = 'icon-wrapper ' + circleClass; checklistShortcodeSpan.style += 'height:' + this.parentExtras.line_height + 'px;'; checklistShortcodeSpan.style += 'width:' + this.parentExtras.line_height + 'px;'; checklistShortcodeSpan.style += 'margin-' + this.parentExtras.icon_margin_position + ':' + this.parentExtras.icon_margin + 'px;'; return checklistShortcodeSpan; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildChecklistShortcodeIconAttr: function( values ) { var checklistShortcodeIcon = {}, icon, iconcolor; if ( ! values.icon || '' === values.icon ) { icon = _.fusionFontAwesome( this.parentValues.icon ); } else { icon = _.fusionFontAwesome( values.icon ); } if ( ! values.iconcolor || '' === values.iconcolor ) { iconcolor = this.parentValues.iconcolor; } else { iconcolor = values.iconcolor; } checklistShortcodeIcon = { class: 'fusion-li-icon ' + icon, style: 'color:' + iconcolor + ';', 'aria-hidden': 'true' }; return checklistShortcodeIcon; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildChecklistShortcodeItemContentAttr: function() { var checklistShortcodeItemContent = { class: 'fusion-li-item-content', style: 'margin-' + this.parentExtras.content_margin_position + ':' + this.parentExtras.content_margin + 'px;' }; checklistShortcodeItemContent = _.fusionInlineEditor( { cid: this.model.get( 'cid' ), 'data-disable-return': true, 'data-disable-extra-spaces': true }, checklistShortcodeItemContent ); return checklistShortcodeItemContent; } } ); } ); }( jQuery ) ); ;/* eslint no-useless-escape: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Vimeo Element View. FusionPageBuilder.fusion_youtube = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values, atts.params ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrSrc = this.buildAttrSrc( atts.values ); // Any extras that need passed on. attributes.id = atts.values.id; attributes.api_params = atts.values.api_params; attributes.title_attribute = ! _.isEmpty( atts.values.title_attribute ) ? atts.values.title_attribute : 'YouTube video player ' + this.model.get( 'cid' ); attributes.width = atts.values.width; attributes.height = atts.values.height; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values, params ) { var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/, match; // Make videos 16:9 by default, values.width already set to params.width. if ( 'undefined' !== typeof params.width && '' !== params.width && ( 'undefined' === typeof params.height || '' === params.height ) ) { values.height = Math.round( params.width * 9 / 16 ); } // values.height already set to params.height. if ( 'undefined' !== typeof params.height && '' !== params.height && ( 'undefined' === typeof params.width || '' === params.width ) ) { values.width = Math.round( params.height * 16 / 9 ); } values.height = _.fusionValidateAttrValue( values.height, '' ); values.width = _.fusionValidateAttrValue( values.width, '' ); // Make sure only the video ID is passed to the iFrame. match = values.id.match( regExp ); if ( match && 11 === match[ 2 ].length ) { values.id = match[ 2 ]; } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Attributes. var attrYoutube = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-video fusion-youtube', style: '' } ); if ( 'yes' === values.center ) { attrYoutube[ 'class' ] += ' center-video'; } else { attrYoutube.style += 'max-width:' + values.width + 'px;max-height:' + values.height + 'px;'; } if ( '' !== values.alignment ) { attrYoutube[ 'class' ] += ' fusion-align' + values.alignment; attrYoutube.style += ' width:100%'; } if ( 'true' == values.autoplay || 'yes' === values.autoplay ) { attrYoutube[ 'data-autoplay' ] = '1'; } if ( values[ 'class' ] && '' !== values[ 'class' ] ) { attrYoutube[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.css_id ) { attrYoutube.id = values.css_id; } return attrYoutube; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttrSrc: function( values ) { var videoSCAttr = { class: 'video-shortcode' }; if ( 'yes' === values.center ) { videoSCAttr.style = 'max-width:' + values.width + 'px;max-height:' + values.height + 'px;'; } return videoSCAttr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Vimeo Element View. FusionPageBuilder.fusion_soundcloud = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.width = _.fusionValidateAttrValue( values.width, 'px' ); values.height = _.fusionValidateAttrValue( values.height, 'px' ); values.autoplay = ( 'yes' === values.auto_play ) ? 'true' : 'false'; values.comments = ( 'yes' === values.comments ) ? 'true' : 'false'; if ( 'visual' === values.layout ) { values.visual = 'true'; if ( ! values.height || '' === values.height ) { values.height = '450'; } } else { values.visual = 'false'; if ( ! values.height || '' === values.height ) { values.height = '166'; } } values.height = parseInt( values.height, 10 ); values.show_related = ( 'yes' === values.show_related ) ? 'false' : 'true'; values.show_reposts = ( 'yes' === values.show_reposts ) ? 'true' : 'false'; values.show_user = ( 'yes' === values.show_user ) ? 'true' : 'false'; if ( values.color ) { values.color = jQuery.AWB_Color( values.color ).toHexString(); values.color = values.color.replace( '#', '' ); } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Attributes. var attr = { class: 'fusion-soundcloud' }; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); return attr; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Text Element View. FusionPageBuilder.fusion_text = FusionPageBuilder.ElementView.extend( { /** * Runs before view DOM is patched. * * @since 2.0.0 * @return null */ beforePatch: function() { if ( 'undefined' === typeof this.model.attributes.params.element_content || '' === this.model.attributes.params.element_content ) { this.model.attributes.params.element_content = fusionBuilderText.text_placeholder; } }, afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.output = _.autop( atts.values.element_content ); return attributes; }, /** * Modifies the values. * * @since 3.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.font_size && '' !== values.font_size ) { values.font_size = _.fusionGetValueWithUnit( values.font_size ); } if ( 'undefined' !== typeof values.letter_spacing && '' !== values.letter_spacing ) { values.letter_spacing = _.fusionGetValueWithUnit( values.letter_spacing ); } if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var self = this, textAttributes = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-text fusion-text-' + this.model.get( 'cid' ), style: '' } ), browserPrefixes = [ '-webkit-', '-moz-', '' ]; textAttributes[ 'class' ] += _.fusionGetStickyClass( values.sticky_display ); if ( 'default' === values.rule_style ) { values.rule_style = fusionAllElements.fusion_text.defaults.rule_style; } textAttributes.style += _.fusionGetFontStyle( 'text_font', values ); // Alignment. if ( values.content_alignment ) { textAttributes.style += 'text-align:' + values.content_alignment + ';'; } if ( this.flexDisplay() ) { if ( values.content_alignment_medium && values.content_alignment !== values.content_alignment_medium ) { textAttributes[ 'class' ] += ' md-text-align-' + values.content_alignment_medium; } if ( values.content_alignment_small && values.content_alignment !== values.content_alignment_small ) { textAttributes[ 'class' ] += ' sm-text-align-' + values.content_alignment_small; } } // Only add styling if more than one column is used. if ( 1 < values.columns ) { textAttributes[ 'class' ] += ' fusion-text-split-columns fusion-text-columns-' + values.columns; _.each( browserPrefixes, function( prefix ) { textAttributes.style += ' ' + prefix + 'column-count:' + values.columns + ';'; if ( 'none' !== values.column_spacing && values.column_spacing ) { textAttributes.style += ' ' + prefix + 'column-gap:' + _.fusionValidateAttrValue( values.column_spacing, 'px' ) + ';'; } if ( 'none' !== values.column_min_width && values.column_min_width ) { textAttributes.style += ' ' + prefix + 'column-width:' + _.fusionValidateAttrValue( values.column_min_width, 'px' ) + ';'; } if ( 'none' !== values.rule_style ) { textAttributes.style += ' ' + prefix + 'column-rule:' + values.rule_size + 'px ' + values.rule_style + ' ' + values.rule_color + ';'; } } ); } if ( 'undefined' !== typeof values.font_size && '' !== values.font_size ) { textAttributes.style += 'font-size:' + values.font_size + ';'; } if ( 'undefined' !== typeof values.line_height && '' !== values.line_height ) { textAttributes.style += 'line-height:' + values.line_height + ';'; } if ( 'undefined' !== typeof values.letter_spacing && '' !== values.letter_spacing ) { textAttributes.style += 'letter-spacing:' + values.letter_spacing + ';'; } if ( 'undefined' !== typeof values.text_transform && '' !== values.text_transform && 'none' !== values.text_transform ) { textAttributes.style += 'text-transform:' + values.text_transform + ';'; } if ( 'undefined' !== typeof values.text_color && '' !== values.text_color ) { textAttributes.style += 'color:' + values.text_color + ';'; } if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { textAttributes[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.margin_top ) { textAttributes.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { textAttributes.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { textAttributes.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { textAttributes.style += 'margin-left:' + values.margin_left + ';'; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { textAttributes.id = values.id; } if ( '' !== values.margin_bottom ) { textAttributes[ 'class' ] += ' fusion-text-no-margin'; } textAttributes = _.fusionInlineEditor( { cid: self.model.get( 'cid' ) }, textAttributes ); textAttributes = _.fusionAnimations( values, textAttributes ); return textAttributes; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Title View FusionPageBuilder.fusion_tagline_box = FusionPageBuilder.ElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); if ( 'object' === typeof params ) { // Split border radius into 4. if ( 'undefined' === typeof params.button_border_radius_top_left && 'undefined' !== typeof params.button_border_radius && '' !== params.button_border_radius ) { params.button_border_radius_top_left = parseInt( params.button_border_radius ) + 'px'; params.button_border_radius_top_right = params.button_border_radius_top_left; params.button_border_radius_bottom_right = params.button_border_radius_top_left; params.button_border_radius_bottom_left = params.button_border_radius_top_left; delete params.button_border_radius; } this.model.set( 'params', params ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Shared base object. this.extras = atts.extras; this.attrButton = this.buildButtonAttr( atts.values ); // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.attrReadingBox = this.buildReadingBoxAttr( atts.values ); attributes.desktopAttrButton = this.buildDesktopButtonAttr( atts.values ); attributes.mobileAttrButton = this.buildMobileButtonAttr( atts.values ); attributes.titleAttr = this.buildTitleAttr( atts.values ); attributes.buttonSpanAttr = this.buildButtonSpanAttr( atts.values ); attributes.descriptionAttr = this.buildDescriptionAttr( atts.values ); attributes.contentAttr = this.buildContentAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 2.0 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.border = _.fusionValidateAttrValue( values.border, 'px' ); if ( values.modal ) { values.link = '#'; } if ( values.button_type ) { values.button_type = values.button_type.toLowerCase(); } // BC compatibility for button shape. if ( 'undefined' !== typeof values.button_shape && 'undefined' === typeof values.button_border_radius ) { values.button_border_radius = '0'; if ( 'square' === values.button_shape ) { values.button_border_radius = '0'; } else if ( 'round' === values.button_shape ) { values.button_border_radius = '2'; if ( '3d' === values.button_type ) { values.button_border_radius = '4'; } } else if ( 'pill' === values.button_shape ) { values.button_border_radius = '25'; } else if ( '' === values.button_shape ) { values.button_border_radius = ''; } values.button_border_radius_top_left = values.button_border_radius; values.button_border_radius_top_right = values.button_border_radius_top_left; values.button_border_radius_bottom_right = values.button_border_radius_top_left; values.button_border_radius_bottom_left = values.button_border_radius_top_left; } else if ( 'string' === typeof values.buton_border_radius && 'undefined' === typeof values.button_border_radius_top_left ) { values.button_border_radius_top_left = values.button_button_border_radius; values.button_border_radius_top_right = values.button_border_radius_top_left; values.button_border_radius_bottom_right = values.button_border_radius_top_left; values.button_border_radius_bottom_left = values.button_border_radius_top_left; } values.button_border_radius = _.fusionGetValueWithUnit( values.button_border_radius_top_left ) + ' ' + _.fusionGetValueWithUnit( values.button_border_radius_top_right ) + ' ' + _.fusionGetValueWithUnit( values.button_border_radius_bottom_right ) + ' ' + _.fusionGetValueWithUnit( values.button_border_radius_bottom_left ); try { if ( FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( values.description ) ) === values.description ) { values.description = FusionPageBuilderApp.base64Decode( values.description ); values.description = _.unescape( values.description ); } if ( FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( values.title ) ) === values.title ) { values.title = FusionPageBuilderApp.base64Decode( values.title ); values.title = _.unescape( values.title ); } } catch ( error ) { console.log( error ); // jshint ignore:line } }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-reading-box-container reading-box-container-' + this.model.get( 'cid' ), style: '' } ); attr = _.fusionAnimations( values, attr ); if ( values.margin_top || '0' === values.margin_top ) { attr.style += 'margin-top:' + _.fusionGetValueWithUnit( values.margin_top ) + ';'; } if ( values.margin_bottom || '0' === values.margin_bottom ) { attr.style += 'margin-bottom:' + _.fusionGetValueWithUnit( values.margin_bottom ) + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildReadingBoxAttr: function( values ) { var attrReadingBox = { class: 'reading-box' }; if ( 'right' === values.content_alignment ) { attrReadingBox[ 'class' ] += ' reading-box-right'; } else if ( 'center' === values.content_alignment ) { attrReadingBox[ 'class' ] += ' reading-box-center'; } if ( 'yes' === values.shadow ) { attrReadingBox[ 'class' ] += ' element-bottomshadow'; } attrReadingBox.style = 'background-color:' + values.backgroundcolor + ';'; attrReadingBox.style += 'border-width:' + values.border + ';'; attrReadingBox.style += 'border-color:' + values.bordercolor + ';'; if ( 'none' !== values.highlightposition ) { if ( 3 < parseInt( values.border, 10 ) ) { attrReadingBox.style += 'border-' + values.highlightposition + '-width:' + values.border + ';'; } else { attrReadingBox.style += 'border-' + values.highlightposition + '-width:3px;'; } attrReadingBox.style += 'border-' + values.highlightposition + '-color:' + this.extras.primary_color + ';'; } attrReadingBox.style += 'border-style:solid;'; return attrReadingBox; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildButtonAttr: function( values ) { var attrButton = { class: 'button fusion-button button-' + values.buttoncolor + ' fusion-button-' + values.button_size + ' button-' + values.button_size + ' button-' + values.button_type, style: '' }; attrButton[ 'class' ] = attrButton[ 'class' ].toLowerCase(); if ( 'right' === values.content_alignment ) { attrButton[ 'class' ] += ' continue-left'; } else if ( 'center' === values.content_alignment ) { attrButton[ 'class' ] += ' continue-center'; } else { attrButton[ 'class' ] += ' continue-right'; } if ( 'flat' === values.button_type ) { attrButton.style += '-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;'; } attrButton.href = values.link; attrButton.target = values.linktarget; if ( '_blank' === attrButton.target ) { attrButton.rel = 'noopener noreferrer'; } if ( '' !== values.modal ) { attrButton[ 'data-toggle' ] = 'modal'; attrButton[ 'data-target' ] = '.' + values.modal; } if ( '' !== values.button_border_radius ) { attrButton.style += 'border-radius:' + values.button_border_radius; } return attrButton; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildTitleAttr: function() { var self = this; return _.fusionInlineEditor( { cid: self.model.get( 'cid' ), param: 'title', 'disable-return': true, 'disable-extra-spaces': true, encoding: true, toolbar: false }, {} ); }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildButtonSpanAttr: function() { var self = this; return _.fusionInlineEditor( { cid: self.model.get( 'cid' ), param: 'button', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, {} ); }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildDescriptionAttr: function( values ) { var descriptionAttr = { class: 'reading-box-description' }, self = this; if ( '' !== values.title ) { descriptionAttr[ 'class' ] += ' fusion-reading-box-additional'; } descriptionAttr = _.fusionInlineEditor( { cid: self.model.get( 'cid' ), param: 'description', 'disable-return': true, 'disable-extra-spaces': true, encoding: true, toolbar: 'simple' }, descriptionAttr ); return descriptionAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildContentAttr: function( values ) { var self = this, contentAttr = { class: 'reading-box-additional' }; if ( '' === values.description && '' !== values.title ) { contentAttr[ 'class' ] += ' fusion-reading-box-additional'; } contentAttr = _.fusionInlineEditor( { cid: self.model.get( 'cid' ) }, contentAttr ); return contentAttr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildDesktopButtonAttr: function( values ) { var attrButton = jQuery.extend( true, {}, this.attrButton ), buttonMarginClass = ''; if ( '' !== values.description && 'undefined' !== typeof values.element_content && '' !== values.element_content ) { buttonMarginClass = ' fusion-desktop-button-margin'; } attrButton[ 'class' ] += ' fusion-desktop-button fusion-tagline-button continue' + buttonMarginClass; return attrButton; }, /** * Builds attributes. * * @since 2.0 * @return {Object} */ buildMobileButtonAttr: function() { var attrButton = jQuery.extend( true, {}, this.attrButton ); attrButton[ 'class' ] += ' fusion-mobile-button'; return attrButton; } } ); } ); }( jQuery ) ); ;/* eslint no-shadow: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Pricing table stylesiew FusionPageBuilder.fusion_pricing_table = FusionPageBuilder.ParentElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); if ( 'undefined' === typeof params.background_color_hover && 'undefined' !== typeof params.bordercolor && '' !== params.bordercolor ) { params.background_color_hover = params.bordercolor; } }, beforeGenerateShortcode: function() { this.updateElementContent(); }, onRender: function() { var columns = 6, params = this.model.get( 'params' ); if ( 'undefined' === typeof params.columns && 'undefined' !== typeof this.model.children && this.model.children.length ) { if ( 6 > this.model.children.length ) { columns = this.model.children.length; } params.columns = columns; this.model.set( 'params', params ); this.updateColumnWidths(); } }, childViewAdded: function() { this.updateColumnWidths(); }, childViewRemoved: function() { this.updateColumnWidths(); }, childViewCloned: function() { this.updateColumnWidths(); }, updateColumnWidths: function() { var params = this.model.get( 'params' ), columns = 'undefined' !== typeof this.model.children ? this.model.children.length : 0, values, attr; // Calculate columns. if ( 6 < columns ) { columns = 6; } params.columns = columns; this.model.set( 'params', params ); // Update classes on parent. values = jQuery.extend( true, {}, window.fusionAllElements[ this.model.get( 'element_type' ) ].defaults, _.fusionCleanParameters( params ) ); attr = this.computeTableData( values ); this.$el.find( '.fusion-child-element' ).attr( 'class', attr[ 'class' ] ); // Update classes on each child. this.model.children.each( function( child ) { var cid = child.attributes.cid, view = window.FusionPageBuilderViewManager.getView( cid ), values = jQuery.extend( true, {}, window.fusionAllElements[ view.model.get( 'element_type' ) ].defaults, _.fusionCleanParameters( view.model.get( 'params' ) ) ); view.buildColumnWrapperAttr( values, columns ); view.onRender(); } ); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { return { styles: this.computeStyles( atts.values ), tableData: this.computeTableData( atts.values ) }; }, /** * Builds the data for the table. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ computeTableData: function( values ) { var type = 'sep', cid = this.model.get( 'cid' ), tableData = {}; if ( '1' == values.type ) { type = 'full'; } if ( 6 < values.columns ) { values.columns = 6; } tableData[ 'class' ] = 'fusion-child-element fusion-pricing-table pricing-table-cid' + cid + ' ' + type + '-boxed-pricing row fusion-columns-' + values.columns + ' columns-' + values.columns + ' fusion-clearfix'; tableData[ 'data-empty' ] = this.emptyPlaceholderText; tableData = _.fusionVisibilityAtts( values.hide_on_mobile, tableData ); if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { tableData[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { tableData.id = values.id; } return tableData; }, /** * Builds the styles. * * @since 2.0 * @param {Object} values - The values. * @return {string} */ computeStyles: function( values ) { var styles, cid = this.model.get( 'cid' ); styles = '<style type="text/css">.pricing-table-cid' + cid + ' .panel-container, .pricing-table-cid' + cid + ' .standout .panel-container,.pricing-table-cid' + cid + '.full-boxed-pricing { background-color: ' + values.bordercolor + ';}.pricing-table-cid' + cid + ' .list-group .list-group-item,.pricing-table-cid' + cid + ' .list-group .list-group-item:last-child{ background-color:' + values.backgroundcolor + '; border-color:' + values.dividercolor + ';}.pricing-table-cid' + cid + '.full-boxed-pricing .panel-wrapper:hover .panel-heading,.full-boxed-pricing .panel-wrapper.hover .panel-heading,.pricing-table-cid' + cid + ' .panel-wrapper:hover .list-group-item,.pricing-table-cid' + cid + ' .panel-wrapper.hover .list-group-item { background-color:' + values.background_color_hover + ';}.pricing-table-cid' + cid + '.full-boxed-pricing .panel-heading{ background-color:' + values.backgroundcolor + ';}.pricing-table-cid' + cid + ' .fusion-panel, .pricing-table-cid' + cid + ' .panel-wrapper:last-child .fusion-panel,.pricing-table-cid' + cid + ' .standout .fusion-panel, .pricing-table-cid' + cid + ' .panel-heading,.pricing-table-cid' + cid + ' .panel-body, .pricing-table-cid' + cid + ' .panel-footer{ border-color:' + values.dividercolor + ';}.pricing-table-cid' + cid + ' .panel-body,.pricing-table-cid' + cid + ' .panel-footer{ background-color:' + values.bordercolor + ';}.pricing-table-cid' + cid + '.sep-boxed-pricing .panel-heading h3{color:' + values.heading_color_style_2 + ';}.pricing-table-cid' + cid + '.full-boxed-pricing.fusion-pricing-table .panel-heading h3{color:' + values.heading_color_style_1 + ';}.pricing-table-cid' + cid + '.fusion-pricing-table .panel-body .price .decimal-part{color:' + values.pricing_color + ';}.pricing-table-cid' + cid + '.fusion-pricing-table .panel-body .price .integer-part{color:' + values.pricing_color + ';}.pricing-table-cid' + cid + ' ul.list-group li{color:' + values.body_text_color + ';}</style>'; return styles; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, fusionAllElements, fusionBuilderText, FusionEvents */ /* eslint no-unused-vars: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Content Boxes Child View. FusionPageBuilder.fusion_pricing_column = FusionPageBuilder.ChildElementView.extend( { /** * Creates params from child shortcodes. * * @since 2.0 * @return {void} */ onInit: function() { this.setPriceParams(); this.setFooterContent(); this.setFeatureRows(); this.clearInvalidParams(); // Price params history. this._priceUpdateHistory = _.debounce( _.bind( this.priceUpdateHistory, this ), 500 ); this.initialPriceValue = false; // Footer content history. this._footerUpdateHistory = _.debounce( _.bind( this.footerUpdateHistory, this ), 500 ); this.initialFooterValue = false; // Column features history. this._featuresUpdateHistory = _.debounce( _.bind( this.featuresUpdateHistory, this ), 500 ); this.initialFeaturesValue = false; }, /** * Generates child shortcodes from params. * * @since 2.0 * @return {void} */ beforeGenerateShortcode: function() { var params = this.model.get( 'params' ), priceParams = this.model.get( 'priceParams' ), shortcode = '[fusion_pricing_price', featuredRows = this.getFeaturedRows(), footerContent = this.model.get( 'footerContent' ); _.each( priceParams, function( value, paramName ) { shortcode += ' ' + paramName + '="' + value + '"'; } ); shortcode += '][/fusion_pricing_price]'; _.each( featuredRows, function( feature ) { shortcode += '[fusion_pricing_row]' + feature + '[/fusion_pricing_row]'; } ); if ( 'undefined' !== typeof footerContent && '' !== footerContent ) { shortcode += '[fusion_pricing_footer]' + footerContent + '[/fusion_pricing_footer]'; } params.element_content = shortcode; this.model.set( 'params', params ); }, setPriceParams: function() { var params = this.model.get( 'params' ), priceShortcode = 'undefined' !== typeof params.element_content ? params.element_content : '', innerRegExp = FusionPageBuilderApp.regExpShortcode( 'fusion_pricing_price' ), priceShortcodeElement = priceShortcode.match( innerRegExp ), priceShortcodeAttributes, priceParams; if ( ! priceShortcodeElement || ! priceShortcodeElement.length ) { this.model.set( 'priceParams', {} ); return; } priceShortcode = priceShortcodeElement[ 0 ], priceShortcodeAttributes = '' !== priceShortcodeElement[ 3 ] ? window.wp.shortcode.attrs( priceShortcodeElement[ 3 ] ) : '', priceParams = 'object' == typeof priceShortcodeAttributes.named ? priceShortcodeAttributes.named : {}; this.model.set( 'priceParams', jQuery.extend( true, {}, priceParams ) ); }, setFooterContent: function() { var params = this.model.get( 'params' ), priceShortcode = 'undefined' !== typeof params.element_content ? params.element_content : '', innerRegExp = FusionPageBuilderApp.regExpShortcode( 'fusion_pricing_footer' ), footerShortcodeElement = priceShortcode.match( innerRegExp ), footerShortcode; if ( ! footerShortcodeElement ) { this.model.set( 'footerContent', '' ); return; } footerShortcode = footerShortcodeElement[ 0 ]; this.model.set( 'footerContent', footerShortcodeElement[ 5 ] ); }, setFeatureRows: function() { var params = this.model.get( 'params' ), priceShortcode = 'undefined' !== typeof params.element_content ? params.element_content : '', pricingColumnRows = FusionPageBuilderApp.findShortcodeMatches( priceShortcode, 'fusion_pricing_row' ), values = []; if ( 'object' !== typeof pricingColumnRows || ! pricingColumnRows || ! pricingColumnRows.length ) { return; } _.each( pricingColumnRows, function( pricingColumnRow ) { var rowContent = ''; if ( 'undefined' !== typeof pricingColumnRow.match( FusionPageBuilderApp.regExpShortcode( 'fusion_pricing_row' ) )[ 5 ] ) { rowContent = pricingColumnRow.match( FusionPageBuilderApp.regExpShortcode( 'fusion_pricing_row' ) )[ 5 ]; } values.push( rowContent ); } ); values = values.join( '|' ); this.model.set( 'featureRows', values ); }, clearInvalidParams: function() { var params = this.model.get( 'params' ); delete params.currency; delete params.currency_position; delete params.price; delete params.time; params.footer_content = false; params.feature_rows = false; this.model.set( 'params', params ); }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { if ( 'undefined' !== typeof this.model.attributes.selectors ) { this.model.attributes.selectors[ 'class' ] += ' ' + this.className; this.setElementAttributes( this.$el, this.model.attributes.selectors ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, priceValues = this.getPriceValues(); attributes.title = atts.values.title; attributes.cid = this.model.get( 'cid' ); attributes.titleAttr = this.buildTitleAttr(); this.buildColumnWrapperAttr( atts.values, atts.parentValues.columns ); // Pricing shortcode. attributes.price = priceValues.price.split( '.' ); attributes.currencyPosition = priceValues.currency_position; attributes.currency = priceValues.currency; attributes.time = priceValues.time; attributes.currencyClasses = this.getCurrencyClasses( priceValues ); attributes.timeClasses = this.getTimeClasses( priceValues ); // Feature rows. attributes.featureRows = this.getFeaturedRows(); // Footer shortcode. attributes.footerContent = this.model.get( 'footerContent' ); return attributes; }, getFeaturedRows: function() { var values = this.model.get( 'featureRows' ); if ( 'undefined' === typeof values ) { return []; } if ( -1 === values.indexOf( '|' ) ) { return [ values ]; } return values.split( '|' ); }, getPriceValues: function() { var priceParams = this.model.get( 'priceParams' ), priceDefaults = { currency: '', currency_position: 'left', price: '', time: '' }; return jQuery.extend( true, {}, priceDefaults, _.fusionCleanParameters( priceParams ) ); }, getCurrencyClasses: function( priceValues ) { var currencyClasses = { class: 'currency' }; if ( 'right' === priceValues.currency_position ) { currencyClasses[ 'class' ] += ' pos-right'; if ( -1 !== priceValues.price.indexOf( '.' ) ) { currencyClasses[ 'class' ] += ' price-without-decimal'; } } return currencyClasses; }, getTimeClasses: function( priceValues ) { var timeClasses = { class: 'time' }; if ( '' !== priceValues.time ) { if ( -1 === priceValues.price.indexOf( '.' ) ) { timeClasses[ 'class' ] += ' price-without-decimal'; } if ( 'right' === priceValues.currency_position ) { timeClasses[ 'class' ] += ' pos-right'; } } return timeClasses; }, buildTitleAttr: function() { var cid = this.model.get( 'cid' ), titleAttr = { class: 'title-row' }; _.fusionInlineEditor( { cid: cid, param: 'title', 'disable-return': true, 'disable-extra-spaces': true, toolbar: false }, titleAttr ); return titleAttr; }, updatePricingTablePrice: function( name, value ) { var priceParams = this.model.get( 'priceParams' ); priceParams[ name ] = value; this.model.set( 'priceParams', priceParams ); this.reRender(); }, updatePricingTableFooter: function( value ) { this.model.set( 'footerContent', value ); this.reRender(); }, updatePricingTableFeatures: function( value ) { this.model.set( 'featureRows', value ); this.reRender(); }, priceUpdateHistory: function( name, value ) { var priceParams = this.model.get( 'priceParams' ), originalParam = this.initialPriceValue, state = { type: 'price-param', param: name, newValue: value, cid: this.model.get( 'cid' ) }, elementMap = fusionAllElements[ this.model.get( 'element_type' ) ], paramObject = elementMap.params[ name ], paramTitle = 'object' === typeof paramObject ? paramObject.heading : name; state.oldValue = originalParam; FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + paramTitle, state ); this.initialPriceValue = false; }, footerUpdateHistory: function( value ) { var originalParam = this.initialFooterValue, state = { type: 'pricefooter-param', newValue: value, cid: this.model.get( 'cid' ) }, elementMap = fusionAllElements[ this.model.get( 'element_type' ) ], paramObject = elementMap.params.footer_content, paramTitle = 'object' === typeof paramObject ? paramObject.heading : name; state.oldValue = originalParam; FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + paramTitle, state ); this.initialFooterValue = false; }, featuresUpdateHistory: function( value ) { var originalParam = this.initialFeaturesValue, state = { type: 'pricefeatures-param', newValue: value, cid: this.model.get( 'cid' ) }, elementMap = fusionAllElements[ this.model.get( 'element_type' ) ], paramObject = elementMap.params.feature_rows, paramTitle = 'object' === typeof paramObject ? paramObject.heading : name; state.oldValue = originalParam; FusionEvents.trigger( 'fusion-history-save-step', fusionBuilderText.edited + ' ' + elementMap.name + ' - ' + paramTitle, state ); this.initialFeaturesValue = false; }, /** * Builder column wrapper attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildColumnWrapperAttr: function( values, columns ) { var attr = { class: 'panel-wrapper fusion-column column' }; if ( '5' == columns ) { columns = 2; } else { columns = 12 / parseInt( columns, 10 ); } attr[ 'class' ] += ' col-lg-' + columns + ' col-md-' + columns + ' col-sm-' + columns; attr[ 'class' ] += ' fusion-pricingtable-column'; if ( 'yes' === values.standout ) { attr[ 'class' ] += ' standout'; } if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { attr.id = values.id; } this.model.set( 'selectors', attr ); } } ); _.extend( FusionPageBuilder.Callback.prototype, { fusionPricingTablePrice: function( name, value, args, view ) { var priceParams = view.model.get( 'priceParams' ), originalParam = priceParams[ name ]; // If its the same value, no need to do anything. if ( originalParam === value ) { return; } if ( ! view.initialPriceValue ) { view.initialPriceValue = originalParam; } view._priceUpdateHistory( name, value ); priceParams[ name ] = value; view.model.set( 'priceParams', priceParams ); return { render: true }; } } ); _.extend( FusionPageBuilder.Callback.prototype, { fusionPricingTableFooter: function( name, value, args, view ) { var originalParam = view.model.get( 'footerContent' ); if ( originalParam === value ) { return; } if ( ! view.initialFooterValue ) { view.initialFooterValue = originalParam; } view._footerUpdateHistory( value ); view.model.set( 'footerContent', value ); return { render: true }; } } ); _.extend( FusionPageBuilder.Callback.prototype, { fusionPricingTableRows: function( name, value, args, view ) { var originalParam = view.model.get( 'featureRows' ); if ( originalParam === value ) { return; } if ( ! view.initialFeaturesValue ) { view.initialFeaturesValue = originalParam; } view._featuresUpdateHistory( value ); view.model.set( 'featureRows', value ); return { render: true }; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Blog Element View. FusionPageBuilder.fusion_blog = FusionPageBuilder.ElementView.extend( { /** * Are there any non landscape images, used for masonry layout. */ regularImagesFound: false, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.extras = atts.extras; // Create attribute objects. attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); attributes.blogPosts = ''; this.regularImagesFound = false; if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.posts ) { attributes.blogPosts = this.buildBlogPosts( atts ); // Add class if regular size images were found. if ( true === this.regularImagesFound ) { attributes.attr[ 'class' ] += ' fusion-masonry-has-vertical'; } } if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.max_num_pages ) { attributes.attrPostsContainer = this.buildPostsContainerAttr( atts ); if ( 'undefined' !== typeof atts.query_data.paged ) { attributes.paginationCode = this.buildPagination( atts ); } } attributes.load_more_text = atts.extras.load_more_text; attributes.load_more = atts.values.load_more && -1 !== atts.values.number_posts; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; attributes.query_data = atts.query_data; return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { values.blog_grid_column_spacing = _.fusionValidateAttrValue( values.blog_grid_column_spacing, '' ); values.scrolling = ( 'undefined' !== values.paging && 'no' == values.paging && 'pagination' === values.scrolling ) ? 'no' : values.scrolling; if ( -1 == values.number_posts ) { values.scrolling = 'no'; } // Add hyphens for alternate layout options. if ( 'large alternate' === values.layout ) { values.layout = 'large-alternate'; } else if ( 'medium alternate' === values.layout ) { values.layout = 'medium-alternate'; } values.load_more = false; if ( 'no' !== values.scrolling ) { if ( 'load_more_button' === values.scrolling ) { values.load_more = true; values.scrolling = 'infinite'; } } if ( 'undefined' !== typeof values.excerpt_length ) { values.excerpt_words = values.excerpt_length; } if ( '0' === values.blog_grid_column_spacing ) { values.blog_grid_column_spacing = '0.0'; } if ( 'object' !== typeof values.blog_grid_padding ) { values.blog_grid_padding = { top: '', right: '', bottom: '', left: '' }; } if ( 'undefined' !== typeof values.padding_top && '' !== values.padding_top ) { values.blog_grid_padding.top = values.padding_top; } if ( 'undefined' !== typeof values.padding_right && '' !== values.padding_right ) { values.blog_grid_padding.right = values.padding_right; } if ( 'undefined' !== typeof values.padding_bottom && '' !== values.padding_bottom ) { values.blog_grid_padding.bottom = values.padding_bottom; } if ( 'undefined' !== typeof values.padding_left && '' !== values.padding_left ) { values.blog_grid_padding.left = values.padding_left; } values.blog_grid_padding = [ _.fusionGetValueWithUnit( values.blog_grid_padding.top ), _.fusionGetValueWithUnit( values.blog_grid_padding.right ), _.fusionGetValueWithUnit( values.blog_grid_padding.bottom ), _.fusionGetValueWithUnit( values.blog_grid_padding.left ) ]; values.padding = 'object' === typeof values.blog_grid_padding ? values.blog_grid_padding.join( ' ' ) : values.blog_grid_padding; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-blog-shortcode fusion-blog-archive', style: '' } ), blogLayout = '', cid = this.model.get( 'cid' ); // Set the correct layout class. blogLayout = 'fusion-blog-layout-' + values.layout; if ( 'timeline' === values.layout ) { blogLayout = 'fusion-blog-layout-timeline-wrapper'; } else if ( 'grid' === values.layout || 'masonry' === values.layout ) { blogLayout = 'fusion-blog-layout-grid-wrapper'; } if ( values.content_alignment && ( 'grid' === values.layout || 'masonry' === values.layout || 'timeline' === values.layout ) ) { attr[ 'class' ] += ' fusion-blog-layout-' + values.content_alignment; } attr[ 'class' ] += ' fusion-blog-shortcode-cid' + cid; attr[ 'class' ] += ' ' + blogLayout; attr[ 'class' ] += ' fusion-blog-' + values.scrolling; if ( 'yes' !== values.thumbnail ) { attr[ 'class' ] += ' fusion-blog-no-images'; } if ( '0' == values.blog_grid_column_spacing || '0px' === values.blog_grid_column_spacing ) { attr[ 'class' ] += ' fusion-no-col-space'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds attributes for blog post container. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ buildPostsContainerAttr: function( atts ) { var attr = { class: 'fusion-posts-container', style: '' }, values = atts.values, extras = atts.extras, queryData = atts.query_data, negativeMargin = ''; attr[ 'class' ] += ' fusion-posts-container-' + values.scrolling; if ( ! this.metaInfoCombined ) { attr[ 'class' ] += ' fusion-no-meta-info'; } if ( values.load_more ) { attr[ 'class' ] += ' fusion-posts-container-load-more'; } // Add class if rollover is enabled. if ( extras.image_rollover ) { attr[ 'class' ] += ' fusion-blog-rollover'; } attr[ 'data-pages' ] = queryData.max_num_pages; if ( 'grid' === values.layout || 'masonry' === values.layout ) { attr[ 'class' ] += ' fusion-blog-layout-grid fusion-blog-layout-grid-' + values.blog_grid_columns + ' isotope'; if ( 'masonry' === values.layout ) { attr[ 'class' ] += ' fusion-blog-layout-masonry'; if ( queryData.regular_images_found ) { attr[ 'class' ] += ' fusion-blog-layout-masonry-has-vertical'; } } if ( 'grid' === values.layout ) { if ( 'yes' === values.equal_heights ) { attr[ 'class' ] += ' fusion-blog-equal-heights'; } } if ( 'undefined' !== typeof values.blog_grid_column_spacing || 0 === parseInt( values.blog_grid_column_spacing, 10 ) ) { attr[ 'data-grid-col-space' ] = values.blog_grid_column_spacing; } negativeMargin = ( -1 ) * parseFloat( values.blog_grid_column_spacing ) / 2; attr.style = 'margin: ' + negativeMargin + 'px ' + negativeMargin + 'px 0;height:500px;'; } return attr; }, /** * Builds the pagination. * * @since 2.0 * @param {Object} atts - The attributes. * @return {string} */ buildPagination: function( atts ) { var globalPagination = atts.extras.pagination_global, globalStartEndRange = atts.extras.pagination_start_end_range_global, range = atts.extras.pagination_range_global, paged = '', pages = '', paginationCode = '', queryData = atts.query_data, values = atts.values; if ( -1 == values.number_posts ) { values.scrolling = 'no'; } if ( 'timeline' === values.layout ) { values.post_count = 1; } if ( 'no' !== values.scrolling ) { paged = queryData.paged; pages = queryData.max_num_pages; paginationCode = _.fusionPagination( pages, paged, range, values.scrolling, globalPagination, globalStartEndRange ); } return paginationCode; }, /** * Builds the blog posts HTML. * * @since 2.0 * @param {Object} atts - The values. * @return {string} */ buildBlogPosts: function( atts ) { var html = '', queryData = atts.query_data, values = atts.values, extras = atts.extras, imageSize = '', dateValues = {}, postCount = 1, prevPostMonth = null, prevPostYear = null, timelineDate = '', blogShortcodeLoop = {}, timelineAlign = '', beforeLoopAction = '', blogFusionPostWrapper = {}, color = '', colorCSS = '', metaInfoCombined = '', isZeroExcerpt = '', metaAll = ( 'yes' === values.meta_all ), metaAuthor = ( 'yes' === values.meta_author ), metaCategories = ( 'yes' === values.meta_categories ), metaComments = ( 'yes' === values.meta_comments ), metaDate = ( 'yes' === values.meta_date ), metaLink = ( 'yes' === values.meta_link ), mataTags = ( 'yes' === values.meta_tags ), stripHTML = ( 'yes' === values.strip_html ), thumbnail = ( 'yes' === values.thumbnail ), showTitle = ( 'yes' === atts.params.show_title || 'yes' === atts.params.title ), titleLink = ( 'yes' === values.title_link ), metaInfoSettings = {}, preTitleContent = '', metaData = '', contentSep = '', dateAndFormat = '', formatClass = '', blogShortcodePostContentWrapper = {}, link = '', linkTarget = '', linkIconTarget = '', postLinksTarget = '', blogShortcodePostTitle = {}, headerContent = '', content = '', readMoreContent = '', readMoreWrapperClass = 'fusion-alignright', gridTimeLineContent = '', readMoreLinkAttributes = {}, contentSepAttr = {}, contentSepTypes = '', isThereMetaAbove = false, isThereMetaBelow = false, isThereContent = false; // Initialize the time stamps for timeline month/year check. if ( 'timeline' === values.layout ) { postCount = 1; prevPostMonth = null; prevPostYear = null; } // Combine meta info into one variable. this.metaInfoCombined = metaAll * ( metaAuthor + metaDate + metaCategories + mataTags + metaComments + metaLink ); metaInfoCombined = this.metaInfoCombined; // Create boolean that holds info whether content should be excerpted. isZeroExcerpt = ( 'yes' === values.excerpt && 1 > values.excerpt_words ) ? 1 : 0; metaInfoSettings.post_meta = metaAll; metaInfoSettings.post_meta_author = metaAuthor; metaInfoSettings.post_meta_date = metaDate; metaInfoSettings.post_meta_cats = metaCategories; metaInfoSettings.post_meta_tags = mataTags; metaInfoSettings.post_meta_comments = metaComments; metaInfoSettings.disable_date_rich_snippet_pages = extras.disable_date_rich_snippet_pages; isThereMetaAbove = metaInfoCombined * ( metaAuthor + metaDate + metaCategories + mataTags ); isThereMetaBelow = metaInfoCombined * ( metaComments || metaLink ); isThereContent = 'no' === values.excerpt || ( 'yes' === values.excerpt && ! isZeroExcerpt ); _.each( queryData.posts, function( post ) { var footerContent = '', metaFooterContent, borderColor; readMoreContent = ''; headerContent = ''; preTitleContent = ''; // Work out correct image size. imageSize = 'blog-large'; imageSize = ( ! FusionPageBuilderApp.$el.hasClass( 'has-sidebar' ) ) ? 'full' : 'blog-large'; imageSize = ( 'medium' === values.layout || 'medium-alternate' === values.layout ) ? 'blog-medium' : imageSize; imageSize = ( 'undefined' !== typeof post.slideshow.featured_image_height && 'undefined' !== typeof post.slideshow.featured_image_width && '' !== post.slideshow.featured_image_height && '' !== post.slideshow.featured_image_width && 'auto' !== post.slideshow.featured_image_height && 'auto' !== post.slideshow.featured_image_width ) ? 'full' : imageSize; imageSize = ( 'auto' === post.slideshow.featured_image_height || 'auto' === post.slideshow.featured_image_width ) ? 'full' : imageSize; imageSize = ( 'grid' === values.layout || 'timeline' === values.layout ) ? 'full' : imageSize; post.slideshow.image_size = imageSize; if ( 'timeline' === values.layout ) { dateValues = {}; dateValues.prev_post_month = prevPostMonth; dateValues.post_month = post.post_month; dateValues.prev_post_year = prevPostYear; dateValues.post_year = post.post_year; timelineDate = ''; if ( dateValues.prev_post_month != dateValues.post_month || dateValues.prev_post_year != dateValues.post_year ) { if ( 1 < postCount ) { timelineDate = '</div>'; } timelineDate += '<h3 class="fusion-timeline-date" style="background-color:' + values.grid_element_color + ';">' + post.timeline_date_format + '</h3>'; timelineDate += '<div class="fusion-collapse-month">'; } html += timelineDate; } // BlogShortcodeLoop Attributes. blogShortcodeLoop = {}; blogShortcodeLoop.id = 'post-' + post.id; blogShortcodeLoop[ 'class' ] = 'post fusion-post-' + values.layout; if ( 'masonry' === values.layout ) { if ( true !== post.slideshow.image_data.masonry_data.specific_element_orientation_class ) { post.slideshow.image_data.masonry_data.element_orientation_class = _.fusionGetElementOrientationClass( { imageWidth: post.slideshow.image_data.masonry_data.image_width, imageHeight: post.slideshow.image_data.masonry_data.image_height }, values.blog_masonry_grid_ratio, values.blog_masonry_width_double ); } post.slideshow.image_data.masonry_data.element_base_padding = _.fusionGetElementBasePadding( post.slideshow.image_data.masonry_data.element_orientation_class ); if ( 'fusion-element-landscape' !== post.slideshow.image_data.masonry_data.element_orientation_class ) { this.regularImagesFound = true; } // Additional grid class needed for masonry layout. blogShortcodeLoop[ 'class' ] += ' fusion-post-grid'; blogShortcodeLoop[ 'class' ] += ' ' + post.slideshow.image_data.masonry_data.element_orientation_class; } // Set the correct column class for every post. if ( 'timeline' === values.layout ) { timelineAlign = ' fusion-right-column'; if ( 0 < ( postCount % 2 ) ) { timelineAlign = ' fusion-left-column'; } blogShortcodeLoop[ 'class' ] += ' fusion-clearfix' + timelineAlign; blogShortcodeLoop.style = 'border-color:' + values.grid_element_color + ';'; } // Set the has-post-thumbnail if a video is used. This is needed if no featured image is present. if ( false !== post.post_video ) { blogShortcodeLoop[ 'class' ] += ' has-post-thumbnail'; } if ( false !== post.post_class ) { blogShortcodeLoop[ 'class' ] += post.post_class; } beforeLoopAction = '<article ' + _.fusionGetAttributes( blogShortcodeLoop ) + '>\n'; html += beforeLoopAction; blogFusionPostWrapper = { class: 'fusion-post-wrapper', style: '' }; if ( 'masonry' === values.layout ) { color = jQuery.AWB_Color( values.grid_box_color ); colorCSS = color.toRgbaString(); if ( 0 === color.alpha() ) { colorCSS = color.toHexString(); } if ( 0 === color.alpha() || 'transparent' === values.grid_element_color ) { blogFusionPostWrapper[ 'class' ] += ' fusion-masonary-is-transparent '; blogFusionPostWrapper.style += 'border:none;'; } else { blogFusionPostWrapper.style += 'border:1px solid ' + values.grid_element_color + ';border-bottom-width:3px;'; } blogFusionPostWrapper.style += 'background-color:' + colorCSS + ';'; blogFusionPostWrapper.style += 'border-color:' + values.grid_element_color + ';'; } else if ( 'grid' === values.layout ) { color = jQuery.AWB_Color( values.grid_box_color ); colorCSS = color.toRgbaString(); borderColor = jQuery.AWB_Color( values.grid_element_color ); if ( 0 === borderColor.alpha() || 'transparent' === values.grid_element_color ) { blogFusionPostWrapper.style += 'border:none;'; } else { blogFusionPostWrapper.style += 'border:1px solid ' + values.grid_element_color + ';border-bottom-width:3px;'; } blogFusionPostWrapper.style += 'background-color:' + colorCSS + ';'; blogFusionPostWrapper.style += 'border-color:' + values.grid_element_color + ';'; } else if ( 'timeline' === values.layout ) { color = jQuery.AWB_Color( values.grid_box_color ); colorCSS = color.toRgbaString(); blogFusionPostWrapper.style = 'background-color:' + colorCSS + ';'; } if ( 'grid' === values.layout || 'timeline' === values.layout || 'masonry' === values.layout ) { html += '<div ' + _.fusionGetAttributes( blogFusionPostWrapper ) + '>'; } if ( thumbnail && 'medium-alternate' !== values.layout ) { if ( 'masonry' !== values.layout ) { preTitleContent = _.fusionGetBlogSlideshow( post.slideshow ); } else { post.slideshow.image_data.layout = values.layout; post.slideshow.image_data.masonry_data.blog_grid_column_spacing = parseFloat( values.blog_grid_column_spacing ); preTitleContent = _.fusionFeaturedImage( post.slideshow.image_data ); } } if ( 'medium-alternate' === values.layout || 'large-alternate' === values.layout ) { preTitleContent += '<div class="fusion-date-and-formats">'; dateAndFormat = '<div class="fusion-date-box updated">'; dateAndFormat += '<span class="fusion-date">' + post.alternate_date_format_day + '</span>'; dateAndFormat += '<span class="fusion-month-year">' + post.alternate_date_format_month_year + '</span>'; dateAndFormat += '</div>'; switch ( post.format ) { case 'gallery': formatClass = 'images'; break; case 'link': formatClass = 'link'; break; case 'image': formatClass = 'image'; break; case 'quote': formatClass = 'quotes-left'; break; case 'video': formatClass = 'film'; break; case 'audio': formatClass = 'headphones'; break; case 'chat': formatClass = 'bubbles'; break; default: formatClass = 'pen'; break; } dateAndFormat += '<div class="fusion-format-box">'; dateAndFormat += '<i class="awb-icon-' + formatClass + '" aria-hidden="true"></i>'; dateAndFormat += '</div>'; preTitleContent += dateAndFormat; preTitleContent += '</div>'; if ( thumbnail && 'medium-alternate' === values.layout ) { preTitleContent += _.fusionGetBlogSlideshow( post.slideshow ); } if ( metaAll ) { metaData = _.fusionRenderPostMetadata( 'alternate', metaInfoSettings, post.meta_data ); } } if ( 'grid' === values.layout || 'timeline' === values.layout || 'masonry' === values.layout ) { if ( 'masonry' !== values.layout && ( ( showTitle && isThereMetaAbove && ( isThereContent || isThereMetaBelow ) ) || ( showTitle && ! isThereMetaAbove && isThereMetaBelow ) ) ) { contentSepAttr = { class: 'fusion-content-sep' }; contentSepTypes = values.grid_separator_style_type; contentSepTypes = contentSepTypes.split( '|' ); jQuery.each( contentSepTypes, function( index, type ) { contentSepAttr[ 'class' ] += ' sep-' + type; } ); contentSepAttr.style = 'border-color:' + values.grid_separator_color; contentSep = '<div ' + _.fusionGetAttributes( contentSepAttr ) + '></div>'; } if ( metaAll ) { metaData = _.fusionRenderPostMetadata( 'grid_timeline', metaInfoSettings, post.meta_data ); } blogShortcodePostContentWrapper[ 'class' ] = 'fusion-post-content-wrapper'; if ( 'masonry' === values.layout ) { blogShortcodePostContentWrapper.style = 'background-color:inherit;'; blogShortcodePostContentWrapper.style += 'padding: ' + values.padding + ';'; if ( ! metaInfoCombined && isZeroExcerpt && ! showTitle ) { blogShortcodePostContentWrapper.style += ' display:none;'; } } else if ( 'grid' === values.layout ) { blogShortcodePostContentWrapper.style = 'background-color:inherit;'; blogShortcodePostContentWrapper.style += 'padding: ' + values.padding + ';'; if ( ! metaInfoCombined && ! showTitle && ( isZeroExcerpt || 'hide' === values.excerpt ) ) { blogShortcodePostContentWrapper.style += ' display:none;'; } } preTitleContent += '<div ' + _.fusionGetAttributes( blogShortcodePostContentWrapper ) + '>'; } preTitleContent += '<div class="fusion-post-content post-content">'; if ( showTitle ) { if ( titleLink ) { linkIconTarget = post.link_icon_target; postLinksTarget = post.post_links_target; if ( 'yes' === linkIconTarget || 'yes' === postLinksTarget ) { linkTarget = ' target="_blank" rel="noopener noreferrer"'; } link = '<a href="' + post.permalink + '"' + linkTarget + '>' + post.title + '</a>'; } else { link = post.title; } } if ( 'timeline' === values.layout ) { preTitleContent += '<div class="fusion-timeline-circle" style="background-color:' + values.grid_element_color + ';"></div>'; preTitleContent += '<div class="fusion-timeline-arrow" style="color:' + values.grid_element_color + ';"></div>'; } blogShortcodePostTitle[ 'class' ] = 'blog-shortcode-post-title'; if ( extras.disable_date_rich_snippet_pages ) { blogShortcodePostTitle[ 'class' ] += ' entry-title'; } headerContent = preTitleContent + '<h2 ' + _.fusionGetAttributes( blogShortcodePostTitle ) + '>' + link + '</h2>' + metaData + contentSep; html += headerContent; if ( 'hide' !== values.excerpt ) { if ( post.content.has_custom_excerpt ) { content = _.fusionGetFixedContent( post.content, values.excerpt, Number.MAX_SAFE_INTEGER, stripHTML ); } else { content = _.fusionGetFixedContent( post.content, values.excerpt, values.excerpt_words, stripHTML ); } } html += '<div class="fusion-post-content-container">' + content + '</div>'; if ( metaLink ) { if ( values.meta_read ) { readMoreWrapperClass = 'fusion-alignright'; if ( 'grid' === values.layout || 'timeline' === values.layout || 'masonry' === values.layout ) { readMoreWrapperClass = 'fusion-alignleft'; } linkIconTarget = post.link_icon_target; postLinksTarget = post.post_links_target; if ( 'yes' === linkIconTarget || 'yes' === postLinksTarget ) { readMoreLinkAttributes.target = '_blank'; readMoreLinkAttributes.rel = 'noopener noreferrer'; } readMoreLinkAttributes.href = post.permalink; readMoreContent += '<div class="' + readMoreWrapperClass + '">'; readMoreContent += '<a ' + _.fusionGetAttributes( readMoreLinkAttributes ) + '>'; readMoreContent += '<span class="fusion-read-more">' + extras.read_more_text + '</span>'; readMoreContent += '</a>'; readMoreContent += '</div>'; if ( 'large-alternate' === values.layout || 'medium-alternate' === values.layout ) { readMoreContent = '<div class="fusion-meta-info">' + readMoreContent + '</div>'; } } } if ( metaComments ) { gridTimeLineContent = '<div class="fusion-alignright">' + post.timeline_comments + '</div>'; } if ( 'grid' === values.layout || 'timeline' === values.layout || 'masonry' === values.layout ) { footerContent += '</div>'; if ( 0 < metaInfoCombined ) { metaFooterContent = readMoreContent; metaFooterContent += gridTimeLineContent; footerContent += '<div class="fusion-meta-info">' + metaFooterContent + '</div>'; } } footerContent += '</div>'; footerContent += '<div class="fusion-clearfix"></div>'; if ( 0 < metaInfoCombined && -1 !== jQuery.inArray( values.layout, [ 'large', 'medium' ] ) ) { footerContent += '<div class="fusion-meta-info">' + _.fusionRenderPostMetadata( 'standard', metaInfoSettings, post.meta_data ) + readMoreContent + '</div>'; } if ( metaAll && -1 !== jQuery.inArray( values.layout, [ 'large-alternate', 'medium-alternate' ] ) ) { footerContent += readMoreContent; } html += footerContent; if ( 'grid' === values.layout || 'timeline' === values.layout || 'masonry' === values.layout ) { html += '</div>\n'; html += '</article>\n'; } else { html += '</article>\n'; } if ( 'timeline' === values.layout ) { prevPostMonth = post.post_month; prevPostYear = post.post_year; postCount++; values.post_count++; } } ); return html; }, /** * Build the styles. * * @since 2.0 * @param {Object} values - The values object. * @return {string} */ buildStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ); styles += '.fusion-blog-shortcode-cid' + cid + ' .fusion-blog-layout-grid .fusion-post-grid{padding:' + ( parseFloat( values.blog_grid_column_spacing ) / 2 ) + 'px;}'; styles += '.fusion-blog-shortcode-cid' + cid + ' .fusion-posts-container{margin-left: -' + ( parseFloat( values.blog_grid_column_spacing ) / 2 ) + 'px !important; margin-right:-' + ( parseFloat( values.blog_grid_column_spacing ) / 2 ) + 'px !important;}'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Lightbox View. FusionPageBuilder.fusion_lightbox = FusionPageBuilder.ElementView.extend( { /** * Runs on render. * * @since 2.0 * @return {void} */ onRender: function() { this.afterPatch(); }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var item = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '[data-rel="iLightbox"]' ) ); if ( 'object' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox ) { if ( 'undefined' !== typeof this.iLightbox ) { this.iLightbox.destroy(); } if ( item.length ) { this.iLightbox = item.iLightBox( jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaLightBox.prepare_options( 'single' ) ); } } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { // Create attribute objects. atts.name = atts.params.alt_text; atts.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; atts.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; atts.attr = this.buildAttr( atts.params ); atts.imgAttr = this.buildImgAttr( atts.params ); atts.values = atts.params; return atts; }, /** * Builds attributes. * * @since 3.5 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { // Main wrapper attributes var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'awb-lightbox awb-lightbox-' + this.model.get( 'cid' ), style: '' } ); if ( values.title ) { attr.title = attr[ 'data-title' ] = values.title; // eslint-disable-line no-multi-assign } if ( 'undefined' !== typeof values.type && 'video' === values.type ) { attr.href = values.video_url; } else if ( 'link' === values.type ) { attr.href = values.link_url; } else { attr.href = values.full_image; } if ( values.description ) { attr[ 'data-caption' ] = values.description; } if ( attr.href ) { attr[ 'data-rel' ] = 'iLightbox'; } if ( 'undefined' !== typeof values[ 'class' ] && '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'undefined' !== typeof values.id && '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds image attributes. * * @since 3.5 * @param {Object} values - The values object. * @return {Object} */ buildImgAttr: function( values ) { var attr = {}; if ( values.thumbnail_image ) { attr.src = values.thumbnail_image; } if ( values.alt_text ) { attr.alt = values.alt_text; } return attr; } } ); } ); }( jQuery ) ); ;/* global FusionEvents, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.fusion_widget = FusionPageBuilder.ElementView.extend( { onInit: function() { this.contentView = false; this.listenTo( FusionEvents, 'fusion-widget-rendered', this.removeLoadingOverlay ); this.deprecatedParams(); }, sanitizeValue: function( param, value ) { // HTML and Text widget especial escape. if ( 'wp_widget_custom_html__content' === param || 'wp_widget_text__text' === param ) { return _.escape( value ); } return value; }, onRender: function() { this.renderWidgetContent(); }, /** * Removes loading overlay * * @since 2.0.0 * @return {void} */ removeLoadingOverlay: function() { var contentType = 'element', $elementContent; if ( _.isObject( this.model.attributes ) ) { if ( 'fusion_builder_container' === this.model.attributes.element_type ) { contentType = 'container'; } else if ( 'fusion_builder_column' === this.model.attributes.element_type ) { contentType = 'columns'; } } $elementContent = this.$el.find( '.fusion-builder-' + contentType + '-content' ); $elementContent.removeClass( 'fusion-loader' ); $elementContent.find( '.fusion-builder-loader' ).remove(); }, beforeRemove: function() { if ( this.contentView ) { this.contentView.removeElement(); } }, renderWidgetContent: function() { var view, viewSettings = { model: this.model }, widgetType = this.model.attributes.params.type; if ( ! this.model.get( 'params' ).type ) { return; } if ( this.contentView ) { this.$el.find( '.fusion-widget-content' ).html( this.contentView.render().el ); } else { if ( 'undefined' !== typeof FusionPageBuilder[ widgetType ] ) { view = new FusionPageBuilder[ widgetType ]( viewSettings ); } else { view = new FusionPageBuilder.fusion_widget_content( viewSettings ); } this.contentView = view; this.$el.find( '.fusion-widget-content' ).html( view.render().el ); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyles( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; attributes.placeholder = this.getWidgetPlaceholder(); return attributes; }, /** * Get widget placeholder. * * @since 2.0.0 * @return {string} */ getWidgetPlaceholder: function() { var placeholder = jQuery( this.getPlaceholder() ).append( '<span class="fusion-tb-source-separator"> - </span><br/><span>' + fusionBuilderText.select_widget + '</span>' ); return placeholder[ 0 ].outerHTML; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-widget fusion-widget-element fusion-widget-area fusion-content-widget-area widget fusion-live-widget fusion-widget-cid' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } if ( values.fusion_align ) { attr[ 'class' ] += ' fusion-widget-align-' + values.fusion_align; } if ( values.fusion_align_mobile ) { attr[ 'class' ] += ' fusion-widget-mobile-align-' + values.fusion_align_mobile; } return attr; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildStyles: function( values ) { var styles = '', cid = this.model.get( 'cid' ); styles = '<style type="text/css">'; styles += '.fusion-widget.fusion-widget-cid' + cid + '{'; styles += 'background-color:' + values.fusion_bg_color + ';'; if ( 'undefined' !== typeof values.fusion_padding_color ) { styles += 'padding:' + _.fusionCheckValue( values.fusion_padding_color ) + ';'; } if ( 'undefined' !== typeof values.fusion_bg_radius_size ) { styles += 'border-radius:' + _.fusionCheckValue( values.fusion_bg_radius_size ) + ';'; } if ( 'undefined' !== typeof values.fusion_margin ) { styles += 'margin:' + _.fusionCheckValue( values.fusion_margin ) + ';'; } styles += 'border-color:' + values.fusion_border_color + ';'; styles += 'border-width:' + _.fusionValidateAttrValue( values.fusion_border_size, 'px' ) + ';'; if ( '' !== values.fusion_border_size ) { styles += 'border-style:' + values.fusion_border_style + ';'; } styles += '}'; if ( 'no' === values.fusion_display_title ) { styles += '.fusion-widget.fusion-widget-cid' + cid + ' .widget-title{display:none;}'; } if ( 'undefined' !== typeof values.fusion_divider_color && '' !== values.fusion_divider_color ) { styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' li { border-color:' + values.fusion_divider_color + ';}'; if ( 'WP_Widget_Tag_Cloud' === values.type ) { styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' .tagcloud a { border-color:' + values.fusion_divider_color + ';}'; } else if ( 'Fusion_Widget_Menu' === values.type ) { styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' .fusion-widget-menu ul li a:after { color:' + values.fusion_divider_color + ';}'; } } // Special handling for vertical menu widget, to take into account the deprecated border_color option. if ( 'Fusion_Widget_Vertical_Menu' === values.type ) { if ( 'undefined' !== typeof values.border_color && 'undefined' === typeof values.fusion_divider_color ) { values.fusion_divider_color = values.border_color; } if ( '' !== values.fusion_divider_color ) { styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' .menu { border-right-color:' + values.fusion_divider_color + ' !important; border-top-color:' + values.fusion_divider_color + ' !important;}'; styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' .menu li a { border-bottom-color:' + values.fusion_divider_color + ' !important; }'; styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' .right .menu { border-left-color:' + values.fusion_divider_color + ' !important; }'; } else { styles += '#wrapper .fusion-widget.fusion-widget-cid' + cid + ' > ul.menu { margin-top: -8px; }'; } } styles += '</style>'; return styles; }, /** * Filter out DOM before patching. * * @since 2.0.0 * @return {void} */ patcherFilter: function( diff ) { var filteredDiff = []; _.each( diff, function( info ) { if ( 'replaceElement' === info.action ) { if ( 'undefined' !== typeof info.oldValue.attributes && -1 !== info.oldValue.attributes[ 'class' ].indexOf( 'fusion-widget-content-view' ) ) { // Ignore. } else { filteredDiff.push( info ); } } else if ( 'addElement' === info.action ) { if ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-widget-content-view' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-widget' ) ) { // Ignore. } else { filteredDiff.push( info ); } } else if ( 'removeElement' === info.action ) { if ( -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-widget-content' ) || -1 !== info.element.attributes[ 'class' ].indexOf( 'fusion-widget' ) ) { // Ignore. } else { filteredDiff.push( info ); } } else { filteredDiff.push( info ); } } ); return filteredDiff; }, deprecatedParams: function() { var params = this.model.get( 'params' ); // Ensures backwards compatibility for the border_color option of the vertical menu. if ( 'Fusion_Widget_Vertical_Menu' === params.type && 'undefined' === typeof params.fusion_divider_color ) { params.fusion_divider_color = params.fusion_widget_vertical_menu__border_color; delete params.fusion_widget_vertical_menu__border_color; } this.model.set( 'params', params ); } } ); _.extend( FusionPageBuilder.Callback.prototype, { fusion_get_widget_markup: function( name, value, modelData, args, cid, action, model, view ) { view.changeParam( name, value ); view.contentView.getHTML( view ); }, fusion_widget_changed: function( name, value, args, view ) { view.changeParam( name, value ); view.model.attributes.markup = ''; FusionEvents.trigger( 'fusion-widget-changed' ); view.render(); view.addLoadingOverlay(); // prevent another re-render return { render: false }; } } ); } ); }() ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Notices Component View. FusionPageBuilder.fusion_tb_woo_notices = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-notices-tb fusion-woo-notices-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.alignment ) { attr[ 'class' ] += ' alignment-text-' + values.alignment; } if ( '' !== values.show_button ) { attr[ 'class' ] += ' show-button-' + values.show_button; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-notices-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_notices ) { output = atts.query_data.woo_notices; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, selectors, selectorMessage, selectorError, selectorNotices; this.baseSelector = '.fusion-woo-notices-tb.fusion-woo-notices-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectorMessage = [ this.baseSelector + ' .woocommerce-info', this.baseSelector + ' .woocommerce-message' ]; selectorError = [ this.baseSelector + ' .woocommerce-error li' ]; selectorNotices = _.union( selectorMessage, selectorError ); // Margin styles. if ( ! this.isDefault( 'margin_top' ) ) { this.addCssProperty( selectorNotices, 'margin-top', _.fusionGetValueWithUnit( values.margin_top ) ); } if ( ! this.isDefault( 'margin_right' ) ) { this.addCssProperty( selectorNotices, 'margin-right', _.fusionGetValueWithUnit( values.margin_right ) ); } if ( ! this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( selectorNotices, 'margin-bottom', _.fusionGetValueWithUnit( values.margin_bottom ) ); } if ( ! this.isDefault( 'margin_left' ) ) { this.addCssProperty( selectorNotices, 'margin-left', _.fusionGetValueWithUnit( values.margin_left ) ); } // Padding styles. if ( ! this.isDefault( 'padding_top' ) ) { this.addCssProperty( selectorNotices, 'padding-top', _.fusionGetValueWithUnit( values.padding_top ) ); } if ( ! this.isDefault( 'padding_right' ) ) { this.addCssProperty( selectorNotices, 'padding-right', _.fusionGetValueWithUnit( values.padding_right ) ); } if ( ! this.isDefault( 'padding_bottom' ) ) { this.addCssProperty( selectorNotices, 'padding-bottom', _.fusionGetValueWithUnit( values.padding_bottom ) ); } if ( ! this.isDefault( 'padding_left' ) ) { this.addCssProperty( selectorNotices, 'padding-left', _.fusionGetValueWithUnit( values.padding_left ) ); } if ( ! this.isDefault( 'font_size' ) ) { this.addCssProperty( selectorNotices, 'font-size', values.font_size ); } if ( ! this.isDefault( 'font_color' ) ) { this.addCssProperty( selectorNotices, 'color', values.font_color ); } // Border styles. if ( ! this.isDefault( 'border_sizes_top' ) ) { this.addCssProperty( selectorNotices, 'border-top-width', _.fusionGetValueWithUnit( values.border_sizes_top ) ); } if ( ! this.isDefault( 'border_sizes_right' ) ) { this.addCssProperty( selectorNotices, 'border-right-width', _.fusionGetValueWithUnit( values.border_sizes_right ) ); } if ( ! this.isDefault( 'border_sizes_bottom' ) ) { this.addCssProperty( selectorNotices, 'border-bottom-width', _.fusionGetValueWithUnit( values.border_sizes_bottom ) ); } if ( ! this.isDefault( 'border_sizes_left' ) ) { this.addCssProperty( selectorNotices, 'border-left-width', _.fusionGetValueWithUnit( values.border_sizes_left ) ); } if ( ! this.isDefault( 'border_radius_top_left' ) ) { this.addCssProperty( selectorNotices, 'border-top-left-radius', _.fusionGetValueWithUnit( values.border_radius_top_left ) ); } if ( ! this.isDefault( 'border_radius_top_right' ) ) { this.addCssProperty( selectorNotices, 'border-top-right-radius', _.fusionGetValueWithUnit( values.border_radius_top_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_right' ) ) { this.addCssProperty( selectorNotices, 'border-bottom-right-radius', _.fusionGetValueWithUnit( values.border_radius_bottom_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_left' ) ) { this.addCssProperty( selectorNotices, 'border-bottom-left-radius', _.fusionGetValueWithUnit( values.border_radius_bottom_left ) ); } if ( ! this.isDefault( 'border_style' ) ) { this.addCssProperty( selectorNotices, 'border-style', values.border_style ); } if ( ! this.isDefault( 'border_color' ) ) { this.addCssProperty( selectorNotices, 'border-color', values.border_color ); } if ( ! this.isDefault( 'background_color' ) ) { this.addCssProperty( selectorNotices, 'background-color', values.background_color ); } // Icon styles. selectors = [ this.baseSelector + ' .woocommerce-info .fusion-woo-notices-tb-icon', this.baseSelector + ' .woocommerce-message .fusion-woo-notices-tb-icon', this.baseSelector + ' .woocommerce-error .fusion-woo-notices-tb-icon' ]; if ( ! this.isDefault( 'icon_size' ) ) { this.addCssProperty( selectors, 'font-size', values.icon_size + 'px' ); } if ( ! this.isDefault( 'icon_color' ) ) { this.addCssProperty( selectors, 'color', values.icon_color ); } // Link & Hover styles. selectors = [ this.baseSelector + ' .woocommerce-info .wc-forward', this.baseSelector + ' .woocommerce-message .wc-forward', this.baseSelector + ' .woocommerce-error .wc-forward' ]; if ( ! this.isDefault( 'link_color' ) ) { this.addCssProperty( selectors, 'color', values.link_color ); } selectors = [ this.baseSelector + ' .woocommerce-info .wc-forward:hover', this.baseSelector + ' .woocommerce-message .wc-forward:hover', this.baseSelector + ' .woocommerce-error .wc-forward:hover' ]; if ( ! this.isDefault( 'link_hover_color' ) ) { this.addCssProperty( selectors, 'color', values.link_hover_color ); } // Success styles. selectors = [ this.baseSelector + ' .woocommerce-message' ]; if ( ! this.isDefault( 'success_border_color' ) ) { this.addCssProperty( selectors, 'border-color', values.success_border_color ); } if ( ! this.isDefault( 'success_background_color' ) ) { this.addCssProperty( selectors, 'background-color', values.success_background_color ); } if ( ! this.isDefault( 'success_text_color' ) ) { this.addCssProperty( selectors, 'color', values.success_text_color ); } selectors = [ this.baseSelector + ' .woocommerce-message .fusion-woo-notices-tb-icon' ]; if ( ! this.isDefault( 'success_icon_color' ) ) { this.addCssProperty( selectors, 'color', values.success_icon_color ); } // Success Link & Hover styles. selectors = [ this.baseSelector + ' .woocommerce-message .wc-forward' ]; if ( ! this.isDefault( 'success_link_color' ) ) { this.addCssProperty( selectors, 'color', values.success_link_color ); } selectors = [ this.baseSelector + ' .woocommerce-message .wc-forward:hover' ]; if ( ! this.isDefault( 'success_link_hover_color' ) ) { this.addCssProperty( selectors, 'color', values.success_link_hover_color ); } // Error styles. if ( ! this.isDefault( 'error_border_color' ) ) { this.addCssProperty( selectorError, 'border-color', values.error_border_color ); } if ( ! this.isDefault( 'error_background_color' ) ) { this.addCssProperty( selectorError, 'background-color', values.error_background_color ); } if ( ! this.isDefault( 'error_text_color' ) ) { this.addCssProperty( selectorError, 'color', values.error_text_color ); } selectors = [ this.baseSelector + ' .woocommerce-error .fusion-woo-notices-tb-icon' ]; if ( ! this.isDefault( 'error_icon_color' ) ) { this.addCssProperty( selectors, 'color', values.error_icon_color ); } // Error Link & Hover styles. selectors = [ this.baseSelector + ' .woocommerce-error .wc-forward' ]; if ( ! this.isDefault( 'error_link_color' ) ) { this.addCssProperty( selectors, 'color', values.error_link_color ); } selectors = [ this.baseSelector + ' .woocommerce-error .wc-forward:hover' ]; if ( ! this.isDefault( 'error_link_hover_color' ) ) { this.addCssProperty( selectors, 'color', values.error_link_hover_color ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Billing Component View. FusionPageBuilder.fusion_tb_woo_checkout_billing = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @return null */ onRender: function() { if ( ! jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'woocommerce' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'woocommerce' ); } }, /** * Runs just before view is removed. * * @since 3.3 * @return null */ beforeRemove: function() { var self = this, removeClass = true; _.find( FusionPageBuilderApp.collection.models, function( element ) { if ( self.model.cid !== element.get( 'cid' ) && 'undefined' !== typeof element.get( 'element_type' ) && -1 !== element.get( 'element_type' ).indexOf( 'fusion_tb_woo_checkout' ) ) { removeClass = false; // Break. return true; } } ); if ( true === removeClass ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'woocommerce' ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-checkout-billing-tb fusion-woo-checkout-billing-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-checkout-billing-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_checkout_billing ) { output = atts.query_data.woo_checkout_billing; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var inputs, hoverColor, placeholderColor, placeHolderInputs, hoverInputs, focusInputs, css; this.baseSelector = '.fusion-woo-checkout-billing-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; inputs = [ this.baseSelector + ' input', this.baseSelector + ' select', this.baseSelector + ' textarea' ]; if ( ! this.isDefault( 'field_bg_color' ) ) { this.addCssProperty( inputs, 'background-color', this.values.field_bg_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'background-color', this.values.field_bg_color, true ); } if ( ! this.isDefault( 'field_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.values.field_text_color ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( inputs, 'color', this.values.field_text_color, true ); placeHolderInputs = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder' ]; this.addCssProperty( placeHolderInputs, 'color', placeholderColor ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_text_color, true ); } if ( ! this.isDefault( 'field_border_color' ) ) { this.addCssProperty( inputs, 'border-color', this.values.field_border_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'border-color', this.values.field_border_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_border_color, true ); } if ( ! this.isDefault( 'field_border_focus_color' ) ) { hoverColor = jQuery.AWB_Color( this.values.field_border_focus_color ).alpha( 0.5 ).toRgbaString(); hoverInputs = [ this.baseSelector + ' input:hover', this.baseSelector + ' select:hover', this.baseSelector + ' textarea:hover' ]; this.addCssProperty( hoverInputs, 'border-color', hoverColor, true ); focusInputs = [ this.baseSelector + ' input:focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus' ]; this.addCssProperty( focusInputs, 'border-color', this.values.field_border_focus_color, true ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'border-color', hoverColor, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'color', hoverColor, true ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ /* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Billing Component View. FusionPageBuilder.fusion_tb_woo_checkout_tabs = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @return null */ onRender: function() { if ( ! jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'woocommerce' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'woocommerce' ); } }, /** * Runs just before view is removed. * * @since 3.3 * @return null */ beforeRemove: function() { var self = this, removeClass = true; _.find( FusionPageBuilderApp.collection.models, function( element ) { if ( self.model.cid !== element.cid && -1 !== element.attributes.element_type.indexOf( 'fusion_tb_woo_checkout' ) ) { removeClass = false; // Break. return true; } } ); if ( true === removeClass ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'woocommerce' ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.output = this.buildOutput( atts ); attributes.styles = this.buildStyleBlock(); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-checkout-tabs-tb fusion-woo-checkout-tabs-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'horizontal' === values.layout ) { attr[ 'class' ] += ' woo-tabs-horizontal'; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-checkout-tabs-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_checkout_tabs ) { output = atts.query_data.woo_checkout_tabs; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var self = this, sides, margin_name, content_padding_name, nav_padding_name, text_styles, rule, value, title_selectors, inputs, placeholderColor, placeHolderInputs, hoverColor, hoverInputs, focusInputs, selector, css; this.baseSelector = '.fusion-woo-checkout-tabs-tb.fusion-woo-checkout-tabs-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; sides = [ 'top', 'right', 'bottom', 'left' ]; // Margins. jQuery.each( sides, function( index, side ) { // Element margin. margin_name = 'margin_' + side; if ( '' !== self.values[ margin_name ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( self.values[ margin_name ] ) ); } } ); // Paddings. jQuery.each( sides, function( index, side ) { content_padding_name = 'content_padding_' + side; nav_padding_name = 'nav_padding_' + side; // Add content padding to style. if ( '' !== self.values[ content_padding_name ] ) { self.addCssProperty( self.baseSelector + ' .avada-checkout', 'padding-' + side, _.fusionGetValueWithUnit( self.values[ content_padding_name ] ) ); } if ( '' !== self.values[ nav_padding_name ] ) { self.addCssProperty( self.baseSelector + ' .woocommerce-checkout-nav > li > a', 'padding-' + side, _.fusionGetValueWithUnit( self.values[ nav_padding_name ] ) ); } } ); if ( 'vertical' === this.values.layout && ! this.isDefault( 'nav_content_space' ) ) { this.addCssProperty( this.baseSelector + ' .avada-checkout', 'margin-left', 'calc(220px + ' + _.fusionGetValueWithUnit( this.values.nav_content_space ) + ')' ); } if ( !this.isDefault( 'backgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li.is-active > a', 'background-color', this.values.backgroundcolor ); this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li > a:hover', 'background-color', this.values.backgroundcolor ); this.addCssProperty( this.baseSelector + ' .avada-checkout', 'background-color', this.values.backgroundcolor ); } if ( !this.isDefault( 'inactivebackgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li > a', 'background-color', this.values.inactivebackgroundcolor ); } if ( !this.isDefault( 'active_nav_text_color' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li.is-active > a', 'color', this.values.active_nav_text_color ); this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li.is-active > a:after', 'color', this.values.active_nav_text_color ); this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li > a:hover', 'color', this.values.active_nav_text_color ); } if ( !this.isDefault( 'inactive_nav_text_color' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav > li > a', 'color', this.values.inactive_nav_text_color ); } if ( !this.isDefault( 'bordercolor' ) ) { if ( 'horizontal' === this.values.layout ) { this.addCssProperty( this.baseSelector + '.woo-tabs-horizontal > .woocommerce-checkout-nav .is-active', 'border-color', this.values.bordercolor ); } else { this.addCssProperty( this.baseSelector + ' .woocommerce-checkout-nav li a', 'border-color', this.values.bordercolor ); } this.addCssProperty( this.baseSelector + ' .avada-checkout', 'border-color', this.values.bordercolor ); this.addCssProperty( this.baseSelector + ' .avada-checkout .shop_table tr', 'border-color', this.values.bordercolor ); this.addCssProperty( this.baseSelector + ' .avada-checkout .shop_table tfoot', 'border-color', this.values.bordercolor ); } if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector + ' .avada-checkout', 'color', this.values.text_color ); this.addCssProperty( this.baseSelector + ' .avada-checkout .shop_table tfoot .order-total .amount', 'color', this.values.text_color ); this.addCssProperty( this.baseSelector + ' .avada-checkout .shop_table tfoot .order-total .amount', 'font-weight', '700' ); } if ( !this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .avada-checkout', 'font-size', _.fusionGetValueWithUnit( this.values.text_font_size ) ); } text_styles = _.fusionGetFontStyle( 'text_font', this.values, 'object' ); for ( rule in text_styles ) { // eslint-disable-line guard-for-in var value = text_styles[ rule ]; // eslint-disable-line this.addCssProperty( this.baseSelector + ' .avada-checkout', rule, value ); // eslint-disable-line block-scoped-var } // Link color. if ( !this.isDefault( 'link_color' ) ) { self.addCssProperty( this.baseSelector + ' a:not(.fusion-button)', 'color', this.values.link_color ); } // Link hover color. if ( !this.isDefault( 'link_hover_color' ) ) { self.addCssProperty( this.baseSelector + ' a:not(.fusion-button):hover', 'color', this.values.link_hover_color ); } // Title styles. title_selectors = [ this.baseSelector + ' .avada-checkout h3' ]; if ( !this.isDefault( 'title_color' ) ) { this.addCssProperty( title_selectors, 'color', this.values.title_color ); } if ( !this.isDefault( 'title_font_size' ) ) { this.addCssProperty( title_selectors, 'font-size', _.fusionGetValueWithUnit( this.values.title_font_size ) ); } text_styles = _.fusionGetFontStyle( 'title_font', this.values, 'object' ); for ( rule in text_styles ) { // eslint-disable-line guard-for-in var value = text_styles[ rule ]; // eslint-disable-line this.addCssProperty( title_selectors, rule, value ); // eslint-disable-line block-scoped-var } inputs = [ this.baseSelector + ' input', this.baseSelector + ' select', this.baseSelector + ' textarea' ]; if ( ! this.isDefault( 'field_bg_color' ) ) { this.addCssProperty( inputs, 'background-color', this.values.field_bg_color ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'background-color', this.values.field_bg_color, true ); } if ( ! this.isDefault( 'field_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.values.field_text_color ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( inputs, 'color', this.values.field_text_color ); // Select 2. this.addCssProperty( this.baseSelector + ' .select2-container--default .select2-selection--single .select2-selection__rendered', 'color', this.values.field_text_color ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_text_color, true ); placeHolderInputs = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder' ]; this.addCssProperty( placeHolderInputs, 'color', placeholderColor ); } if ( ! this.isDefault( 'field_border_color' ) ) { this.addCssProperty( inputs, 'border-color', this.values.field_border_color ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'border-color', this.values.field_border_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_border_color, true ); } if ( ! this.isDefault( 'field_border_focus_color' ) ) { hoverColor = jQuery.AWB_Color( this.values.field_border_focus_color ).alpha( 0.5 ).toRgbaString(); hoverInputs = [ this.baseSelector + ' input:hover', this.baseSelector + ' select:hover', this.baseSelector + ' textarea:hover' ]; this.addCssProperty( hoverInputs, 'border-color', hoverColor ); focusInputs = [ this.baseSelector + ' input:focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus' ]; this.addCssProperty( focusInputs, 'border-color', this.values.field_border_focus_color ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'border-color', hoverColor, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'color', hoverColor, true ); } selector = this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li label'; if ( !this.isDefault( 'payment_label_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.payment_label_padding_top ); } if ( !this.isDefault( 'payment_label_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.payment_label_padding_bottom ); } if ( !this.isDefault( 'payment_label_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', 'max(2.5em,' + this.values.payment_label_padding_left + ')' ); } if ( !this.isDefault( 'payment_label_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.payment_label_padding_right ); } if ( !this.isDefault( 'payment_label_bg_color' ) ) { this.addCssProperty( selector, 'background', this.values.payment_label_bg_color ); } if ( !this.isDefault( 'payment_label_color' ) ) { this.addCssProperty( selector, 'color', this.values.payment_label_color ); } if ( !this.isDefault( 'payment_label_hover_color' ) ) { this.addCssProperty( selector + ':hover', 'color', this.values.payment_label_hover_color ); this.addCssProperty( this.baseSelector + ' ul li input:checked+label', 'color', this.values.payment_label_hover_color ); } selector = this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li:hover label'; if ( !this.isDefault( 'payment_label_bg_hover_color' ) ) { this.addCssProperty( selector, 'background', this.values.payment_label_bg_hover_color ); } selector = [ this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li .payment_box', this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li.woocommerce-notice' ]; if ( !this.isDefault( 'payment_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.payment_padding_top ); } if ( !this.isDefault( 'payment_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.payment_padding_bottom ); } if ( !this.isDefault( 'payment_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.payment_padding_left ); } if ( !this.isDefault( 'payment_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.payment_padding_right ); } if ( !this.isDefault( 'payment_box_bg' ) ) { this.addCssProperty( selector, 'background', this.values.payment_box_bg ); } if ( !this.isDefault( 'payment_color' ) ) { this.addCssProperty( selector, 'color', this.values.payment_color ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Shipping Component View. FusionPageBuilder.fusion_tb_woo_checkout_shipping = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @return null */ onRender: function() { if ( ! jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).hasClass( 'woocommerce' ) ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).addClass( 'woocommerce' ); } }, /** * Runs just before view is removed. * * @since 3.3 * @return null */ beforeRemove: function() { var self = this, removeClass = true; _.find( FusionPageBuilderApp.collection.models, function( element ) { if ( self.model.cid !== element.cid && -1 !== element.attributes.element_type.indexOf( 'fusion_tb_woo_checkout' ) ) { removeClass = false; // Break. return true; } } ); if ( true === removeClass ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).removeClass( 'woocommerce' ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-checkout-shipping-tb fusion-woo-checkout-shipping-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-checkout-shipping-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_checkout_shipping ) { output = atts.query_data.woo_checkout_shipping; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var inputs, hoverColor, placeholderColor, placeHolderInputs, hoverInputs, focusInputs, css; this.baseSelector = '.fusion-woo-checkout-shipping-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; inputs = [ this.baseSelector + ' input', this.baseSelector + ' select', this.baseSelector + ' textarea' ]; if ( ! this.isDefault( 'field_bg_color' ) ) { this.addCssProperty( inputs, 'background', this.values.field_bg_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'background-color', this.values.field_bg_color, true ); } if ( ! this.isDefault( 'field_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.values.field_text_color ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( inputs, 'color', this.values.field_text_color, true ); placeHolderInputs = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder' ]; this.addCssProperty( placeHolderInputs, 'color', placeholderColor ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_text_color, true ); } if ( ! this.isDefault( 'field_border_color' ) ) { this.addCssProperty( inputs, 'border-color', this.values.field_border_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'border-color', this.values.field_border_color, true ); } if ( ! this.isDefault( 'field_border_focus_color' ) ) { hoverColor = jQuery.AWB_Color( this.values.field_border_focus_color ).alpha( 0.5 ).toRgbaString(); hoverInputs = [ this.baseSelector + ' input:hover', this.baseSelector + ' select:hover', this.baseSelector + ' textarea:hover' ]; this.addCssProperty( hoverInputs, 'border-color', hoverColor ); focusInputs = [ this.baseSelector + ' input:focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus' ]; this.addCssProperty( focusInputs, 'border-color', this.values.field_border_focus_color ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Payment Component View. FusionPageBuilder.fusion_tb_woo_checkout_payment = FusionPageBuilder.ElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { // Split border width into 4. if ( 'undefined' === typeof params.button_border_top && 'undefined' !== typeof params.button_border_width && '' !== params.button_border_width ) { params.button_border_top = parseInt( params.button_border_width ) + 'px'; params.button_border_right = params.button_border_top; params.button_border_bottom = params.button_border_top; params.button_border_left = params.button_border_top; delete params.button_border_width; } this.model.set( 'params', params ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-checkout-payment-tb fusion-woo-checkout-payment-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.button_alignment ) { attr[ 'class' ] += ' button-align-' + values.button_alignment; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-checkout-payment-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_checkout_payment ) { output = atts.query_data.woo_checkout_payment; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { // variables into current scope var self = this, button, button_size_map, button_dimensions, button_hover, textStyles, css, selector; this.baseSelector = '.fusion-woo-checkout-payment-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; textStyles = _.fusionGetFontStyle( 'text_typography', values, 'object' ); jQuery.each( textStyles, function( rule, value ) { self.addCssProperty( self.baseSelector, rule, value ); } ); // Text font size. if ( !this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector, 'font-size', _.fusionGetValueWithUnit( this.values.text_font_size ) ); } if ( !this.isDefault( 'link_color' ) ) { this.addCssProperty( this.baseSelector + ' a', 'color', this.values.link_color ); } if ( !this.isDefault( 'link_hover_color' ) ) { this.addCssProperty( this.baseSelector + ' a:hover', 'color', this.values.link_hover_color ); } selector = this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li > label'; if ( !this.isDefault( 'label_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.label_padding_top ); } if ( !this.isDefault( 'label_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.label_padding_bottom ); } if ( !this.isDefault( 'label_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', 'max(55px,' + this.values.label_padding_left + ')' ); } if ( !this.isDefault( 'label_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.label_padding_right ); } if ( !this.isDefault( 'label_bg_color' ) ) { this.addCssProperty( selector, 'background', this.values.label_bg_color ); } if ( !this.isDefault( 'label_color' ) ) { this.addCssProperty( selector, 'color', this.values.label_color ); } if ( !this.isDefault( 'label_hover_color' ) ) { this.addCssProperty( selector + ':hover', 'color', this.values.label_hover_color ); this.addCssProperty( this.baseSelector + ' ul li input:checked+label', 'color', this.values.label_hover_color ); } selector = this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li:hover > label'; if ( !this.isDefault( 'label_bg_hover_color' ) ) { this.addCssProperty( selector, 'background', this.values.label_bg_hover_color ); } selector = [ this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li .payment_box', this.baseSelector + ' .woocommerce-checkout-payment ul.wc_payment_methods li.woocommerce-notice' ]; if ( !this.isDefault( 'payment_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.payment_padding_top ); } if ( !this.isDefault( 'payment_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.payment_padding_bottom ); } if ( !this.isDefault( 'payment_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.payment_padding_left ); } if ( !this.isDefault( 'payment_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.payment_padding_right ); } if ( !this.isDefault( 'payment_box_bg' ) ) { this.addCssProperty( selector, 'background', this.values.payment_box_bg ); } if ( !this.isDefault( 'payment_color' ) ) { this.addCssProperty( selector, 'color', this.values.payment_color ); } if ( !this.isDefault( 'button_style' ) ) { button = '.fusion-body ' + this.baseSelector + ' #place_order'; // Button size. if ( ! this.isDefault( 'button_size' ) ) { button_size_map = { small: { padding: '9px 20px', line_height: '14px', font_size: '12px' }, medium: { padding: '11px 23px', line_height: '16px', font_size: '13px' }, large: { padding: '13px 29px', line_height: '17px', font_size: '14px' }, xlarge: { padding: '17px 40px', line_height: '21px', font_size: '18px' } }; if ( 'object' === typeof button_size_map[ this.values.button_size ] ) { button_dimensions = button_size_map[ this.values.button_size ]; this.addCssProperty( button, 'padding', button_dimensions.padding ); this.addCssProperty( button, 'line-height', button_dimensions.line_height ); this.addCssProperty( button, 'font-size', button_dimensions.font_size ); } } if ( ! this.isDefault( 'button_stretch' ) ) { this.addCssProperty( button, 'flex', '1' ); this.addCssProperty( button, 'width', '100%' ); } if ( ! this.isDefault( 'button_border_top' ) ) { this.addCssProperty( button, 'border-top-width', _.fusionGetValueWithUnit( this.values.button_border_top ) ); } if ( ! this.isDefault( 'button_border_right' ) ) { this.addCssProperty( button, 'border-right-width', _.fusionGetValueWithUnit( this.values.button_border_right ) ); } if ( ! this.isDefault( 'button_border_bottom' ) ) { this.addCssProperty( button, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.button_border_bottom ) ); } if ( ! this.isDefault( 'button_border_left' ) ) { this.addCssProperty( button, 'border-left-width', _.fusionGetValueWithUnit( this.values.button_border_left ) ); } if ( ! this.isDefault( 'button_color' ) ) { this.addCssProperty( button, 'color', this.values.button_color ); } if ( ( 'string' === typeof this.params.button_gradient_top && '' !== this.params.button_gradient_top ) || ( 'string' === typeof this.params.button_gradient_bottom && '' !== this.params.button_gradient_bottom ) ) { this.addCssProperty( button, 'background', this.values.button_gradient_top ); this.addCssProperty( button, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom + ', ' + this.values.button_gradient_top + ' )' ); } if ( ! this.isDefault( 'button_border_color' ) ) { this.addCssProperty( button, 'border-color', this.values.button_border_color ); } button_hover = button + ':hover'; // Button hover text color if ( ! this.isDefault( 'button_color_hover' ) ) { this.addCssProperty( button_hover, 'color', this.values.button_color_hover ); } if ( ( 'string' === typeof this.params.button_gradient_top_hover && '' !== this.params.button_gradient_top_hover ) || ( 'string' === typeof this.params.button_gradient_bottom_hover && '' !== this.params.button_gradient_bottom_hover ) ) { this.addCssProperty( button_hover, 'background', this.values.button_gradient_top_hover ); this.addCssProperty( button_hover, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom_hover + ', ' + this.values.button_gradient_top_hover + ' )' ); } if ( ! this.isDefault( 'button_border_color_hover' ) ) { this.addCssProperty( button_hover, 'border-color', this.values.button_border_color_hover ); } } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Order Review Component View. FusionPageBuilder.fusion_tb_woo_checkout_order_review = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-checkout-order-review-tb fusion-woo-checkout-order-review-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-checkout-order-review-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_checkout_order_review ) { output = atts.query_data.woo_checkout_order_review; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var selector, css; this.baseSelector = '.fusion-woo-checkout-order-review-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; selector = [ this.baseSelector + ' tbody tr td', this.baseSelector + ' thead tr th', this.baseSelector + ' tfoot tr th', this.baseSelector + ' tfoot tr td' ]; if ( !this.isDefault( 'cell_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.cell_padding_top ); } if ( !this.isDefault( 'cell_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.cell_padding_bottom ); } if ( !this.isDefault( 'cell_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.cell_padding_left ); } if ( !this.isDefault( 'cell_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.cell_padding_right ); } selector = this.baseSelector + ' thead tr th'; if ( !this.isDefault( 'header_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.header_cell_backgroundcolor ); } if ( !this.isDefault( 'header_color' ) ) { this.addCssProperty( selector, 'color', this.values.header_color ); } if ( !this.isDefault( 'fusion_font_family_header_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_header_font ); } if ( !this.isDefault( 'fusion_font_variant_header_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_header_font ); } if ( !this.isDefault( 'header_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.header_font_size ); } selector = this.baseSelector + ' tbody tr td'; if ( !this.isDefault( 'table_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.table_cell_backgroundcolor ); } if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( selector, 'color', this.values.text_color ); } if ( !this.isDefault( 'fusion_font_family_text_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_text_font ); } if ( !this.isDefault( 'fusion_font_variant_text_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_text_font ); } if ( !this.isDefault( 'text_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.text_font_size ); } selector = this.baseSelector + ' tr, ' + this.baseSelector + ' tr td, ' + this.baseSelector + ' tr th, ' + this.baseSelector + ' tfoot'; if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( selector, 'border-color', this.values.border_color, true ); } selector = this.baseSelector + ' tfoot tr th, ' + this.baseSelector + ' tfoot tr td'; if ( !this.isDefault( 'footer_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.footer_cell_backgroundcolor ); } selector += ', ' + this.baseSelector + ' .shop_table tfoot .order-total .amount'; if ( !this.isDefault( 'footer_color' ) ) { this.addCssProperty( selector, 'color', this.values.footer_color ); } if ( !this.isDefault( 'fusion_font_family_footer_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_footer_font ); } if ( !this.isDefault( 'fusion_font_variant_footer_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_footer_font ); } if ( !this.isDefault( 'footer_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.footer_font_size ); } if ( 'show' !== this.values.table_header ) { this.addCssProperty( this.baseSelector + ' thead', 'display', 'none' ); } if ( 'show' !== this.values.display_product_images ) { this.addCssProperty( this.baseSelector + ' .product-thumbnail', 'display', 'none' ); this.addCssProperty( this.baseSelector + ' .shop_table tbody tr', 'height', 'auto' ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Cart Table View. FusionPageBuilder.fusion_woo_cart_table = FusionPageBuilder.ElementView.extend( { afterPatch: function() { var $quantityBoxes = this.$el.find( 'div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)' ).find( '.qty' ); if ( $quantityBoxes.length && 'function' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaAddQuantityBoxes ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaAddQuantityBoxes( '.qty', $quantityBoxes ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.wooCartTable = this.buildAttr( atts.values, attributes.cid ); attributes.cart_table = ''; if ( 'undefined' !== typeof atts.query_data ) { attributes.cart_table = atts.query_data; } attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Builds main attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values, cid ) { // WooCartTable attributes. var wooCartTable = { class: 'shop_table shop_table_responsive cart woocommerce-cart-form__contents fusion-woo-cart_table fusion-woo-cart_table-' + cid }; wooCartTable = _.fusionVisibilityAtts( values.hide_on_mobile, wooCartTable ); if ( '' !== values[ 'class' ] ) { wooCartTable[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { wooCartTable.id = values.id; } wooCartTable = _.fusionAnimations( values, wooCartTable ); return wooCartTable; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { // variables into current scope var selector, css; this.values = values; this.baseSelector = '.fusion-woo-cart_table-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', this.values.margin_top, true ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', this.values.margin_bottom ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', this.values.margin_left ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', this.values.margin_right ); } selector = this.baseSelector + ' tbody tr td, ' + this.baseSelector + ' thead tr th'; if ( !this.isDefault( 'cell_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.cell_padding_top ); } if ( !this.isDefault( 'cell_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.cell_padding_bottom ); } if ( !this.isDefault( 'cell_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.cell_padding_left ); } if ( !this.isDefault( 'cell_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.cell_padding_right ); } if ( !this.isDefault( 'cell_padding_top' ) || !this.isDefault( 'cell_padding_bottom' ) ) { this.addCssProperty( this.baseSelector + '.shop_table tbody tr', 'height', 'auto' ); } selector = this.baseSelector + ' thead tr th'; if ( !this.isDefault( 'heading_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.heading_cell_backgroundcolor ); } if ( !this.isDefault( 'heading_color' ) ) { this.addCssProperty( selector, 'color', this.values.heading_color ); } if ( !this.isDefault( 'fusion_font_family_heading_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_heading_font ); } if ( !this.isDefault( 'fusion_font_variant_heading_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_heading_font ); } if ( !this.isDefault( 'heading_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.heading_font_size ); } selector = this.baseSelector + ' tbody tr td'; if ( !this.isDefault( 'table_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.table_cell_backgroundcolor ); } if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( [ selector, selector + ' a', selector + ' .amount' ], 'color', this.values.text_color, true ); //this.addCssProperty( selector + ' a', 'color', this.values.text_color ); } if ( !this.isDefault( 'fusion_font_family_text_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_text_font ); } if ( !this.isDefault( 'fusion_font_variant_text_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_text_font ); } if ( !this.isDefault( 'text_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.text_font_size ); } selector = this.baseSelector + ' tr, ' + this.baseSelector + ' tr td, ' + this.baseSelector + ' tr th'; if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( selector, 'border-color', this.values.border_color, true ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Cart Coupons View. FusionPageBuilder.fusion_woo_cart_coupons = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.wooCartCouponsAttr = this.buildAttr( atts.values, attributes.cid ); attributes.cart_coupons_content = ''; if ( 'undefined' !== typeof atts.query_data ) { attributes.cart_coupons_content = atts.query_data; } attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Builds main attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values, cid ) { // WooCartCoupons attributes. var wooCartCoupons = { class: 'coupon fusion-woo-cart_coupons fusion-woo-cart_coupons-' + cid }; wooCartCoupons = _.fusionVisibilityAtts( values.hide_on_mobile, wooCartCoupons ); if ( '' !== values[ 'class' ] ) { wooCartCoupons[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { wooCartCoupons.id = values.id; } wooCartCoupons = _.fusionAnimations( values, wooCartCoupons ); return wooCartCoupons; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var inputs, hoverColor, placeholderColor, placeHolderInputs, hoverInputs, focusInputs, css, selector; this.values = values; // variables into current scope this.baseSelector = '.fusion-woo-cart_coupons-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', this.values.margin_top, true ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', this.values.margin_bottom ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', this.values.margin_left ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', this.values.margin_right ); } inputs = [ this.baseSelector + ' input', this.baseSelector + ' select', this.baseSelector + ' textarea' ]; if ( ! this.isDefault( 'field_bg_color' ) ) { this.addCssProperty( inputs, 'background', this.values.field_bg_color ); } if ( ! this.isDefault( 'field_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.values.field_text_color ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( inputs, 'color', this.values.field_text_color ); placeHolderInputs = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder' ]; this.addCssProperty( placeHolderInputs, 'color', placeholderColor ); } if ( ! this.isDefault( 'field_border_color' ) ) { this.addCssProperty( inputs, 'border-color', this.values.field_border_color ); } if ( ! this.isDefault( 'field_border_focus_color' ) ) { hoverColor = jQuery.AWB_Color( this.values.field_border_focus_color ).alpha( 0.5 ).toRgbaString(); hoverInputs = [ this.baseSelector + ' input:hover', this.baseSelector + ' select:hover', this.baseSelector + ' textarea:hover' ]; this.addCssProperty( hoverInputs, 'border-color', hoverColor ); focusInputs = [ this.baseSelector + ' input:focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus' ]; this.addCssProperty( focusInputs, 'border-color', this.values.field_border_focus_color ); } selector = this.baseSelector + ' button.fusion-apply-coupon'; if ( !this.isDefault( 'button_margin_top' ) ) { this.addCssProperty( selector, 'margin-top', this.values.button_margin_top ); } if ( !this.isDefault( 'button_margin_bottom' ) ) { this.addCssProperty( selector, 'margin-bottom', this.values.button_margin_bottom ); } if ( !this.isDefault( 'button_margin_left' ) ) { this.addCssProperty( selector, 'margin-left', this.values.button_margin_left ); } if ( !this.isDefault( 'button_margin_right' ) ) { this.addCssProperty( selector, 'margin-right', this.values.button_margin_right ); } selector = this.baseSelector + ' div.avada-coupon-fields'; if ( 'floated' === this.values.buttons_layout ) { this.addCssProperty( selector, 'flex-direction', 'row' ); } else { this.addCssProperty( selector, 'flex-direction', 'column', true ); this.addCssProperty( this.baseSelector + ' input#avada_coupon_code', 'flex', 'auto' ); this.addCssProperty( this.baseSelector + ' input#avada_coupon_code', 'margin-right', '0' ); if ( 'yes' === this.values.button_span ) { this.addCssProperty( selector, 'align-items', 'stretch', true ); this.addCssProperty( this.baseSelector + ' input#avada_coupon_code', 'width', '100%' ); } else { this.addCssProperty( selector, 'align-items', this.values.stacked_buttons_alignment, true ); } } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Cart Shipping View. FusionPageBuilder.fusion_woo_cart_shipping = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.cid = this.model.get( 'cid' ); attributes.wooCartShippingAttr = this.buildAttr( atts.values, attributes.cid ); attributes.cart_shipping_content = ''; if ( 'undefined' !== typeof atts.query_data ) { attributes.cart_shipping_content = atts.query_data; } attributes.styles = this.buildStyleBlock( atts.values, atts.extras ); return attributes; }, /** * Builds main attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values, cid ) { // WooFeaturedProductsSliderShortcode attributes. var wooCartShippingAttr = { class: 'woocommerce-shipping-calculator fusion-woocommerce-shipping-calculator fusion-woocommerce-shipping-calculator-' + cid }; wooCartShippingAttr = _.fusionVisibilityAtts( values.hide_on_mobile, wooCartShippingAttr ); if ( '' !== values[ 'class' ] ) { wooCartShippingAttr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { wooCartShippingAttr.id = values.id; } wooCartShippingAttr = _.fusionAnimations( values, wooCartShippingAttr ); return wooCartShippingAttr; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @param {Object} extras - The extras object. * @return {String} */ buildStyleBlock: function( values, extras ) { var inputs, hoverColor, placeholderColor, placeHolderInputs, hoverInputs, css; this.values = values; // variables into current scope this.baseSelector = '.fusion-woocommerce-shipping-calculator-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', this.values.margin_top, true ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', this.values.margin_bottom ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', this.values.margin_left ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', this.values.margin_right ); } inputs = [ this.baseSelector + ' input', this.baseSelector + ' select', this.baseSelector + ' textarea', this.baseSelector + ' .avada-select-parent .select-arrow', this.baseSelector + '.select2-container--default .select2-selection--single' ]; if ( ! this.isDefault( 'field_bg_color' ) ) { this.addCssProperty( inputs, 'background', this.values.field_bg_color, true ); } if ( ! this.isDefault( 'field_text_color' ) ) { placeholderColor = jQuery.AWB_Color( this.values.field_text_color ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( inputs, 'color', this.values.field_text_color, true ); placeHolderInputs = [ this.baseSelector + ' input::placeholder', this.baseSelector + ' textarea::placeholder' ]; this.addCssProperty( placeHolderInputs, 'color', placeholderColor ); } if ( ! this.isDefault( 'field_border_color' ) ) { this.addCssProperty( inputs, 'border-color', this.values.field_border_color, true ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'border-color', this.values.field_border_color, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent .select-arrow', 'color', this.values.field_border_color, true ); } if ( ! this.isDefault( 'field_border_focus_color' ) ) { hoverColor = jQuery.AWB_Color( this.values.field_border_focus_color ).alpha( 0.5 ).toRgbaString(); hoverInputs = [ this.baseSelector + ' input:hover', this.baseSelector + ' select:hover', this.baseSelector + ' textarea:hover', this.baseSelector + ' input:focus', this.baseSelector + ' select:focus', this.baseSelector + ' textarea:focus' ]; this.addCssProperty( hoverInputs, 'border-color', hoverColor, true ); // Select 2. this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'border-color', hoverColor, true ); this.addCssProperty( this.baseSelector + ' .avada-select-parent:hover .select-arrow', 'color', hoverColor, true ); } css = this.parseCSS(); css += this.mediaQueryStyles( extras ); return ( css ) ? '<style>' + css + '</style>' : ''; }, /** * Builds media query styles. * * @since 3.3 * @param {Object} extras - The extras object. * @return {String} */ mediaQueryStyles: function( extras ) { var baseSelector = '.fusion-woocommerce-shipping-calculator-' + this.model.get( 'cid' ), css = ''; css = '@media only screen and (max-width:' + extras.content_break_point + 'px) {'; css += baseSelector + ' p.fusion-layout-column.fusion-column-last:last-of-type {'; css += 'margin-bottom: 0px;'; css += '}}'; css = '@media only screen and (min-width:' + extras.content_break_point + 'px) {'; css += baseSelector + ' .fusion-layout-column.fusion-column-last {'; css += 'margin-bottom: 0px;'; css += '}}'; return css; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Featured Product Slider View. FusionPageBuilder.fusion_woo_cart_totals = FusionPageBuilder.ElementView.extend( { afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.cid = this.model.get( 'cid' ); attributes.wooCartTotalsWrapper = this.buildWrapperAttr( atts.values, attributes.cid ); attributes.cart_totals = ''; if ( 'undefined' !== typeof atts.query_data ) { attributes.cart_totals = atts.query_data; } attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Builds wrapper attributes. * * @since 3.3 * @param {Object} values - The values. * @return {Object} */ buildWrapperAttr: function( values, cid ) { var attributes = { class: 'fusion-woo-cart-totals-wrapper fusion-woo-cart-totals-wrapper-' + cid }; attributes = _.fusionVisibilityAtts( values.hide_on_mobile, attributes ); if ( '' !== values[ 'class' ] ) { attributes[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'show' === values.buttons_visibility ) { attributes[ 'class' ] += ' show-buttons'; } if ( '' !== values.id ) { attributes.id = values.id; } attributes = _.fusionAnimations( values, attributes ); return attributes; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { // variables into current scope var selector, text_selector, css; this.values = values; this.baseSelector = '.fusion-woo-cart-totals-wrapper-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', this.values.margin_top ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', this.values.margin_bottom ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', this.values.margin_left ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', this.values.margin_right ); } selector = this.baseSelector + ' tbody tr td, ' + this.baseSelector + ' tbody tr th'; if ( !this.isDefault( 'cell_padding_top' ) ) { this.addCssProperty( selector, 'padding-top', this.values.cell_padding_top ); } if ( !this.isDefault( 'cell_padding_bottom' ) ) { this.addCssProperty( selector, 'padding-bottom', this.values.cell_padding_bottom ); } if ( !this.isDefault( 'cell_padding_left' ) ) { this.addCssProperty( selector, 'padding-left', this.values.cell_padding_left ); } if ( !this.isDefault( 'cell_padding_right' ) ) { this.addCssProperty( selector, 'padding-right', this.values.cell_padding_right ); } selector = this.baseSelector + ' tbody tr th'; if ( !this.isDefault( 'heading_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.heading_cell_backgroundcolor ); } if ( !this.isDefault( 'fusion_font_family_heading_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_heading_font ); } if ( !this.isDefault( 'fusion_font_variant_heading_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_heading_font ); } if ( !this.isDefault( 'heading_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.heading_font_size ); } selector = this.baseSelector + ' tbody tr td'; if ( !this.isDefault( 'table_cell_backgroundcolor' ) ) { this.addCssProperty( selector, 'background-color', this.values.table_cell_backgroundcolor ); } text_selector = selector + ', ' + this.baseSelector + ' a, ' + this.baseSelector + ' .amount'; if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( text_selector, 'color', this.values.text_color, true ); } if ( !this.isDefault( 'heading_color' ) ) { this.addCssProperty( this.baseSelector + ' tbody tr th', 'color', this.values.heading_color, true ); } if ( !this.isDefault( 'fusion_font_family_text_font' ) ) { this.addCssProperty( selector, 'font-family', this.values.fusion_font_family_text_font ); } if ( !this.isDefault( 'fusion_font_variant_text_font' ) ) { this.addCssProperty( selector, 'font-weight', this.values.fusion_font_variant_text_font ); } if ( !this.isDefault( 'text_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.text_font_size ); } selector = this.baseSelector + ' tr, ' + this.baseSelector + ' tr td, ' + this.baseSelector + ' tr th'; if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( selector, 'border-color', this.values.border_color, true ); } selector = '.fusion-woo-cart-totals-wrapper-' + this.model.get( 'cid' ) + ' div.wc-proceed-to-checkout'; if ( 'floated' === this.values.buttons_layout ) { this.addCssProperty( selector, 'flex-direction', 'row' ); if ( 'yes' === this.values.button_span ) { this.addCssProperty( selector, 'justify-content', 'stretch', true ); this.addCssProperty( selector + ' a', 'flex', '1' ); } else { this.addCssProperty( selector, 'justify-content', this.values.floated_buttons_alignment, true ); } } else { this.addCssProperty( selector, 'flex-direction', 'column', true ); this.addCssProperty( selector, 'align-items', this.values.stacked_buttons_alignment, true ); if ( 'yes' === this.values.button_span ) { this.addCssProperty( selector, 'align-items', 'stretch', true ); } else { this.addCssProperty( selector, 'align-items', this.values.stacked_buttons_alignment, true ); } } if ( !this.isDefault( 'button_margin_top' ) ) { this.addCssProperty( selector + ' a', 'margin-top', this.values.button_margin_top ); } if ( !this.isDefault( 'button_margin_bottom' ) ) { this.addCssProperty( selector + ' a', 'margin-bottom', this.values.button_margin_bottom ); } if ( !this.isDefault( 'button_margin_left' ) ) { this.addCssProperty( selector + ' a', 'margin-left', this.values.button_margin_left ); } if ( !this.isDefault( 'button_margin_right' ) ) { this.addCssProperty( selector + ' a', 'margin-right', this.values.button_margin_right ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ /* global fusionAllElements, FusionApp, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Post Cards View. FusionPageBuilder.fusion_post_cards = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts ); attributes.productsLoop = this.buildOutput( atts ); attributes.productsAttrs = this.buildProductsAttrs( atts.values ); attributes.query_data = atts.query_data; attributes.values = atts.values; attributes.loadMoreText = _.has( atts.extras, 'load_more_text_' + atts.values.post_type ) ? atts.extras[ 'load_more_text_' + atts.values.post_type ] : atts.extras.load_more_text; // carousel. if ( 'carousel' === atts.values.layout ) { attributes.carouselNav = this.buildCarouselNav(); } if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.max_num_pages ) { if ( 'undefined' !== typeof atts.query_data.paged ) { attributes.pagination = this.buildPagination( atts ); } } return attributes; }, /** * Modifies the values. * * @since 3.3 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } if ( 'undefined' !== typeof values.nav_margin_top && '' !== values.nav_margin_top ) { values.nav_margin_top = _.fusionGetValueWithUnit( this.getReverseNum( values.nav_margin_top ) ); } if ( 1 === parseInt( values.columns ) && 'grid' === values.layout ) { values.column_spacing = '0px'; } // No delay offering for carousels and sliders. if ( 'grid' !== values.layout ) { values.animation_delay = 0; } }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-post-cards fusion-post-cards-' + this.model.get( 'cid' ) } ); if ( '' !== values.animation_type ) { // Grid and has delay, set parent args here, otherwise it will be on children. if ( 'grid' === values.layout && 0 !== parseInt( values.animation_delay ) ) { attr = _.fusionAnimations( values, attr, false ); attr[ 'data-animation-delay' ] = values.animation_delay; attr[ 'class' ] += ' fusion-delayed-animation'; } else { // Not grid always no delay, add to parent. attr = _.fusionAnimations( values, attr ); } } if ( 'slider' === values.layout ) { attr[ 'class' ] += ' fusion-slider-sc fusion-flexslider-loading flexslider'; attr[ 'data-slideshow_autoplay' ] = 'no' === values.autoplay ? false : true; attr[ 'data-slideshow_animation' ] = values.slider_animation; attr[ 'data-slideshow_control_nav' ] = 'no' === values.show_nav ? false : true; } else if ( 'carousel' === values.layout ) { attr[ 'class' ] += ' fusion-carousel fusion-carousel-responsive'; attr[ 'data-autoplay' ] = values.autoplay; attr[ 'data-columns' ] = values.columns; attr[ 'data-columnsmedium' ] = values.columns_medium; attr[ 'data-columnssmall' ] = values.columns_small; attr[ 'data-itemmargin' ] = values.column_spacing; attr[ 'data-itemwidth' ] = 180; attr[ 'data-touchscroll' ] = values.mouse_scroll; attr[ 'data-imagesize' ] = 'auto'; attr[ 'data-scrollitems' ] = values.scroll_items; } else if ( 'grid' === values.layout && 'terms' !== values.source ) { attr[ 'class' ] += ' fusion-grid-archive'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds carousel nav. * * @since 3.3 * @return {string} */ buildCarouselNav: function() { var output = ''; output += '<div class="fusion-carousel-nav">'; output += '<span class="fusion-nav-prev"></span>'; output += '<span class="fusion-nav-next"></span>'; output += '</div>'; return output; }, /** * Builds items UL attributes. * * @since 3.3 * @param {Object} values - The values. * @return {Object} */ buildProductsAttrs: function( values ) { var attr = { class: '' }; if ( 'grid' === values.layout ) { attr[ 'class' ] += 'fusion-grid fusion-grid-' + values.columns + ' fusion-flex-align-items-' + values.flex_align_items; } else if ( 'slider' === values.layout ) { attr[ 'class' ] += 'slides'; } else if ( 'carousel' === values.layout ) { attr[ 'class' ] += 'fusion-carousel-holder'; } if ( this.isLoadMore() ) { attr[ 'class' ] += ' fusion-grid-container-infinite'; } if ( 'load_more_button' === values.scrolling ) { attr[ 'class' ] += ' fusion-grid-container-load-more'; } return attr; }, /** * Builds columns classes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {string} */ buildColumnClasses: function( atts ) { var classes = ''; if ( 'grid' === atts.values.layout ) { classes += 'fusion-grid-column fusion-post-cards-grid-column'; } else if ( 'carousel' === atts.values.layout ) { classes += 'fusion-carousel-item'; } if ( 'product' === atts.values.post_type && 'posts' === atts.values.source ) { classes += ' product'; } return classes; }, /** * Builds columns wrapper. * * @since 3.3 * @param {Object} atts - The attributes. * @return {string} */ buildColumnWrapper: function( atts ) { var classes = ''; if ( 'carousel' === atts.values.layout ) { classes += 'fusion-carousel-item-wrapper'; } return classes; }, /** * Builds the pagination. * * @since 3.3 * @param {Object} atts - The attributes. * @return {string} */ buildPagination: function( atts ) { var globalPagination = atts.extras.pagination_global, globalStartEndRange = atts.extras.pagination_start_end_range_global, range = atts.extras.pagination_range_global, paged = '', pages = '', paginationCode = '', queryData = atts.query_data, values = atts.values; if ( -1 == values.number_posts ) { values.scrolling = 'no'; } if ( 'no' !== values.scrolling ) { paged = queryData.paged; pages = queryData.max_num_pages; paginationCode = _.fusionPagination( pages, paged, range, values.scrolling, globalPagination, globalStartEndRange ); } return paginationCode; }, /** * Check is load more. * * @since 3.3 * @return {boolean} */ isLoadMore: function() { return -1 !== jQuery.inArray( this.values.scrolling, [ 'infinite', 'load_more_button' ] ); }, /** * Get reverse number. * * @since 3.3 * @param {String} value - the number value. * @return {String} */ getReverseNum: function( value ) { return -1 !== value.indexOf( '-' ) ? value.replace( '-', '' ) : '-' + value; }, /** * Get grid width value. * * @since 3.3 * @param {String} columns - the columns count. * @return {String} */ getGridWidthVal: function( columns ) { var cols = [ '100%', '50%', '33.3333%', '25%', '20%', '16.6666%' ]; return cols[ columns - 1 ]; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = '', _self = this, lists; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.loop_product ) { lists = jQuery( '<ul>' + atts.query_data.loop_product + '</ul>' ); lists.find( 'li' ).each( function() { jQuery( this ).removeClass( 'fusion-grid-column fusion-post-cards-grid-column fusion-carousel-item product' ) .addClass( _self.buildColumnClasses( atts ) ) .find( '.fusion-column-wrapper' ).removeClass( 'fusion-carousel-item-wrapper' ) .addClass( _self.buildColumnWrapper( atts ) ); // Separators are always added into data, just remove if not valid. if ( 'grid' !== _self.values.layout || 1 < parseInt( _self.values.columns ) ) { jQuery( this ).find( '.fusion-absolute-separator' ).remove(); } else { jQuery( this ).find( '.fusion-absolute-separator' ).css( { display: 'block' } ); } } ); output = lists.html(); } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( atts ) { var css, selectors, media, column_spacing, row_spacing, self = this, values = atts.values, responsive_style = '', nestedCSS = 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.nested_css ? atts.query_data.nested_css : null; this.baseSelector = '.fusion-post-cards.fusion-post-cards-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectors = [ this.baseSelector + ' .infinite-scroll-hide' ]; if ( this.isLoadMore() ) { this.addCssProperty( selectors, 'display', 'none' ); } if ( 1 < parseInt( values.columns ) ) { selectors = [ this.baseSelector + ' ul.fusion-grid' ]; column_spacing = _.fusionGetValueWithUnit( this.values.column_spacing ); this.addCssProperty( selectors, 'margin-right', 'calc((' + column_spacing + ')/ -2)' ); this.addCssProperty( selectors, 'margin-left', 'calc((' + column_spacing + ')/ -2)' ); selectors = [ this.baseSelector + ' ul.fusion-grid > .fusion-grid-column' ]; this.addCssProperty( selectors, 'padding-left', 'calc((' + column_spacing + ')/ 2)' ); this.addCssProperty( selectors, 'padding-right', 'calc((' + column_spacing + ')/ 2)' ); selectors = [ this.baseSelector + ' ul.fusion-grid > .fusion-grid-column .fusion-column-inner-bg' ]; this.addCssProperty( selectors, 'margin-left', 'calc((' + column_spacing + ')/ 2)' ); this.addCssProperty( selectors, 'margin-right', 'calc((' + column_spacing + ')/ 2)' ); } if ( 'grid' === this.values.layout ) { row_spacing = _.fusionGetValueWithUnit( this.values.row_spacing ); selectors = [ this.baseSelector + ' ul.fusion-grid' ]; this.addCssProperty( selectors, 'margin-top', 'calc((' + row_spacing + ')/ -2)' ); selectors = [ this.baseSelector + ' ul.fusion-grid > .fusion-grid-column' ]; this.addCssProperty( selectors, 'padding-top', 'calc((' + row_spacing + ')/ 2)' ); this.addCssProperty( selectors, 'padding-bottom', 'calc((' + row_spacing + ')/ 2)' ); selectors = [ this.baseSelector + ' ul.fusion-grid > .fusion-grid-column > .fusion-column-inner-bg' ]; this.addCssProperty( selectors, 'margin-top', 'calc((' + row_spacing + ')/ 2)' ); this.addCssProperty( selectors, 'margin-bottom', 'calc((' + row_spacing + ')/ 2)' ); } selectors = [ this.baseSelector ]; // Margin styles. if ( ! this.isDefault( 'margin_top' ) ) { this.addCssProperty( selectors, 'margin-top', values.margin_top ); } if ( ! this.isDefault( 'margin_right' ) ) { this.addCssProperty( selectors, 'margin-right', values.margin_right ); } if ( ! this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( selectors, 'margin-bottom', values.margin_bottom ); } if ( ! this.isDefault( 'margin_left' ) ) { this.addCssProperty( selectors, 'margin-left', values.margin_left ); } selectors = [ this.baseSelector + ' .flex-control-nav' ]; if ( 'slider' === values.layout ) { this.addCssProperty( selectors, 'bottom', values.nav_margin_top ); } // Process children css if it's there. if ( Array.isArray( nestedCSS ) ) { jQuery.each( nestedCSS, function( index, rules ) { if ( Array.isArray( rules ) ) { jQuery.each( rules, function( key, rule ) { var important = 'undefined' !== typeof rule.important ? rule.important : false; self.addCssProperty( self.baseSelector + ' ' + rule.selector, rule.rule, rule.value, important ); } ); } } ); } css = this.parseCSS(); if ( 'grid' === values.layout ) { _.each( [ 'medium', 'small' ], function( size ) { var key = 'columns_' + size; // Check for default value. if ( this.isDefault( key ) ) { return; } this.dynamic_css = {}; // Build responsive styles. selectors = [ this.baseSelector + ' .fusion-grid .fusion-grid-column' ]; this.addCssProperty( selectors, 'width', this.getGridWidthVal( values[ key ] ) + '!important' ); media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; responsive_style += media + '{' + this.parseCSS() + '}'; }, this ); css += responsive_style; } return ( css ) ? '<style>' + css + '</style>' : ''; }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.post_card ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] ) { FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] = true; } } } } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionAppConfig, FusionEvents */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.fusion_widget_content = window.wp.Backbone.View.extend( { template: FusionPageBuilder.template( jQuery( '#tmpl-fusion_widget_content' ).html() ), className: 'fusion-widget-content-view', events: { }, /** * First filters applied to widget markup when retrieved via ajax. * * @since 2.2.0 * @return {String} */ filterRenderContent: function ( output ) { return output; }, /** * Before Widget Content View actions. * * @since 2.2.0 * @return {void} */ beforeRemove: function () { // eslint-disable-line no-empty-function }, /** * Remove Widget Content View. * * @since 2.2.0 * @return {void} */ removeElement: function() { FusionApp.deleteScripts( this.cid ); this.beforeRemove(); this.remove(); }, /** * Init function. * * @since 2.2.0 * @return {void} */ initialize: function() { // Set markup if ( this.model.attributes.markup && this.model.attributes.markup.output ) { this.model.attributes.markup = FusionApp.removeScripts( this.filterRenderContent( this.model.attributes.markup.output ), this.cid ); this.injectScripts(); } this.onInit(); }, /** * Renders the view. * * @since 2.2.0 * @return {Object} this */ render: function() { if ( !this.isAjax && ( 'undefined' === typeof this.model.attributes.markup || '' === this.model.attributes.markup ) ) { FusionApp.deleteScripts( this.cid ); this.getHTML( this ); } this.$el.html( this.template( this.model.attributes ) ); this.onRender(); return this; }, onInit: function() { this.isAjax = false; }, onRender: function() { // eslint-disable-line no-empty-function }, /** * Calls getHTML(). * * @since 2.2.0 * @param {Object} view * @return {void} */ getMarkup: function( view ) { this.getHTML( view ); }, /** * Add selected widget scripts to Fusion App. * * @since 2.2.0 * @return {void} */ injectScripts: function() { var self, dfd; self = this; dfd = jQuery.Deferred(); setTimeout( function() { FusionApp.injectScripts( self.cid ); dfd.resolve(); }, 100 ); return dfd.promise(); }, /** * Fetch selected widget markup. * * @since 2.2.0 * @param {Object} view * @return {void} */ getHTML: function( view ) { var self = this, params; params = view.model.get( 'params' ); self.isAjax = true; this.beforeGetHTML(); jQuery.ajax( { type: 'POST', url: fusionAppConfig.ajaxurl, dataType: 'JSON', data: { action: 'fusion_get_widget_markup', fusion_load_nonce: fusionAppConfig.fusion_load_nonce, type: view.model.attributes.params.type, params: params, widget_id: view.model.cid } } ) .done( function( response ) { self.isAjax = false; FusionApp.deleteScripts( self.cid ); view.model.attributes.markup = FusionApp.removeScripts( self.filterRenderContent( response ), self.cid ); view.render(); self.injectScripts() .then( function() { self.afterGetHTML(); // Remove parent loading overlay FusionEvents.trigger( 'fusion-widget-rendered' ); } ); } ); }, beforeGetHTML: function() { // eslint-disable-line no-empty-function }, afterGetHTML: function() { // eslint-disable-line no-empty-function } } ); } ); }() ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.RevSliderWidget = FusionPageBuilder.fusion_widget_content.extend( { beforeGetHTML: function() { var sliderId = this.$el.find( 'rs-module' ).attr( 'id' ); // use preview context to correctly disable the revolution slider this.sliderInitiated = Boolean( sliderId ); FusionApp.previewWindow.jQuery( '#' + sliderId ).revkill(); }, beforeRemove: function() { var sliderId = this.$el.find( 'rs-module' ).attr( 'id' ); // use preview context to correctly disable the revolution slider FusionApp.previewWindow.jQuery( '#' + sliderId ).revkill(); }, filterRenderContent: function( output ) { var result = this.filterDuplicates( this.disableInlineScripts( output, this.sliderInitiated ) ); return result; }, filterDuplicates: function( output ) { var alias = output.match( /(data-alias="(.*?)")/g ); alias = alias && 0 > alias.length ? alias[ 0 ].split( '=' )[ 1 ] : '""'; if ( jQuery( '#fb-preview' ).contents().find( 'rs-module-wrap[data-alias=' + alias + ']' ).length ) { return '<div class="fusion-builder-placeholder">' + window.fusionBuilderText.duplicate_slider_revolution + '</div>'; } return output; }, disableInlineScripts: function( output, force ) { if ( ( -1 !== output.indexOf( 'rev_slider_error' ) && -1 !== output.indexOf( '<script' ) && -1 !== output.indexOf( '</script>' ) ) || force ) { output = output.replace( '<script', '<!--<script' ).replace( '</script>', '</script>-->' ); } return output; } } ); } ); }() ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.Fusion_Widget_Facebook_Page = FusionPageBuilder.fusion_widget_content.extend( { afterGetHTML: function() { if ( 'undefined' !== typeof FusionApp.previewWindow.FB ) { FusionApp.previewWindow.FB.XFBML.parse(); } } } ); } ); }() ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.WP_Widget_Media_Video = FusionPageBuilder.fusion_widget_content.extend( { onInit: function() { this.model.attributes.markup = ''; }, afterGetHTML: function() { var video = this.$el.find( 'video' ); video.attr( 'id', 'video-' + this.model.get( 'cid' ) ); FusionApp.previewWindow.wp.mediaelement.initialize(); } } ); } ); }() ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Author view. FusionPageBuilder.fusion_tb_author = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); return attributes; }, /** * Builds output. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = '', title = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-author-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.author ) { output = atts.query_data.author; } title = _.buildTitleElement( atts.values, atts.extras, jQuery( jQuery.parseHTML( output ) ).find( 'h1, h2, h3, h4, h5, h6' ).html() ); output = output.replace( jQuery( jQuery.parseHTML( output ) ).find( 'h1, h2, h3, h4, h5, h6' ).parent().prop( 'outerHTML' ), title ); return output; }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'about-author fusion-live-author-tb fusion-author-tb fusion-author-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'hide' !== values.avatar ) { attr[ 'class' ] += ' ' + values.avatar; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds styles. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var styles = '<style type="text/css">'; if ( 'circle' === values.avatar ) { styles += '.fusion-author-tb-' + this.model.get( 'cid' ) + '.circle .about-author-container .avatar{border-radius: 50%;}'; } if ( 'square' === values.avatar ) { styles += '.fusion-author-tb-' + this.model.get( 'cid' ) + '.square .about-author-container .avatar{border-radius: 0;}'; } if ( 'hide' === values.avatar ) { styles += '.fusion-author-tb-' + this.model.get( 'cid' ) + ' .about-author-container .avatar{display:none;}'; } if ( 'hide' === values.headings ) { styles += '.fusion-author-tb-' + this.model.get( 'cid' ) + ' .fusion-title{display:none;}'; } if ( 'hide' === values.biography ) { styles += '.fusion-author-tb-' + this.model.get( 'cid' ) + ' .about-author-container .description{display:none;}'; } styles += '</style>'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Comments view. FusionPageBuilder.fusion_tb_comments = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); attributes.placeholder = this.getComponentPlaceholder(); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); return attributes; }, /** * Modifies the values. * * @since 2.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.padding = _.fusionValidateAttrValue( values.padding, 'px' ); }, /** * Builds output. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = '', title = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-comments-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.comments ) { output = atts.query_data.comments; } _.each( jQuery( jQuery.parseHTML( output ) ).find( 'h1, h2, h3, h4, h5, h6' ), function( item ) { title = _.buildTitleElement( atts.values, atts.extras, jQuery( item ).html() ); output = output.replace( jQuery( item ).parent().prop( 'outerHTML' ), title ); } ); return output; }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-comments-tb fusion-live-comments-tb fusion-comments-tb-' + this.model.get( 'cid' ) + ' fusion-order-' + values.template_order.split( ',' )[ 0 ].replace( '_', '-' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'hide' !== values.avatar ) { attr[ 'class' ] += ' ' + values.avatar; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds styles. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var selectors, css; this.baseSelector = '.fusion-comments-tb.fusion-comments-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectors = this.baseSelector + ' .commentlist .the-comment'; if ( !this.isDefault( 'border_size' ) ) { this.addCssProperty( selectors, 'border-bottom-width', values.border_size ); } if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( selectors, 'border-color', values.border_color ); } if ( 'hide' === values.avatar ) { this.addCssProperty( this.baseSelector + ' .commentlist .the-comment .comment-text', 'margin-left', '0px' ); } if ( 'circle' === values.avatar ) { this.addCssProperty( this.baseSelector + '.circle .the-comment .avatar', 'border-radius', '50%' ); } if ( 'square' === values.avatar ) { this.addCssProperty( this.baseSelector + '.square .the-comment .avatar', 'border-radius', '0' ); } if ( 'hide' === values.avatar ) { this.addCssProperty( this.baseSelector + ' .the-comment .avatar', 'display', 'none' ); } if ( '' !== values.padding ) { this.addCssProperty( this.baseSelector + ' .commentlist .children', 'padding-left', values.padding ); } if ( 'hide' === values.headings ) { this.addCssProperty( this.baseSelector + ' .fusion-title', 'display', 'none' ); } if ( !this.isDefault( 'heading_color' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-title h' + values.heading_size, 'color', values.heading_color, true ); } if ( !this.isDefault( 'link_color' ) ) { this.addCssProperty( this.baseSelector + ' a', 'color', values.link_color ); this.addCssProperty( this.baseSelector + ' .comment-author.meta a', 'color', values.link_color, true ); } if ( !this.isDefault( 'link_hover_color' ) ) { this.addCssProperty( this.baseSelector + ' a:hover', 'color', values.link_hover_color ); this.addCssProperty( this.baseSelector + ' .comment-author.meta a:hover', 'color', values.link_hover_color, true ); } if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector, 'color', values.text_color ); } if ( !this.isDefault( 'meta_color' ) ) { this.addCssProperty( this.baseSelector + ' .comment-author.meta', 'color', values.meta_color, true ); } css = this.parseCSS(); return ( css ) ? '<style type="text/css">' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global FusionApp */ /* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Content Component View. FusionPageBuilder.fusion_tb_content = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.output = this.buildOutput( atts ); attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Builds output. * * @since 3.3 * @param {Object} atts - The attributes object. * @return {String} */ buildOutput: function( atts ) { var output = '', stripHTML = ( 'yes' === atts.values.strip_html ); if ( 'undefined' !== typeof atts.query_data && 'object' === typeof atts.query_data.content ) { if ( atts.query_data.content.has_custom_excerpt ) { output = _.fusionGetFixedContent( atts.query_data.content, atts.values.excerpt, Number.MAX_SAFE_INTEGER, stripHTML ); } else { output = _.fusionGetFixedContent( atts.query_data.content, atts.values.excerpt, atts.values.excerpt_length, stripHTML ); } } if ( '' === output ) { output = 'object' === typeof FusionApp.initialData.examplePostDetails && 'string' === typeof FusionApp.initialData.examplePostDetails.post_content ? FusionApp.initialData.examplePostDetails.post_content : _.autop( 'This is some example content.' ); } return output; }, buildStyleBlock: function( values ) { var text_styles, css, self = this; this.baseSelector = '.fusion-content-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( !this.isDefault( 'content_alignment' ) ) { this.addCssProperty( this.baseSelector, 'text-align', this.values.content_alignment ); } if ( !this.isDefault( 'font_size' ) ) { this.addCssProperty( this.baseSelector, 'font-size', _.fusionGetValueWithUnit( this.values.font_size ) ); } text_styles = _.fusionGetFontStyle( 'text_font', values, 'object' ); jQuery.each( text_styles, function( rule, value ) { self.addCssProperty( self.baseSelector, rule, value ); } ); if ( !this.isDefault( 'line_height' ) ) { this.addCssProperty( this.baseSelector, 'line-height', this.values.line_height ); } if ( !this.isDefault( 'letter_spacing' ) ) { this.addCssProperty( this.baseSelector, 'letter-spacing', _.fusionGetValueWithUnit( this.values.letter_spacing ) ); } if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector, 'color', _.fusionGetValueWithUnit( this.values.text_color ) ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-content-tb fusion-content-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Featured Images Slider Component View. FusionPageBuilder.fusion_tb_featured_slider = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output ) { attributes.output = atts.markup.output; } // Use AJAX content if it exists. if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.output ) { attributes.output = atts.query_data.output; } if ( '' === attributes.output ) { attributes.output = this.getComponentPlaceholder(); } return attributes; }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-featured-slider-tb fusion-featured-slider-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Meta Component View. FusionPageBuilder.fusion_tb_meta = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.4 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Modifies the values. * * @since 2.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.height = _.fusionValidateAttrValue( values.height, 'px' ); }, /** * Builds attributes. * * @since 2.4 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-meta-tb fusion-meta-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.padding_top ) { attr.style += 'padding-top:' + values.padding_top + ';'; } if ( '' !== values.padding_right ) { attr.style += 'padding-right:' + values.padding_right + ';'; } if ( '' !== values.padding_bottom ) { attr.style += 'padding-bottom:' + values.padding_bottom + ';'; } if ( '' !== values.padding_left ) { attr.style += 'padding-left:' + values.padding_left + ';'; } if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values.stacked_vertical_align && 'floated' !== values.layout ) { attr.style += 'justify-content:' + values.stacked_vertical_align + ';'; } if ( '' !== values.stacked_horizontal_align && 'floated' !== values.layout ) { attr.style += 'align-items:' + values.stacked_horizontal_align + ';'; } if ( '' !== values.height ) { attr.style += 'min-height:' + values.height + ';'; } if ( '' !== values.font_size ) { attr.style += 'font-size:' + values.font_size + ';'; } if ( '' !== values.background_color ) { attr.style += 'background-color:' + values.background_color + ';'; } if ( '' !== values.layout ) { attr[ 'class' ] += ' ' + values.layout; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-meta-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.meta ) { output = atts.query_data.meta; } return output; }, /** * Builds styles. * * @since 2.4 * @return {String} */ buildStyleBlock: function() { var selectors, css, media; this.baseSelector = '.fusion-meta-tb.fusion-meta-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectors = [ this.baseSelector, this.baseSelector + ' a' ]; if ( !this.isDefault( 'text_color' ) ) { this.addCssProperty( selectors, 'color', this.values.text_color ); } if ( !this.isDefault( 'link_color' ) ) { this.addCssProperty( [ this.baseSelector + ' span a' ], 'color', this.values.link_color ); } // Alignment. if ( '' !== this.values.alignment && 'stacked' !== this.values.layout ) { this.addCssProperty( [ this.baseSelector ], 'justify-content', this.values.alignment ); } selectors = [ this.baseSelector + ' a:hover', this.baseSelector + ' span a:hover' ]; if ( !this.isDefault( 'text_hover_color' ) ) { this.addCssProperty( selectors, 'color', this.values.text_hover_color ); } if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( [ this.baseSelector ], 'border-color', this.values.border_color ); } if ( !this.isDefault( 'border_bottom' ) ) { this.addCssProperty( [ this.baseSelector ], 'border-bottom-width', this.values.border_bottom ); } if ( !this.isDefault( 'border_top' ) ) { this.addCssProperty( [ this.baseSelector ], 'border-top-width', this.values.border_top ); } if ( !this.isDefault( 'border_left' ) ) { this.addCssProperty( [ this.baseSelector ], 'border-left-width', this.values.border_left ); } if ( !this.isDefault( 'border_right' ) ) { this.addCssProperty( [ this.baseSelector ], 'border-right-width', this.values.border_right ); } selectors = [ this.baseSelector + ' > span:not(.fusion-meta-tb-sep)' ]; if ( !this.isDefault( 'item_border_color' ) ) { this.addCssProperty( selectors, 'border-color', this.values.item_border_color ); } if ( !this.isDefault( 'item_border_bottom' ) ) { this.addCssProperty( selectors, 'border-bottom-width', this.values.item_border_bottom ); } if ( !this.isDefault( 'item_border_top' ) ) { this.addCssProperty( selectors, 'border-top-width', this.values.item_border_top ); } if ( !this.isDefault( 'item_border_left' ) ) { this.addCssProperty( selectors, 'border-left-width', this.values.item_border_left ); } if ( !this.isDefault( 'item_border_right' ) ) { this.addCssProperty( selectors, 'border-right-width', this.values.item_border_right ); } if ( !this.isDefault( 'item_background_color' ) ) { this.addCssProperty( selectors, 'background-color', this.values.item_background_color ); } if ( !this.isDefault( 'item_padding_top' ) ) { this.addCssProperty( selectors, 'padding-top', this.values.item_padding_top ); } if ( !this.isDefault( 'item_padding_bottom' ) ) { this.addCssProperty( selectors, 'padding-bottom', this.values.item_padding_bottom ); } if ( !this.isDefault( 'item_padding_left' ) ) { this.addCssProperty( selectors, 'padding-left', this.values.item_padding_left ); } if ( !this.isDefault( 'item_padding_right' ) ) { this.addCssProperty( selectors, 'padding-right', this.values.item_padding_right ); } if ( !this.isDefault( 'item_margin_top' ) ) { this.addCssProperty( selectors, 'margin-top', this.values.item_margin_top ); } if ( !this.isDefault( 'item_margin_bottom' ) ) { this.addCssProperty( selectors, 'margin-bottom', this.values.item_margin_bottom ); } if ( !this.isDefault( 'item_margin_left' ) ) { this.addCssProperty( selectors, 'margin-left', this.values.item_margin_left ); } if ( !this.isDefault( 'item_margin_right' ) ) { this.addCssProperty( selectors, 'margin-right', this.values.item_margin_right ); } css = this.parseCSS(); // Responsive Alignment. if ( 'stacked' !== this.values.layout ) { _.each( [ 'medium', 'small' ], function( size ) { var key = 'alignment_' + size; media = '@media only screen and (max-width:' + this.extras[ 'visibility_' + size ] + 'px)'; if ( '' === this.values[ key ] ) { return; } this.dynamic_css = {}; this.addCssProperty( [ this.baseSelector ], 'justify-content', this.values[ key ] ); css += media + '{' + this.parseCSS() + '}'; }, this ); } return ( css ) ? '<style type="text/css">' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Pagination view. FusionPageBuilder.fusion_tb_pagination = FusionPageBuilder.ElementView.extend( { /** * Runs after view DOM is patched. * * @since 3.2 * @return {void} */ afterPatch: function() { var $pagination = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-live-pagination-tb.layout-sticky' ) ); if ( jQuery( '.fusion-builder-module-settings[data-element-cid="' + this.model.get( 'cid' ) + '"]' ).length ) { $pagination.addClass( 'show-live' ); } }, /** * Modify template attributes. * * @since 2.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; // Any extras that need passed on. attributes.values = atts.values; return attributes; }, /** * Modifies the values. * * @since 2.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.border_size = _.fusionValidateAttrValue( values.border_size, 'px' ); values.height = _.fusionValidateAttrValue( values.height, 'px' ); values.preview_height = _.fusionValidateAttrValue( values.preview_height, 'px' ); values.preview_wrapper_width = _.fusionValidateAttrValue( values.preview_wrapper_width, 'px' ); values.preview_width = _.fusionValidateAttrValue( values.preview_width, 'px' ); }, /** * Builds attributes. * * @since 2.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-live-pagination-tb fusion-pagination-tb fusion-pagination-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values.height && 'sticky' !== values.layout ) { attr.style += 'min-height:' + values.height + ';'; } if ( '' !== values.font_size ) { attr.style += 'font-size:' + values.font_size + ';'; } if ( 'sticky' !== values.layout ) { attr[ 'class' ] += ' single-navigation clearfix '; } if ( values.layout ) { attr[ 'class' ] += ' layout-' + values.layout; } if ( values.preview_position && 'preview' === values.layout ) { attr[ 'class' ] += ' position-' + values.preview_position; } if ( 'yes' === values.box_shadow ) { attr[ 'class' ] += ' has-box-shadow'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.alignment && 'sticky' !== values.layout ) { attr[ 'class' ] += ' align-' + values.alignment; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds styles. * * @since 2.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var styles = '<style type="text/css">'; if ( '' !== values.border_size ) { styles += '.fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky){border-width:' + values.border_size + ';}'; if ( 'preview' === values.layout ) { styles += '.fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation.layout-preview .fusion-pagination-preview-wrapper{'; if ( 'top' === values.preview_position ) { styles += 'margin-bottom: calc(' + values.border_size + ' + 1px);'; } else { styles += 'margin-top: calc(' + values.border_size + ' + 1px);'; } styles += '}'; } } if ( '' !== values.border_color ) { styles += '.fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky){border-color:' + values.border_color + ';}'; } if ( '' !== values.text_color ) { styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a,'; styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a::before,'; styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a::after {'; styles += 'color:' + values.text_color + ';'; styles += '}'; } if ( '' !== values.text_hover_color ) { styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a:hover,'; styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a:hover::before,'; styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.single-navigation:not(.layout-sticky) a:hover::after {'; styles += 'color:' + values.text_hover_color + ';'; styles += '}'; } if ( '' !== values.bg_color && 'text' !== values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation,'; styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + ':not(.layout-sticky).layout-preview .fusion-pagination-preview-wrapper{'; styles += 'background:' + values.bg_color + ';}'; } if ( 'yes' === values.box_shadow && 'text' !== values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky.has-box-shadow .fusion-control-navigation:before,'; styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + ':not(.layout-sticky).layout-preview.has-box-shadow .fusion-pagination-preview-wrapper{'; styles += 'box-shadow:' + _.fusionGetBoxShadowStyle( values ) + ' !important;}'; } styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation a,'; styles += '.fusion-fullwidth .fusion-builder-row.fusion-row .fusion-pagination-tb-' + this.model.get( 'cid' ) + ':not(.layout-sticky).layout-preview .fusion-pagination-preview-wrapper .fusion-item-title {'; if ( '' !== values.preview_text_color && 'text' !== values.layout ) { styles += 'color:' + values.preview_text_color + ';'; } if ( '' !== values.preview_font_size && 'text' !== values.layout ) { styles += 'font-size:' + values.preview_font_size + ';'; } styles += '}'; if ( '' !== values.preview_height && 'sticky' === values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation{'; styles += 'height:' + values.preview_height + ';'; styles += '}'; } if ( '' !== values.preview_wrapper_width && 'sticky' === values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation{'; styles += 'min-width:' + values.preview_wrapper_width + ';'; styles += '}'; } if ( '' !== values.preview_width && 'sticky' === values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation.next{'; if ( jQuery( 'body' ).hasClass( 'rtl' ) ) { styles += 'transform:translate( calc( max( -' + values.preview_wrapper_width + ', -50vw ) + ' + values.preview_width + '), -50% ) !important;'; } else { styles += 'transform:translate( calc( min( ' + values.preview_wrapper_width + ', 50vw ) - ' + values.preview_width + '), -50% );'; } styles += '}'; styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky .fusion-control-navigation.prev{'; if ( jQuery( 'body' ).hasClass( 'rtl' ) ) { styles += 'transform:translate( calc( min( ' + values.preview_wrapper_width + ', 50vw ) - ' + values.preview_width + '), -50% ) !important;'; } else { styles += 'transform:translate( calc( max( -' + values.preview_wrapper_width + ', -50vw ) + ' + values.preview_width + '), -50% );'; } styles += '}'; } if ( '' !== values.z_index && 'sticky' === values.layout ) { styles += '.fusion-body .fusion-pagination-tb-' + this.model.get( 'cid' ) + '.layout-sticky{'; styles += 'z-index:' + parseInt( values.z_index ) + ';'; styles += '}'; } styles += '</style>'; return styles; }, /** * Open actual modal. * * @since 2.0 * @return {void} */ onSettingsOpen: function() { var $pagination = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-live-pagination-tb' ) ); if ( $pagination.hasClass( 'layout-sticky' ) ) { $pagination.addClass( 'show-live' ); } }, /** * Close the modal. * * @since 2.0 * @return {void} */ onSettingsClose: function() { var $pagination = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.fusion-live-pagination-tb' ) ); if ( $pagination.hasClass( 'layout-sticky' ) ) { $pagination.removeClass( 'show-live' ); } } } ); } ); }( jQuery ) ); ;/* global fusionBuilderText, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Related Component View. FusionPageBuilder.fusion_tb_related = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { this._refreshJs(); }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Create attribute objects. attributes.attr = this.buildAttr( atts.values ); attributes.titleElement = 'yes' === atts.values.heading_enable ? _.buildTitleElement( atts.values, atts.extras, this.getSectionTitle() ) : ''; attributes.query_data = atts.query_data; // add placeholder. attributes.query_data.placeholder = this.getComponentPlaceholder(); if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.related_items ) { attributes.relatedCarousel = this.buildRelatedCarousel( atts ); attributes.carouselAttrs = this.buildCarouselAttrs( atts.values ); attributes.carouselNav = true === atts.values.related_posts_navigation ? this.buildCarouselNav() : ''; } return attributes; }, /** * Modify values. * * @since 2.0 * @param {Object} values - The values. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } values.related_posts_navigation = ( 'yes' === values.related_posts_navigation || '1' === values.related_posts_navigation ) ? true : false; values.related_posts_autoplay = ( 'yes' === values.related_posts_autoplay || '1' === values.related_posts_autoplay ) ? true : false; values.related_posts_swipe = ( 'yes' === values.related_posts_swipe || '1' === values.related_posts_swipe ) ? true : false; }, /** * Builds related posts carousel. * * @since 2.0 * @param {Object} atts - The Attributes. * @return {string} */ buildRelatedCarousel: function( atts ) { var queryData = atts.query_data, values = atts.values, html = ''; _.each( queryData.related_items, function( item ) { var carouselItemCss = ''; if ( queryData.related_items.length < values.related_posts_columns ) { carouselItemCss = ( atts.extras.content_width - parseInt( values.related_posts_column_spacing ) * ( values.related_posts_columns - 1 ) ) / values.related_posts_columns; // eslint-disable-line no-mixed-operators carouselItemCss = ' style="max-width: ' + carouselItemCss + 'px;"'; } html += '<li class="fusion-carousel-item"' + carouselItemCss + '>'; html += '<div class="fusion-carousel-item-wrapper">'; html += item.featured_image; if ( 'title_below_image' === values.related_posts_layout ) { html += '<h4 class="fusion-carousel-title">'; html += '<a class="fusion-related-posts-title-link" href="' + item.link + '" target="_self" title="' + item.title_attr + '">' + item.title + '</a>'; html += '</h4>'; html += '<div class="fusion-carousel-meta">'; html += '<span class="fusion-date">' + item.date + '</span>'; if ( true === item.comments_open ) { html += '<span class="fusion-inline-sep">|</span>'; html += '<span>'; html += item.comments; html += '</span>'; } html += '</div>'; } html += '</div>'; html += '</li>'; } ); return html; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'related-posts single-related-posts fusion-related-tb', style: '' } ), cid = this.model.get( 'cid' ); attr = _.fusionAnimations( values, attr ); if ( values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } attr[ 'class' ] += ' fusion-related-tb-' + cid; if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } return attr; }, /** * Builds carousel nav. * * @since 2.2 * @return {string} */ buildCarouselNav: function() { var output = ''; output += '<div class="fusion-carousel-nav">'; output += '<span class="fusion-nav-prev"></span>'; output += '<span class="fusion-nav-next"></span>'; output += '</div>'; return output; }, /** * Builds carousel attributes. * * @since 2.0 * @param {Object} values - The values. * @return {Object} */ buildCarouselAttrs: function( values ) { var attr = { class: 'fusion-carousel' }; if ( 'title_below_image' === values.related_posts_layout ) { attr[ 'class' ] += ' fusion-carousel-title-below-image'; } attr[ 'data-imagesize' ] = ( 'cropped' === values.related_posts_image_size ) ? 'fixed' : 'auto'; /** * Set the meta content variable. */ attr[ 'data-metacontent' ] = ( 'title_on_rollover' === values.related_posts_layout ) ? 'no' : 'yes'; /** * Set the autoplay variable. */ attr[ 'data-autoplay' ] = ( values.related_posts_autoplay ) ? 'yes' : 'no'; /** * Set the touch scroll variable. */ attr[ 'data-touchscroll' ] = ( values.related_posts_swipe ) ? 'yes' : 'no'; attr[ 'data-columns' ] = values.related_posts_columns; attr[ 'data-itemmargin' ] = parseInt( values.related_posts_column_spacing ) + 'px'; attr[ 'data-itemwidth' ] = 180; attr[ 'data-touchscroll' ] = 'yes'; attr[ 'data-scrollitems' ] = ( 0 == values.related_posts_swipe_items ) ? '' : values.related_posts_swipe_items; return attr; }, /** * Get section title based on the post type. * * @since 2.2 * @return {string} */ getSectionTitle: function() { var sectionTitle = fusionBuilderText.related_posts; if ( 'undefined' !== typeof FusionApp.data.examplePostDetails ) { if ( 'avada_portfolio' === FusionApp.data.examplePostDetails.post_type ) { sectionTitle = fusionBuilderText.related_projects; } else if ( 'avada_faq' === FusionApp.data.examplePostDetails.post_type ) { sectionTitle = fusionBuilderText.related_faqs; } } return sectionTitle; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Related Component View. FusionPageBuilder.fusion_tb_archives = FusionPageBuilder.fusion_blog.extend( { onInit: function() { var output, markupIsEmpty, markupIsPlaceholder; this.filterTemplateAtts = this._filterTemplateAtts( this.filterTemplateAtts ); output = this.model.attributes.markup && this.model.attributes.markup.output; markupIsEmpty = '' === output; markupIsPlaceholder = output && output.includes( 'fusion-builder-placeholder' ); if ( markupIsEmpty || markupIsPlaceholder ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ _filterTemplateAtts: function( filterTemplateAtts ) { var self = this; return function( atts ) { atts.params.show_title = 'yes'; atts = filterTemplateAtts.call( self, atts ); atts.placeholder = self.getComponentPlaceholder(); return atts; }; }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_blog', this.model.attributes.cid ); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Price Component View. FusionPageBuilder.fusion_tb_woo_price = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { var borderRadiusTopLeft = 'undefined' !== typeof values.border_radius_top_left && '' !== values.border_radius_top_left ? _.fusionGetValueWithUnit( values.border_radius_top_left ) : '0px', borderRadiusTopRight = 'undefined' !== typeof values.border_radius_top_right && '' !== values.border_radius_top_right ? _.fusionGetValueWithUnit( values.border_radius_top_right ) : '0px', borderRadiusBottomRight = 'undefined' !== typeof values.border_radius_bottom_right && '' !== values.border_radius_bottom_right ? _.fusionGetValueWithUnit( values.border_radius_bottom_right ) : '0px', borderRadiusBottomLeft = 'undefined' !== typeof values.border_radius_bottom_left && '' !== values.border_radius_bottom_left ? _.fusionGetValueWithUnit( values.border_radius_bottom_left ) : '0px'; values.border_radius = borderRadiusTopLeft + ' ' + borderRadiusTopRight + ' ' + borderRadiusBottomRight + ' ' + borderRadiusBottomLeft; values.border_radius = ( '0px 0px 0px 0px' === values.border_radius ) ? '' : values.border_radius; values.badge_border_size = _.fusionValidateAttrValue( values.badge_border_size, 'px' ); }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-price-tb fusion-woo-price-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values.alignment ) { attr.style += 'justify-content:' + values.alignment + ';'; } if ( 'yes' !== values.show_sale ) { attr[ 'class' ] += ' hide-sale'; } if ( '0px' !== values.badge_border_size ) { attr[ 'class' ] += ' has-border'; } if ( '' !== values.sale_position ) { attr[ 'class' ] += ' sale-position-' + values.sale_position; } if ( '' !== values.layout ) { attr[ 'class' ] += ' ' + values.layout; } if ( '' !== values.badge_position && 'no' !== values.show_badge ) { attr[ 'class' ] += ' has-badge badge-position-' + values.badge_position; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Adds CSS property to object. * * @since 3.2 * @param {String} selectors - The CSS selectors. * @param {String} property - The CSS property. * @param {String} value - The CSS property value. * @param {Bool} important - Should have important tag. * @return {void} */ addCssProperty: function ( selectors, property, value, important ) { if ( 'object' === typeof selectors ) { selectors = Object.values( selectors ); } if ( 'object' === typeof selectors ) { selectors = selectors.join( ',' ); } if ( 'object' !== typeof this.dynamic_css[ selectors ] ) { this.dynamic_css[ selectors ] = {}; } if ( 'undefined' !== typeof important && important ) { value += ' !important'; } if ( 'undefined' === typeof this.dynamic_css[ selectors ][ property ] || ( 'undefined' !== typeof important && important ) || ! this.dynamic_css[ selectors ][ property ].includes( 'important' ) ) { this.dynamic_css[ selectors ][ property ] = value; } }, /** * Checks if param has got default value or not. * * @since 3.2 * @param {String} param - The param. * @return {Bool} */ isDefault: function( param ) { return this.values[ param ] === fusionAllElements.fusion_tb_woo_price.defaults[ param ]; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-price-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_price ) { output = atts.query_data.woo_price; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, selectors, fontStyles = {}, self = this; this.baseSelector = '.fusion-woo-price-tb.fusion-woo-price-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; selectors = [ this.baseSelector + ' .price', this.baseSelector + ' .price ins .amount', this.baseSelector + ' .price del .amount', this.baseSelector + ' .price > .amount' ]; if ( ! this.isDefault( 'price_font_size' ) ) { this.addCssProperty( selectors, 'font-size', values.price_font_size ); } if ( ! this.isDefault( 'price_color' ) ) { this.addCssProperty( selectors, 'color', values.price_color ); } fontStyles = _.fusionGetFontStyle( 'price_typography', values, 'object' ); jQuery.each( fontStyles, function( rule, value ) { self.addCssProperty( selectors, rule, value ); } ); if ( ! this.isDefault( 'sale_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .price del .amount', 'font-size', values.sale_font_size ); } if ( ! this.isDefault( 'sale_color' ) ) { this.addCssProperty( this.baseSelector + ' .price del .amount', 'color', values.sale_color ); } fontStyles = _.fusionGetFontStyle( 'sale_typography', values, 'object' ); jQuery.each( fontStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .price del .amount', rule, value ); } ); if ( ! this.isDefault( 'stock_font_size' ) ) { this.addCssProperty( this.baseSelector + ' p.stock', 'font-size', values.stock_font_size ); } if ( ! this.isDefault( 'stock_color' ) ) { this.addCssProperty( this.baseSelector + ' p.stock', 'color', values.stock_color ); } fontStyles = _.fusionGetFontStyle( 'stock_typography', values, 'object' ); jQuery.each( fontStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' p.stock', rule, value ); } ); if ( ! this.isDefault( 'badge_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'font-size', values.badge_font_size ); } if ( ! this.isDefault( 'badge_text_color' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'color', values.badge_text_color ); } fontStyles = _.fusionGetFontStyle( 'badge_typography', values, 'object' ); jQuery.each( fontStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .fusion-onsale', rule, value ); } ); if ( ! this.isDefault( 'badge_bg_color' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'background', values.badge_bg_color ); } if ( ! this.isDefault( 'badge_border_size' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'border-width', values.badge_border_size ); } if ( ! this.isDefault( 'badge_border_color' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'border-color', values.badge_border_color ); } if ( ! this.isDefault( 'badge_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'font-size', values.badge_font_size ); } if ( values.border_radius && '' !== values.border_radius ) { this.addCssProperty( this.baseSelector + ' .fusion-onsale', 'border-radius', values.border_radius ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; }, /** * Parses CSS. * * @since 3.2 * @return {String} */ parseCSS: function () { var css = ''; if ( 'object' !== typeof this.dynamic_css ) { return ''; } _.each( this.dynamic_css, function ( properties, selector ) { if ( 'object' === typeof properties ) { css += selector + '{'; _.each( properties, function ( value, property ) { css += property + ':' + value + ';'; } ); css += '}'; } } ); return css; } } ); } ); }( jQuery ) ); ;/* global fusionSanitize */ /* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Cart Component View. FusionPageBuilder.fusion_tb_woo_cart = FusionPageBuilder.ElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { // Split border width into 4. if ( 'undefined' === typeof params.button_border_top && 'undefined' !== typeof params.button_border_width && '' !== params.button_border_width ) { params.button_border_top = parseInt( params.button_border_width ) + 'px'; params.button_border_right = params.button_border_top; params.button_border_bottom = params.button_border_top; params.button_border_left = params.button_border_top; delete params.button_border_width; } this.model.set( 'params', params ); } this.variationMarkup = this.$el.length && this.$el.find( '.single_variation_wrap' ).length ? this.$el.find( '.single_variation_wrap' ).html() : ''; }, beforePatch: function() { this.variationMarkup = this.$el.length && this.$el.find( '.single_variation_wrap' ).length ? this.$el.find( '.single_variation_wrap' ).html() : ''; }, afterPatch: function() { var $form = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.variations_form' ) ), self = this; setTimeout( function() { self._refreshJs(); }, 10 ); if ( $form.length && 'function' === typeof $form.wc_variation_form ) { $form.wc_variation_form(); } if ( 'string' === typeof this.variationMarkup && '' !== this.variationMarkup ) { setTimeout( function() { self.$el.find( '.single_variation_wrap' ).html( self.variationMarkup ); self.$el.find( '.single_variation' ).css( 'display', 'flex' ); }, 300 ); } }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.values = atts.values; this.params = this.model.get( 'params' ); this.extras = atts.extras; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = { 'class': 'fusion-woo-cart fusion-woo-cart-' + this.model.get( 'cid' ) }; if ( ! this.$el.closest( 'body' ).hasClass( 'woocommerce' ) ) { attr[ 'class' ] += ' woocommerce'; } attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); attr = _.fusionAnimations( values, attr ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } if ( 'no' === values.show_price ) { attr[ 'class' ] += ' hide-price'; } if ( 'no' === values.show_stock ) { attr[ 'class' ] += ' hide-stock'; } return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-cart' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.markup ) { output = atts.query_data.markup; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { // variables into current scope var table, table_td, stock, label, table_tr, self = this, headingStyles = {}, select, arrow, both, border_colors, color_swatch, image_swatch, button_swatch, swatches, active_swatches, hover_swatches, direction, hover_color, width, full_swatches, info, description, prices, sales, variation_clear, button_wrapper, quantity_input, quantity_buttons, quantity_both, height, quantity_font, hover_buttons, button, button_size_map, button_dimensions, button_hover, css, image_swatch_radius, color_swatch_radius, map_flex, topMargin, bottomMargin, button_wrapper_quantity; this.baseSelector = '.fusion-woo-cart-' + this.model.get( 'cid' ); this.dynamic_css = {}; // Variation margins. table = this.baseSelector + ' table.variations'; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( table, 'margin-top', _.fusionGetValueWithUnit( this.values.margin_top ) ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( table, 'margin-right', _.fusionGetValueWithUnit( this.values.margin_right ) ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( table, 'margin-bottom', _.fusionGetValueWithUnit( this.values.margin_bottom ) ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( table, 'margin-left', _.fusionGetValueWithUnit( this.values.margin_left ) ); } table_td = this.baseSelector + ' table td'; // Border size. if ( !this.isDefault( 'border_sizes_top' ) ) { this.addCssProperty( table_td, 'border-top-width', _.fusionGetValueWithUnit( this.values.border_sizes_top ) ); } if ( !this.isDefault( 'border_sizes_right' ) ) { this.addCssProperty( table_td, 'border-right-width', _.fusionGetValueWithUnit( this.values.border_sizes_right ) ); } if ( !this.isDefault( 'border_sizes_bottom' ) ) { this.addCssProperty( table_td, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.border_sizes_bottom ) ); } if ( !this.isDefault( 'border_sizes_left' ) ) { this.addCssProperty( table_td, 'border-left-width', _.fusionGetValueWithUnit( this.values.border_sizes_left ) ); } if ( !this.isDefault( 'border_color' ) ) { this.addCssProperty( table_td, 'border-color', this.values.border_color ); } if ( !this.isDefault( 'cell_padding_top' ) ) { this.addCssProperty( table_td, 'padding-top', _.fusionGetValueWithUnit( this.values.cell_padding_top ) ); } if ( !this.isDefault( 'cell_padding_right' ) ) { this.addCssProperty( table_td, 'padding-right', _.fusionGetValueWithUnit( this.values.cell_padding_right ) ); } if ( !this.isDefault( 'cell_padding_bottom' ) ) { this.addCssProperty( table_td, 'padding-bottom', _.fusionGetValueWithUnit( this.values.cell_padding_bottom ) ); } if ( !this.isDefault( 'cell_padding_left' ) ) { this.addCssProperty( table_td, 'padding-left', _.fusionGetValueWithUnit( this.values.cell_padding_left ) ); } if ( !this.isDefault( 'cell_background' ) ) { this.addCssProperty( table_td, 'background-color', this.values.cell_background ); } label = this.baseSelector + ' td.label'; if ( 'floated' !== this.values.variation_layout ) { table_tr = this.baseSelector + ' table tr'; this.addCssProperty( table_tr, 'display', 'flex' ); this.addCssProperty( table_tr, 'flex-direction', 'column' ); this.addCssProperty( table_tr, 'width', '100%' ); } else if ( !this.isDefault( 'label_area_width' ) ) { this.addCssProperty( label, 'width', _.fusionGetValueWithUnit( this.values.label_area_width ) ); } if ( !this.isDefault( 'text_align' ) ) { this.addCssProperty( label, 'text-align', this.values.text_align ); map_flex = { center: 'center', left: ( jQuery( 'body' ).hasClass( 'rtl' ) ? 'flex-end' : 'flex-start' ), right: ( jQuery( 'body' ).hasClass( 'rtl' ) ? 'flex-start' : 'flex-end' ) }; this.addCssProperty( table + ' .avada-select-wrapper', 'justify-content', map_flex[ this.values.text_align ] ); } // Label text styling, share with grouped. label = [ this.baseSelector + ' td.label', this.baseSelector + ' .woocommerce-grouped-product-list label', this.baseSelector + ' .woocommerce-grouped-product-list label a', this.baseSelector + ' .woocommerce-grouped-product-list .amount' ]; if ( !this.isDefault( 'label_color' ) ) { this.addCssProperty( label, 'color', this.values.label_color ); } if ( !this.isDefault( 'label_font_size' ) ) { this.addCssProperty( label, 'font-size', _.fusionGetValueWithUnit( this.values.label_font_size ) ); } headingStyles = _.fusionGetFontStyle( 'label_typography', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( label, rule, value ); } ); if ( !this.isDefault( 'select_style' ) ) { select = table + ' select'; arrow = table + ' .select-arrow'; both = [ select, arrow ]; // Select height. if ( ! this.isDefault( 'select_height' ) ) { this.addCssProperty( select, 'height', _.fusionGetValueWithUnit( this.values.select_height ) ); } if ( ! this.isDefault( 'select_font_size' ) ) { this.addCssProperty( select, 'font-size', _.fusionGetValueWithUnit( this.values.select_font_size ) ); this.addCssProperty( arrow, 'font-size', 'calc( ( ' + _.fusionGetValueWithUnit( this.values.select_font_size ) + ' ) * .75 )', true ); } if ( ! this.isDefault( 'select_color' ) ) { this.addCssProperty( both, 'color', this.values.select_color ); } if ( ! this.isDefault( 'select_background' ) ) { this.addCssProperty( select, 'background-color', this.values.select_background ); } if ( ! this.isDefault( 'select_border_color' ) ) { border_colors = [ select, select + ':focus' ]; this.addCssProperty( border_colors, 'border-color', this.values.select_border_color ); } if ( ! this.isDefault( 'select_border_sizes_top' ) && '' !== this.values.select_border_sizes_top ) { this.addCssProperty( select, 'border-top-width', _.fusionGetValueWithUnit( this.values.select_border_sizes_top ) ); this.addCssProperty( arrow, 'top', _.fusionGetValueWithUnit( this.values.select_border_sizes_top ) ); } if ( ! this.isDefault( 'select_border_sizes_right' ) && '' !== this.values.select_border_sizes_right ) { this.addCssProperty( select, 'border-right-width', _.fusionGetValueWithUnit( this.values.select_border_sizes_right ) ); } if ( ! this.isDefault( 'select_border_sizes_bottom' ) && '' !== this.values.select_border_sizes_bottom ) { this.addCssProperty( select, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.select_border_sizes_bottom ) ); this.addCssProperty( arrow, 'bottom', _.fusionGetValueWithUnit( this.values.select_border_sizes_bottom ) ); } if ( ! this.isDefault( 'select_border_sizes_left' ) && '' !== this.values.select_border_sizes_left ) { this.addCssProperty( select, 'border-left-width', _.fusionGetValueWithUnit( this.values.select_border_sizes_left ) ); } if ( ! this.isDefault( 'select_border_color' ) && ! this.isDefault( 'select_border_sizes_right' ) && ! this.isDefault( 'select_border_sizes_left' ) ) { this.addCssProperty( arrow, 'border-left', _.fusionGetValueWithUnit( this.values.select_border_sizes_left ) + ' solid ' + this.values.select_border_color ); } if ( ! this.isDefault( 'border_radius_top_left' ) ) { this.addCssProperty( select, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_left ) ); } if ( ! this.isDefault( 'border_radius_top_right' ) ) { this.addCssProperty( select, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_right' ) ) { this.addCssProperty( select, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_left' ) ) { this.addCssProperty( select, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_left ) ); } } if ( !this.isDefault( 'swatch_style' ) && this.extras.woocommerce_variations ) { color_swatch = table + ' .avada-color-select'; image_swatch = table + ' .avada-image-select'; button_swatch = table + ' .avada-button-select'; swatches = [ color_swatch, image_swatch, button_swatch ]; active_swatches = [ color_swatch + '[data-checked]', image_swatch + '[data-checked]', button_swatch + '[data-checked]' ]; hover_swatches = [ color_swatch + ':hover', image_swatch + ':hover', button_swatch + ':hover', color_swatch + ':focus:not( [data-checked] )', image_swatch + ':focus:not( [data-checked] )', button_swatch + ':focus:not( [data-checked] )' ]; // General swatch styling. if ( !this.isDefault( 'swatch_margin_top' ) ) { this.addCssProperty( swatches, 'margin-top', _.fusionGetValueWithUnit( this.values.swatch_margin_top ) ); } if ( !this.isDefault( 'swatch_margin_right' ) ) { this.addCssProperty( swatches, 'margin-right', _.fusionGetValueWithUnit( this.values.swatch_margin_right ) ); } if ( !this.isDefault( 'swatch_margin_bottom' ) ) { this.addCssProperty( swatches, 'margin-bottom', _.fusionGetValueWithUnit( this.values.swatch_margin_bottom ) ); } if ( !this.isDefault( 'swatch_margin_left' ) ) { this.addCssProperty( swatches, 'margin-left', _.fusionGetValueWithUnit( this.values.swatch_margin_left ) ); } if ( ! this.isDefault( 'swatch_background_color' ) ) { this.addCssProperty( swatches, 'background-color', this.values.swatch_background_color ); } if ( ! this.isDefault( 'swatch_background_color_active' ) ) { this.addCssProperty( active_swatches, 'background-color', this.values.swatch_background_color_active ); } if ( ! this.isDefault( 'swatch_border_sizes_top' ) && '' !== this.values.swatch_border_sizes_top ) { this.addCssProperty( swatches, 'border-top-width', _.fusionGetValueWithUnit( this.values.swatch_border_sizes_top ) ); } if ( ! this.isDefault( 'swatch_border_sizes_right' ) && '' !== this.values.swatch_border_sizes_right ) { this.addCssProperty( swatches, 'border-right-width', _.fusionGetValueWithUnit( this.values.swatch_border_sizes_right ) ); } if ( ! this.isDefault( 'swatch_border_sizes_bottom' ) && '' !== this.values.swatch_border_sizes_bottom ) { this.addCssProperty( swatches, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.swatch_border_sizes_bottom ) ); } if ( ! this.isDefault( 'swatch_border_sizes_left' ) && '' !== this.values.swatch_border_sizes_left ) { this.addCssProperty( swatches, 'border-left-width', _.fusionGetValueWithUnit( this.values.swatch_border_sizes_left ) ); } if ( ! this.isDefault( 'swatch_border_color' ) ) { this.addCssProperty( swatches, 'border-color', this.values.swatch_border_color ); } if ( ! this.isDefault( 'swatch_border_color_active' ) ) { this.addCssProperty( active_swatches, 'border-color', this.values.swatch_border_color_active ); hover_color = jQuery.AWB_Color( this.values.swatch_border_color_active ).alpha( 0.5 ).toRgbaString(); this.addCssProperty( hover_swatches, 'border-color', hover_color ); } if ( ! this.isDefault( 'color_swatch_height' ) ) { this.addCssProperty( color_swatch, 'height', _.fusionGetValueWithUnit( this.values.color_swatch_height ) ); } if ( ! this.isDefault( 'color_swatch_width' ) ) { width = ( 'auto' === this.values.color_swatch_width ) ? 'auto' : _.fusionGetValueWithUnit( this.values.color_swatch_width ); this.addCssProperty( color_swatch, 'width', width ); } if ( ! this.isDefault( 'color_swatch_padding_top' ) && '' !== this.values.color_swatch_padding_top ) { this.addCssProperty( color_swatch, 'padding-top', _.fusionGetValueWithUnit( this.values.color_swatch_padding_top ) ); } if ( ! this.isDefault( 'color_swatch_padding_right' ) && '' !== this.values.color_swatch_padding_right ) { this.addCssProperty( color_swatch, 'padding-right', _.fusionGetValueWithUnit( this.values.color_swatch_padding_right ) ); } if ( ! this.isDefault( 'color_swatch_padding_bottom' ) && '' !== this.values.color_swatch_padding_bottom ) { this.addCssProperty( color_swatch, 'padding-bottom', _.fusionGetValueWithUnit( this.values.color_swatch_padding_bottom ) ); } if ( ! this.isDefault( 'color_swatch_padding_left' ) && '' !== this.values.color_swatch_padding_left ) { this.addCssProperty( color_swatch, 'padding-left', _.fusionGetValueWithUnit( this.values.color_swatch_padding_left ) ); } color_swatch_radius = [ color_swatch, color_swatch + ' span' ]; if ( ! this.isDefault( 'color_swatch_border_radius_top_left' ) ) { this.addCssProperty( color_swatch_radius, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.color_swatch_border_radius_top_left ) ); } if ( ! this.isDefault( 'color_swatch_border_radius_top_right' ) ) { this.addCssProperty( color_swatch_radius, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.color_swatch_border_radius_top_right ) ); } if ( ! this.isDefault( 'color_swatch_border_radius_bottom_right' ) ) { this.addCssProperty( color_swatch_radius, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.color_swatch_border_radius_bottom_right ) ); } if ( ! this.isDefault( 'color_swatch_border_radius_bottom_left' ) ) { this.addCssProperty( color_swatch_radius, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.color_swatch_border_radius_bottom_left ) ); } if ( ! this.isDefault( 'image_swatch_height' ) ) { this.addCssProperty( image_swatch, 'height', _.fusionGetValueWithUnit( this.values.image_swatch_height ) ); } if ( ! this.isDefault( 'image_swatch_width' ) ) { width = ( 'auto' === this.values.image_swatch_width ) ? 'auto' : _.fusionGetValueWithUnit( this.values.image_swatch_width ); this.addCssProperty( image_swatch, 'width', width ); if ( 'auto' !== this.values.image_swatch_width ) { this.addCssProperty( image_swatch + ' img', 'width', '100%' ); } } if ( ! this.isDefault( 'image_swatch_padding_top' ) && '' !== this.values.image_swatch_padding_top ) { this.addCssProperty( image_swatch, 'padding-top', _.fusionGetValueWithUnit( this.values.image_swatch_padding_top ) ); } if ( ! this.isDefault( 'image_swatch_padding_right' ) && '' !== this.values.image_swatch_padding_right ) { this.addCssProperty( image_swatch, 'padding-right', _.fusionGetValueWithUnit( this.values.image_swatch_padding_right ) ); } if ( ! this.isDefault( 'image_swatch_padding_bottom' ) && '' !== this.values.image_swatch_padding_bottom ) { this.addCssProperty( image_swatch, 'padding-bottom', _.fusionGetValueWithUnit( this.values.image_swatch_padding_bottom ) ); } if ( ! this.isDefault( 'image_swatch_padding_left' ) && '' !== this.values.image_swatch_padding_left ) { this.addCssProperty( image_swatch, 'padding-left', _.fusionGetValueWithUnit( this.values.image_swatch_padding_left ) ); } image_swatch_radius = [ image_swatch, image_swatch + ' img' ]; if ( ! this.isDefault( 'image_swatch_border_radius_top_left' ) ) { this.addCssProperty( image_swatch_radius, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.image_swatch_border_radius_top_left ) ); } if ( ! this.isDefault( 'image_swatch_border_radius_top_right' ) ) { this.addCssProperty( image_swatch_radius, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.image_swatch_border_radius_top_right ) ); } if ( ! this.isDefault( 'image_swatch_border_radius_bottom_right' ) ) { this.addCssProperty( image_swatch_radius, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.image_swatch_border_radius_bottom_right ) ); } if ( ! this.isDefault( 'image_swatch_border_radius_bottom_left' ) ) { this.addCssProperty( image_swatch_radius, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.image_swatch_border_radius_bottom_left ) ); } if ( ! this.isDefault( 'button_swatch_height' ) ) { this.addCssProperty( button_swatch, 'height', _.fusionGetValueWithUnit( this.values.button_swatch_height ) ); } if ( ! this.isDefault( 'button_swatch_width' ) ) { width = ( 'auto' === this.values.button_swatch_width ) ? 'auto' : _.fusionGetValueWithUnit( this.values.button_swatch_width ); this.addCssProperty( button_swatch, 'width', width ); } if ( ! this.isDefault( 'button_swatch_padding_top' ) && '' !== this.values.button_swatch_padding_top ) { this.addCssProperty( button_swatch, 'padding-top', _.fusionGetValueWithUnit( this.values.button_swatch_padding_top ) ); } if ( ! this.isDefault( 'button_swatch_padding_right' ) && '' !== this.values.button_swatch_padding_right ) { this.addCssProperty( button_swatch, 'padding-right', _.fusionGetValueWithUnit( this.values.button_swatch_padding_right ) ); } if ( ! this.isDefault( 'button_swatch_padding_bottom' ) && '' !== this.values.button_swatch_padding_bottom ) { this.addCssProperty( button_swatch, 'padding-bottom', _.fusionGetValueWithUnit( this.values.button_swatch_padding_bottom ) ); } if ( ! this.isDefault( 'button_swatch_padding_left' ) && '' !== this.values.button_swatch_padding_left ) { this.addCssProperty( button_swatch, 'padding-left', _.fusionGetValueWithUnit( this.values.button_swatch_padding_left ) ); } if ( ! this.isDefault( 'button_swatch_border_radius_top_left' ) ) { this.addCssProperty( button_swatch, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.button_swatch_border_radius_top_left ) ); } if ( ! this.isDefault( 'button_swatch_border_radius_top_right' ) ) { this.addCssProperty( button_swatch, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.button_swatch_border_radius_top_right ) ); } if ( ! this.isDefault( 'button_swatch_border_radius_bottom_right' ) ) { this.addCssProperty( button_swatch, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.button_swatch_border_radius_bottom_right ) ); } if ( ! this.isDefault( 'button_swatch_border_radius_bottom_left' ) ) { this.addCssProperty( button_swatch, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.button_swatch_border_radius_bottom_left ) ); } if ( ! this.isDefault( 'button_swatch_font_size' ) ) { this.addCssProperty( button_swatch, 'font-size', _.fusionGetValueWithUnit( this.values.button_swatch_font_size ) ); } if ( ! this.isDefault( 'button_swatch_color' ) ) { this.addCssProperty( button_swatch, 'color', this.values.button_swatch_color ); } if ( ! this.isDefault( 'button_swatch_color_active' ) ) { full_swatches = [ color_swatch + '[data-checked]', image_swatch + '[data-checked]', button_swatch + '[data-checked]', color_swatch + ':hover', image_swatch + ':hover', button_swatch + ':hover', color_swatch + ':focus', image_swatch + ':focus', button_swatch + ':focus' ]; this.addCssProperty( full_swatches, 'color', this.values.button_swatch_color_active ); } } info = this.baseSelector + ' .woocommerce-variation'; // Info padding. if ( !this.isDefault( 'info_padding_top' ) ) { this.addCssProperty( info, 'padding-top', _.fusionGetValueWithUnit( this.values.info_padding_top ) ); } if ( !this.isDefault( 'info_padding_right' ) ) { this.addCssProperty( info, 'padding-right', _.fusionGetValueWithUnit( this.values.info_padding_right ) ); } if ( !this.isDefault( 'info_padding_bottom' ) ) { this.addCssProperty( info, 'padding-bottom', _.fusionGetValueWithUnit( this.values.info_padding_bottom ) ); } if ( !this.isDefault( 'info_padding_left' ) ) { this.addCssProperty( info, 'padding-left', _.fusionGetValueWithUnit( this.values.info_padding_left ) ); } if ( !this.isDefault( 'info_background' ) ) { this.addCssProperty( info, 'background-color', this.values.info_background ); } if ( !this.isDefault( 'info_border_sizes_top' ) ) { this.addCssProperty( info, 'border-top-width', _.fusionGetValueWithUnit( this.values.info_border_sizes_top ) ); } if ( !this.isDefault( 'info_border_sizes_right' ) ) { this.addCssProperty( info, 'border-right-width', _.fusionGetValueWithUnit( this.values.info_border_sizes_right ) ); } if ( !this.isDefault( 'info_border_sizes_bottom' ) ) { this.addCssProperty( info, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.info_border_sizes_bottom ) ); } if ( !this.isDefault( 'info_border_sizes_left' ) ) { this.addCssProperty( info, 'border-left-width', _.fusionGetValueWithUnit( this.values.info_border_sizes_left ) ); } if ( !this.isDefault( 'info_border_color' ) ) { this.addCssProperty( info, 'border-color', this.values.info_border_color ); } if ( !this.isDefault( 'info_border_radius_top_left' ) ) { this.addCssProperty( info, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.info_border_radius_top_left ) ); } if ( !this.isDefault( 'info_border_radius_top_right' ) ) { this.addCssProperty( info, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.info_border_radius_top_right ) ); } if ( !this.isDefault( 'info_border_radius_bottom_right' ) ) { this.addCssProperty( info, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.info_border_radius_bottom_right ) ); } if ( !this.isDefault( 'info_border_radius_bottom_left' ) ) { this.addCssProperty( info, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.info_border_radius_bottom_left ) ); } description = info + ' .woocommerce-variation-description'; if ( !this.isDefault( 'info_align' ) ) { this.addCssProperty( info, 'justify-content', this.values.info_align ); direction = jQuery( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left'; if ( 'flex-end' === this.values.info_align ) { direction = jQuery( 'body' ).hasClass( 'rtl' ) ? 'left' : 'right'; } else if ( 'center' === this.values.info_align ) { direction = 'center'; } this.addCssProperty( description, 'text-align', direction ); } if ( !this.isDefault( 'description_color' ) ) { this.addCssProperty( description, 'color', this.values.description_color ); } if ( !this.isDefault( 'description_font_size' ) ) { this.addCssProperty( description, 'font-size', _.fusionGetValueWithUnit( this.values.description_font_size ) ); } headingStyles = _.fusionGetFontStyle( 'description_typography', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( description, rule, value ); } ); if ( 'after' === this.values.description_order ) { this.addCssProperty( description, 'order', '2' ); } // Hide old sale price. if ( 'no' === this.values.show_sale ) { this.addCssProperty( info + ' .price del', 'display', 'none' ); } if ( 'before' === this.values.sale_order ) { this.addCssProperty( info + ' .price del', 'margin-' + ( ( jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'left' : 'right' ), '0.5em' ); } else { this.addCssProperty( info + ' .price', 'flex-direction', 'row-reverse' ); this.addCssProperty( info + ' .price del', 'margin-' + ( ( jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'right' : 'left' ), '0.5em' ); } // Price font size. prices = [ info + ' .price', info + ' .price > .amount', info + ' .price ins > .amount' ]; if ( !this.isDefault( 'price_font_size' ) ) { this.addCssProperty( prices, 'font-size', this.values.price_font_size ); } if ( !this.isDefault( 'price_color' ) ) { this.addCssProperty( prices, 'color', this.values.price_color ); } headingStyles = _.fusionGetFontStyle( 'price_typography', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( prices, rule, value ); } ); sales = [ info + ' .price del .amount', info + ' .price del' ]; if ( !this.isDefault( 'sale_font_size' ) ) { this.addCssProperty( sales, 'font-size', this.values.sale_font_size ); } if ( !this.isDefault( 'sale_color' ) ) { this.addCssProperty( sales, 'color', this.values.sale_color ); } headingStyles = _.fusionGetFontStyle( 'sale_typography', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( sales, rule, value ); } ); stock = [ this.baseSelector + ' .stock', info + ' .woocommerce-variation-availability' ]; if ( !this.isDefault( 'stock_font_size' ) ) { this.addCssProperty( stock, 'font-size', this.values.stock_font_size ); } if ( !this.isDefault( 'stock_color' ) ) { this.addCssProperty( stock, 'color', this.values.stock_color ); } headingStyles = _.fusionGetFontStyle( 'stock_typography', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( stock, rule, value ); } ); variation_clear = this.baseSelector + ' .reset_variations'; if ( 'hide' !== this.values.variation_clear ) { if ( 'absolute' !== this.values.variation_clear ) { this.addCssProperty( variation_clear, 'position', 'static' ); this.addCssProperty( variation_clear, 'display', 'inline-block' ); this.addCssProperty( variation_clear, 'right', 'initial' ); this.addCssProperty( variation_clear, 'top', 'initial' ); if ( 'floated' === this.values.variation_layout ) { topMargin = '' === this.values.clear_margin_top ? '0px' : _.fusionGetValueWithUnit( this.values.clear_margin_top ); bottomMargin = '' === this.values.clear_margin_bottom ? '0px' : _.fusionGetValueWithUnit( this.values.clear_margin_bottom ); this.addCssProperty( this.baseSelector + ' .variations tr:last-of-type td.label', 'padding-bottom', fusionSanitize.add_css_values( [ this.extras.body_font_size, topMargin, bottomMargin ] ) ); } } if ( ! this.isDefault( 'clear_margin_top' ) ) { this.addCssProperty( variation_clear, 'margin-top', _.fusionGetValueWithUnit( this.values.clear_margin_top ) ); } if ( ! this.isDefault( 'clear_margin_right' ) ) { this.addCssProperty( variation_clear, 'margin-right', _.fusionGetValueWithUnit( this.values.clear_margin_right ) ); } if ( ! this.isDefault( 'clear_margin_bottom' ) ) { this.addCssProperty( variation_clear, 'margin-bottom', _.fusionGetValueWithUnit( this.values.clear_margin_bottom ) ); } if ( ! this.isDefault( 'clear_margin_left' ) ) { this.addCssProperty( variation_clear, 'margin-left', _.fusionGetValueWithUnit( this.values.clear_margin_left ) ); } if ( ! this.isDefault( 'clear_color' ) ) { this.addCssProperty( variation_clear, 'color', this.values.clear_color ); } if ( ! this.isDefault( 'clear_color_hover' ) ) { this.addCssProperty( variation_clear + ':hover', 'color', this.values.clear_color_hover ); } } else { this.addCssProperty( variation_clear, 'display', 'none', true ); } // Button area alignment and spacing. button_wrapper = this.baseSelector + ' .fusion-button-wrapper'; // Button alignment. if ( 'stacked' === this.values.button_layout ) { this.addCssProperty( button_wrapper, 'display', 'flex' ); this.addCssProperty( button_wrapper, 'flex-direction', 'column' ); this.addCssProperty( button_wrapper, 'align-items', this.values.button_align ); button_wrapper_quantity = button_wrapper + ' .quantity'; this.addCssProperty( button_wrapper_quantity, 'margin-bottom', '1.2em' ); this.addCssProperty( button_wrapper_quantity, 'margin-right', '0' ); } else if ( !this.isDefault( 'button_justify' ) ) { this.addCssProperty( button_wrapper, 'display', 'flex' ); this.addCssProperty( button_wrapper, 'justify-content', this.values.button_justify ); direction = ( jQuery( 'body' ).hasClass( 'rtl' ) ) ? 'left' : 'right'; this.addCssProperty( button_wrapper + ' .quantity', 'margin-' + direction, '1.2em' ); } if ( !this.isDefault( 'button_margin_top' ) ) { this.addCssProperty( button_wrapper, 'margin-top', _.fusionGetValueWithUnit( this.values.button_margin_top ) ); } if ( !this.isDefault( 'button_margin_right' ) ) { this.addCssProperty( button_wrapper, 'margin-right', _.fusionGetValueWithUnit( this.values.button_margin_right ) ); } if ( !this.isDefault( 'button_margin_bottom' ) ) { this.addCssProperty( button_wrapper, 'margin-bottom', _.fusionGetValueWithUnit( this.values.button_margin_bottom ) ); } if ( !this.isDefault( 'button_margin_left' ) ) { this.addCssProperty( button_wrapper, 'margin-left', _.fusionGetValueWithUnit( this.values.button_margin_left ) ); } if ( !this.isDefault( 'quantity_style' ) ) { quantity_input = '.fusion-body #main ' + this.baseSelector + ' .quantity input[type="number"].qty'; quantity_buttons = '.fusion-body #main ' + this.baseSelector + ' .quantity input[type="button"]'; quantity_both = [ quantity_input, quantity_buttons ]; // Quantity height. height = '36px'; if ( ! this.isDefault( 'quantity_height' ) ) { height = _.fusionGetValueWithUnit( this.values.quantity_height ); this.addCssProperty( quantity_both, 'height', height ); this.addCssProperty( quantity_buttons, 'width', height ); } // Quantity width. width = '36px'; if ( ! this.isDefault( 'quantity_width' ) ) { width = _.fusionGetValueWithUnit( this.values.quantity_width ); if ( -1 !== width.indexOf( '%' ) ) { this.addCssProperty( quantity_input, 'width', 'calc( 100% - ' + height + ' - ' + height + ' )' ); } else { this.addCssProperty( quantity_input, 'width', width ); } } if ( ! this.isDefault( 'quantity_width' ) || ! this.isDefault( 'quantity_height' ) ) { this.addCssProperty( this.baseSelector + ' .quantity', 'width', 'calc( ' + width + ' + ' + height + ' + ' + height + ' )' ); } if ( ! this.isDefault( 'quantity_radius_top_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .minus', 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_top_left ) ); } if ( ! this.isDefault( 'quantity_radius_bottom_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .minus', 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_bottom_left ) ); } if ( ! this.isDefault( 'quantity_radius_top_right' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .plus', 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_top_right ) ); } if ( ! this.isDefault( 'quantity_radius_bottom_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .plus', 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_bottom_right ) ); } if ( ! this.isDefault( 'quantity_font_size' ) ) { quantity_font = [ quantity_input, quantity_buttons, this.baseSelector + ' .quantity' ]; this.addCssProperty( quantity_font, 'font-size', _.fusionGetValueWithUnit( this.values.quantity_font_size ) ); } if ( ! this.isDefault( 'quantity_color' ) ) { this.addCssProperty( quantity_input, 'color', this.values.quantity_color ); } if ( ! this.isDefault( 'quantity_background' ) ) { this.addCssProperty( quantity_input, 'background-color', this.values.quantity_background ); } if ( ! this.isDefault( 'quantity_border_sizes_top' ) ) { this.addCssProperty( quantity_input, 'border-top-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_top ) ); } if ( ! this.isDefault( 'quantity_border_sizes_right' ) ) { this.addCssProperty( quantity_input, 'border-right-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_right ) ); } if ( ! this.isDefault( 'quantity_border_sizes_bottom' ) ) { this.addCssProperty( quantity_input, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_bottom ) ); } if ( ! this.isDefault( 'quantity_border_sizes_left' ) ) { this.addCssProperty( quantity_input, 'border-left-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_left ) ); } if ( ! this.isDefault( 'quantity_border_color' ) ) { this.addCssProperty( quantity_input, 'border-color', this.values.quantity_border_color ); } if ( ! this.isDefault( 'qbutton_border_sizes_top' ) ) { this.addCssProperty( quantity_buttons, 'border-top-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_top ) ); } if ( ! this.isDefault( 'qbutton_border_sizes_right' ) ) { this.addCssProperty( quantity_buttons, 'border-right-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_right ) ); } if ( ! this.isDefault( 'qbutton_border_sizes_bottom' ) ) { this.addCssProperty( quantity_buttons, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_bottom ) ); } if ( ! this.isDefault( 'qbutton_border_sizes_left' ) ) { this.addCssProperty( quantity_buttons, 'border-left-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_left ) ); } if ( ! this.isDefault( 'qbutton_color' ) ) { this.addCssProperty( quantity_buttons, 'color', this.values.qbutton_color ); } if ( ! this.isDefault( 'qbutton_background' ) ) { this.addCssProperty( quantity_buttons, 'background-color', this.values.qbutton_background ); } if ( ! this.isDefault( 'qbutton_border_color' ) ) { this.addCssProperty( quantity_buttons, 'border-color', this.values.qbutton_border_color ); } hover_buttons = quantity_buttons + ':hover'; // Quantity button hover text color. if ( ! this.isDefault( 'qbutton_color_hover' ) ) { this.addCssProperty( hover_buttons, 'color', this.values.qbutton_color_hover ); } if ( ! this.isDefault( 'qbutton_background_hover' ) ) { this.addCssProperty( hover_buttons, 'background-color', this.values.qbutton_background_hover ); } if ( ! this.isDefault( 'qbutton_border_color_hover' ) ) { this.addCssProperty( hover_buttons, 'border-color', this.values.qbutton_border_color_hover ); } } if ( !this.isDefault( 'button_style' ) ) { button = '.fusion-body ' + this.baseSelector + ' .fusion-button-wrapper .button'; // Button size. if ( ! this.isDefault( 'button_size' ) ) { button_size_map = { small: { padding: '9px 20px', line_height: '14px', font_size: '12px' }, medium: { padding: '11px 23px', line_height: '16px', font_size: '13px' }, large: { padding: '13px 29px', line_height: '17px', font_size: '14px' }, xlarge: { padding: '17px 40px', line_height: '21px', font_size: '18px' } }; if ( 'object' === typeof button_size_map[ this.values.button_size ] ) { button_dimensions = button_size_map[ this.values.button_size ]; this.addCssProperty( button, 'padding', button_dimensions.padding ); this.addCssProperty( button, 'line-height', button_dimensions.line_height ); this.addCssProperty( button, 'font-size', button_dimensions.font_size ); } } if ( ! this.isDefault( 'button_stretch' ) ) { this.addCssProperty( button, 'flex', '1' ); this.addCssProperty( button, 'width', '100%' ); } if ( ! this.isDefault( 'button_border_top' ) ) { this.addCssProperty( button, 'border-top-width', _.fusionGetValueWithUnit( this.values.button_border_top ) ); } if ( ! this.isDefault( 'button_border_right' ) ) { this.addCssProperty( button, 'border-right-width', _.fusionGetValueWithUnit( this.values.button_border_right ) ); } if ( ! this.isDefault( 'button_border_bottom' ) ) { this.addCssProperty( button, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.button_border_bottom ) ); } if ( ! this.isDefault( 'button_border_left' ) ) { this.addCssProperty( button, 'border-left-width', _.fusionGetValueWithUnit( this.values.button_border_left ) ); } if ( ! this.isDefault( 'button_color' ) ) { this.addCssProperty( button, 'color', this.values.button_color ); } if ( ( 'string' === typeof this.params.button_gradient_top && '' !== this.params.button_gradient_top ) || ( 'string' === typeof this.params.button_gradient_bottom && '' !== this.params.button_gradient_bottom ) ) { this.addCssProperty( button, 'background', this.values.button_gradient_top ); this.addCssProperty( button, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom + ', ' + this.values.button_gradient_top + ' )' ); } if ( ! this.isDefault( 'button_border_color' ) ) { this.addCssProperty( button, 'border-color', this.values.button_border_color ); } button_hover = button + ':hover'; // Button hover text color if ( ! this.isDefault( 'button_color_hover' ) ) { this.addCssProperty( button_hover, 'color', this.values.button_color_hover ); } if ( ( 'string' === typeof this.params.button_gradient_top_hover && '' !== this.params.button_gradient_top_hover ) || ( 'string' === typeof this.params.button_gradient_bottom_hover && '' !== this.params.button_gradient_bottom_hover ) ) { this.addCssProperty( button_hover, 'background', this.values.button_gradient_top_hover ); this.addCssProperty( button_hover, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom_hover + ', ' + this.values.button_gradient_top_hover + ' )' ); } if ( ! this.isDefault( 'button_border_color_hover' ) ) { this.addCssProperty( button_hover, 'border-color', this.values.button_border_color_hover ); } } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Stock Component View. FusionPageBuilder.fusion_tb_woo_stock = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.stock_font_size = _.fusionValidateAttrValue( values.stock_font_size, 'px' ); }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-stock-tb fusion-woo-stock-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-stock-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_stock ) { output = atts.query_data.woo_stock; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var styles = '<style type="text/css">'; if ( '' !== values.stock_font_size ) { styles += '.fusion-woo-stock-tb.fusion-woo-stock-tb-' + this.model.get( 'cid' ) + ' p.stock{ font-size: ' + values.stock_font_size + '}'; } if ( '' !== values.stock_color ) { styles += '.fusion-woo-stock-tb.fusion-woo-stock-tb-' + this.model.get( 'cid' ) + ' p.stock{ color: ' + values.stock_color + '}'; } styles += '</style>'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Rating Component View. FusionPageBuilder.fusion_tb_woo_rating = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { values.icon_size = _.fusionValidateAttrValue( values.icon_size, 'px' ); values.count_font_size = _.fusionValidateAttrValue( values.count_font_size, 'px' ); }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-rating-tb fusion-woo-rating-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( '' !== values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( '' !== values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( '' !== values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( 'yes' !== values.show_count ) { attr[ 'class' ] += ' hide-count'; } if ( '' !== values.alignment ) { attr[ 'class' ] += ' align-' + values.alignment; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-rating-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_rating ) { output = atts.query_data.woo_rating; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var styles = '<style type="text/css">'; if ( '' !== values.icon_size ) { styles += '.fusion-woo-rating-tb.fusion-woo-rating-tb-' + this.model.get( 'cid' ) + ' .woocommerce-product-rating .star-rating {'; styles += 'font-size:' + values.icon_size + ';}'; } if ( '' !== values.icon_color ) { styles += '.fusion-woo-rating-tb.fusion-woo-rating-tb-' + this.model.get( 'cid' ) + ' .woocommerce-product-rating .star-rating:before,'; styles += '.fusion-woo-rating-tb.fusion-woo-rating-tb-' + this.model.get( 'cid' ) + ' .woocommerce-product-rating .star-rating span:before {'; styles += 'color:' + values.icon_color + ';}'; } styles += '.fusion-woo-rating-tb.fusion-woo-rating-tb-' + this.model.get( 'cid' ) + ' .woocommerce-product-rating a.woocommerce-review-link {'; if ( '' !== values.count_font_size ) { styles += 'font-size:' + values.count_font_size + ';'; } if ( '' !== values.count_color ) { styles += 'color:' + values.count_color + ';'; } styles += '}'; if ( '' !== values.count_hover_color ) { styles += '.fusion-woo-rating-tb.fusion-woo-rating-tb-' + this.model.get( 'cid' ) + ' .woocommerce-product-rating a.woocommerce-review-link:hover {'; styles += 'color:' + values.count_hover_color + ';}'; } styles += '</style>'; return styles; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Rating Component View. FusionPageBuilder.fusion_tb_woo_short_description = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-short-description-tb fusion-woo-short-description-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-short-description-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_short_description ) { output = atts.query_data.woo_short_description; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var css, self = this, textStyles = {}; this.baseSelector = '.fusion-woo-short-description-tb.fusion-woo-short-description-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; // Text styles. if ( ! this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-product-details__short-description', 'color', values.text_color ); } if ( ! this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-product-details__short-description', 'font-size', _.fusionGetValueWithUnit( values.text_font_size ) ); } // Text typography styles. textStyles = _.fusionGetFontStyle( 'text_font', values, 'object' ); jQuery.each( textStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .woocommerce-product-details__short-description', rule, value ); } ); jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, side ) { var marginName = 'margin_' + side; // Element margin. if ( '' !== values[ marginName ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( values[ marginName ] ) ); } } ); css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* eslint no-mixed-spaces-and-tabs: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Rating Component View. FusionPageBuilder.fusion_tb_woo_reviews = FusionPageBuilder.ElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { // Split border width into 4. if ( 'undefined' === typeof params.button_border_top && 'undefined' !== typeof params.button_border_width && '' !== params.button_border_width ) { params.button_border_top = parseInt( params.button_border_width ) + 'px'; params.button_border_right = params.button_border_top; params.button_border_bottom = params.button_border_top; params.button_border_left = params.button_border_top; delete params.button_border_width; } this.model.set( 'params', params ); } }, /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var $this = this; jQuery( window ).on( 'load', function() { $this._refreshJs(); } ); }, refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).find( '.fusion-builder-live-element[data-cid="' + this.model.get( 'cid' ) + '"] ' ).find( '.comment-form-rating select[name="rating"]:visible' ).trigger( 'init' ); }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; this.params = this.model.get( 'params' ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-reviews-tb fusion-woo-reviews-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'no' == values.show_tab_title ) { attr[ 'class' ] += ' woo-reviews-hide-heading'; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-reviews-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_reviews ) { output = atts.query_data.woo_reviews; } return this.disableInlineScripts( output ); }, /** * Disables inline scripts. * * @since 3.2 * @param {String} output - The output string. * @return {String} */ disableInlineScripts: function( output ) { if ( -1 !== output.indexOf( '<script' ) && -1 !== output.indexOf( '</script>' ) ) { output = output.replace( '<script', '<!--<script' ).replace( '</script>', '</script>-->' ); } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var self = this, textStyles = {}, css = '', button, button_hover, button_size_map, button_dimensions, hasBorder = false; this.baseSelector = '.fusion-woo-reviews-tb.fusion-woo-reviews-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, side ) { var marginName = 'margin_' + side; // Element margin. if ( '' !== values[ marginName ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( values[ marginName ] ) ); } } ); // Text styles. if ( ! this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector, 'color', this.values.text_color ); this.addCssProperty( '#wrapper ' + this.baseSelector + ' .meta', 'color', this.values.text_color ); this.addCssProperty( [ this.baseSelector + ' .stars a', this.baseSelector + ' .stars a:after' ], 'color', this.values.text_color ); } if ( ! this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector, 'font-size', _.fusionGetValueWithUnit( this.values.text_font_size ) ); } // Text typography styles. textStyles = _.fusionGetFontStyle( 'text_font', values, 'object' ); jQuery.each( textStyles, function( rule, value ) { self.addCssProperty( self.baseSelector, rule, value ); } ); // Border. if ( ! this.isDefault( 'border_size' ) ) { this.addCssProperty( this.baseSelector + ' #reviews li .comment-text', 'border-width', this.values.border_size + 'px' ); } if ( ! this.isDefault( 'border_color' ) ) { this.addCssProperty( this.baseSelector + ' #reviews li .comment-text', 'border-color', this.values.border_color ); } // Stars color. if ( ! this.isDefault( 'stars_color' ) ) { this.addCssProperty( this.baseSelector + ' .comment-text .star-rating:before', 'color', this.values.stars_color ); this.addCssProperty( this.baseSelector + ' .comment-text .star-rating span:before', 'color', this.values.stars_color ); } if ( ! this.isDefault( 'rating_box_bg_color' ) ) { this.addCssProperty( this.baseSelector + ' .stars > span > a', 'background-color', this.values.rating_box_bg_color ); } if ( ! this.isDefault( 'rating_box_active_bg_color' ) ) { this.addCssProperty( this.baseSelector + ' .stars > span > a:hover', 'background-color', this.values.rating_box_active_bg_color ); this.addCssProperty( this.baseSelector + ' .stars > span > a.active', 'background-color', this.values.rating_box_active_bg_color ); } if ( !this.isDefault( 'button_style' ) ) { button = '.fusion-body ' + this.baseSelector + ' #reviews input#submit.submit'; // Button size. if ( ! this.isDefault( 'button_size' ) ) { button_size_map = { small: { padding: '9px 20px', line_height: '14px', font_size: '12px' }, medium: { padding: '11px 23px', line_height: '16px', font_size: '13px' }, large: { padding: '13px 29px', line_height: '17px', font_size: '14px' }, xlarge: { padding: '17px 40px', line_height: '21px', font_size: '18px' } }; if ( 'object' === typeof button_size_map[ this.values.button_size ] ) { button_dimensions = button_size_map[ this.values.button_size ]; this.addCssProperty( button, 'padding', button_dimensions.padding ); this.addCssProperty( button, 'line-height', button_dimensions.line_height ); this.addCssProperty( button, 'font-size', button_dimensions.font_size ); } } if ( ! this.isDefault( 'button_stretch' ) ) { this.addCssProperty( button, 'flex', '1' ); this.addCssProperty( button, 'width', '100%' ); } if ( ! this.isDefault( 'button_border_top' ) ) { hasBorder = true; this.addCssProperty( button, 'border-top-width', _.fusionGetValueWithUnit( this.values.button_border_top ) ); } if ( ! this.isDefault( 'button_border_right' ) ) { hasBorder = true; this.addCssProperty( button, 'border-right-width', _.fusionGetValueWithUnit( this.values.button_border_right ) ); } if ( ! this.isDefault( 'button_border_bottom' ) ) { hasBorder = true; this.addCssProperty( button, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.button_border_bottom ) ); } if ( ! this.isDefault( 'button_border_left' ) ) { hasBorder = true; this.addCssProperty( button, 'border-left-width', _.fusionGetValueWithUnit( this.values.button_border_left ) ); } if ( hasBorder ) { this.addCssProperty( button, 'border-style', 'solid' ); } if ( ! this.isDefault( 'button_color' ) ) { this.addCssProperty( button, 'color', this.values.button_color ); } if ( ( 'string' === typeof this.params.button_gradient_top && '' !== this.params.button_gradient_top ) || ( 'string' === typeof this.params.button_gradient_bottom && '' !== this.params.button_gradient_bottom ) ) { this.addCssProperty( button, 'background', this.values.button_gradient_top ); this.addCssProperty( button, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom + ', ' + this.values.button_gradient_top + ' )' ); } if ( ! this.isDefault( 'button_border_color' ) ) { this.addCssProperty( button, 'border-color', this.values.button_border_color ); } button_hover = button + ':hover'; // Button hover text color if ( ! this.isDefault( 'button_color_hover' ) ) { this.addCssProperty( button_hover, 'color', this.values.button_color_hover ); } if ( ( 'string' === typeof this.params.button_gradient_top_hover && '' !== this.params.button_gradient_top_hover ) || ( 'string' === typeof this.params.button_gradient_bottom_hover && '' !== this.params.button_gradient_bottom_hover ) ) { this.addCssProperty( button_hover, 'background', this.values.button_gradient_top_hover ); this.addCssProperty( button_hover, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom_hover + ', ' + this.values.button_gradient_top_hover + ' )' ); } if ( ! this.isDefault( 'button_border_color_hover' ) ) { this.addCssProperty( button_hover, 'border-color', this.values.button_border_color_hover ); } } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Rating Component View. FusionPageBuilder.fusion_tb_woo_additional_info = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-additional-info-tb fusion-woo-additional-info-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-additional-info-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_additional_info ) { output = atts.query_data.woo_additional_info; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var self = this, css = '', cellSelectors, headingStyles = {}, textStyles = {}; this.baseSelector = '.fusion-woo-additional-info-tb.fusion-woo-additional-info-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; // Heading styles. if ( ! this.isDefault( 'heading_color' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes tr th', 'color', values.heading_color ); } if ( ! this.isDefault( 'heading_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes tr th', 'font-size', _.fusionGetValueWithUnit( values.heading_font_size ) ); } // Heading typography styles. headingStyles = _.fusionGetFontStyle( 'heading_font', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .shop_attributes tr th', rule, value ); } ); // Text styles. if ( ! this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes tr td', 'color', values.text_color ); } if ( ! this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes tr td', 'font-size', _.fusionGetValueWithUnit( values.text_font_size ) ); } // Text typography styles. textStyles = _.fusionGetFontStyle( 'text_font', values, 'object' ); jQuery.each( textStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .shop_attributes tr td', rule, value ); } ); // Table Border styles. if ( ! this.isDefault( 'border_color' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes tr', 'border-color', values.border_color ); } // Cell background. if ( ! this.isDefault( 'table_cell_backgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes td', 'background-color', values.table_cell_backgroundcolor ); } // Heading background. if ( ! this.isDefault( 'heading_cell_backgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .shop_attributes th', 'background-color', values.heading_cell_backgroundcolor ); } // Table cell selectors. cellSelectors = [ this.baseSelector + ' .shop_attributes tr th', this.baseSelector + ' .shop_attributes tr td' ]; // Get padding. jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, side ) { var cellPaddingName = 'cell_padding_' + side, marginName = 'margin_' + side; // Add content padding to style. if ( '' !== values[ cellPaddingName ] ) { self.addCssProperty( cellSelectors, 'padding-' + side, _.fusionGetValueWithUnit( values[ cellPaddingName ] ) ); } // Element margin. if ( '' !== values[ marginName ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( values[ marginName ] ) ); } } ); css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Rating Component View. FusionPageBuilder.fusion_tb_woo_tabs = FusionPageBuilder.ElementView.extend( { /** * Runs during render() call. * * @since 2.0 * @return {void} */ onRender: function() { var $this = this; jQuery( window ).on( 'load', function() { $this._refreshJs(); } ); }, refreshJs: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).find( '.fusion-builder-live-element[data-cid="' + this.model.get( 'cid' ) + '"] ' ).find( '.wc-tabs-wrapper, .woocommerce-tabs, .comment-form-rating select[name="rating"]:visible' ).trigger( 'init' ); }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock( atts.values ); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-tabs-tb fusion-woo-tabs-tb-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( 'horizontal' === values.layout ) { attr[ 'class' ] += ' woo-tabs-horizontal'; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-tabs-tb' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.woo_tabs ) { output = atts.query_data.woo_tabs; } return this.disableInlineScripts( output ); }, /** * Disables inline scripts. * * @since 3.2 * @param {String} output - The output string. * @return {String} */ disableInlineScripts: function( output ) { if ( -1 !== output.indexOf( '<script' ) && -1 !== output.indexOf( '</script>' ) ) { output = output.replace( '<script', '<!--<script' ).replace( '</script>', '</script>-->' ); } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var self = this, titleSelectors, css, headingStyles = {}, textStyles = {}; this.baseSelector = '.fusion-woo-tabs-tb.fusion-woo-tabs-tb-' + this.model.get( 'cid' ); this.dynamic_css = {}; jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, side ) { var marginName = 'margin_' + side; // Element margin. if ( '' !== values[ marginName ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( values[ marginName ] ) ); } } ); if ( ! this.isDefault( 'backgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .wc-tabs > li.active > a', 'background-color', this.values.backgroundcolor ); this.addCssProperty( this.baseSelector + ' .wc-tabs > li > a:hover', 'background-color', this.values.backgroundcolor ); this.addCssProperty( this.baseSelector + ' .woocommerce-Tabs-panel', 'background-color', this.values.backgroundcolor ); } if ( ! this.isDefault( 'inactivebackgroundcolor' ) ) { this.addCssProperty( this.baseSelector + ' .wc-tabs > li > a', 'background-color', this.values.inactivebackgroundcolor ); } if ( ! this.isDefault( 'active_nav_text_color' ) ) { this.addCssProperty( this.baseSelector + ' .wc-tabs > li.active > a', 'color', this.values.active_nav_text_color ); this.addCssProperty( this.baseSelector + ' .wc-tabs > li > a:hover', 'color', this.values.active_nav_text_color ); } if ( ! this.isDefault( 'inactive_nav_text_color' ) ) { this.addCssProperty( this.baseSelector + ' .wc-tabs > li > a', 'color', this.values.inactive_nav_text_color ); } if ( ! this.isDefault( 'bordercolor' ) ) { if ( 'horizontal' === values.layout ) { this.addCssProperty( this.baseSelector + '.woo-tabs-horizontal .woocommerce-tabs > .tabs .active', 'border-color', this.values.bordercolor ); this.addCssProperty( this.baseSelector + '.woo-tabs-horizontal .woocommerce-tabs > .tabs', 'border-color', this.values.bordercolor ); } else { this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .tabs li a', 'border-color', this.values.bordercolor ); } this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel', 'border-color', this.values.bordercolor ); this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel .shop_attributes tr', 'border-color', this.values.bordercolor ); } // Text styles. if ( ! this.isDefault( 'text_color' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel', 'color', this.values.text_color ); this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel .shop_attributes th', 'color', this.values.text_color ); this.addCssProperty( '#wrapper ' + this.baseSelector + ' .meta', 'color', this.values.text_color ); this.addCssProperty( [ this.baseSelector + ' .stars a', this.baseSelector + ' .stars a:after' ], 'color', this.values.text_color ); } if ( ! this.isDefault( 'text_font_size' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel', 'font-size', _.fusionGetValueWithUnit( this.values.text_font_size ) ); } // Text typography styles. textStyles = _.fusionGetFontStyle( 'text_font', values, 'object' ); jQuery.each( textStyles, function( rule, value ) { self.addCssProperty( self.baseSelector + ' .woocommerce-tabs .panel', rule, value ); } ); // Title styles. titleSelectors = [ '#wrapper ' + this.baseSelector + ' #tab-reviews #reviews .woocommerce-Reviews-title', '#wrapper ' + this.baseSelector + ' .woocommerce-Tabs-panel .fusion-woocommerce-tab-title' ]; if ( ! this.isDefault( 'title_color' ) ) { this.addCssProperty( titleSelectors, 'color', this.values.title_color ); } if ( ! this.isDefault( 'title_font_size' ) ) { this.addCssProperty( titleSelectors, 'font-size', _.fusionGetValueWithUnit( this.values.title_font_size ) ); } // Title typography styles. headingStyles = _.fusionGetFontStyle( 'title_font', values, 'object' ); jQuery.each( headingStyles, function( rule, value ) { self.addCssProperty( titleSelectors, rule, value ); } ); if ( 'vertical' === this.values.layout && ! this.isDefault( 'nav_content_space' ) ) { this.addCssProperty( this.baseSelector + ' .woocommerce-tabs .panel', 'margin-left', 'calc(220px + ' + _.fusionGetValueWithUnit( this.values.nav_content_space ) + ')' ); } // Stars color. if ( ! this.isDefault( 'stars_color' ) ) { this.addCssProperty( this.baseSelector + ' .comment-text .star-rating:before', 'color', this.values.stars_color ); this.addCssProperty( this.baseSelector + ' .comment-text .star-rating span:before', 'color', this.values.stars_color ); } // Get padding. jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, padding ) { var content_padding_name = 'content_padding_' + padding, nav_padding_name = 'nav_padding_' + padding; // Add content padding to style. if ( '' !== self.values[ content_padding_name ] ) { self.addCssProperty( self.baseSelector + ' .woocommerce-tabs .panel', 'padding-' + padding, _.fusionGetValueWithUnit( self.values[ content_padding_name ] ) ); } if ( '' !== self.values[ nav_padding_name ] ) { self.addCssProperty( self.baseSelector + ' .woocommerce-tabs .tabs li a', 'padding-' + padding, _.fusionGetValueWithUnit( self.values[ nav_padding_name ] ) ); } } ); css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Product Component View. FusionPageBuilder.WooProductsView = FusionPageBuilder.ElementView.extend( { onInit: function() { if ( this.model.attributes.markup && '' === this.model.attributes.markup.output ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.validateValues( atts.values ); this.values = atts.values; this.extras = atts.extras; this.query_data = atts.query_data; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.attr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); attributes.layout = atts.values.products_layout; attributes.titleElement = 'yes' === atts.values.heading_enable ? _.buildTitleElement( atts.values, atts.extras, this.getSectionTitle() ) : ''; attributes.carouselAttrs = this.buildCarouselAttrs( atts.values ); attributes.carouselNav = 'yes' === atts.values.products_navigation ? this.buildCarouselNav() : ''; attributes.productsAttrs = this.buildProductsAttrs( atts.values ); attributes.query_data = atts.query_data; // add placeholder. attributes.query_data.placeholder = this.getComponentPlaceholder(); return attributes; }, /** * Modifies the values. * * @since 3.2 * @param {Object} values - The values object. * @return {void} */ validateValues: function( values ) { if ( 'undefined' !== typeof values.margin_top && '' !== values.margin_top ) { values.margin_top = _.fusionGetValueWithUnit( values.margin_top ); } if ( 'undefined' !== typeof values.margin_right && '' !== values.margin_right ) { values.margin_right = _.fusionGetValueWithUnit( values.margin_right ); } if ( 'undefined' !== typeof values.margin_bottom && '' !== values.margin_bottom ) { values.margin_bottom = _.fusionGetValueWithUnit( values.margin_bottom ); } if ( 'undefined' !== typeof values.margin_left && '' !== values.margin_left ) { values.margin_left = _.fusionGetValueWithUnit( values.margin_left ); } }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-products-tb ' + this.shortcode_classname + ' ' + this.shortcode_classname + '-' + this.model.get( 'cid' ), style: '' } ); if ( values.margin_top ) { attr.style += 'margin-top:' + values.margin_top + ';'; } if ( values.margin_right ) { attr.style += 'margin-right:' + values.margin_right + ';'; } if ( values.margin_bottom ) { attr.style += 'margin-bottom:' + values.margin_bottom + ';'; } if ( values.margin_left ) { attr.style += 'margin-left:' + values.margin_left + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds carousel nav. * * @since 3.2 * @return {string} */ buildCarouselNav: function() { var output = ''; output += '<div class="fusion-carousel-nav">'; output += '<span class="fusion-nav-prev"></span>'; output += '<span class="fusion-nav-next"></span>'; output += '</div>'; return output; }, /** * Builds carousel attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildCarouselAttrs: function( values ) { var attr = { class: 'fusion-carousel' }; /** * Set the autoplay variable. */ attr[ 'data-autoplay' ] = values.products_autoplay; /** * Set the touch scroll variable. */ attr[ 'data-touchscroll' ] = values.products_swipe; attr[ 'data-columns' ] = values.products_columns; attr[ 'data-itemmargin' ] = parseInt( values.products_column_spacing ) + 'px'; attr[ 'data-itemwidth' ] = 180; attr[ 'data-scrollitems' ] = ( 0 == values.products_swipe_items ) ? '' : values.products_swipe_items; return attr; }, /** * Builds products UL attributes. * * @since 3.2 * @param {Object} values - The values. * @return {Object} */ buildProductsAttrs: function( values ) { var attr = { class: 'products products-' + values.products_columns }; return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data[ this.shortcode_handle ] ) { output = atts.query_data[ this.shortcode_handle ]; } return output; }, /** * Get section title based on the post type. * * @since 3.2 * @return {string} */ getSectionTitle: function() { return ''; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var css, selectors; this.baseSelector = '.' + this.shortcode_classname + '.' + this.shortcode_classname + '-' + this.model.get( 'cid' ); this.dynamic_css = {}; if ( ! this.isDefault( 'products_layout' ) ) { selectors = [ 'body:not(.fusion-woocommerce-equal-heights):not(.fusion-woo-archive-page-columns-1) ' + this.baseSelector + ' .fusion-carousel .fusion-carousel-item .fusion-carousel-item-wrapper', '.fusion-woocommerce-equal-heights:not(.fusion-woo-archive-page-columns-1) ' + this.baseSelector + ' .products .product' ]; this.addCssProperty( selectors, 'display', 'block' ); selectors = [ '.fusion-woocommerce-equal-heights:not(.fusion-woo-archive-page-columns-1) ' + this.baseSelector + ' .fusion-carousel .fusion-carousel-item .fusion-carousel-item-wrapper' ]; this.addCssProperty( selectors, 'vertical-align', 'top' ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Related Component View. FusionPageBuilder.fusion_tb_woo_related = FusionPageBuilder.WooProductsView.extend( { /** * Define shortcode handle. * * @since 3.2 */ shortcode_handle: 'fusion_tb_woo_related', /** * Define shortcode classname. * * @since 3.2 */ shortcode_classname: 'fusion-woo-related-tb', /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = FusionPageBuilder.WooProductsView.prototype.buildAttr.call( this, values ); attr[ 'class' ] += ' related products'; return attr; }, /** * Get section title based on the post type. * * @since 3.2 * @return {string} */ getSectionTitle: function() { return fusionBuilderText.related_products; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Product Images Component View. FusionPageBuilder.fusion_tb_woo_product_images = FusionPageBuilder.ElementView.extend( { /** * Runs before view DOM is patched. * * @since 3.2 * @return {void} */ beforePatch: function() { var element = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( this.$el.find( '.woocommerce-product-gallery' ) ); if ( 'undefined' !== typeof element.data( 'flexslider' ) ) { element.flexslider( 'destroy' ); } }, /** * Modify template attributes. * * @since 3.2 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Validate values. this.values = atts.values; this.params = this.model.get( 'params' ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.styles = this.buildStyleBlock(); attributes.output = this.buildOutput( atts ); return attributes; }, /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-product-images fusion-woo-product-images-' + this.model.get( 'cid' ), style: '', 'data-zoom_enabled': 'yes' === values.product_images_zoom ? 1 : 0, 'data-photoswipe_enabled': 'woocommerce' === values.product_images_layout ? 1 : 0 } ); if ( '' !== values.alignment ) { attr.style += 'justify-content:' + values.alignment + ';'; } if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-product-images' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.markup ) { output = atts.query_data.markup; } return output; }, /** * Builds styles. * * @since 3.2 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function() { var css; this.baseSelector = '.fusion-woo-product-images-' + this.model.get( 'cid' ); this.dynamic_css = {}; this.addCssProperty( this.baseSelector + ' .woocommerce-product-gallery', 'max-width', _.fusionGetValueWithUnit( this.values.product_images_width ) ); if ( ! this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', _.fusionGetValueWithUnit( this.values.margin_top ) ); } if ( ! this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', _.fusionGetValueWithUnit( this.values.margin_right ) ); } if ( ! this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', _.fusionGetValueWithUnit( this.values.margin_bottom ) ); } if ( ! this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', _.fusionGetValueWithUnit( this.values.margin_left ) ); } css = this.parseCSS(); return ( css ) ? '<style type="text/css">' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Related Component View. FusionPageBuilder.fusion_tb_woo_archives = FusionPageBuilder.fusion_woo_product_grid.extend( { onInit: function() { var output, markupIsEmpty, markupIsPlaceholder; this.filterTemplateAtts = this._filterTemplateAtts( this.filterTemplateAtts ); output = this.model.attributes.markup && this.model.attributes.markup.output; markupIsEmpty = '' === output; markupIsPlaceholder = output && output.includes( 'fusion-builder-placeholder' ); if ( markupIsEmpty || markupIsPlaceholder ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes. * @return {Object} */ _filterTemplateAtts: function( filterTemplateAtts ) { var self = this; return function( atts ) { atts.params.show_title = 'yes'; atts = filterTemplateAtts.call( self, atts ); atts.placeholder = self.getComponentPlaceholder(); return atts; }; }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_woo_product_grid', this.model.attributes.cid ); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Related Component View. FusionPageBuilder.fusion_tb_post_card_archives = FusionPageBuilder.fusion_post_cards.extend( { onInit: function() { var output, markupIsEmpty, markupIsPlaceholder; this.filterTemplateAtts = this._filterTemplateAtts( this.filterTemplateAtts ); output = this.model.attributes.markup && this.model.attributes.markup.output; markupIsEmpty = '' === output; markupIsPlaceholder = output && output.includes( 'fusion-builder-placeholder' ); if ( markupIsEmpty || markupIsPlaceholder ) { this.model.attributes.markup.output = this.getComponentPlaceholder(); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ _filterTemplateAtts: function( filterTemplateAtts ) { var self = this; return function( atts ) { atts.params.show_title = 'yes'; atts = filterTemplateAtts.call( self, atts ); atts.placeholder = self.getComponentPlaceholder(); return atts; }; }, /** * Runs after view DOM is patched. * * @since 3.3 * @return {void} */ afterPatch: function() { jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ).trigger( 'fusion-element-render-fusion_post_cards', this.model.attributes.cid ); }, /** * Runs just after render on cancel. * * @since 3.5 * @return null */ beforeGenerateShortcode: function() { var elementType = this.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, _.fusionCleanParameters( this.model.get( 'params' ) ) ); if ( 'object' !== typeof options ) { return; } // If images needs replaced lets check element to see if we have media being used to add to object. if ( 'undefined' !== typeof FusionApp.data.replaceAssets && FusionApp.data.replaceAssets && ( 'undefined' !== typeof FusionApp.data.fusion_element_type || 'fusion_template' === FusionApp.getPost( 'post_type' ) ) ) { this.mapStudioImages( options, values ); if ( '' !== values.post_card ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] ) { FusionPageBuilderApp.mediaMap.post_cards[ values.post_card ] = true; } } } } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp, FusionPageBuilderViewManager, fusionAllElements, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function( $ ) { $( document ).ready( function() { // Builder Blank Page View FusionPageBuilder.BlankFormView = window.wp.Backbone.View.extend( { className: 'fusion-builder-blank-page', template: FusionPageBuilder.template( $( '#fusion-builder-blank-form-template' ).html() ), events: { 'click .fusion-builder-new-section-add': 'addContainer', 'click .fusion-builder-video-button': 'openVideoModal', 'click #fusion-load-studio-dialog': 'openLibrary' }, /** * Init. * * @since 2.0.0 * @return {void} */ initialize: function() { this.$el.attr( 'data-cid', this.model.get( 'cid' ) ); }, /** * Renders the view. * * @since 2.0.0 * @return {Object} this */ render: function() { var colorScheme = this.getColorScheme( FusionApp.settings.content_bg_color ); this.$el.html( this.template( this.model.toJSON() ) ); this.$el.addClass( 'fusion-builder-scheme-' + colorScheme ); this.$el.find( '#video-dialog' ).dialog( { dialogClass: 'fusion-builder-dialog fusion-video-dialog', autoOpen: false, modal: true, height: 470, width: 700 } ); return this; }, /** * Calculate color scheme depend on hex color. * * @since 2.0.0 * @param {string} color - The hex color code to calculate color scheme against. * @return {string} */ getColorScheme: function( color ) { return 0.5 < jQuery.AWB_Color( color ).lightness() ? 'light' : 'dark'; }, /** * Opens a video modal. * * @since 2.0.0 * @param {Object} event - The event triggering the modal. * @return {void} */ openVideoModal: function( event ) { if ( event ) { event.preventDefault(); } jQuery( '#video-dialog' ).dialog( 'open' ); jQuery( '#video-dialog iframe' ).focus(); jQuery( '#video-dialog iframe' )[ 0 ].contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); }, /** * Adds a container. * * @since 2.0.0 * @param {Object} event - The event triggering the container addition. * @return {void} */ addContainer: function( event ) { var elementID, defaultParams, params, value, newContainer; if ( event ) { event.preventDefault(); FusionPageBuilderApp.newContainerAdded = true; } elementID = FusionPageBuilderViewManager.generateCid(); defaultParams = fusionAllElements.fusion_builder_container.params; params = {}; // Process default options for shortcode. _.each( defaultParams, function( param ) { if ( _.isObject( param.value ) ) { value = param[ 'default' ]; } else { value = param.value; } params[ param.param_name ] = value; if ( 'dimension' === param.type && _.isObject( param.value ) ) { _.each( param.value, function( val, name ) { params[ name ] = val; } ); } } ); this.collection.add( [ { type: 'fusion_builder_container', added: 'manually', element_type: 'fusion_builder_container', cid: elementID, params: params, view: this, created: 'auto' } ] ); // Make sure to add row to new container not current one. newContainer = FusionPageBuilderViewManager.getView( elementID ); newContainer.addRow(); this.removeBlankPageHelper(); }, /** * Opens the library. * Calls the LibraryView and then renders it. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ openLibrary: function( event ) { var view, libraryModel = { target: jQuery( event.currentTarget ).data( 'target' ), focus: jQuery( event.currentTarget ).data( 'focus' ) }, viewSettings = { model: libraryModel }; if ( event ) { event.preventDefault(); event.stopPropagation(); FusionPageBuilderApp.sizesHide( event ); } view = new FusionPageBuilder.LibraryView( viewSettings ); view.render(); }, /** * Removes the helper for blank pages. * * @since 2.0.0 * @param {Object} event - The event. * @return {void} */ removeBlankPageHelper: function( event ) { if ( event ) { event.preventDefault(); } FusionPageBuilderViewManager.removeView( this.model.get( 'cid' ) ); this.model.destroy(); if ( jQuery( '#video-dialog' ).length ) { jQuery( '#video-dialog' ).dialog( 'destroy' ); } this.remove(); } } ); jQuery( 'body' ).on( 'click', '.ui-dialog-titlebar-close', function() { var dialog = jQuery( this ).closest( '.ui-dialog' ); if ( dialog.find( '#video-dialog' ).length ) { dialog.find( '#video-dialog iframe' )[ 0 ].contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); dialog.hide(); } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Password View. FusionPageBuilder.FormComponentView = FusionPageBuilder.ElementView.extend( { onInit: function() { this.formData = FusionApp.data.postMeta; this.listenTo( window.FusionEvents, 'fusion-rerender-form-inputs', this.reRender ); }, /** * Builds attributes. * * @since 3.1 * @param {Object} values - The values object. * @return {Object} */ buildStyles: function() { return ''; }, elementData: function( values ) { var data = {}; data.checked = ''; data.required = ''; data.required_label = ''; data.required_placeholder = ''; data.disabled = ''; data[ 'class' ] = ''; data.id = ''; data.placeholder = ''; data.label = ''; data.label_class = ''; data.holds_private_data = 'no'; data.upload_size = ''; data.pattern = ''; if ( 'undefined' === typeof values ) { return data; } if ( 'fusion_form_phone_number' === this.model.get( 'element_type' ) ) { data.pattern = ' pattern="[0-9()#&+*-=.]+" title="' + fusionBuilderText.phone_pattern_text + '"'; } if ( 'fusion_form_checkbox' === this.model.get( 'element_type' ) && 'undefined' !== typeof values.checked && values.checked ) { data.checked = ' checked="checked"'; } if ( 'fusion_form_upload' === this.model.get( 'element_type' ) && 'undefined' !== typeof values.upload_size && values.upload_size ) { data.upload_size = ' data-size="' + values.upload_size + '"'; } if ( 'undefined' !== typeof values.required && ( 'yes' === values.required || 'selection' === values.required ) ) { if ( 'selection' !== values.required ) { data.required = ' required="true" aria-required="true"'; } data.required_label = ' <abbr class="fusion-form-element-required" title="' + fusionBuilderText.required + '">*</abbr>'; data.required_placeholder = '*'; } if ( 'undefined' !== typeof values.disabled && 'yes' === values.disabled ) { data.disabled = ' disabled'; if ( 'undefined' !== typeof values.placeholder && '' !== values.placeholder ) { data.value = values.placeholder; } } data[ 'class' ] = ' class="fusion-form-input"'; if ( 'undefined' !== typeof values.placeholder && '' !== values.placeholder ) { if ( 'fusion_form_dropdown' === this.model.get( 'element_type' ) ) { data.placeholder = values.placeholder + data.required_placeholder; } else { data.placeholder = ' placeholder="' + values.placeholder + data.required_placeholder + '"'; } } if ( 'fusion_form_checkbox' === this.model.get( 'element_type' ) ) { data.label_class = ' class="fusion-form-checkbox-label"'; } if ( 'undefined' !== typeof values.label && '' !== values.label ) { data.label = '<label for="' + values.name + '"' + data.label_class + '>' + values.label + data.required_label + '</label>'; } data.holds_private_data = ' data-holds-private-data="false"'; if ( 'undefined' !== typeof values.holds_private_data && '' !== values.holds_private_data ) { data.holds_private_data = ' data-holds-private-data="true"'; } return data; }, checkbox: function( values, type ) { var options = '', elementData, elementName, elementHtml, checkboxClass, html = ''; if ( 'undefined' === typeof values.options || ! values.options ) { return html; } values.options = JSON.parse( FusionPageBuilderApp.base64Decode( values.options ) ); elementData = this.elementData( values ); _.each( values.options, function( option, key ) { var checked = option[ 0 ] ? ' checked ' : '', label = ( 'undefined' !== typeof option[ 1 ] ) ? option[ 1 ].trim() : '', value = ! _.isEmpty( option[ 2 ] ) ? option[ 2 ].trim() : label, // eslint-disable-line no-unused-vars labelId; elementName = ( 'checkbox' === type ) ? values.name + '[]' : values.name; checkboxClass = ( 'floated' === values.form_field_layout ) ? 'fusion-form-' + type + ' option-inline' : 'fusion-form-' + type; labelId = type + '-' + label.replace( ' ', '-' ).toLowerCase() + '-' + key; options += '<div class="' + checkboxClass + '">'; options += '<input id="' + labelId + '" type="' + type + '" value="' + label + '" name="' + elementName + '"' + elementData[ 'class' ] + elementData.id + elementData.required + checked + elementData.holds_private_data + '/>'; options += '<label for="' + labelId + '">'; options += label + '</label>'; options += '</div>'; } ); elementHtml = '<fieldset>'; elementHtml += options; elementHtml += '</fieldset>'; if ( '' !== values.tooltip ) { elementData.label += this.getFieldTooltip( values ); } html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; }, generateInputField: function( values, type ) { var elementData, elementHtml, html = ''; elementData = this.elementData( values ); if ( '' !== values.tooltip ) { elementData.label += this.getFieldTooltip( values ); } values.value = 'undefined' !== typeof values.value && '' !== values.value ? values.value : ''; values.value = 'undefined' !== typeof elementData.value && '' !== elementData.value ? elementData.value : values.value; elementHtml = '<input type="' + type + '" name="' + values.name + '" value="' + values.value + '" ' + elementData[ 'class' ] + elementData.id + elementData.required + elementData.disabled + elementData.placeholder + elementData.holds_private_data + elementData.pattern + '/>'; elementHtml = this.generateIconHtml( values, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; }, getFieldTooltip: function( values ) { var html = ''; if ( '' !== values.tooltip ) { html = '<div class="fusion-form-tooltip">'; html += '<i class="awb-icon-question-circle"></i>'; html += '<span class="fusion-form-tooltip-content">' + values.tooltip + '</span>'; html += '</div>'; } return html; }, addFieldWrapperHtml: function() { var html, labelPosition = 'above', params = this.model.get( 'params' ); if ( 'undefined' !== typeof this.formData._fusion.label_position ) { labelPosition = this.formData._fusion.label_position; } html = '<div '; // Add custom ID if it's there. if ( 'undefined' !== typeof params.id && '' !== params.id ) { html += 'id="' + params.id + '" '; } // Start building class. html += 'class="fusion-form-field ' + this.model.get( 'element_type' ).replace( /_/g, '-' ) + '-field ' + this.model.get( 'cid' ) + ' ' + this.model.get( 'element_type' ).replace( /_/g, '-' ) + '-field fusion-form-label-' + labelPosition; // Add custom class if it's there. if ( 'undefined' !== typeof params[ 'class' ] && '' !== params[ 'class' ] ) { html += ' ' + params[ 'class' ]; } // Close class quotes. html += '"'; html += ' data-form-id="' + FusionApp.data.postDetails.post_id + '">'; return html; }, generateFormFieldHtml: function( fieldHtml ) { var html = this.addFieldWrapperHtml(); html += fieldHtml; html += '</div>'; return html; }, generateIconHtml: function( atts, html ) { var icon; if ( 'undefined' !== typeof atts.input_field_icon && '' !== atts.input_field_icon ) { icon = '<div class="fusion-form-input-with-icon">'; icon += '<i class="' + _.fusionFontAwesome( atts.input_field_icon ) + '"></i>'; html = icon + html; html += '</div>'; } return html; }, generateLabelHtml: function( html, elementHtml, label ) { if ( '' !== label ) { label = '<div class="fusion-form-label-wrapper">' + label + '</div>'; } if ( 'undefined' === typeof this.formData._fusion.label_position || 'above' === this.formData._fusion.label_position ) { html += label + elementHtml; } else { html += elementHtml + label; } return html; }, generateTooltipHtml: function( values, elementData ) { if ( '' !== values.tooltip ) { elementData.label += this.getFieldTooltip( values ); } return elementData; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Checkbox View. FusionPageBuilder.fusion_form_checkbox = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; var required_can_be_shown = false; if ( 'selection' === atts.values.required ) { required_can_be_shown = ( 0 < parseInt( atts.values.min_required ) ); // Do not show "*" if there is no minimum required fields. if ( ! required_can_be_shown ) { atts.values.required = ''; } } // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.checkbox( atts.values, 'checkbox' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Date View. FusionPageBuilder.fusion_form_date = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateDateFieldHtml( atts.values ) ); return attributes; }, generateDateFieldHtml: function( values ) { var elementData, elementHtml, html = '', input_type = 'type="date"'; elementData = this.elementData( values ); this.generateTooltipHtml( values, elementData ); if ( 'custom' === values.picker || 'desktop' === values.picker ) { input_type = 'type="text"'; } elementHtml = '<input id="date-' + this.model.get( 'cid' ) + '" ' + input_type + ' data-type="' + values.picker + '" name="' + values.name + '" ' + elementData.holds_private_data + elementData[ 'class' ] + elementData.required + elementData.placeholder + '/>'; elementHtml = this.generateIconHtml( values, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; }, onRender: function() { this.afterPatch(); }, beforePatch: function() { var picker; if ( 'function' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.flatpickr ) { picker = jQuery( '#fb-preview' )[ 0 ].contentWindow.flatpickr( '#date-' + this.model.get( 'cid' ), {} ); if ( picker && 'function' === typeof picker.destroy ) { picker.destroy(); } } }, /** * Runs after view DOM is patched. * * @since 3.1 * @return {void} */ afterPatch: function() { var self = this; setTimeout( function() { var $item = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( self.$el.find( 'input[type="date"]' ) ), type = $item.attr( 'data-type' ), format = $item.attr( 'data-format' ), useMobile = 'custom' === type; format = 'undefined' === typeof format || '' === format ? 'Y-m-d' : format; // Native, do not init. if ( 'native' === type || 'function' !== typeof $item.flatpickr ) { return; } $item.flatpickr( { defaultDate: new Date().getTime(), disableMobile: useMobile, dateFormat: format } ); }, 200 ); } } ); } ); }( jQuery ) ); ;/* global FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Select View. FusionPageBuilder.fusion_form_select = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateSelectField( atts.values ) ); return attributes; }, generateSelectField: function( values ) { var elementData, elementHtml, options = '', html = ''; if ( 'undefined' === typeof values.options || ! values.options ) { return html; } values.options = JSON.parse( FusionPageBuilderApp.base64Decode( values.options ) ); elementData = this.elementData( values ); if ( '' !== values.tooltip ) { elementData.label += this.getFieldTooltip( values ); } if ( 'undefined' !== typeof values.placeholder && '' !== values.placeholder ) { options += '<option value="" selected disabled>' + values.placeholder + '</option>'; } _.each( values.options, function( option ) { var selected = option[ 0 ] ? ' selected ' : ''; var label = option[ 1 ].trim(); var value = '' !== option[ 2 ] ? option[ 2 ].trim() : label; options += '<option value="' + value + '" ' + selected + '>' + label + '</option>'; } ); elementHtml = '<div class="fusion-select-wrapper">'; elementHtml += '<select class="fusion-form-input" name="' + values.name + '"' + elementData[ 'class' ] + elementData.required + elementData.style + elementData.holds_private_data + '>'; elementHtml += options; elementHtml += '</select>'; elementHtml += '<div class="select-arrow"><svg width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M1.5 1.75L6 6.25L10.5 1.75" stroke="#6D6D6D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg>'; elementHtml += '</div>'; elementHtml = this.generateIconHtml( values, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Email View. FusionPageBuilder.fusion_form_email = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateInputField( atts.values, 'email' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Hidden View. FusionPageBuilder.fusion_form_hidden = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.name = atts.values.label; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Honeypot View. FusionPageBuilder.fusion_form_honeypot = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.5 * @return {Object} */ filterTemplateAtts: function() { var attributes = {}; // Create attribute objects. attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Number View. FusionPageBuilder.fusion_form_number = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateInputField( atts.values, 'number' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Password View. FusionPageBuilder.fusion_form_password = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateInputField( atts.values, 'password' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Phone Number View. FusionPageBuilder.fusion_form_phone_number = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateInputField( atts.values, 'phone-number' ) ); return attributes; } } ); } ); }( jQuery ) ); ;/* global FusionApp, fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Select Image View. FusionPageBuilder.fusion_form_image_select = FusionPageBuilder.ParentElementView.extend( { onInit: function() { this.formData = FusionApp.data.postMeta; this.listenTo( window.FusionEvents, 'fusion-rerender-form-inputs', this.reRender ); }, /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, elementData = this.elementData( atts.values ); this.elementDataValues = elementData; if ( '' !== atts.values.tooltip ) { elementData.label += this.getFieldTooltip( atts.values ); } attributes.outerWrapper = this.outerWrapper( atts.values ); attributes.labelPosition = 'undefined' !== typeof this.formData._fusion.label_position ? this.formData._fusion.label_position : 'above'; attributes.elementLabel = elementData.label; attributes.styles = this.buildStyles( atts.values ); return attributes; }, getFieldTooltip: function( values ) { var html = ''; if ( '' !== values.tooltip ) { html = '<div class="fusion-form-tooltip">'; html += '<i class="awb-icon-question-circle"></i>'; html += '<span class="fusion-form-tooltip-content">' + values.tooltip + '</span>'; html += '</div>'; } return html; }, outerWrapper: function( values ) { var html, labelPosition = 'above', params = this.model.get( 'params' ); if ( 'undefined' !== typeof this.formData._fusion.label_position ) { labelPosition = this.formData._fusion.label_position; } html = '<div '; // Add custom ID if it's there. if ( 'undefined' !== typeof params.id && '' !== params.id ) { html += 'id="' + params.id + '" '; } // Start building class. html += 'class="fusion-form-field fusion-form-field-' + this.model.get( 'element_type' ).replace( /_/g, '-' ) + this.model.get( 'cid' ) + ' fusion-form-field-' + this.model.get( 'element_type' ) + ' fusion-form-label-' + labelPosition; // Add inline class if needed. if ( 'floated' === values.form_field_layout ) { html += ' option-inline'; } // Add custom class if it's there. if ( 'undefined' !== typeof params[ 'class' ] && '' !== params[ 'class' ] ) { html += ' ' + params[ 'class' ]; } // Close class quotes. html += '"'; html += ' data-form-id="' + FusionApp.data.postDetails.post_id + '">'; return html; }, elementData: function( values ) { var data = {}; data.checked = ''; data.required = ''; data.required_label = ''; data.required_placeholder = ''; data[ 'class' ] = ''; data.id = ''; data.placeholder = ''; data.label = ''; data.label_class = ''; data.holds_private_data = 'no'; data.upload_size = ''; if ( 'undefined' === typeof values ) { return data; } if ( 'fusion_form_checkbox' === this.model.get( 'element_type' ) && 'undefined' !== typeof values.checked && values.checked ) { data.checked = ' checked="checked"'; } if ( 'fusion_form_upload' === this.model.get( 'element_type' ) && 'undefined' !== typeof values.upload_size && values.upload_size ) { data.upload_size = ' data-size="' + values.upload_size + '"'; } if ( 'undefined' !== typeof values.required && 'yes' === values.required ) { data.required = ' required="true" aria-required="true"'; data.required_label = ' <abbr class="fusion-form-element-required" title="' + fusionBuilderText.required + '">*</abbr>'; data.required_placeholder = '*'; } data[ 'class' ] = ' class="fusion-form-input"'; if ( 'undefined' !== typeof values.placeholder && '' !== values.placeholder ) { if ( 'fusion_form_dropdown' === this.model.get( 'element_type' ) ) { data.placeholder = values.placeholder + data.required_placeholder; } else { data.placeholder = ' placeholder="' + values.placeholder + data.required_placeholder + '"'; } } if ( 'fusion_form_checkbox' === this.model.get( 'element_type' ) ) { data.label_class = ' class="fusion-form-checkbox-label"'; } if ( 'undefined' !== typeof values.label && '' !== values.label ) { data.label = '<label for="' + values.name + '"' + data.label_class + '>' + values.label + data.required_label + '</label>'; } data.holds_private_data = ' data-holds-private-data="false"'; if ( 'undefined' !== typeof values.holds_private_data && '' !== values.holds_private_data ) { data.holds_private_data = ' data-holds-private-data="true"'; } return data; }, /** * Builds styles. * * @since 3.1 * @param {Object} values - The values object. * @return {Object} */ buildStyles: function( values ) { var styles = '', paddingStyles = '', base_selector = '.fusion-form-form-wrapper.fusion-form .fusion-form-field.fusion-form-field-fusion-form-image-select' + this.model.get( 'cid' ); if ( '' !== values.width ) { styles += base_selector + ' .fusion-form-image-select label .fusion-form-image-wrapper{width:' + _.fusionGetValueWithUnit( values.width ) + ';}'; } if ( '' !== values.height ) { styles += base_selector + ' .fusion-form-image-select label .fusion-form-image-wrapper{height:' + _.fusionGetValueWithUnit( values.height ) + ';}'; } if ( '' !== values.border_size_top ) { styles += base_selector + ' .fusion-form-image-select label{border-top-width:' + _.fusionGetValueWithUnit( values.border_size_top ) + ';}'; } if ( '' !== values.border_size_right ) { styles += base_selector + ' .fusion-form-image-select label{border-right-width:' + _.fusionGetValueWithUnit( values.border_size_right ) + ';}'; } if ( '' !== values.border_size_bottom ) { styles += base_selector + ' .fusion-form-image-select label{border-bottom-width:' + _.fusionGetValueWithUnit( values.border_size_bottom ) + ';}'; } if ( '' !== values.border_size_left ) { styles += base_selector + ' .fusion-form-image-select label{border-left-width:' + _.fusionGetValueWithUnit( values.border_size_left ) + ';}'; } if ( '' !== values.border_radius ) { styles += base_selector + ' .fusion-form-image-select label{border-radius:' + _.fusionGetValueWithUnit( values.border_radius ) + ';}'; } if ( '' !== values.inactive_color ) { styles += base_selector + ' .fusion-form-image-select label{border-color:' + _.fusionGetValueWithUnit( values.inactive_color ) + ';}'; } if ( '' !== values.active_color ) { styles += base_selector + ' .fusion-form-image-select .fusion-form-input:checked + label{border-color:' + values.active_color + ';}'; styles += base_selector + ' .fusion-form-image-select .fusion-form-input:hover:not(:checked) + label{border-color:' + jQuery.AWB_Color( values.active_color ).alpha( 0.5 ).toRgbaString() + ';}'; } // Padding. jQuery.each( [ 'top', 'right', 'bottom', 'left' ], function( index, padding ) { var paddingName = 'padding_' + padding; if ( '' !== values[ paddingName ] ) { paddingStyles += 'padding-' + padding + ':' + _.fusionGetValueWithUnit( values[ paddingName ] ) + ';'; } } ); if ( '' !== paddingStyles ) { styles += base_selector + ' label{' + paddingStyles + ';}'; } if ( '' !== styles ) { styles = '<style type="text/css">' + styles + '</style>'; } return styles; } } ); } ); }( jQuery ) ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Select Image View. FusionPageBuilder.fusion_form_image_select_input = FusionPageBuilder.ChildElementView.extend( { onInit: function() { this.formData = FusionApp.data.postMeta; }, /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}, parentView = window.FusionPageBuilderViewManager.getView( this.model.get( 'parent' ) ), params = this.model.get( 'params' ); // Create attribute objects; attributes.imageUrl = atts.values.image; attributes.labelId = 'HTML+ ' + this.model.get( 'cid' ); attributes.value = '' === atts.values.name ? atts.values.label.toLowerCase().replace( ' ', '_' ) : atts.values.name; attributes.inputName = 'input' + this.model.get( 'cid' ); attributes.elementData = parentView.elementDataValues; attributes.checked = 'yes' === atts.values.checked ? ' checked ' : ''; attributes.labelPosition = 'undefined' !== typeof this.formData._fusion.label_position ? this.formData._fusion.label_position : 'above'; attributes.label = 'undefined' !== typeof params.label && '' !== params.label ? atts.values.label : ''; attributes.inputType = undefined !== typeof parentView.model.attributes.params.multiple_select && 'yes' === parentView.model.attributes.params.multiple_select ? 'checkbox' : 'radio'; return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Radio View. FusionPageBuilder.fusion_form_radio = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.checkbox( atts.values, 'radio' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Range View. FusionPageBuilder.fusion_form_range = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateRangeField( atts.values ) ); return attributes; }, generateRangeField: function ( atts ) { var elementData, elementHtml, containerClass = 'fusion-form-range-field-container', html = ''; elementData = this.elementData( atts ); elementData = this.generateTooltipHtml( atts, elementData ); if ( 'right' === atts.orientation ) { containerClass += ' orientation-right'; } elementHtml = '<div class="' + containerClass + '">'; if ( 'right' !== atts.orientation ) { elementHtml += '<input type="text" disabled class="fusion-form-range-value" value="' + atts.value + '"/>'; } elementHtml += '<input type="range" name="' + atts.name + '" min="' + atts.min + '" max="' + atts.max + '" step="' + atts.step + '" value="' + atts.value + '"' + elementData[ 'class' ] + elementData.required + elementData.placeholder + elementData.holds_private_data + '/>'; if ( 'right' === atts.orientation ) { elementHtml += '<input type="text" disabled class="fusion-form-range-value" value="' + atts.value + '"/>'; } elementHtml += '</div>'; html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; } } ); } ); }( jQuery ) ); ;/* global fusionSanitize, FusionPageBuilderApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Rating View. FusionPageBuilder.fusion_form_rating = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateRatingField( atts.values ) ); return attributes; }, generateRatingField: function( values ) { var elementData, elementName, elementHtml = '', limit, styles = '', options = '', hoverColor = '', html = '', option; elementData = this.elementData( values ); limit = fusionSanitize.number( values.limit ); elementName = values.name; while ( 0 < limit ) { option = limit; options += '<input id="' + option + '-' + this.model.get( 'cid' ) + '" type="radio" value="' + option + '" name="' + elementName + '"' + elementData[ 'class' ] + elementData.required + elementData.checked + elementData.holds_private_data + '/>'; options += '<label for="' + option + '-' + this.model.get( 'cid' ) + '" class="fusion-form-rating-icon">'; options += '<i class="' + values.icon + '"></i>'; options += '</label>'; limit--; } // CSS for .rating-icon if ( values.icon_color || ( 'undefined' !== typeof values.icon_size && '' !== values.icon_size ) ) { styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-rating-icon { '; if ( values.icon_color ) { styles += 'color: ' + values.icon_color + ';'; } if ( 'undefined' !== typeof values.icon_size && '' !== values.icon_size ) { styles += 'font-size: ' + values.icon_size + ';'; } styles += '}'; } // CSS for .rating-icon:hover, .rating-icon:checked if ( values.active_icon_color ) { hoverColor = jQuery.AWB_Color( values.active_icon_color ).alpha( 0.5 ).toRgbaString(); styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-input:checked~label i{ color: ' + values.active_icon_color + ';}'; styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-input:checked:hover ~ label i,'; styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-rating-icon:hover i,'; styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-rating-icon:hover ~ label i,'; styles += '.fusion-form-form-wrapper .fusion-form-field .fusion-form-rating-area-' + this.model.get( 'cid' ) + '.fusion-form-rating-area .fusion-form-input:hover ~ label i{ color: ' + hoverColor + ';}'; } if ( '' !== styles ) { elementHtml += '<style type="text/css">' + styles + '</style>'; } elementHtml += '<fieldset class="fusion-form-rating-area fusion-form-rating-area-' + this.model.get( 'cid' ) + ( FusionPageBuilderApp.$el.hasClass( 'rtl' ) ? ' rtl' : '' ) + '">'; elementHtml += options; elementHtml += '</fieldset>'; if ( '' !== values.tooltip ) { elementData.label += this.getFieldTooltip( values ); } html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form reCAPTCHA View. FusionPageBuilder.fusion_form_recaptcha = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { // eslint-disable-line no-unused-vars var attributes = {}; return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Hidden View. FusionPageBuilder.fusion_form_submit = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; if ( ! this.btnInstance ) { this.btnInstance = new FusionPageBuilder.fusion_button( { model: this.model, attributes: atts } ); this.btnInstance.elementTemplate = FusionPageBuilder.template( jQuery( '#tmpl-fusion_button-shortcode' ).html() ); } // Create attribute attributes.html = this.generateFormFieldHtml( this.btnInstance.render().$el.html() ); return attributes; } } ); } ); }( jQuery ) ); ;/* global FusionApp, FusionPageBuilderApp, fusionAllElements, FusionPageBuilderViewManager */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Notice View. FusionPageBuilder.fusion_form_notice = FusionPageBuilder.FormComponentView.extend( { alertInstance: {}, onInit: function() { this.formData = FusionApp.data.postMeta; this.listenTo( window.FusionEvents, 'fusion-render-form-notices', this.reRender ); }, /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Whether we should show warning instead. attributes.showNotices = 'undefined' === typeof this.formData._fusion.form_confirmation_type || 'redirect' !== this.formData._fusion.form_confirmation_type; attributes.successAlert = ''; attributes.errorAlert = ''; if ( ! attributes.showNotices ) { return attributes; } /* attributes.name = atts.values.label; attributes.label = window.fusionAllElements[ this.model.get( 'element_type' ) ].name; attributes.icon = window.fusionAllElements[ this.model.get( 'element_type' ) ].icon; */ atts.values.margin_bottom = _.fusionValidateAttrValue( atts.values.margin_bottom, 'px' ); atts.values.margin_left = _.fusionValidateAttrValue( atts.values.margin_left, 'px' ); atts.values.margin_right = _.fusionValidateAttrValue( atts.values.margin_right, 'px' ); atts.values.margin_top = _.fusionValidateAttrValue( atts.values.margin_top, 'px' ); // Default alert bottom margin. if ( '' === atts.values.margin_bottom ) { atts.values.margin_bottom = '20px'; } attributes.style = ''; if ( '' !== atts.values.margin_top ) { attributes.style += 'margin-top:' + atts.values.margin_top + ';'; } if ( '' !== atts.values.margin_right ) { attributes.style += 'margin-right:' + atts.values.margin_right + ';'; } if ( '' !== atts.values.margin_bottom ) { attributes.style += 'margin-bottom:' + atts.values.margin_bottom + ';'; } if ( '' !== atts.values.margin_left ) { attributes.style += 'margin-left:' + atts.values.margin_left + ';'; } attributes.successAlert = '' !== atts.values.success ? this.renderAlert( atts.values.success, 'success' ) : ''; attributes.errorAlert = '' !== atts.values.error ? this.renderAlert( atts.values.error, 'error' ) : ''; return attributes; }, renderAlert: function( content, alertType ) { var shortcodeType = 'fusion_alert', newParams, shortcodeContent = content, defaultParams, params, type, elementSettings, elementModel; try { if ( FusionPageBuilderApp.base64Encode( FusionPageBuilderApp.base64Decode( shortcodeContent ) ) === shortcodeContent ) { shortcodeContent = FusionPageBuilderApp.base64Decode( shortcodeContent ); shortcodeContent = _.unescape( shortcodeContent ); } } catch ( error ) { console.log( error ); // jshint ignore:line } if ( 'undefined' === typeof this.alertInstance[ alertType ] ) { if ( shortcodeType in fusionAllElements ) { defaultParams = fusionAllElements[ shortcodeType ].params; type = fusionAllElements[ shortcodeType ].shortcode; } params = {}; // Process default parameters from shortcode _.each( defaultParams, function( param ) { params[ param.param_name ] = ( _.isObject( param.value ) ) ? param[ 'default' ] : param.value; } ); // Used as a flag for opening on first render. params.open_settings = 'false'; params.element_content = shortcodeContent; params.type = alertType; params.margin_top = this.values.margin_top; params.margin_right = this.values.margin_right; params.margin_bottom = this.values.margin_bottom; params.margin_left = this.values.margin_left; elementSettings = { type: 'element', added: 'manually', element_type: type, params: params, parent: this.model.get( 'cid' ), multi: false, cid: FusionPageBuilderViewManager.generateCid(), silent: true }; elementModel = new FusionPageBuilder.Element( elementSettings ); this.alertInstance[ alertType ] = new FusionPageBuilder.fusion_alert( { model: elementModel } ); } else { newParams = this.alertInstance[ alertType ].model.get( 'params' ); newParams.element_content = shortcodeContent; newParams.margin_top = this.values.margin_top; newParams.margin_right = this.values.margin_right; newParams.margin_bottom = this.values.margin_bottom; newParams.margin_left = this.values.margin_left; this.alertInstance[ alertType ].model.set( 'params', newParams ); } return this.alertInstance[ alertType ].render().$el.html(); } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Text View. FusionPageBuilder.fusion_form_text = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateInputField( atts.values, 'text' ) ); return attributes; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Textarea View. FusionPageBuilder.fusion_form_textarea = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateTextareaField( atts.values ) ); return attributes; }, generateTextareaField: function ( atts ) { var elementData, elementHtml, value, html = ''; elementData = this.elementData( atts ); elementData = this.generateTooltipHtml( atts, elementData ); value = 'undefined' !== typeof elementData.value ? elementData.value : ''; elementHtml = '<textarea cols="40" rows="' + atts.rows + '" name="' + atts.name + '"' + elementData[ 'class' ] + elementData.required + elementData.disabled + elementData.placeholder + elementData.holds_private_data + '>' + value + '</textarea>'; elementHtml = this.generateIconHtml( atts, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Time View. FusionPageBuilder.fusion_form_time = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateTimeField( atts.values ) ); return attributes; }, generateTimeField: function( values ) { var elementData, elementHtml, html = '', input_type = 'type="time"'; elementData = this.elementData( values ); this.generateTooltipHtml( values, elementData ); if ( 'custom' === values.picker || 'desktop' === values.picker ) { input_type = 'type="text"'; } elementHtml = '<input id="time-' + this.model.get( 'cid' ) + '" ' + input_type + ' data-type="' + values.picker + '" data-clock="' + values.clock + '" name="' + values.name + '" ' + elementData.holds_private_data + elementData[ 'class' ] + elementData.required + elementData.placeholder + '/>'; elementHtml = this.generateIconHtml( values, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; }, onRender: function() { this.afterPatch(); }, beforePatch: function() { var picker; if ( 'function' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.flatpickr ) { picker = jQuery( '#fb-preview' )[ 0 ].contentWindow.flatpickr( '#time-' + this.model.get( 'cid' ), {} ); if ( picker && 'function' === typeof picker.destroy ) { picker.destroy(); } } }, /** * Runs after view DOM is patched. * * @since 2.0 * @return {void} */ afterPatch: function() { var self = this; setTimeout( function() { var $item = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( self.$el.find( 'input[type="time"]' ) ), type = $item.attr( 'data-type' ), useMobile = 'custom' === type, fullClock = 'full' === $item.attr( 'data-clock' ); // Native, do not init. if ( 'native' === type || 'function' !== typeof $item.flatpickr ) { return; } $item.flatpickr( { allowInput: true, disableMobile: useMobile, enableTime: true, noCalendar: true, dateFormat: 'H:i', time_24hr: fullClock } ); }, 200 ); } } ); } ); }( jQuery ) ); ;/* global fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion Form Upload View. FusionPageBuilder.fusion_form_upload = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 3.1 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects; attributes.styles = this.buildStyles( atts.values ); attributes.html = this.generateFormFieldHtml( this.generateUploadField( atts.values ) ); return attributes; }, generateUploadField: function ( atts ) { var elementData, elementHtml, style, html = ''; atts[ 'class' ] = ( '' !== atts[ 'class' ] ) ? atts[ 'class' ] + ' fusion-form-file-upload' : 'fusion-form-file-upload'; elementData = this.elementData( atts ); elementData = this.generateTooltipHtml( atts, elementData ); elementData.multiple = 'yes' === atts.multiple ? ' multiple' : ''; elementData.name = atts.name; elementData.multiple = ''; if ( 'yes' === atts.multiple ) { elementData.name += '[]'; elementData.multiple = ' multiple'; } elementData.accept = 'undefined' !== typeof atts.extensions && '' !== atts.extensions ? 'accept="' + atts.extensions + '"' : ''; elementHtml = '<div class="fusion-form-upload-field-container" style="' + style + '">'; elementHtml += '<input type="file" name="' + elementData.name + '" value="" ' + elementData[ 'class' ] + elementData.accept + elementData.required + elementData.placeholder + elementData.upload_size + elementData.multiple + '/>'; elementHtml += '<input type="text" disabled value="" class="fusion-form-upload-field" ' + elementData.required + elementData.placeholder + elementData.holds_private_data + '/>'; elementHtml += '<a class="fusion-button button-flat button-medium button-default button-1 fusion-button-default-span fusion-button-default-type fusion-form-upload-field-button" style="border-radius:0;"><span class="fusion-button-text">' + fusionBuilderText.choose_file + '</span></a>'; elementHtml += '</div>'; elementHtml = this.generateIconHtml( atts, elementHtml ); html = this.generateLabelHtml( html, elementHtml, elementData.label ); return html; } } ); } ); }( jQuery ) ); ;/* global FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Checkout Billing Component View. FusionPageBuilder.fusion_post_card_image = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.output = this.buildOutput( atts ); attributes.styles = this.buildStyleBlock( atts.values ); return attributes; }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-' + FusionApp.settings.woocommerce_product_box_design + '-product-image-wrapper fusion-woo-product-image fusion-post-card-image fusion-post-card-image-' + this.model.get( 'cid' ), style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function( atts ) { var output = ''; if ( 'undefined' !== typeof atts.markup && 'undefined' !== typeof atts.markup.output && 'undefined' === typeof atts.query_data ) { output = jQuery( jQuery.parseHTML( atts.markup.output ) ).filter( '.fusion-woo-product-image' ).html(); output = ( 'undefined' === typeof output ) ? atts.markup.output : output; } else if ( 'undefined' !== typeof atts.query_data && 'undefined' !== typeof atts.query_data.fusion_post_card_image ) { output = atts.query_data.fusion_post_card_image; } return output; }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function( values ) { var self = this, sides, margin_name, css; this.baseSelector = '.fusion-post-card-image.fusion-post-card-image-' + this.model.get( 'cid' ); this.dynamic_css = {}; sides = [ 'top', 'right', 'bottom', 'left' ]; // Margins. jQuery.each( sides, function( index, side ) { // Element margin. margin_name = 'margin_' + side; if ( '' !== self.values[ margin_name ] ) { self.addCssProperty( self.baseSelector, 'margin-' + side, _.fusionGetValueWithUnit( self.values[ margin_name ] ) ); } } ); if ( ! this.isDefault( 'crossfade_bg_color' ) ) { this.addCssProperty( this.baseSelector + ' .crossfade-images', 'background-color', values.crossfade_bg_color ); } // Border Radius. if ( ! this.isDefault( 'border_radius_top_left' ) ) { this.addCssProperty( this.baseSelector, 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_left ) ); } if ( ! this.isDefault( 'border_radius_top_right' ) ) { this.addCssProperty( this.baseSelector, 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_top_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_right' ) ) { this.addCssProperty( this.baseSelector, 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_right ) ); } if ( ! this.isDefault( 'border_radius_bottom_left' ) ) { this.addCssProperty( this.baseSelector, 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.border_radius_bottom_left ) ); } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global fusionBuilderText */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Woo Related Component View. FusionPageBuilder.fusion_tb_woo_upsells = FusionPageBuilder.WooProductsView.extend( { /** * Define shortcode handle. * * @since 3.2 */ shortcode_handle: 'fusion_tb_woo_upsells', /** * Define shortcode classname. * * @since 3.2 */ shortcode_classname: 'fusion-woo-upsells-tb', /** * Builds attributes. * * @since 3.2 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = FusionPageBuilder.WooProductsView.prototype.buildAttr.call( this, values ); if ( 'up-sells' === this.query_data.query_type ) { attr[ 'class' ] += ' up-sells upsells products'; } else { attr[ 'class' ] += ' fusion-woo-cross-sells products cross-sells'; } return attr; }, /** * Get section title based on the post type. * * @since 3.2 * @return {string} */ getSectionTitle: function() { if ( 'up-sells' === this.query_data.query_type ) { return fusionBuilderText.upsells_products; } return fusionBuilderText.cross_sells_products; } } ); } ); }( jQuery ) ); ;var FusionPageBuilder = FusionPageBuilder || {}; ( function () { jQuery( document ).ready( function () { // Post Card Cart Component View. FusionPageBuilder.fusion_post_card_cart = FusionPageBuilder.ElementView.extend( { onInit: function() { var params = this.model.get( 'params' ); // Check for newer margin params. If unset but regular is, copy from there. if ( 'object' === typeof params ) { // Split border width into 4. if ( 'undefined' === typeof params.button_border_top && 'undefined' !== typeof params.button_border_width && '' !== params.button_border_width ) { params.button_border_top = parseInt( params.button_border_width ) + 'px'; params.button_border_right = params.button_border_top; params.button_border_bottom = params.button_border_top; params.button_border_left = params.button_border_top; delete params.button_border_width; } // Split border width into 4. if ( 'undefined' === typeof params.button_details_border_top && 'undefined' !== typeof params.button_details_border_width && '' !== params.button_details_border_width ) { params.button_details_border_top = parseInt( params.button_details_border_width ) + 'px'; params.button_details_border_right = params.button_details_border_top; params.button_details_border_bottom = params.button_details_border_top; params.button_details_border_left = params.button_details_border_top; delete params.button_details_border_width; } this.model.set( 'params', params ); } }, afterPatch: function () { var $quantityBoxes = this.$el.find( 'div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)' ).find( '.qty' ); if ( $quantityBoxes.length && 'function' === typeof jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaAddQuantityBoxes ) { jQuery( '#fb-preview' )[ 0 ].contentWindow.avadaAddQuantityBoxes( '.qty', $quantityBoxes ); } }, /** * Modify template attributes. * * @since 3.3 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function ( atts ) { var attributes = {}; this.values = atts.values; this.extras = atts.extras; this.setIconDefaults(); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.wrapperAttr = this.buildAttr( atts.values ); attributes.output = this.buildOutput( atts ); attributes.styles = this.buildStyleBlock(); return attributes; }, /** * Set default icons for text links * * @since 3.3 */ setIconDefaults: function() { if ( 'custom' !== this.values.button_style ) { this.values.icon_position = 'left'; this.values.button_icon = 'fa-shopping-cart fas'; } if ( 'custom' !== this.values.product_link_style ) { this.values.icon_details_position = 'left'; this.values.button_details_icon = 'fa-list-ul fas'; } }, /** * Builds attributes. * * @since 3.3 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function ( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-woo-cart fusion-post-card-cart', style: '' } ); if ( '' !== values[ 'class' ] ) { attr[ 'class' ] += ' ' + values[ 'class' ]; } if ( '' !== values.id ) { attr.id = values.id; } attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds output. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildOutput: function ( atts ) { var quantity = '', buttons = '', output; if ( 'yes' === atts.values.show_add_to_cart_button ) { buttons += this.buildAddToCart( ); } if ( 'yes' === atts.values.show_product_link_button ) { buttons += this.buildProductDetails( ); } if ( 'yes' === atts.values.show_quantity_input ) { quantity = this.buildQuantity( ); } output = quantity; if ( this.has_buttons_wrapper() ) { output += '<div class="fusion-post-card-cart-button-wrapper">'; } output += buttons; if ( this.has_buttons_wrapper() ) { output += '</div>'; } return output; }, /** * Builds Quantity * * @since 3.3 * @return {String} */ buildQuantity: function ( ) { var output = '<div class="fusion-post-card-cart-quantity">' + '<div class="quantity">' + '<label class="screen-reader-text" for="quantity_temp">Quis voluptas quos ut in quantity</label>' + '<input type="number" id="quantity_temp" class="input-text qty text" step="1" min="1" max="" name="quantity" value="1" title="Qty" size="4" inputmode="numeric" />' + '</div></div>'; return output; }, /** * Builds Add to cart button * * @since 3.3 * @return {String} */ buildAddToCart: function ( ) { var output = ''; var button_class = '' === this.values.button_size ? ' fusion-button-default-size' : ''; button_class += 'custom' === this.values.button_style ? ' button-default' : ''; output = '<a href="#" data-quantity="1" class="fusion-post-card-cart-add-to-cart ' + button_class + '"' + ' aria-label="Add Temp Product" rel="nofollow">'; if ( '' !== this.values.button_icon && 'left' === this.values.icon_position ) { output += '<i class="' + this.values.button_icon + ' button-icon-left" aria-hidden="true"></i>'; } output += this.extras.add_to_cart_text; if ( '' !== this.values.button_icon && 'right' === this.values.icon_position ) { output += '<i class="' + this.values.button_icon + ' button-icon-right" aria-hidden="true"></i>'; } output += '</a>'; return output; }, /** * Builds Details/Quick view button * * @since 3.3 * @return {String} */ buildProductDetails: function ( ) { var output = ''; var button_class = '' === this.values.button_details_size ? ' fusion-button-default-size' : ''; button_class += 'custom' === this.values.product_link_style ? ' button-default' : ''; if ( '1' === this.values.enable_quick_view || 'yes' === this.values.enable_quick_view ) { output = '<a href="#" class="fusion-post-card-cart-product-link fusion-quick-view' + button_class + '">'; if ( '' !== this.values.button_details_icon && 'left' === this.values.icon_details_position ) { output += '<i class="' + this.values.button_details_icon + ' button-icon-left" aria-hidden="true"></i>'; } output += this.extras.quick_view_text; if ( '' !== this.values.button_details_icon && 'right' === this.values.icon_details_position ) { output += '<i class="' + this.values.button_details_icon + ' button-icon-right" aria-hidden="true"></i>'; } output += '</a>'; } else { output = '<a href="#" class="fusion-post-card-cart-product-link show_details_button' + button_class + '">'; if ( '' !== this.values.button_details_icon && 'left' === this.values.icon_details_position ) { output += '<i class="' + this.values.button_details_icon + ' button-icon-left" aria-hidden="true"></i>'; } output += this.extras.details_text; if ( '' !== this.values.button_details_icon && 'right' === this.values.icon_details_position ) { output += '<i class="' + this.values.button_details_icon + ' button-icon-right" aria-hidden="true"></i>'; } output += '</a>'; } return output; }, /** * Checks if buttons wrapper needed * * @since 3.3 * @param {Object} values - The values object. * @return {Boolean} */ has_buttons_wrapper: function () { return ( 'yes' === this.values.show_product_link_button || 'yes' === this.values.show_add_to_cart_button ) && ! ( 'floated' === this.values.cart_layout && 'floated' === this.values.buttons_layout && 'no' === this.values.buttons_stretch ); }, /** * Builds styles. * * @since 3.3 * @param {Object} values - The values object. * @return {String} */ buildStyleBlock: function () { var selector, quantity_input, quantity_buttons, quantity_both, height, width, quantity_font, hover_buttons, button, button_hover, button_size_map, button_dimensions, css; this.baseSelector = '.fusion-post-card-cart'; this.dynamic_css = {}; button_size_map = { small: { padding: '9px 20px', line_height: '14px', font_size: '12px' }, medium: { padding: '11px 23px', line_height: '16px', font_size: '13px' }, large: { padding: '13px 29px', line_height: '17px', font_size: '14px' }, xlarge: { padding: '17px 40px', line_height: '21px', font_size: '18px' } }; if ( !this.isDefault( 'margin_top' ) ) { this.addCssProperty( this.baseSelector, 'margin-top', _.fusionGetValueWithUnit( this.values.margin_top ) ); } if ( !this.isDefault( 'margin_right' ) ) { this.addCssProperty( this.baseSelector, 'margin-right', _.fusionGetValueWithUnit( this.values.margin_right ) ); } if ( !this.isDefault( 'margin_bottom' ) ) { this.addCssProperty( this.baseSelector, 'margin-bottom', _.fusionGetValueWithUnit( this.values.margin_bottom ) ); } if ( !this.isDefault( 'margin_left' ) ) { this.addCssProperty( this.baseSelector, 'margin-left', _.fusionGetValueWithUnit( this.values.margin_left ) ); } selector = this.baseSelector + ' .fusion-post-card-cart-quantity'; if ( 'floated' === this.values.cart_layout ) { this.addCssProperty( this.baseSelector, 'flex-direction', 'row' ); this.addCssProperty( selector, 'flex-direction', 'row' ); this.addCssProperty( this.baseSelector, 'justify-content', this.values.justify ); this.addCssProperty( this.baseSelector, 'align-items', 'center' ); } else { this.addCssProperty( selector, 'flex-direction', 'column' ); this.addCssProperty( this.baseSelector, 'flex-direction', 'column' ); this.addCssProperty( selector, 'display', 'flex' ); this.addCssProperty( selector, 'align-items', this.values.align ); } // Button wrapper if both buttons are used. if ( this.has_buttons_wrapper( ) ) { selector = this.baseSelector + ' .fusion-post-card-cart-button-wrapper'; if ( 'floated' === this.values.buttons_layout ) { this.addCssProperty( selector, 'flex-direction', 'row' ); this.addCssProperty( selector, 'align-items', 'center' ); if ( 'stacked' === this.values.cart_layout ) { this.addCssProperty( selector, 'justify-content', this.values.buttons_justify ); } } else if ( 'stacked' === this.values.buttons_layout ) { this.addCssProperty( selector, 'flex-direction', 'column' ); this.addCssProperty( selector, 'align-items', this.values.buttons_alignment ); } if ( 'yes' === this.values.buttons_stretch ) { this.addCssProperty( selector + ' a', 'justify-content', 'center' ); // Stacked buttons next to quantity if ( 'floated' === this.values.cart_layout ) { if ( 'stacked' === this.values.buttons_layout ) { // Make the buttons the same width and wrapper expand.. this.addCssProperty( selector, 'flex', '1' ); this.addCssProperty( selector, 'align-items', 'stretch' ); } else { // Both floated, button wrapper expand then buttons expand. this.addCssProperty( selector, 'flex', '1' ); this.addCssProperty( selector + ' a', 'flex', '1' ); } } else if ( 'stacked' === this.values.buttons_layout ) { // Make the buttons the same width. this.addCssProperty( selector, 'align-items', 'stretch' ); } else { // Allow each button to grow equally. this.addCssProperty( selector + ' a', 'flex', '1' ); } } } if ( 'custom' === this.values.quantity_style ) { quantity_input = '.fusion-body #main ' + this.baseSelector + ' .quantity input[type="number"].qty'; quantity_buttons = '.fusion-body #main ' + this.baseSelector + ' .quantity input[type="button"]'; quantity_both = [ quantity_input, quantity_buttons ]; selector = this.baseSelector + ' .fusion-post-card-cart-quantity'; if ( !this.isDefault( 'quantity_margin_top' ) ) { this.addCssProperty( selector, 'margin-top', _.fusionGetValueWithUnit( this.values.quantity_margin_top ) ); } if ( !this.isDefault( 'quantity_margin_right' ) ) { this.addCssProperty( selector, 'margin-right', _.fusionGetValueWithUnit( this.values.quantity_margin_right ) ); } if ( !this.isDefault( 'quantity_margin_bottom' ) ) { this.addCssProperty( selector, 'margin-bottom', _.fusionGetValueWithUnit( this.values.quantity_margin_bottom ) ); } if ( !this.isDefault( 'quantity_margin_left' ) ) { this.addCssProperty( selector, 'margin-left', _.fusionGetValueWithUnit( this.values.quantity_margin_left ) ); } height = '36px'; if ( !this.isDefault( 'quantity_height' ) ) { height = _.fusionGetValueWithUnit( this.values.quantity_height ); this.addCssProperty( quantity_both, 'height', height ); this.addCssProperty( quantity_buttons, 'width', height ); } width = '36px'; if ( !this.isDefault( 'quantity_width' ) ) { width = _.fusionGetValueWithUnit( this.values.quantity_width ); if ( false !== width.includes( '%' ) ) { this.addCssProperty( quantity_input, 'width', 'calc( 100% - ' + height + ' - ' + height + ' )' ); } else { this.addCssProperty( quantity_input, 'width', width ); } } if ( !this.isDefault( 'quantity_width' ) || !this.isDefault( 'quantity_height' ) ) { this.addCssProperty( this.baseSelector + ' .quantity', 'width', 'calc( ' + width + ' + ' + height + ' + ' + height + ' )' ); } if ( !this.isDefault( 'quantity_radius_top_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .minus', 'border-top-left-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_top_left ) ); } if ( !this.isDefault( 'quantity_radius_bottom_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .minus', 'border-bottom-left-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_bottom_left ) ); } if ( !this.isDefault( 'quantity_radius_top_right' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .plus', 'border-top-right-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_top_right ) ); } if ( !this.isDefault( 'quantity_radius_bottom_left' ) ) { this.addCssProperty( this.baseSelector + ' .quantity .plus', 'border-bottom-right-radius', _.fusionGetValueWithUnit( this.values.quantity_radius_bottom_right ) ); } if ( !this.isDefault( 'quantity_font_size' ) ) { quantity_font = [ quantity_input, quantity_buttons, this.baseSelector + ' .quantity' ]; this.addCssProperty( quantity_font, 'font-size', _.fusionGetValueWithUnit( this.values.quantity_font_size ) ); } if ( !this.isDefault( 'quantity_color' ) ) { this.addCssProperty( quantity_input, 'color', this.values.quantity_color ); } if ( !this.isDefault( 'quantity_background' ) ) { this.addCssProperty( quantity_input, 'background-color', this.values.quantity_background ); } if ( !this.isDefault( 'quantity_border_sizes_top' ) ) { this.addCssProperty( quantity_input, 'border-top-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_top ) ); } if ( !this.isDefault( 'quantity_border_sizes_right' ) ) { this.addCssProperty( quantity_input, 'border-right-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_right ) ); } if ( !this.isDefault( 'quantity_border_sizes_bottom' ) ) { this.addCssProperty( quantity_input, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_bottom ) ); } if ( !this.isDefault( 'quantity_border_sizes_left' ) ) { this.addCssProperty( quantity_input, 'border-left-width', _.fusionGetValueWithUnit( this.values.quantity_border_sizes_left ) ); } if ( !this.isDefault( 'quantity_border_color' ) ) { this.addCssProperty( quantity_input, 'border-color', this.values.quantity_border_color ); } if ( !this.isDefault( 'qbutton_border_sizes_top' ) ) { this.addCssProperty( quantity_buttons, 'border-top-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_top ) ); } if ( !this.isDefault( 'qbutton_border_sizes_right' ) ) { this.addCssProperty( quantity_buttons, 'border-right-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_right ) ); } if ( !this.isDefault( 'qbutton_border_sizes_bottom' ) ) { this.addCssProperty( quantity_buttons, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_bottom ) ); } if ( !this.isDefault( 'qbutton_border_sizes_left' ) ) { this.addCssProperty( quantity_buttons, 'border-left-width', _.fusionGetValueWithUnit( this.values.qbutton_border_sizes_left ) ); } if ( !this.isDefault( 'qbutton_color' ) ) { this.addCssProperty( quantity_buttons, 'color', this.values.qbutton_color ); } if ( !this.isDefault( 'qbutton_background' ) ) { this.addCssProperty( quantity_buttons, 'background-color', this.values.qbutton_background ); } if ( !this.isDefault( 'qbutton_border_color' ) ) { this.addCssProperty( quantity_buttons, 'border-color', this.values.qbutton_border_color ); } hover_buttons = [ quantity_buttons + ':hover', quantity_buttons + ':focus' ]; // Quantity button hover text color. if ( !this.isDefault( 'qbutton_color_hover' ) ) { this.addCssProperty( hover_buttons, 'color', this.values.qbutton_color_hover ); } if ( !this.isDefault( 'qbutton_background_hover' ) ) { this.addCssProperty( hover_buttons, 'background-color', this.values.qbutton_background_hover ); } if ( !this.isDefault( 'qbutton_border_color_hover' ) ) { this.addCssProperty( hover_buttons, 'border-color', this.values.qbutton_border_color_hover ); } } selector = this.baseSelector + ' .fusion-post-card-cart-add-to-cart'; if ( !this.isDefault( 'button_margin_top' ) ) { this.addCssProperty( selector, 'margin-top', _.fusionGetValueWithUnit( this.values.button_margin_top ) ); } if ( !this.isDefault( 'button_margin_right' ) ) { this.addCssProperty( selector, 'margin-right', _.fusionGetValueWithUnit( this.values.button_margin_right ) ); } if ( !this.isDefault( 'button_margin_bottom' ) ) { this.addCssProperty( selector, 'margin-bottom', _.fusionGetValueWithUnit( this.values.button_margin_bottom ) ); } if ( !this.isDefault( 'button_margin_left' ) ) { this.addCssProperty( selector, 'margin-left', _.fusionGetValueWithUnit( this.values.button_margin_left ) ); } if ( 'custom' === this.values.button_style ) { button = '.fusion-body ' + this.baseSelector + ' .fusion-post-card-cart-add-to-cart'; button_hover = button + ':hover'; // Button size. if ( !this.isDefault( 'button_size' ) ) { if ( 'undefined' !== typeof button_size_map[ this.values.button_size ] ) { button_dimensions = button_size_map[ this.values.button_size ]; this.addCssProperty( button, 'padding', button_dimensions.padding ); this.addCssProperty( button, 'line-height', button_dimensions.line_height ); this.addCssProperty( button, 'font-size', button_dimensions.font_size ); } } if ( ! this.isDefault( 'button_border_top' ) ) { this.addCssProperty( button, 'border-top-width', _.fusionGetValueWithUnit( this.values.button_border_top ) ); } if ( ! this.isDefault( 'button_border_right' ) ) { this.addCssProperty( button, 'border-right-width', _.fusionGetValueWithUnit( this.values.button_border_right ) ); } if ( ! this.isDefault( 'button_border_bottom' ) ) { this.addCssProperty( button, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.button_border_bottom ) ); } if ( ! this.isDefault( 'button_border_left' ) ) { this.addCssProperty( button, 'border-left-width', _.fusionGetValueWithUnit( this.values.button_border_left ) ); } if ( !this.isDefault( 'button_color' ) ) { this.addCssProperty( button, 'color', this.values.button_color ); } if ( ( 'undefined' !== typeof this.values.button_gradient_top && '' !== this.values.button_gradient_top ) || ( 'undefined' !== this.values.button_gradient_bottom && '' !== this.values.button_gradient_bottom ) ) { this.addCssProperty( button, 'background', this.values.button_gradient_top ); this.addCssProperty( button, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom + ', ' + this.values.button_gradient_top + ' )' ); } if ( !this.isDefault( 'button_border_color' ) ) { this.addCssProperty( button, 'border-color', this.values.button_border_color ); } if ( !this.isDefault( 'button_color_hover' ) ) { this.addCssProperty( button_hover, 'color', this.values.button_color_hover ); } if ( ( this.values.button_gradient_top_hover && '' !== this.values.button_gradient_top_hover ) || ( this.values.button_gradient_bottom_hover && '' !== this.values.button_gradient_bottom_hover ) ) { this.addCssProperty( button_hover, 'background', this.values.button_gradient_top_hover ); this.addCssProperty( button_hover, 'background-image', 'linear-gradient( to top, ' + this.values.button_gradient_bottom_hover + ', ' + this.values.button_gradient_top_hover + ' )' ); } if ( !this.isDefault( 'button_border_color_hover' ) ) { this.addCssProperty( button_hover, 'border-color', this.values.button_border_color_hover ); } } else { // Link text color. if ( !this.isDefault( 'link_color' ) ) { this.addCssProperty( selector, 'color', this.values.link_color ); } if ( !this.isDefault( 'link_hover_color' ) ) { this.addCssProperty( selector + ':hover', 'color', this.values.link_hover_color ); } if ( !this.isDefault( 'link_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.link_font_size ); } } // Product link button styling selector = this.baseSelector + ' .fusion-post-card-cart-product-link'; if ( !this.isDefault( 'button_details_margin_top' ) ) { this.addCssProperty( selector, 'margin-top', _.fusionGetValueWithUnit( this.values.button_details_margin_top ) ); } if ( !this.isDefault( 'button_details_margin_right' ) ) { this.addCssProperty( selector, 'margin-right', _.fusionGetValueWithUnit( this.values.button_details_margin_right ) ); } if ( !this.isDefault( 'button_details_margin_bottom' ) ) { this.addCssProperty( selector, 'margin-bottom', _.fusionGetValueWithUnit( this.values.button_details_margin_bottom ) ); } if ( !this.isDefault( 'button_details_margin_left' ) ) { this.addCssProperty( selector, 'margin-left', _.fusionGetValueWithUnit( this.values.button_details_margin_left ) ); } if ( 'custom' === this.values.product_link_style ) { button = '.fusion-body ' + this.baseSelector + ' .fusion-post-card-cart-product-link'; // Button size. if ( !this.isDefault( 'button_details_size' ) ) { if ( 'undefined' !== typeof button_size_map[ this.values.button_details_size ] ) { button_dimensions = button_size_map[ this.values.button_details_size ]; this.addCssProperty( button, 'padding', button_dimensions.padding ); this.addCssProperty( button, 'line-height', button_dimensions.line_height ); this.addCssProperty( button, 'font-size', button_dimensions.font_size ); } } if ( ! this.isDefault( 'button_details_border_top' ) ) { this.addCssProperty( button, 'border-top-width', _.fusionGetValueWithUnit( this.values.button_details_border_top ) ); } if ( ! this.isDefault( 'button_details_border_right' ) ) { this.addCssProperty( button, 'border-right-width', _.fusionGetValueWithUnit( this.values.button_details_border_right ) ); } if ( ! this.isDefault( 'button_details_border_bottom' ) ) { this.addCssProperty( button, 'border-bottom-width', _.fusionGetValueWithUnit( this.values.button_details_border_bottom ) ); } if ( ! this.isDefault( 'button_details_border_left' ) ) { this.addCssProperty( button, 'border-left-width', _.fusionGetValueWithUnit( this.values.button_details_border_left ) ); } if ( !this.isDefault( 'button_details_color' ) ) { this.addCssProperty( button, 'color', this.values.button_details_color ); } if ( ( 'undefined' !== typeof this.values.button_details_gradient_top && '' !== this.values.button_details_gradient_top ) || ( 'undefined' !== typeof this.values.button_details_gradient_bottom && '' !== this.values.button_details_gradient_bottom ) ) { this.addCssProperty( button, 'background', this.values.button_details_gradient_top ); this.addCssProperty( button, 'background-image', 'linear-gradient( to top, ' + this.values.button_details_gradient_bottom + ', ' + this.values.button_details_gradient_top + ' )' ); } if ( !this.isDefault( 'button_details_border_color' ) ) { this.addCssProperty( button, 'border-color', this.values.button_details_border_color ); } button_hover = button + ':hover'; // Button hover text color. if ( !this.isDefault( 'button_details_color_hover' ) ) { this.addCssProperty( button_hover, 'color', this.values.button_details_color_hover ); } if ( ( 'undefined' !== typeof this.values.button_details_gradient_top_hover && '' !== this.values.button_details_gradient_top_hover ) || ( 'undefined' !== typeof this.values.button_details_gradient_bottom_hover && '' !== this.values.button_details_gradient_bottom_hover ) ) { this.addCssProperty( button_hover, 'background', this.values.button_details_gradient_top_hover ); this.addCssProperty( button_hover, 'background-image', 'linear-gradient( to top, ' + this.values.button_details_gradient_bottom_hover + ', ' + this.values.button_details_gradient_top_hover + ' )' ); } if ( !this.isDefault( 'button_details_border_color_hover' ) ) { this.addCssProperty( button_hover, 'border-color', this.values.button_details_border_color_hover ); } } else { // Link text color. if ( !this.isDefault( 'product_link_color' ) ) { this.addCssProperty( selector, 'color', this.values.product_link_color ); } if ( !this.isDefault( 'product_link_hover_color' ) ) { this.addCssProperty( selector + ':hover', 'color', this.values.product_link_hover_color ); } if ( !this.isDefault( 'product_link_font_size' ) ) { this.addCssProperty( selector, 'font-size', this.values.product_link_font_size ); } } css = this.parseCSS(); return ( css ) ? '<style>' + css + '</style>' : ''; } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Alert Element View. FusionPageBuilder.fusion_facebook_page = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.atts = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; attributes.styles = this.buildStyles( atts ); return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = {}; if ( '' !== values.id ) { attr.id = values.id; } attr[ 'class' ] = 'fusion-facebook-page fb-page fusion-facebook-page-' + this.model.get( 'cid' ) + ' ' + values[ 'class' ]; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( '' !== values.href ) { attr[ 'data-href' ] = values.href; } if ( '' !== values.tabs ) { attr[ 'data-tabs' ] = values.tabs; } if ( '' !== values.width ) { attr[ 'data-width' ] = values.width; } if ( '' !== values.height ) { attr[ 'data-height' ] = values.height; } if ( 'small' === values.header ) { attr[ 'data-small_header' ] = 'true'; } if ( 'hide' === values.cover ) { attr[ 'data-hide_cover' ] = 'true'; } if ( 'hide' === values.cta ) { attr[ 'data-hide_cta' ] = 'true'; } if ( 'on' === values.lazy ) { attr[ 'data-lazy' ] = 'true'; } if ( 'hide' === values.facepile ) { attr[ 'data-show_facepile' ] = 'false'; } //Animation attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds margin styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildMarginStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-facebook-page-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== atts.values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( atts.values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); return responsiveStyles; }, /** * Builds styles. * * @since 3.5 * @param {Object} atts - The atts object * @return {string} */ buildStyles: function( atts ) { var selectors; var values = atts.values; var style; this.dynamic_css = {}; this.baseSelector = '.fusion-facebook-page-' + this.model.get( 'cid' ); selectors = [ this.baseSelector ]; if ( '' !== values.alignment ) { this.addCssProperty( selectors, 'display', 'flex' ); this.addCssProperty( selectors, 'justify-content', values.alignment ); } style = this.parseCSS(); style += this.buildMarginStyles( atts ); return style ? '<style>' + style + '</style>' : ''; }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function() { if ( 'undefined' !== typeof FusionApp.previewWindow.FB ) { FusionApp.previewWindow.FB.XFBML.parse(); } }, onInit: function() { this._refreshJs(); }, onRender: function() { this._refreshJs(); }, afterPatch: function() { this._refreshJs(); } } ); } ); }( jQuery ) ); ;/* global fusionAllElements, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion twitter timeline. FusionPageBuilder.fusion_twitter_timeline = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.atts = this.buildAttr( atts.values ); attributes.iframeAtts = this.buildIframeAttr( atts.values ); // Any extras that need passed on. attributes.values = atts.values; attributes.styles = this.buildStyles( atts ); return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = _.fusionVisibilityAtts( values.hide_on_mobile, { class: 'fusion-twitter-timeline fusion-twitter-timeline-' + this.model.get( 'cid' ) + ' ' + values[ 'class' ] } ); if ( '' !== values.id ) { attr.id = values.id; } //Animation attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds Iframe attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildIframeAttr: function( values ) { var attr = {}; attr[ 'class' ] = 'twitter-timeline'; attr.href = 'https://twitter.com/' + values.username; if ( '' !== values.language ) { attr[ 'data-lang' ] = values.language; } if ( '' !== values.width ) { attr[ 'data-width' ] = values.width; } if ( '' !== values.height ) { attr[ 'data-height' ] = values.height; } if ( '' !== values.theme ) { attr[ 'data-theme' ] = values.theme; } if ( 'hide' !== values.borders && '' !== values.border_color ) { attr[ 'data-border-color' ] = values.border_color; } let chrome = ''; if ( 'hide' === values.header ) { chrome += ' noheader'; } if ( 'hide' === values.footer ) { chrome += ' nofooter'; } if ( 'hide' === values.borders ) { chrome += ' noborders'; } if ( 'hide' === values.scrollbar ) { chrome += ' noscrollbar'; } if ( 'yes' === values.transparent ) { chrome += ' transparent'; } if ( '' !== chrome ) { attr[ 'data-chrome' ] = chrome; } return attr; }, /** * Builds margin styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildMarginStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-twitter-timeline-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== atts.values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( atts.values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); return responsiveStyles; }, /** * Builds styles. * * @since 3.5 * @param {Object} atts - The atts object * @return {string} */ buildStyles: function( atts ) { var selectors; var style; var values = atts.values; this.dynamic_css = {}; this.baseSelector = '.fusion-twitter-timeline-' + this.model.get( 'cid' ); selectors = [ this.baseSelector ]; if ( '' !== values.alignment ) { this.addCssProperty( selectors, 'display', 'flex' ); this.addCssProperty( selectors, 'justify-content', values.alignment ); } style = this.parseCSS(); style += this.buildMarginStyles( atts ); return style ? '<style>' + style + '</style>' : ''; }, /** * Triggers a refresh. * * @since 2.0.0 * @return void */ refreshJs: function() { if ( 'undefined' !== typeof FusionApp.previewWindow.twttr ) { FusionApp.previewWindow.twttr.widgets.load(); } }, onInit: function() { this._refreshJs(); }, onRender: function() { this._refreshJs(); }, afterPatch: function() { this._refreshJs(); } } ); } ); }( jQuery ) ); ;/* globals fusionAllElements, FusionApp */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { // Fusion flickr. FusionPageBuilder.fusion_flickr = FusionPageBuilder.FormComponentView.extend( { /** * Modify template attributes. * * @since 2.0 * @param {Object} atts - The attributes object. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; // Create attribute objects attributes.atts = this.buildAttr( atts.values ); // Any extras that need passed on. attributes.cid = this.model.get( 'cid' ); attributes.values = atts.values; attributes.columnStyles = this.buildColumnStyles( atts ); attributes.marginStyles = this.buildMarginStyles( atts ); attributes.aspectRatio = this.buildAspectRatioStyles( atts.values ); attributes.flickrItems = FusionApp.previewWindow.fusionFlickrItems; return attributes; }, /** * Builds attributes. * * @since 2.0 * @param {Object} values - The values object. * @return {Object} */ buildAttr: function( values ) { var attr = {}; attr[ 'class' ] = 'fusion-flickr-element flickr-' + this.model.get( 'cid' ) + ' ' + values[ 'class' ]; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( '' !== values.id ) { attr.id = values.id; } if ( '' !== values.hover_type ) { attr[ 'class' ] += ' hover-' + values.hover_type; } attr.style = ''; if ( '' !== values.columns ) { attr.style += '--flickr-grid-columns:' + values.columns + ';'; } if ( '' !== values.columns_medium ) { attr.style += '--flickr-grid-md-columns:' + values.columns_medium + ';'; } if ( '' !== values.columns_small ) { attr.style += '--flickr-grid-sm-columns:' + values.columns_small + ';'; } if ( '' !== values.columns_spacing ) { attr.style += '--flickr-grid-gap:' + _.fusionGetValueWithUnit( values.columns_spacing ) + ';'; } if ( '' !== values.columns_spacing_medium ) { attr.style += '--flickr-grid-md-gap:' + _.fusionGetValueWithUnit( values.columns_spacing_medium ) + ';'; } if ( '' !== values.columns_spacing_small ) { attr.style += '--flickr-grid-sm-gap:' + _.fusionGetValueWithUnit( values.columns_spacing_small ) + ';'; } if ( '' !== values.flickr_id ) { attr[ 'data-id' ] = values.flickr_id; } if ( '' !== values.type ) { attr[ 'data-type' ] = values.type; } if ( '' !== values.album_id ) { attr[ 'data-album_id' ] = values.album_id; } if ( '' !== values.count ) { attr[ 'data-count' ] = values.count; } if ( '' !== values.api_key ) { attr[ 'data-api_key' ] = values.api_key; } if ( '' !== values.link_type ) { attr[ 'data-link_type' ] = values.link_type; } if ( 'page' === values.link_type && '_blank' === values.link_target ) { attr[ 'data-link_target' ] = values.link_target; } //Animation attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds margin styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildMarginStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-flickr-element.flickr-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== atts.values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( atts.values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); if ( '' !== responsiveStyles ) { responsiveStyles = '<style>' + responsiveStyles + '</style>'; } return responsiveStyles; }, /** * Builds column styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildColumnStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-flickr-element.flickr-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var columns = ( 'large' === size ) ? atts.values.columns : atts.values[ 'columns_' + size ], columns_spacing = ( 'large' === size ) ? atts.values.columns_spacing : atts.values[ 'columns_spacing_' + size ], columns_style = ''; if ( '' !== columns ) { columns_style += 'grid-template-columns: repeat(' + columns + ', 1fr);'; } if ( '' !== columns_spacing ) { columns_style += 'grid-gap:' + _.fusionGetValueWithUnit( columns_spacing ) + ';'; } if ( '' !== columns_style ) { columns_style = elementSelector + '{' + columns_style + '}'; } if ( 'large' === size ) { responsiveStyles += columns_style; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + columns_style + '}'; } } ); if ( '' !== responsiveStyles ) { responsiveStyles = '<style>' + responsiveStyles + '</style>'; } return responsiveStyles; }, /** * Builds aspect ratio styles. * * @since 7.6 * @param {Object} atts - The atts object. * @return {string} */ buildAspectRatioStyles: function( values ) { var selectors, aspectRatio, width, height, padding; if ( '' === values.aspect_ratio ) { return ''; } this.dynamic_css = {}; this.baseSelector = '.fusion-flickr-element.flickr-' + this.model.get( 'cid' ) + ' .flickr-image'; selectors = [ this.baseSelector ]; // Calc Ratio if ( 'custom' === values.aspect_ratio && '' !== values.custom_aspect_ratio ) { this.addCssProperty( selectors, 'padding-top', values.custom_aspect_ratio + '%' ); } else { aspectRatio = values.aspect_ratio.split( '-' ); width = aspectRatio[ 0 ] || ''; height = aspectRatio[ 1 ] || ''; padding = '' !== width && '' !== height ? ( height / width ) * 100 : ''; this.addCssProperty( selectors, 'padding-top', padding + '%' ); } //Ratio Position selectors = [ this.baseSelector + ' img' ]; const x = '' !== values.aspect_ratio_position_x ? values.aspect_ratio_position_x + '%' : '50%'; const y = '' !== values.aspect_ratio_position_y ? values.aspect_ratio_position_y + '%' : '50%'; this.addCssProperty( selectors, 'object-position', x + ' ' + y ); const css = this.parseCSS(); return '<style>' + css + '</style>'; }, /** * Things to do, places to go when options change. * * @since 2.0.0 * @param {string} paramName - The name of the parameter that changed. * @param {mixed} paramValue - The value of the option that changed. * @param {Object} event - The event triggering the option change. * @return {void} */ onOptionChange: function( paramName ) { if ( 'flickr_id' === paramName || 'count' === paramName ) { FusionApp.previewWindow.fusionFlickrItems = ''; } } } ); } ); }( jQuery ) ); ;/* global fusionAllElements */ var FusionPageBuilder = FusionPageBuilder || {}; ( function() { jQuery( document ).ready( function() { FusionPageBuilder.fusion_tagcloud = FusionPageBuilder.ElementView.extend( { /** * Modify template attributes. * * @since 3.5 * @param {Object} atts - The attributes. * @return {Object} */ filterTemplateAtts: function( atts ) { var attributes = {}; this.values = atts.values; attributes.tagcloudAttr = this.buildtagcloudAttr( atts.values ); attributes.marginStyles = this.buildMarginStyles( atts ); attributes.styles = this.getStyleTag( atts.values ); attributes.tagCloudItems = atts.query_data; return attributes; }, /** * Build the tagcloud element attributes. * * @since 3.5 * @param {Object} values * @return {Object} */ buildtagcloudAttr: function( values ) { var attr = { 'class': 'fusion-tagcloud-element fusion-tagcloud-cid-' + this.model.get( 'cid' ) }; attr = _.fusionVisibilityAtts( values.hide_on_mobile, attr ); if ( '' !== values.id ) { attr.id = values.id; } if ( '' !== values.style ) { attr[ 'class' ] += ' style-' + values.style; } if ( 'variable' === values.font_size_type ) { attr[ 'class' ] += ' variable-font-size'; } //Animation attr = _.fusionAnimations( values, attr ); return attr; }, /** * Builds margin styles. * * @since 3.5 * @param {Object} atts - The atts object. * @return {string} */ buildMarginStyles: function( atts ) { var extras = jQuery.extend( true, {}, fusionAllElements.fusion_imageframe.extras ), elementSelector = '.fusion-tagcloud-cid-' + this.model.get( 'cid' ), responsiveStyles = ''; _.each( [ 'large', 'medium', 'small' ], function( size ) { var marginStyles = '', marginKey; _.each( [ 'top', 'right', 'bottom', 'left' ], function( direction ) { // Margin. marginKey = 'margin_' + direction + ( 'large' === size ? '' : '_' + size ); if ( '' !== atts.values[ marginKey ] ) { marginStyles += 'margin-' + direction + ' : ' + _.fusionGetValueWithUnit( atts.values[ marginKey ] ) + ';'; } } ); if ( '' === marginStyles ) { return; } // Wrap CSS selectors if ( '' !== marginStyles ) { marginStyles = elementSelector + ' {' + marginStyles + '}'; } // Large styles, no wrapping needed. if ( 'large' === size ) { responsiveStyles += marginStyles; } else { // Medium and Small size screen styles. responsiveStyles += '@media only screen and (max-width:' + extras[ 'visibility_' + size ] + 'px) {' + marginStyles + '}'; } } ); if ( '' !== responsiveStyles ) { responsiveStyles = '<style>' + responsiveStyles + '</style>'; } return responsiveStyles; }, /** * Get style element. * * @since 3.5 * @param {object} values * @param {object} extras * @return string */ getStyleTag: function( values ) { var selectors; this.dynamic_css = {}; this.baseSelector = '.fusion-tagcloud-cid-' + this.model.attributes.cid; selectors = [ this.baseSelector ]; if ( '' !== values.alignment ) { this.addCssProperty( selectors, 'justify-content', values.alignment, true ); } if ( '' !== values.tags_spacing ) { this.addCssProperty( selectors, 'gap', _.fusionGetValueWithUnit( values.tags_spacing ), true ); } selectors = [ this.baseSelector + ' a.tag-cloud-link' ]; if ( '' !== values.font_size && 'variable' !== values.font_size_type ) { this.addCssProperty( selectors, 'font-size', _.fusionGetValueWithUnit( values.font_size ), true ); } if ( '' !== values.letter_spacing ) { this.addCssProperty( selectors, 'letter-spacing', _.fusionGetValueWithUnit( values.letter_spacing ), true ); } //padding if ( 'arrows' !== values.style ) { if ( '' !== values.padding_top ) { this.addCssProperty( selectors, 'padding-top', _.fusionGetValueWithUnit( values.padding_top ), true ); } if ( '' !== values.padding_right ) { this.addCssProperty( selectors, 'padding-right', _.fusionGetValueWithUnit( values.padding_right ), true ); } if ( '' !== values.padding_bottom ) { this.addCssProperty( selectors, 'padding-bottom', _.fusionGetValueWithUnit( values.padding_bottom ), true ); } if ( '' !== values.padding_left ) { this.addCssProperty( selectors, 'padding-left', _.fusionGetValueWithUnit( values.padding_left ), true ); } } //borders if ( 'arrows' !== values.style ) { if ( '' !== values.border_top ) { this.addCssProperty( selectors, 'border-top-width', _.fusionGetValueWithUnit( values.border_top ), true ); } if ( '' !== values.border_right ) { this.addCssProperty( selectors, 'border-right-width', _.fusionGetValueWithUnit( values.border_right ), true ); } if ( '' !== values.border_bottom ) { this.addCssProperty( selectors, 'border-bottom-width', _.fusionGetValueWithUnit( values.border_bottom ), true ); } if ( '' !== values.border_left ) { this.addCssProperty( selectors, 'border-left-width', _.fusionGetValueWithUnit( values.border_left ), true ); } if ( '' !== values.border_radius_top_left ) { this.addCssProperty( selectors, 'border-top-left-radius', _.fusionGetValueWithUnit( values.border_radius_top_left ), true ); } if ( '' !== values.border_radius_top_right ) { this.addCssProperty( selectors, 'border-top-right-radius', _.fusionGetValueWithUnit( values.border_radius_top_right ), true ); } if ( '' !== values.border_radius_bottom_left ) { this.addCssProperty( selectors, 'border-bottom-left-radius', _.fusionGetValueWithUnit( values.border_radius_bottom_left ), true ); } if ( '' !== values.border_radius_bottom_right ) { this.addCssProperty( selectors, 'border-bottom-right-radius', _.fusionGetValueWithUnit( values.border_radius_bottom_right ), true ); } } if ( 'arrows' === values.style ) { if ( '' !== values.arrows_border_radius_top_right ) { this.addCssProperty( selectors, 'border-top-right-radius', _.fusionGetValueWithUnit( values.arrows_border_radius_top_right ), true ); } if ( '' !== values.arrows_border_radius_bottom_right ) { this.addCssProperty( selectors, 'border-bottom-right-radius', _.fusionGetValueWithUnit( values.arrows_border_radius_bottom_right ), true ); } } //colors const randomColors = '' !== values.random_colors ? values.random_colors : ''; if ( '' !== values.background_color && !randomColors.includes( 'background' ) ) { this.addCssProperty( selectors, '--tag-color', values.background_color, true ); } if ( '' !== values.text_color && !randomColors.includes( 'text' ) ) { this.addCssProperty( selectors, '--tag-text-color', values.text_color, true ); } if ( '' !== values.border_color && 'arrows' !== values.style && !randomColors.includes( 'background' ) ) { this.addCssProperty( selectors, 'border-color', values.border_color, true ); } selectors = [ this.baseSelector + ' a.tag-cloud-link:hover' ]; if ( '' !== values.background_hover_color && !randomColors.includes( 'background' ) ) { this.addCssProperty( selectors, '--tag-color-hover', values.background_hover_color, true ); } if ( '' !== values.text_hover_color && !randomColors.includes( 'text' ) ) { this.addCssProperty( selectors, '--tag-text-color-hover', values.text_hover_color, true ); } if ( '' !== values.border_hover_color && 'arrows' !== values.style && !randomColors.includes( 'background' ) ) { this.addCssProperty( selectors, 'border-color', values.border_hover_color, true ); } // padding for arrows style. if ( 'arrows' === values.style ) { selectors = [ this.baseSelector + '.style-arrows a.tag-cloud-link .text' ]; if ( '' !== values.padding_top ) { this.addCssProperty( selectors, 'padding-top', _.fusionGetValueWithUnit( values.padding_top ), true ); } if ( '' !== values.padding_right ) { this.addCssProperty( selectors, 'padding-right', _.fusionGetValueWithUnit( values.padding_right ), true ); } if ( '' !== values.padding_bottom ) { this.addCssProperty( selectors, 'padding-bottom', _.fusionGetValueWithUnit( values.padding_bottom ), true ); } if ( '' !== values.padding_left ) { this.addCssProperty( selectors, 'padding-left', _.fusionGetValueWithUnit( values.padding_left ), true ); } if ( '' !== values.padding_top || '' !== values.padding_bottom ) { selectors = [ this.baseSelector + '.style-arrows a.tag-cloud-link' ]; let tags_height = 'calc(2.4em'; // 2.4em the default height from the css file. if ( '' !== values.padding_top ) { tags_height += ' + ' + _.fusionGetValueWithUnit( values.padding_top ); } if ( '' !== values.padding_bottom ) { tags_height += ' + ' + _.fusionGetValueWithUnit( values.padding_bottom ); } tags_height += ')'; this.addCssProperty( selectors, 'height', tags_height, true ); } } const style = this.parseCSS(); return style ? '<style>' + style + '</style>' : ''; }, /** * Init. * * @since 3.5 * @return {void} */ onInit: function() { // Also refresh on init, since the onPageLoad event don't trigger sometimes. var previewBody = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); previewBody.trigger( 'fusion-element-render-fusion_tagcloud', this.model.attributes.cid ); }, /** * Runs after view DOM is patched. * * @since 3.5 * @return {void} */ afterPatch: function() { var previewBody = jQuery( '#fb-preview' )[ 0 ].contentWindow.jQuery( 'body' ); previewBody.trigger( 'fusion-element-render-fusion_tagcloud', this.model.attributes.cid ); } } ); } ); }( jQuery ) );
💾 保存文件
← 返回文件管理器