ProShell v2.0
Dashboard
Server Info
Server: 158.106.128.192
PHP: 8.2.33
home
planet5
public_html
bansibaba.com
wp-includes
2026-09-21 00:41:02
Editing: app.js
Cancel
Save Changes
/* global fusionBuilderGetContent, FusionPageBuilderApp, tinymce, fusionBuilderConfig, fusionHistoryManager, tinyMCE, unescape, fusionAllElements, FusionPageBuilderElements, confirm, fusionBuilderText, alert, FusionPageBuilderViewManager, console, fusionMultiElements, fusionBuilderStickyHeader, openShortcodeGenerator, Fuse, fusionIconSearch, awbUpdatePOPanel */ /* eslint no-bitwise: 0 */ /* eslint no-redeclare: 0 */ /* eslint no-alert: 0 */ /* eslint no-undef: 0 */ /* eslint no-mixed-operators: 0 */ /* eslint no-useless-escape: 0 */ /* eslint no-unused-vars: 0 */ /* eslint no-shadow: 0 */ /* eslint array-callback-return: 0 */ /* eslint no-throw-literal: 0 */ /* eslint max-depth: 0 */ /* eslint no-multi-assign: 0 */ /* eslint guard-for-in: 0 */ /* eslint no-native-reassign: 0 */ /* eslint no-continue: 0 */ /* eslint no-global-assign: 0 */ var FusionPageBuilder = FusionPageBuilder || {}; // Events var FusionPageBuilderEvents = _.extend( {}, Backbone.Events ); ( function( $ ) { var FusionDelay; $.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 ] ) ) ); }; window.fusionBuilderGetContent = function( textareaID, removeAutoP, initialLoad ) { // jshint ignore:line var content; if ( 'undefined' === typeof removeAutoP ) { removeAutoP = false; } if ( 'undefined' === typeof initialLoad ) { initialLoad = false; } if ( ! initialLoad && 'undefined' !== typeof window.tinyMCE && window.tinyMCE.get( textareaID ) && ! window.tinyMCE.get( textareaID ).isHidden() ) { content = window.tinyMCE.get( textareaID ).getContent(); } else if ( $( '#' + textareaID ).length ) { content = $( '#' + textareaID ).val().replace( /\r?\n/g, '\r\n' ); } // Remove auto p tags from content. if ( removeAutoP && 'undefined' !== typeof window.tinyMCE && 'undefined' !== typeof content ) { content = content.replace( /<p>\[/g, '[' ); content = content.replace( /\]<\/p>/g, ']' ); } if ( 'undefined' !== typeof content ) { return content.trim(); } }; // Delay FusionDelay = ( function() { var timer = 0; return function( callback, ms ) { clearTimeout( timer ); timer = setTimeout( callback, ms ); }; }() ); $( window ).on( 'load', function() { if ( $( '#fusion_toggle_builder' ).data( 'enabled' ) ) { $( '#fusion_toggle_builder' ).trigger( 'click' ); } } ); $( '#publishing-action #publish' ).on( 'click', function() { FusionPageBuilderApp.saveGlobal = false; } ); $( window ).on( 'beforeunload', function() { var editor = 'undefined' !== typeof tinymce && tinymce.get( 'content' ); if ( ( ( editor && ! editor.isHidden() && editor.isDirty() ) || ( wp.autosave && wp.autosave.server.postChanged() ) ) && ( true === FusionPageBuilderApp.saveGlobal && ! $( '#publish' ).hasClass( 'disable' ) ) ) { FusionPageBuilderApp.saveGlobal = false; return ''; } } ); $( document ).ready( function() { var $selectedDemo, $useBuilderMetaField, $toggleBuilderButton, $builder, $mainEditorWrapper, $container; // Column sizes dialog. Close on outside click. $( document ).click( function( e ) { if ( $( e.target ).parent( '.column-sizes' ).length || $( e.target ).hasClass( 'fusion-builder-resize-column' ) || $( e.target ).parent( '.fusion-builder-resize-column' ).length ) { // Column sizes dialog clicked. } else { $( '.column-sizes' ).hide(); } } ); // Avada Builder App View FusionPageBuilder.AppView = window.wp.Backbone.View.extend( { mediaImportKeys: [], el: $( '#fusion_builder_main_container' ), template: FusionPageBuilder.template( $( '#fusion-builder-app-template' ).html() ), events: { 'click .fusion-builder-layout-button-save': 'saveLayout', 'click .fusion-builder-layout-button-load': 'loadLayout', 'click .fusion-builder-layout-button-delete': 'deleteLayout', 'click .fusion-builder-layout-buttons-clear': 'clearLayout', 'click .fusion-builder-demo-button-load': 'loadDemoPage', 'click .fusion-builder-layout-code-fields': 'toggleCodeFields', 'click .fusion-builder-layout-custom-css': 'customCSS', 'click .fusion-builder-template-buttons-save': 'saveTemplateDialog', 'click #fusion-builder-layouts .fusion-builder-modal-close': 'hideLibrary', 'click .fusion-builder-library-dialog': 'openLibrary', 'mouseenter .fusion-builder-layout-buttons-history': 'showHistoryDialog', 'mouseleave .fusion-builder-layout-buttons-history': 'hideHistoryDialog', 'click .fusion-builder-element-button-save': 'saveElement', 'click #fusion-load-template-dialog': 'loadPreBuiltPage', 'click #fusion-load-studio-dialog': 'loadSutdioPage', 'click .fusion-builder-layout-buttons-toggle-containers': 'toggleAllContainers', 'click .fusion-builder-global-tooltip': 'unglobalize', 'click .fusion-builder-publish-tooltip': 'publish', 'click .awb-import-options-toggle': 'toggleImportOptions', 'click .awb-import-studio-item': 'loadStudioLayout', contextmenu: 'contextMenu' }, initialize: function() { this.builderActive = false; this.pauseBuilder = false; this.ajaxurl = fusionBuilderConfig.ajaxurl; this.fusion_load_nonce = fusionBuilderConfig.fusion_load_nonce; this.fusion_builder_plugin_dir = fusionBuilderConfig.fusion_builder_plugin_dir; this.layoutIsLoading = false; this.layoutIsSaving = false; this.saveGlobal = false; this.layoutIsDeleting = false; this.parentRowId = ''; this.parentColumnId = ''; this.targetContainerCID = ''; this.activeModal = ''; this.innerColumn = ''; this.blankPage = ''; this.newLayoutLoaded = false; this.newContainerAdded = false; this.fullWidth = fusionBuilderConfig.full_width; this.allContent = ''; // Shortcode Generator this.shortcodeGenerator = ''; this.shortcodeGeneratorMultiElement = ''; this.shortcodeGeneratorMultiElementChild = ''; this.allowShortcodeGenerator = ''; this.shortcodeGeneratorActiveEditor = ''; this.shortcodeGeneratorEditorID = ''; this.manuallyAdded = false; this.manualGenerator = false; this.manualEditor = ''; this.fromExcerpt = false; // Code Block encoding this.disable_encoding = fusionBuilderConfig.disable_encoding; this._keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; this.codeEditor = ''; this.MultiElementChildSettings = false; // Listen for new elements this.listenTo( this.collection, 'add', this.addBuilderElement ); // Convert builder layout to shortcodes this.listenTo( FusionPageBuilderEvents, 'fusion-element-added', this.builderToShortcodes ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-removed', this.builderToShortcodes ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-cloned', this.builderToShortcodes ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-edited', this.builderToShortcodes ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-sorted', this.builderToShortcodes ); // Sync global layouts. this.listenTo( FusionPageBuilderEvents, 'fusion-element-added', this.syncGlobalLayouts ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-cloned', this.syncGlobalLayouts ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-edited', this.syncGlobalLayouts ); this.listenTo( FusionPageBuilderEvents, 'fusion-element-sorted', this.syncGlobalLayouts ); // Loader animation this.listenTo( FusionPageBuilderEvents, 'fusion-show-loader', this.showLoader ); this.listenTo( FusionPageBuilderEvents, 'fusion-hide-loader', this.hideLoader ); // Hide library this.listenTo( FusionPageBuilderEvents, 'fusion-hide-library', this.hideLibrary ); // Save layout template on return key this.listenTo( FusionPageBuilderEvents, 'fusion-save-layout', this.saveLayout ); // Save history state this.listenTo( FusionPageBuilderEvents, 'fusion-save-history-state', this.saveHistoryState ); // Toggled Containers this.toggledContainers = true; // for HTML decoding. this.dummyTextArea = document.createElement( 'textarea' ); this.render(); this.codeFields(); if ( ! jQuery( 'body' ).hasClass( 'gutenberg-editor-page' ) ) { if ( $( '#fusion_toggle_builder' ).hasClass( 'fusion_builder_is_active' ) ) { // Create builder layout on initial load. this.initialBuilderLayout( true ); } // Turn on history tracking. Capture editor. Save initial history state. fusionHistoryManager.turnOnTracking(); fusionHistoryManager.captureEditor(); fusionHistoryManager.turnOffTracking(); } // Context menu. this.contextMenuView = false; this.clipboard = {}; // Dynamic Values Model. this.dynamicValues = new FusionPageBuilder.DynamicValues(); if ( 'object' === typeof fusionDynamicData ) { this.dynamicValues.addData( null, fusionDynamicData.dynamicOptions ); } // Studio Model. this.studio = new FusionPageBuilder.Studio(); // Website Model. this.website = new FusionPageBuilder.Website(); // Simplified element map. this.simplifiedMap = []; // Media map. this.mediaMap = { images: {}, menus: {}, forms: {}, post_cards: {}, videos: {}, icons: {}, off_canvases: {} }; // Settings to params map for form only. if ( jQuery( '#pyre_fusion_form' ).length ) { this.createSettingsToParams(); } }, render: function() { this.$el.html( this.template() ); this.sortableContainers(); return this; }, /** * Maps settings to settingsToParams. * * @since 2.0.0 * @return {void} */ createSettingsToParams: function() { var self = this, paramObj; _.each( fusionAllElements, function( element, elementID ) { if ( ! _.isUndefined( element.settings_to_params ) ) { _.each( element.settings_to_params, function( param, setting ) { param = _.isObject( param ) && ! _.isUndefined( param.param ) ? param.param : param; // We don't have this in PO, no need to listen. if ( jQuery( '[name="_fusion[' + setting + ']"]' ).length ) { jQuery( '[name="_fusion[' + setting + ']"]' ).on( 'change fusion-changed', function() { var value = jQuery( this ).val() && '' !== jQuery( this ).val() ? jQuery( this ).val() : jQuery( this ).closest( '.pyre_metabox_field' ).find( '[data-default]' ).attr( 'data-default' ); self.defaultChanged( elementID, param, value ); } ); } } ); } } ); }, /** * A PO which is used as a default has changed. * * @since 2.0.0 * @return {void} */ defaultChanged: function( elementType, param, value ) { var oldDefault = fusionAllElements[ elementType ].params[ param ][ 'default' ]; if ( 'object' !== typeof fusionAllElements[ elementType ] ) { return; } fusionAllElements[ elementType ].params[ param ][ 'default' ] = value; if ( 'string' === typeof fusionAllElements[ elementType ].params[ param ].description ) { fusionAllElements[ elementType ].params[ param ].description = fusionAllElements[ elementType ].params[ param ].description.replace( '>' + oldDefault, '>' + value ); } }, unglobalize: function( event ) { var cid = jQuery( event.currentTarget ).data( 'cid' ), view = FusionPageBuilderViewManager.getView( cid ), params = view.model.get( 'params' ), type = view.model.get( 'element_type' ), r; r = confirm( fusionBuilderText.are_you_sure_you_want_to_remove_global ); if ( false === r ) { return false; } // Remove global attributes delete params.fusion_global; view.model.set( 'params', params ); view.$el.removeClass( 'fusion-global-element fusion-global-container fusion-global-column' ); jQuery( event.currentTarget ).remove(); view.$el.removeAttr( 'fusion-global-layout' ); if ( 'fusion_builder_container' === type ) { view.$el.find( '.fusion-builder-container-content > .fusion-builder-section-content' ).removeAttr( 'fusion-global-layout' ); } fusionHistoryManager.turnOnTracking(); fusionHistoryState = fusionBuilderText.removed_global; FusionPageBuilderEvents.trigger( 'fusion-element-edited' ); }, publish: function( event ) { var cid = jQuery( event.currentTarget ).data( 'cid' ), view = FusionPageBuilderViewManager.getView( cid ), params = view.model.get( 'params' ), r; r = confirm( fusionBuilderText.are_you_sure_you_want_to_publish ); if ( false === r ) { return false; } params.status = 'published'; view.model.set( 'params', params ); view.updateStatusIcons(); fusionHistoryManager.turnOnTracking(); fusionHistoryState = fusionBuilderText.container_published; // jshint ignore:line FusionPageBuilderEvents.trigger( 'fusion-element-edited' ); }, isTinyMceActive: function() { var isActive = ( 'undefined' !== typeof tinyMCE ) && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden(); return isActive; }, 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; } try { data = unescape( encodeURIComponent( data ) ); } catch ( e ) { data = unescape( 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 ); }, base64Decode: function( input ) { var output = '', chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0; 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 ) { output = output + String.fromCharCode( chr2 ); } if ( 64 !== enc4 ) { output = output + String.fromCharCode( chr3 ); } } output = this.utf8Decode( output ); return output; }, utf8Decode: function( utftext ) { var string = '', i = 0, c = 0, c1 = 0, 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; }, /** * Decodes headings if encoded. * * @since 3.11.0 * @param {string} html - The data to decode. * @return {string} */ maybeDecode: function( text ) { if ( ! this.needsDecoding( text ) ) { return text; } this.dummyTextArea.innerHTML = text; if ( '' !== this.dummyTextArea.value ) { return this.dummyTextArea.value; } return text; }, /** * Checks if encoded. * * @since 3.11.0 * @param {string} html - The data to decode. * @return {string} */ needsDecoding( text ) { const entityPattern = /&[#A-Za-z0-9]+;/; return entityPattern.test( text ); }, 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 ); } } }, fusion_builder_sortable: function( $element ) { var $sortable; $sortable = $element.find( '.fusion-sortable-options' ); $sortable.each( function() { jQuery( this ).sortable(); jQuery( this ).on( 'sortupdate', function( event ) { var sortContainer = jQuery( event.target ), sortOrder = ''; sortContainer.children( '.fusion-sortable-option' ).each( function() { sortOrder += jQuery( this ).data( 'value' ) + ','; } ); sortOrder = sortOrder.slice( 0, -1 ); sortContainer.siblings( '.sort-order' ).val( sortOrder ).trigger( 'change' ); } ); } ); }, fusion_builder_connected_sortable: function( $element ) { var self = this, $sortable = $element.find( '.fusion-connected-sortable' ); $sortable.sortable( { connectWith: '.fusion-connected-sortable', stop: function() { self.updateConnectedSortables( $element ); } } ).disableSelection(); $sortable.find( 'li' ).on( 'dblclick', function() { if ( jQuery( this ).parent().hasClass( 'fusion-connected-sortable-enabled' ) ) { $element.find( '.fusion-connected-sortable-disabled' ).prepend( this ); } else { $element.find( '.fusion-connected-sortable-enabled' ).append( this ); } self.updateConnectedSortables( $element ); } ); }, updateConnectedSortables: function( $element ) { var $enabled = $element.find( '.fusion-connected-sortable-enabled' ), $container = $element.find( '.fusion-builder-option-container' ), sortOrder = ''; $enabled.children( '.fusion-connected-sortable-option' ).each( function() { sortOrder += jQuery( this ).data( 'value' ) + ','; } ); $container.find( '.fusion-connected-sortable' ).each( function() { if ( jQuery( this ).find( 'li' ).length ) { jQuery( this ).removeClass( 'empty' ); } else { jQuery( this ).addClass( 'empty' ); } } ); sortOrder = sortOrder.slice( 0, -1 ); $container.find( '.sort-order' ).val( sortOrder ).trigger( 'change' ); }, fusion_builder_sortable_text: function( $element ) { var $sortable; $sortable = $element.find( '.fusion-sortable-text-options' ); $sortable.each( function() { var $sort = jQuery( this ); $sort.sortable( { handle: '.fusion-sortable-move' } ); $sort.on( 'sortupdate', function( event ) { var sortContainer = jQuery( event.target ), sortOrder = ''; sortContainer.children( '.fusion-sortable-option' ).each( function() { sortOrder += jQuery( this ).find( 'input' ).val() + '|'; } ); sortOrder = sortOrder.slice( 0, -1 ); sortContainer.siblings( '.sort-order' ).val( sortOrder ).trigger( 'change' ); } ); $sort.on( 'click', '.fusion-sortable-remove', function( event ) { event.preventDefault(); jQuery( event.target ).closest( '.fusion-sortable-option' ).remove(); $sort.trigger( 'sortupdate' ); } ); $sort.on( 'change keyup', 'input', function() { $sort.trigger( 'sortupdate' ); } ); $sort.prev( '.fusion-builder-add-sortable-child' ).on( 'click', function( event ) { var $newItem = $sort.next( '.fusion-placeholder-example' ).clone( true ); event.preventDefault(); $newItem.removeClass( 'fusion-placeholder-example' ).removeAttr( 'style' ).appendTo( $sort ); setTimeout( function() { $sort.find( '.fusion-sortable-option:last-child input' ).focus(); }, 100 ); $sort.trigger( 'sortupdate' ); } ); } ); }, fusion_builder_form_options: function( $element ) { var $valuesToggle = $element.find( '#form-options-settings' ), $optionsGrid = $element.find( '.options-grid' ), $addBtn = $element.find( '.fusion-builder-add-sortable-child' ), $formOptions = $optionsGrid.find( '.fusion-form-options' ), $template = jQuery( '<li class="fusion-form-option">' + $element.find( '.fusion-form-option-template' ).html() + '</li>' ), $values = $optionsGrid.find( '.option-values' ), $bulkAdd = $element.find( '.bulk-add-modal' ), allowMultiple = 'yes' === $optionsGrid.data( 'multiple' ), updateValues; updateValues = function() { var options = []; $formOptions.children( 'li' ).each( function() { var option = [], isChecked = jQuery( this ).find( '.fusiona-check_circle' ).length; option.push( isChecked ? 1 : 0 ); jQuery( this ).find( 'input' ).each( function() { option.push( this.value ); } ); options.push( option ); } ); $values.val( FusionPageBuilderApp.base64Encode( JSON.stringify( options ) ) ); }; // Init sortable $formOptions.sortable( { handle: '.fusion-sortable-move' } ); // Bindings $formOptions.on( 'sortupdate', function() { updateValues(); } ); $formOptions.on( 'change keyup', 'input', function( event ) { event.preventDefault(); updateValues(); } ); $valuesToggle.on( 'click', function( event ) { $optionsGrid.toggleClass( 'show-values' ); } ); $formOptions.on( 'click', '.fusion-sortable-remove', function( event ) { event.preventDefault(); jQuery( event.target ).closest( '.fusion-form-option' ).remove(); updateValues(); } ); $formOptions.on( 'click', '.fusion-sortable-check', function( event ) { var $el = jQuery( this ).find( '.fusiona-check_circle_outline' ), isChecked = $el.hasClass( 'fusiona-check_circle' ); event.preventDefault(); if ( ! allowMultiple ) { $formOptions.find( '.fusion-sortable-check .fusiona-check_circle' ).removeClass( 'fusiona-check_circle' ); } if ( isChecked ) { $el.removeClass( 'fusiona-check_circle' ); } else { $el.addClass( 'fusiona-check_circle' ); } updateValues(); } ); $addBtn.on( 'click', function( event ) { var $newEl = $template.clone( true ); event.preventDefault(); $formOptions.append( $newEl ); setTimeout( function () { $newEl.find( '.form-option-label input' ).focus(); }, 100 ); } ); $bulkAdd.on( 'click', function( event ) { var modalView; event.preventDefault(); if ( jQuery( '.fusion-builder-settings-bulk-dialog' ).length ) { return; } modalView = new FusionPageBuilder.BulkAddView( { choices: fusionBuilderConfig.predefined_choices } ); jQuery( modalView.render().el ).dialog( { title: 'Bulk Add / Predefined Choices', dialogClass: 'fusion-builder-settings-bulk-dialog', resizable: false, width: 500, draggable: false, buttons: [ { text: 'Cancel', click: function() { jQuery( this ).dialog( 'close' ); } }, { text: 'Insert Choices', click: function() { var choices = modalView.getChoices(), $newEl; event.preventDefault(); _.each( choices, function( choice ) { $newEl = $template.clone( true ); if ( choice.includes( '|' ) ) { choice = choice.split( '|' ); $newEl.find( 'input.label' ).val( choice[ 0 ] ); $newEl.find( 'input.value' ).val( choice[ 1 ] ); $valuesToggle.prop( 'checked', true ); $optionsGrid.addClass( 'show-values' ); } else { $newEl.find( 'input.label' ).val( choice ); } $formOptions.append( $newEl ); } ); updateValues(); 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(); } } ); } ); }, fusion_builder_logics: function( $element ) { var $optionsGrid = $element.find( '.options-grid' ), $addBtn = $element.find( '.fusion-builder-add-sortable-child' ), $fusionLogics = $optionsGrid.find( '.fusion-logics' ), $template = jQuery( '<li class="fusion-logic">' + $element.find( '.fusion-logic-template' ).html() + '</li>' ), $values = $optionsGrid.find( '.logic-values' ), updateValues; updateValues = function () { var options = []; $fusionLogics.children( 'li' ).each( function () { var option = {}, operator = jQuery( this ).find( '.fusion-sortable-operator' ), self = jQuery( this ); // operator. option.operator = operator.hasClass( 'and' ) ? 'and' : 'or'; // comparison. option.comparison = jQuery( this ).find( '.logic-comparison-selection' ).val(); // field. option.field = jQuery( this ).find( 'select.fusion-logic-choices' ).val(); // desired value. option.value = jQuery( this ).find( '.fusion-logic-option' ).val(); // additinals. if ( jQuery( this ).find( '.logic-additionals' ).length ) { option.additionals = jQuery( this ).find( '.fusion-logic-additionals-field' ).val(); } options.push( option ); } ); $values .val( FusionPageBuilderApp.base64Encode( JSON.stringify( options ) ) ) .trigger( 'change' ); }; // Init sortable $fusionLogics.sortable( { items: '.fusion-logic', tolerance: 'pointer', cursor: 'move', connectWith: '.fusion-logics', handle: '.fusion-logic-controller-head', axis: 'y' } ); // Bindings $fusionLogics.on( 'sortupdate', function () { updateValues(); } ); $fusionLogics.on( 'change keyup', 'input', function ( event ) { event.preventDefault(); updateValues(); } ); $fusionLogics.on( 'change', 'select.fusion-logic-option', function( event ) { event.preventDefault(); updateValues(); } ); $fusionLogics.on( 'change', 'select.fusion-logic-choices', function( event ) { var allChoices = $fusionLogics.closest( '.fusion-builder-option-logics' ).find( '.fusion-logics-all-choices' ).text(), selection = jQuery( this ).val(), selectionText = jQuery( this ).closest( 'select' ).find( 'option:selected' ).text(), $wrapper = jQuery( this ).closest( '.fusion-logic' ), $comparisons = '', $options = '', isSelected, currentChoice; event.preventDefault(); try { allChoices = JSON.parse( allChoices ); } catch ( e ) { allChoices = []; } $wrapper.find( 'h4.logic-title' ).text( selectionText ); currentChoice = allChoices.find( ( { id } ) => id === selection ); if ( 'object' === typeof currentChoice ) { if ( 'object' === typeof currentChoice.comparisons ) { jQuery.each( currentChoice.comparisons, function( comparisonValue, comparisonName ) { isSelected = 'equal' === comparisonValue ? 'active' : ''; $comparisons += '<option value="' + comparisonValue + '" ' + isSelected + '>' + comparisonName + '</select>'; } ); } $wrapper.find( '.logic-comparison-selection' ).empty().append( $comparisons ); switch ( currentChoice.type ) { case 'select': if ( 'object' === typeof currentChoice.options ) { $options += '<div class="select_arrow"></div>'; $options += '<select class="fusion-dont-update fusion-logic-option fusion-hide-from-atts fusion-select-field">'; jQuery.each( currentChoice.options, function( key, choice ) { $options += '<option value="' + key + '">' + choice + '</option>'; } ); $options += '</select>'; } $wrapper.find( '.logic-value-field' ).html( $options ); $wrapper.find( '.logic-value .fusion-select-field' ).select2(); break; case 'text': $options = '<input type="text" value="" placeholder="' + fusionBuilderText.condition_value + '" class="fusion-hide-from-atts fusion-logic-option" />'; $wrapper.find( '.logic-value-field' ).html( $options ); break; } $wrapper.find( '.logic-additionals' ).remove(); if ( 'undefined' !== typeof currentChoice.additionals ) { switch ( currentChoice.additionals.type ) { case 'select': if ( 'object' === typeof currentChoice.additionals.options ) { $options = '<div class="logic-additionals">'; $options += '<div class="select_arrow"></div>'; $options += '<select class="fusion-dont-update fusion-logic-additionals-field fusion-hide-from-atts fusion-select-field">'; jQuery.each( currentChoice.additionals, function( key, choice ) { $options += '<option value="' + key + '">' + choice + '</option>'; } ); $options += '</select>'; $options += '</div>'; } $wrapper.find( '.logic-field' ).append( $options ); $wrapper.find( '.logic-field .fusion-select-field' ).select2(); break; case 'text': $options = '<div class="logic-additionals">'; $options += '<input type="text" value="" placeholder="' + currentChoice.additionals.placeholder + '" class="fusion-hide-from-atts fusion-logic-additionals-field" />'; $options += '</div>'; $wrapper.find( '.logic-field' ).append( $options ); break; } } } updateValues(); } ); $fusionLogics.on( 'click', '.fusion-sortable-remove', function ( event ) { event.preventDefault(); jQuery( event.target ).closest( '.fusion-logic' ).remove(); updateValues(); } ); $fusionLogics.on( 'click', '.fusion-sortable-edit, h4.logic-title', function( event ) { var $parent = jQuery( this ).closest( '.fusion-logic' ); event.preventDefault(); $parent.find( '.fusion-logic-controller-content' ).slideToggle( 'fast' ); } ); $fusionLogics.on( 'click', '.logic-operator', function() { var $el = jQuery( this ).find( '.fusion-sortable-operator' ); if ( $el.hasClass( 'and' ) ) { $el.removeClass( 'and' ).addClass( 'or' ); $el.closest( '.fusion-logic' ).addClass( 'has-or' ).attr( 'aria-label-or', fusionBuilderText.logic_separator_text ); } else { $el.removeClass( 'or' ).addClass( 'and' ); $el.closest( '.fusion-logic' ).removeClass( 'has-or' ); } updateValues(); } ); $fusionLogics.on( 'change', '.logic-comparison-selection', function() { event.preventDefault(); updateValues(); } ); $addBtn.on( 'click', function( event ) { var $newEl = $template.clone( true ); event.preventDefault(); $fusionLogics.find( '.fusion-logic-controller-content' ).hide(); $fusionLogics.append( $newEl ); $newEl.find( '.logic-field .fusion-select-field' ).select2(); $newEl.find( 'select.fusion-logic-choices' ).trigger( 'change' ); updateValues(); } ); }, fusion_builder_iconpicker: function( value, id, container, search ) { var output = jQuery( '.fusion-icons-rendered' ).length ? jQuery( '.fusion-icons-rendered' ).html() : '', outputNav = jQuery( '.fusion-icon-picker-nav-rendered' ).length ? jQuery( '.fusion-icon-picker-nav-rendered' ).html() : '', oldIconName = '', $container = jQuery( container ), $containerParent = $container.parent(), valueSelector = '', selectedSetId = ''; if ( '' !== value ) { if ( 'fusion-prefix-' === value.substr( 0, 14 ) ) { // Custom icon, we need to remove prefix. value = value.replace( 'fusion-prefix-', '' ); } else { value = value.split( ' ' ); // Legacy FontAwesome 4.x icon, so we need check if it needs to be updated. if ( 'undefined' === typeof value[ 1 ] ) { value[ 1 ] = 'fas'; if ( 'undefined' !== typeof window[ 'fusion-fontawesome-free-shims' ] ) { oldIconName = value[ 0 ].substr( 3 ); jQuery.each( window[ 'fusion-fontawesome-free-shims' ], function( i, shim ) { if ( shim[ 0 ] === oldIconName ) { // Update icon name. if ( null !== shim[ 2 ] ) { value[ 0 ] = 'fa-' + shim[ 2 ]; } // Update icon subset. if ( null !== shim[ 1 ] ) { value[ 1 ] = shim[ 1 ]; } return false; } } ); } // Update form field with new values. $containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', value[ 0 ] + ' ' + value[ 1 ] ); } } } // Add icon container and icon navigation. //$container.html( output ).before( '<div class="fusion-icon-picker-nav">' + outputNav + '</div>' ); $container.html( output ).before( '<div class="fusion-icon-picker-nav-wrapper"><a href="#" class="fusion-icon-picker-nav-left fusiona-arrow-left"></a><div class="fusion-icon-picker-nav">' + outputNav + '</div><a href="#" class="fusion-icon-picker-nav-right fusiona-arrow-right"></a></div>' ); // Scroll nav div to right. $containerParent.find( '.fusion-icon-picker-nav-wrapper > .fusion-icon-picker-nav-right' ).on( 'click', function( e ) { e.preventDefault(); $containerParent.find( '.fusion-icon-picker-nav' ).animate( { scrollLeft: '+=100' }, 250 ); } ); // Scroll nav div to left. $containerParent.find( '.fusion-icon-picker-nav-wrapper > .fusion-icon-picker-nav-left' ).on( 'click', function( e ) { e.preventDefault(); $containerParent.find( '.fusion-icon-picker-nav' ).animate( { scrollLeft: '-=100' }, 250 ); } ); // Icon navigation link is clicked. $containerParent.find( '.fusion-icon-picker-nav > a' ).on( 'click', function( e ) { e.preventDefault(); jQuery( '.fusion-icon-picker-nav-active' ).removeClass( 'fusion-icon-picker-nav-active' ); jQuery( this ).addClass( 'fusion-icon-picker-nav-active' ); $container.find( '.fusion-icon-set' ).css( 'display', 'none' ); $container.find( jQuery( this ).attr( 'href' ) ).css( 'display', 'grid' ); } ); if ( '' !== value ) { // FA or custom icon. valueSelector = '.' + ( Array.isArray( value ) ? value.join( '.' ) : value ); $container.find( valueSelector ).parent().addClass( 'selected-element' ).css( 'display', 'flex' ); // Trigger click on parent nav tab item. selectedSetId = $container.find( '.selected-element' ).closest( '.fusion-icon-set' ).prepend( $container.find( '.selected-element' ) ).attr( 'id' ); $containerParent.find( '.fusion-icon-picker-nav a[href="#' + selectedSetId + '"]' ).trigger( 'click' ); } // Icon Search bar. jQuery( search ).on( 'change paste keyup', function() { var thisEl = jQuery( this ); FusionDelay( function() { var options, fuse, result, value; if ( thisEl.val() ) { value = thisEl.val().toLowerCase(); if ( 3 > value.length ) { return; } $container.find( '.fusion-icon-set .icon_preview' ).css( 'display', 'none' ); options = { threshold: 0.2, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 3, keys: [ 'name', 'keywords', 'categories' ] }; fuse = new Fuse( fusionIconSearch, options ); result = fuse.search( value ); // Show icons. _.each( result, function( resultIcon ) { $container.find( '.icon_preview.' + resultIcon.name ).css( 'display', 'flex' ); } ); // Add attributes to iconset containers. _.each( $container.find( '.fusion-icon-set' ), function( subContainer ) { var hasSearchResults = false; subContainer.classList.add( 'no-search-results' ); jQuery( '.icon_preview' ).each( function( index, icon ) { if ( 'none' !== icon.style.display && subContainer.classList.contains( 'no-search-results' ) ) { hasSearchResults = true; } } ); if ( ! hasSearchResults && ! subContainer.querySelector( '.no-search-results-notice' ) ) { jQuery( subContainer ).append( '<div class="no-search-results-notice">' + fusionBuilderText.no_results_in.replace( '%s', jQuery( 'a[href="#' + subContainer.id + '"]' ).html() ) + '</div>' ); } else if ( hasSearchResults ) { subContainer.classList.remove( 'no-search-results' ); } } ); } else { $container.find( '.fusion-icon-set .icon_preview' ).css( 'display', 'flex' ); _.each( $container.find( '.fusion-icon-set' ), function( subContainer ) { subContainer.classList.remove( 'no-search-results' ); } ); } }, 100 ); } ); }, /** * Trigger context menu. * * @since 2.0.0 * @param {Object} event - The jQuery event. * @return {void} */ contextMenu: function( event ) { var viewSettings, view, self = this, $clickTarget = jQuery( event.target ), $target = $clickTarget.closest( '[data-cid]:not(.fusion-builder-row-content)' ), pageType = 'default', elementType; // Disable on blank template element. if ( $clickTarget.hasClass( 'fusion_builder_blank_page' ) || $clickTarget.closest( '.fusion_builder_blank_page' ).length ) { return; } if ( $clickTarget.data( 'cid' ) ) { $target = $clickTarget; } // If targeting the container heading area. if ( $clickTarget.hasClass( 'fusion-builder-section-header' ) || $clickTarget.closest( '.fusion-builder-section-header' ).length ) { if ( $clickTarget.hasClass( 'fusion-builder-section-name' ) ) { return; } $target = $clickTarget.closest( '.fusion_builder_container' ).find( '.fusion-builder-section-content' ).first(); } // Remove any existing. this.removeContextMenu(); event.preventDefault(); view = FusionPageBuilderViewManager.getView( $target.data( 'cid' ) ); if ( ! view ) { return; } elementType = this.getElementType( view.model.attributes.element_type ); // Make sure library view has limited abilities. if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! $clickTarget.closest( '.fusion-builder-row-container-inner' ).length && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) { if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-sections' ) ) { pageType = 'container'; } if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) { pageType = 'column'; if ( 'fusion_builder_container' === elementType ) { return; } } if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) { pageType = 'element'; if ( 'fusion_builder_container' === elementType || 'fusion_builder_column' === elementType || 'fusion_builder_column_inner' === elementType ) { return; } } } if ( ! view ) { return; } viewSettings = { model: { parent: view.model, event: event, parentView: view, pageType: pageType } }; // Create new context view. this.contextMenuView = new FusionPageBuilder.ContextMenuView( viewSettings ); // 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(); } }, /** * 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 && FusionPageBuilderApp.pauseBuilder ) { return 'fusion_builder_row_inner'; } // Made it this far it must be regular. return 'element'; }, fusionBuilderImagePreview: function( $uploadButton ) { var $uploadField = $uploadButton.siblings( '.fusion-builder-upload-field' ), $preview = $uploadField.siblings( '.fusion-builder-upload-preview' ), $removeBtn = $uploadButton.siblings( '.upload-image-remove' ), imageURL = $uploadField.val().trim(), imagePreview, imageIDField; FusionPageBuilderEvents.trigger( 'awb-image-upload-url-' + $uploadButton.data( 'param' ), imageURL ); if ( 0 <= imageURL.indexOf( '<img' ) ) { imagePreview = imageURL; } else { imagePreview = '<img src="' + imageURL + '" />'; } if ( 'image' !== $uploadButton.data( 'type' ) ) { return; } if ( $uploadButton.hasClass( 'hide-edit-buttons' ) ) { return; } if ( '' === imageURL ) { if ( $preview.length ) { $preview.remove(); $removeBtn.remove(); $uploadButton.val( 'Upload Image' ); } // Remove image ID if image preview is empty. imageIDField = $uploadButton.closest( '.fusion-builder-module-settings' ).find( '#' + $uploadButton.data( 'param' ) + '_id' ); if ( 'element_content' === $uploadButton.data( 'param' ) ) { imageIDField = $uploadButton.parents( '.fusion-builder-option' ).next().find( '#image_id' ); } if ( imageIDField.length ) { imageIDField.val( '' ); } return; } if ( ! $preview.length ) { $uploadButton.siblings( '.preview' ).before( '<div class="fusion-builder-upload-preview"><strong class="fusion-builder-upload-preview-title">Preview</strong><div class="fusion-builder-preview-image"><img src="" width="300" height="300" /></div></div>' ); $uploadButton.after( '<input type="button" class="button upload-image-remove" value="Remove" />' ); $uploadButton.val( 'Edit' ); $preview = $uploadField.siblings( '.fusion-builder-upload-preview' ); } $preview.find( 'img' ).replaceWith( imagePreview ); }, FusionBuilderActivateUpload: function( $uploadButton ) { $uploadButton.click( function( event ) { var $thisEl, fileFrame, multiImageContainer, multiImageInput, multiVal, multiUpload = false, multiImages = false, multiImageHtml = '', ids = '', optionID = '', attachment = '', attachments = [], elementType = $( this ).closest( '.fusion_builder_module_settings' ).data( 'element_type' ), param = $( this ).closest( '.fusion-builder-option' ).data( 'option-id' ); const saveType = jQuery( this ).data( 'save-type' ); if ( event ) { event.preventDefault(); } $thisEl = $( this ); // If its a multi upload element, clone default params. if ( 'fusion-multiple-upload' === $thisEl.data( 'id' ) ) { multiUpload = true; } if ( 'fusion-multiple-images' === $thisEl.data( 'id' ) ) { multiImages = true; multiImageContainer = jQuery( $thisEl.next( '.fusion-multiple-image-container' ) )[ 0 ]; multiImageInput = jQuery( $thisEl ).prev( '.fusion-multi-image-input' ); } fileFrame = wp.media( { library: { type: $thisEl.data( 'type' ) }, title: $thisEl.data( 'title' ), multiple: ( multiUpload || multiImages ) ? 'between' : false, frame: 'post', className: 'media-frame mode-select fusion-builder-media-dialog ' + $thisEl.data( 'id' ), displayUserSettings: false, displaySettings: true, allowLocalEdits: true } ); wp.media.frames.file_frame = fileFrame; // Set the media dialog box state as 'gallery' if the element is gallery. if ( multiImages && 'fusion_gallery' === elementType ) { multiVal = multiImageInput.val(); ids = 'string' === typeof multiVal ? multiVal.split( ',' ) : ''; attachments = []; attachment = ''; wp.media._galleryDefaults.link = 'none'; wp.media._galleryDefaults.size = 'thumbnail'; fileFrame.options.syncSelection = true; if ( 'undefined' !== typeof multiVal && '' !== multiVal ) { fileFrame.options.state = 'gallery-edit'; } else { fileFrame.options.state = 'gallery'; } } // Select currently active image automatically. fileFrame.on( 'open', function() { var selection = fileFrame.state().get( 'selection' ), library = fileFrame.state().get( 'library' ), attachment, id, fetchIds = []; if ( multiImages ) { multiVal = multiImageInput.val(); ids = 'string' === typeof multiVal ? multiVal.split( ',' ) : ''; if ( 'fusion_gallery' !== elementType || 'gallery-edit' !== fileFrame.options.state ) { $( '.fusion-builder-media-dialog' ).addClass( 'hide-menu' ); } jQuery.each( ids, function( index, id ) { if ( '' !== id && 'NaN' !== id ) { // Check if attachment exists. if ( 'undefined' !== typeof wp.media.attachment( id ).get( 'url' ) ) { // Exists, add it to selection. selection.add( wp.media.attachment( id ) ); library.add( wp.media.attachment( id ) ); } else { // Doesn't exist we need to fetch. fetchIds.push( id ); } } } ); // If still some attachments needing fetched, fetch them in a single query. if ( 0 < fetchIds.length ) { wp.media.query( { post__in: fetchIds, posts_per_page: fetchIds.length } ).more().then( function() { jQuery.each( ids, function( index, id ) { if ( '' !== id && 'NaN' !== id ) { // Add fetched attachment to selection. selection.add( wp.media.attachment( id ) ); library.add( wp.media.attachment( id ) ); } } ); } ); } } else { optionID = $thisEl.parents( '.fusion-builder-option.upload' ).data( 'option-id' ); id = $thisEl.parents( '.fusion-builder-module-settings' ).find( '#' + optionID + '_id' ).val(); id = ( 'undefined' !== typeof id ? id : $thisEl.parents( '.fusion-builder-module-settings' ).find( '#image_id' ).val() ); if ( 'undefined' !== typeof id && '' !== id ) { id = id.split( '|' )[ 0 ]; } attachment = wp.media.attachment( id ); $( '.fusion-builder-media-dialog' ).addClass( 'hide-menu' ); if ( id ) { attachment.fetch( { success: function( att ) { library.add( att ? [ att ] : [] ); selection.add( att ? [ att ] : [] ); } } ); } } } ); // Set the attachment ids from gallery selection if the element is gallery. if ( multiImages && 'fusion_gallery' === elementType ) { fileFrame.on( 'update', function( selection ) { var imageIDs = '', imageURL = ''; imageIDs = selection.map( function( attachment ) { var imageID = attachment.id; if ( attachment.attributes.sizes && 'undefined' !== typeof attachment.attributes.sizes.thumbnail ) { imageURL = attachment.attributes.sizes.thumbnail.url; } else if ( attachment.attributes.url ) { imageURL = attachment.attributes.url; } if ( multiImages ) { multiImageHtml += '<div class="fusion-multi-image" data-image-id="' + imageID + '">'; multiImageHtml += '<img src="' + imageURL + '"/>'; multiImageHtml += '<span class="fusion-multi-image-remove dashicons dashicons-no-alt"></span>'; multiImageHtml += '</div>'; } return attachment.id; } ); multiImageInput.val( imageIDs ); jQuery( multiImageContainer ).html( multiImageHtml ); } ); } fileFrame.on( 'select insert', function() { var imageURL, imageID, imageSize, imageIDs, state = fileFrame.state(), firstElementNode, firstElement, imageIDField; if ( 'undefined' === typeof state.get( 'selection' ) ) { imageURL = jQuery( fileFrame.$el ).find( '#embed-url-field' ).val(); } else { imageIDs = state.get( 'selection' ).map( function( attachment ) { return attachment.id; } ); const imageURLs = []; state.get( 'selection' ).forEach( ( media ) => { imageURLs.push( `${media.toJSON().url}|${media.id}` ); } ); // If its a multi image element, add the images container and IDs to input field. if ( multiImages ) { if ( 'url' === saveType ) { multiImageInput.val( imageURLs.join( ',' ) ).trigger( 'change' ); } else { multiImageInput.val( imageIDs ).trigger( 'change' ); } } // Remove default item. if ( multiUpload ) { firstElementNode = jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-sortable-options li:first-child' ); if ( firstElementNode.length ) { firstElement = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === firstElementNode.data( 'cid' ); } ); if ( firstElement && ( 'undefined' === typeof firstElement.attributes.params.image || '' === firstElement.attributes.params.image ) ) { jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-sortable-options li:first-child .fusion-builder-multi-setting-remove' ).trigger( 'click' ); } } } state.get( 'selection' ).map( function( attachment ) { var element = attachment.toJSON(), display = state.display( attachment ).toJSON(), defaultParams = {}, child, params, createChildren; imageID = element.id; imageSize = display.size; if ( element.sizes && element.sizes[ display.size ] && element.sizes[ display.size ].url ) { imageURL = element.sizes[ display.size ].url; } else if ( element.url ) { imageURL = element.url; } if ( multiImages ) { multiImageHtml += '<div class="fusion-multi-image" data-image-id="' + imageID + '">'; multiImageHtml += '<img src="' + imageURL + '"/>'; multiImageHtml += '<span class="fusion-multi-image-remove dashicons dashicons-no-alt"></span>'; multiImageHtml += '</div>'; } // If its a multi upload element, add the image to defaults and trigger a new item to be added. if ( multiUpload ) { child = fusionAllElements[ elementType ].element_child; params = fusionAllElements[ elementType ].params[ param ].child_params; createChildren = 'undefined' !== typeof fusionAllElements[ elementType ].params[ param ].create_children ? fusionAllElements[ elementType ].params[ param ].create_children : true; // Save default values _.each( params, function( name, param ) { defaultParams[ param ] = fusionAllElements[ child ].params[ param ].value; } ); // Set new default values _.each( params, function( name, param ) { fusionAllElements[ child ].params[ param ].value = attachment.attributes[ name ]; } ); if ( 'image' === param ) { fusionAllElements[ elementType ].params[ param + '_id' ].value = imageID + '|' + imageSize; } if ( createChildren ) { jQuery( $thisEl ).parents( '.fusion-builder-main-settings' ).find( '.fusion-builder-add-multi-child' ).trigger( 'click' ); FusionPageBuilderEvents.trigger( 'fusion-multi-child-update-preview' ); } // Restore default values _.each( defaultParams, function( defaultValue, param ) { fusionAllElements[ child ].params[ param ].value = defaultValue; } ); } } ); } jQuery( multiImageContainer ).html( multiImageHtml ); if ( ! multiUpload && ! multiImages ) { $thisEl.siblings( '.fusion-builder-upload-field' ).val( imageURL ).trigger( 'change' ); // Set image id. imageIDField = $thisEl.closest( '.fusion-builder-module-settings' ).find( '#' + param + '_id' ); if ( 'element_content' === param ) { imageIDField = $thisEl.parents( '.fusion-builder-option' ).next().find( '#image_id' ); } if ( imageIDField.length ) { imageIDField.val( imageID + '|' + imageSize ); } FusionPageBuilderApp.fusionBuilderImagePreview( $thisEl ); } } ); fileFrame.open(); return false; } ); $uploadButton.siblings( '.fusion-builder-upload-field' ).on( 'input', function() { FusionPageBuilderApp.fusionBuilderImagePreview( $( this ).siblings( '.fusion-builder-upload-button' ) ); } ); $uploadButton.siblings( '.fusion-builder-upload-field' ).each( function() { FusionPageBuilderApp.fusionBuilderImagePreview( $( this ).siblings( '.fusion-builder-upload-button' ) ); } ); jQuery( 'body' ).on( 'click', '.fusion-multi-image-remove', function() { var input = jQuery( this ).parents( '.fusion-multiple-upload-images' ).find( '.fusion-multi-image-input' ), imageIDs, imageID, imageIndex; imageID = jQuery( this ).parent( '.fusion-multi-image' ).data( 'image-id' ); imageIDs = input.val() ? input.val().split( ',' ) : []; const currentImage = imageIDs.find( ( image ) => ( image.includes( '|' ) ? image.includes( '|' + imageID ) : image.includes( imageID ) ) ); imageIndex = imageIDs.indexOf( currentImage ); if ( -1 !== imageIndex ) { imageIDs.splice( imageIndex, 1 ); } imageIDs = imageIDs.join( ',' ); input.val( imageIDs ).trigger( 'change' ); jQuery( this ).parent( '.fusion-multi-image' ).remove(); } ); }, fusionBuilderActivateLinkSelector: function( $linkButton ) { var $linkSubmit = jQuery( '#wp-link-submit' ), $linkTitle = jQuery( '.wp-link-text-field' ), $linkTarget = jQuery( '.link-target' ), $fusionLinkSubmit = jQuery( '<input type="button" name="fusion-link-submit" id="fusion-link-submit" class="button-primary" value="Set Link">' ), $linkDialog = window.wpLink, wpLinkL10n = window.wpLinkL10n, $input, $url; jQuery( $linkButton ).click( function( e ) { $fusionLinkSubmit.insertBefore( $linkSubmit ); $input = jQuery( e.target ).prev( '.fusion-builder-link-field' ); $url = $input.val(); $linkSubmit.hide(); $linkTitle.hide(); $linkTarget.hide(); $fusionLinkSubmit.show(); $linkDialog = ! window.wpLink && $.fn.wpdialog && jQuery( '#wp-link' ).length ? { $link: ! 1, open: function() { this.$link = jQuery( '#wp-link' ).wpdialog( { title: wpLinkL10n.title, width: 480, height: 'auto', modal: ! 0, dialogClass: 'wp-dialog', zIndex: 3e5 } ); }, close: function() { this.$link.wpdialog( 'close' ); } } : window.wpLink; $linkDialog.fusionUpdateLink = function( $fusionLinkSubmit ) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); $url = jQuery( '#wp-link-url' ).length ? jQuery( '#wp-link-url' ).val() : jQuery( '#url-field' ).val(); $input.val( $url ).trigger( 'change' ); $linkSubmit.show(); $linkTitle.show(); $linkTarget.show(); $fusionLinkSubmit.remove(); jQuery( '#wp-link-cancel' ).off( 'click' ); $linkDialog.close(); }; // Using custom CSS field here as dummy text area, as it is always available. $linkDialog.open( 'fusion-custom-css-field' ); jQuery( '#wp-link-url' ).val( $url ); } ); jQuery( 'body' ).on( 'click', '#fusion-link-submit', function() { $linkDialog.fusionUpdateLink( jQuery( this ) ); } ); jQuery( 'body' ).on( 'click', '#wp-link-cancel, #wp-link-close, #wp-link-backdrop', function() { $linkSubmit.show(); $linkTitle.show(); $linkTarget.show(); $fusionLinkSubmit.remove(); } ); }, fusionBuilderActivateNominatimSearch: function( $linkButton ) { let $input, latField, lonField, query; jQuery( $linkButton ).click( function( e ) { e.preventDefault(); $input = jQuery( e.target ).prev( '.fusion-builder-nominatim-field' ); latField = $input.data( 'lat' ); lonField = $input.data( 'lon' ); query = encodeURI( $input.val() ); const url = `https://nominatim.openstreetmap.org/search?q=${query}&format=json`; const initFetch = { method: 'GET', mode: 'cors', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }; window.fetch( url, initFetch ) .then( function( response ) { return response.json(); } ).then( function( json ) { if ( Array.isArray( json ) && 0 < json.length ) { jQuery( `#${latField}` ).val( json[ 0 ].lat ); jQuery( `#${lonField}` ).val( json[ 0 ].lon ); } else { alert( 'Unknown address: ' + $input.val() ); } } )[ 'catch' ]( function( error ) { alert( error.message ); } ); } ); }, fusionBuilderSetContent: 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' } ); } else { $( '#' + textareaID ).val( content ); } }, layoutLoaded: function() { this.newLayoutLoaded = true; }, clearLayout: function( event ) { var r; if ( event ) { event.preventDefault(); } r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_this_layout ); if ( false === r ) { return false; } this.blankPage = true; this.clearBuilderLayout( true ); // Clear history fusionHistoryManager.clearEditor( 'blank' ); }, showHistoryDialog: function( event ) { if ( event ) { event.preventDefault(); } this.$el.find( '.fusion-builder-history-list' ).show(); }, hideHistoryDialog: function( event ) { if ( event ) { event.preventDefault(); } this.$el.find( '.fusion-builder-history-list' ).hide(); }, saveTemplateDialog: function( event ) { if ( event ) { event.preventDefault(); } this.showLibrary(); $( '#fusion-builder-layouts-templates-trigger' ).click(); }, loadPreBuiltPage: function( event ) { if ( event ) { event.preventDefault(); } this.showLibrary(); jQuery( '#fusion-builder-layouts-demos-trigger' ).click(); }, loadSutdioPage: function( event ) { if ( event ) { event.preventDefault(); } this.showLibrary(); jQuery( '#fusion-builder-layouts-studio-trigger' ).click(); }, saveLayout: function( event ) { var templateContent, templateName, layoutsContainer, currentPostID, emptyMessage, customCSS, pageTemplate, $customFields = [], $name, $value; if ( event ) { event.preventDefault(); } // Get custom field values for saving. jQuery( 'input[id^="pyre_"], select[id^="pyre_"]' ).each( function( n ) { $name = jQuery( this ).attr( 'id' ); $value = jQuery( this ).val(); if ( 'undefined' !== typeof $name && 'undefined' !== typeof $value ) { $customFields[ n ] = [ $name, $value ]; } } ); templateContent = fusionBuilderGetContent( 'content', true ); // jshint ignore:line templateName = $( '#new_template_name' ).val(); layoutsContainer = $( '#fusion-builder-layouts-templates .fusion-page-layouts' ); currentPostID = $( '#fusion_builder_main_container' ).data( 'post-id' ); emptyMessage = $( '#fusion-builder-layouts-templates .fusion-page-layouts .fusion-empty-library-message' ); customCSS = $( '#fusion-custom-css-field' ).val(); pageTemplate = $( '#page_template' ).val(); if ( '' !== templateName ) { $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, dataType: 'json', data: { action: 'fusion_builder_save_layout', fusion_load_nonce: fusionBuilderConfig.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: $customFields }, complete: function( data ) { layoutsContainer.prepend( data.responseText ); emptyMessage.hide(); } } ); $( '#new_template_name' ).val( '' ); } else { alert( fusionBuilderText.please_enter_template_name ); } }, saveElement: function( event ) { var fusionElementType, elementCID, elementView; if ( event ) { event.preventDefault(); } fusionElementType = $( event.currentTarget ).data( 'element-type' ); elementCID = $( event.currentTarget ).data( 'element-cid' ); elementView = FusionPageBuilderViewManager.getView( elementCID ); elementView.saveElement(); }, loadLayout: function( event ) { var $layout, contentPlacement, content, $customCSS; if ( event ) { event.preventDefault(); } if ( true === this.layoutIsLoading ) { return; } this.layoutIsLoading = true; $layout = $( event.currentTarget ).closest( 'li' ); contentPlacement = $( event.currentTarget ).data( 'load-type' ); content = fusionBuilderGetContent( 'content' ); $customCSS = jQuery( '#fusion-custom-css-field' ).val(); $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, data: { action: 'fusion_builder_load_layout', fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout_id' ) }, beforeSend: function() { FusionPageBuilderEvents.trigger( 'fusion-show-loader' ); $( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' ); $( '.fusion_builder_modal_inner_row_overlay' ).remove(); $( '#fusion-builder-layouts' ).hide(); } } ) .done( function( data ) { var dataObj; // New layout loaded FusionPageBuilderApp.layoutLoaded(); dataObj = JSON.parse( data ); if ( 'above' === contentPlacement ) { content = dataObj.post_content + content; // Set custom css above if ( 'undefined' !== typeof dataObj.custom_css ) { $( '#fusion-custom-css-field' ).val( dataObj.custom_css + '\n' + $customCSS ); } } else if ( 'below' === contentPlacement ) { content = content + dataObj.post_content; // Set custom css below if ( 'undefined' !== typeof dataObj.custom_css ) { if ( $customCSS.length ) { $( '#fusion-custom-css-field' ).val( $customCSS + '\n' + dataObj.custom_css ); } else { $( '#fusion-custom-css-field' ).val( dataObj.custom_css ); } } } else { content = dataObj.post_content; // Set custom css. if ( 'undefined' !== typeof dataObj.custom_css ) { $( '#fusion-custom-css-field' ).val( dataObj.custom_css ); } // Set Fusion Option selection. jQuery.each( dataObj.post_meta, function( $name, $value ) { jQuery( '#' + $name ).val( $value ).trigger( 'change' ); } ); } FusionPageBuilderApp.clearBuilderLayout(); FusionPageBuilderApp.createBuilderLayout( content ); // Set page template if ( 'undefined' !== typeof dataObj.page_template ) { $( '#page_template' ).val( dataObj.page_template ); } FusionPageBuilderApp.layoutIsLoading = false; } ) .always( function() { FusionPageBuilderEvents.trigger( 'fusion-hide-loader' ); } ); }, loadDemoPage: function( event ) { var pageName, demoName, postId, content, r; if ( event ) { event.preventDefault(); } r = confirm( fusionBuilderText.importing_single_page ); if ( false === r ) { return false; } if ( true === this.layoutIsLoading ) { return; } this.layoutIsLoading = true; pageName = $( event.currentTarget ).data( 'page-name' ); demoName = $( event.currentTarget ).data( 'demo-name' ); postId = $( event.currentTarget ).data( 'post-id' ); $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, data: { action: 'fusion_builder_load_demo', fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce, page_name: pageName, demo_name: demoName, post_id: postId }, beforeSend: function() { FusionPageBuilderEvents.trigger( 'fusion-show-loader' ); $( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' ); $( '.fusion_builder_modal_inner_row_overlay' ).remove(); $( '#fusion-builder-layouts' ).hide(); } } ) .done( function( data ) { var dataObj, meta; // New layout loaded FusionPageBuilderApp.layoutLoaded(); dataObj = JSON.parse( data ); content = dataObj.post_content; FusionPageBuilderApp.clearBuilderLayout( false ); FusionPageBuilderApp.createBuilderLayout( content ); // Set page template if ( 'undefined' !== typeof dataObj.page_template ) { $( '#page_template' ).val( dataObj.page_template ); } meta = dataObj.meta; // Set page options _.each( meta, function( value, name ) { $( '#' + name ).val( value ).trigger( 'change' ); } ); FusionPageBuilderApp.layoutIsLoading = false; } ) .always( function() { FusionPageBuilderEvents.trigger( 'fusion-hide-loader' ); } ); }, deleteLayout: function( event ) { var $layout, r, isGlobal = false; if ( event ) { event.preventDefault(); if ( $( event.currentTarget ).closest( 'li' ).hasClass( 'fusion-global' ) ) { r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_global ); isGlobal = true; } else { r = confirm( fusionBuilderText.are_you_sure_you_want_to_delete_this ); } if ( false === r ) { return false; } } if ( true === this.layoutIsDeleting ) { return; } this.layoutIsDeleting = true; $layout = $( event.currentTarget ).closest( 'li' ); $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, data: { action: 'fusion_builder_delete_layout', fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout_id' ) } } ) .done( function( response ) { var $containerSuffix = 'elements'; if ( 'undefined' === typeof response.success || ! response.success ) { return; } if ( $layout.parents( '#fusion-builder-layouts-templates' ).length ) { $containerSuffix = 'templates'; } $layout.remove(); FusionPageBuilderApp.layoutIsDeleting = false; if ( ! $( '#fusion-builder-layouts-' + $containerSuffix + ' .fusion-page-layouts' ).find( 'li' ).length ) { $( '#fusion-builder-layouts-' + $containerSuffix + ' .fusion-page-layouts .fusion-empty-library-message' ).show(); } if ( true === isGlobal ) { $.each( $( 'div[fusion-global-layout="' + $layout.data( 'layout_id' ) + '"]' ), function( i, val ) { // jshint ignore:line if ( $( this ).hasClass( 'fusion-builder-section-content' ) ) { $( this ).parent().parent().find( 'a.fusion-builder-remove' ).first().trigger( 'click' ); } else { $( this ).find( 'a.fusion-builder-remove' ).first().trigger( 'click' ); $( this ).find( 'a.fusion-builder-remove-inner-row' ).first().trigger( 'click' ); } } ); } } ); }, /** * Toggles import options. * * @since 3.7 * @param {Object} event - The event. * @return {void} */ toggleImportOptions: function( event ) { var $wrapper = jQuery( event.currentTarget ).closest( '.studio-wrapper' ); if ( ! $wrapper.hasClass( 'fusion-studio-preview-active' ) ) { $wrapper.find( '.awb-import-options' ).toggleClass( 'open' ); } }, loadStudioLayout: function( event ) { var $layout, self = this, category = 'undefined' !== typeof fusionBuilderConfig.post_type && 'fusion_form' === fusionBuilderConfig.post_type ? 'forms' : 'fusion_template', importOptions = FusionPageBuilderApp.studio.getImportOptions( event ), postMeta, content, $layoutsContainer; if ( event ) { event.preventDefault(); } // Off canvas. category = 'undefined' !== typeof fusionBuilderConfig.post_type && 'awb_off_canvas' === fusionBuilderConfig.post_type ? fusionBuilderConfig.post_type : category; if ( 'string' === typeof fusionBuilderConfig.template_category && 0 < fusionBuilderConfig.template_category.length ) { category = fusionBuilderConfig.template_category; } if ( true === this.layoutIsLoading ) { return; } this.layoutIsLoading = true; $layout = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ); $layoutsContainer = $layout.closest( '.studio-imports' ); // Get correct content. FusionPageBuilderApp.builderToShortcodes(); content = fusionBuilderGetContent( 'content' ); FusionPageBuilderApp.loaded = false; jQuery.ajax( { type: 'POST', url: FusionPageBuilderApp.ajaxurl, dataType: 'JSON', data: { action: 'fusion_builder_load_layout', fusion_load_nonce: FusionPageBuilderApp.fusion_load_nonce, fusion_layout_id: $layout.data( 'layout-id' ), overWriteType: importOptions.overWriteType, shouldInvert: importOptions.shouldInvert, imagesImport: importOptions.imagesImport, fusion_studio: true, post_id: fusionBuilderConfig.post_id, category: category }, beforeSend: function() { FusionPageBuilderEvents.trigger( 'fusion-show-loader' ); $( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' ); $( '.fusion_builder_modal_inner_row_overlay' ).remove(); $( '#fusion-builder-layouts' ).hide(); $( '#fusion-builder-fusion_template-studio' ).find( '.studio-wrapper' ).addClass( 'loading' ); jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_content ); }, 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. self.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( self.studio.getImportData(), self.mediaImportKeys[ k ], importOptions ); } ); 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, self.studio.getImportData().post_content, importOptions.loadType ); FusionPageBuilderEvents.trigger( 'fusion-studio-content-imported', self.studio.getImportData() ); self.studioLayoutImportComplete(); // Update PO panel. if ( 'function' === typeof awbUpdatePOPanel ) { postMeta = self.studio.getImportData().post_meta; if ( 'undefined' !== typeof postMeta && 'undefined' !== typeof postMeta._fusion ) { awbUpdatePOPanel( postMeta._fusion ); } } self.studio.resetImportData(); }, function() { jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_content_failed ); self.studioLayoutImportComplete(); self.studio.resetImportData(); } ); } else { self.setStudioContent( data, data.post_content, importOptions.loadType ); FusionPageBuilderEvents.trigger( 'fusion-studio-content-imported', data ); // Update PO panel. if ( 'function' === typeof awbUpdatePOPanel ) { postMeta = data.post_meta; if ( 'undefined' !== typeof postMeta && 'undefined' !== typeof postMeta._fusion ) { awbUpdatePOPanel( postMeta._fusion ); } } self.studioLayoutImportComplete(); } } } ); }, /** * Does what needs to be done when layout is imported. * * @since 3.5 * @param {Object} event - The event. */ studioLayoutImportComplete: function() { FusionPageBuilderEvents.trigger( 'fusion-hide-loader' ); $( '#fusion-builder-fusion_template-studio' ).find( '.studio-wrapper' ).removeClass( 'loading' ); }, /** * * @param {Object} dataObj * @param {String} newContent * @param {String} contentPlacement */ setStudioContent: function( dataObj, newContent, contentPlacement ) { var dataObj, newCustomCss, existingCss = jQuery( '#fusion-custom-css-field' ).val(), content = ''; // Get correct content. FusionPageBuilderApp.builderToShortcodes(); content = fusionBuilderGetContent( 'content' ); // New layout loaded FusionPageBuilderApp.layoutLoaded(); newCustomCss = 'undefined' !== typeof dataObj.custom_css ? dataObj.custom_css : false; if ( 'load-type-above' === contentPlacement ) { content = newContent + content; if ( newCustomCss ) { jQuery( '#fusion-custom-css-field' ).val( newCustomCss + '\n' + existingCss ); } } else if ( 'load-type-below' === contentPlacement ) { content = content + newContent; if ( newCustomCss ) { jQuery( '#fusion-custom-css-field' ).val( existingCss + '\n' + newCustomCss ); } } else { content = newContent; if ( newCustomCss ) { jQuery( '#fusion-custom-css-field' ).val( newCustomCss ); } // Set Fusion Option selection. jQuery.each( dataObj.post_meta, function( $name, $value ) { jQuery( '#' + $name ).val( $value ).trigger( 'change' ); } ); // Set page template. jQuery( '#page_template' ).val( '100-width.php' ); } // Create new builder layout. FusionPageBuilderApp.clearBuilderLayout(); FusionPageBuilderApp.createBuilderLayout( content ); FusionPageBuilderApp.layoutIsLoading = false; }, /** * Imports studio post's media. * * @param {object} postData * @param {string} mediaKey * @param {object} importOptions * @return promise */ importStudioMedia: function( postData, mediaKey, importOptions ) { var self = this; let mediaKeyLabel = mediaKey; if ( 'multiple_images' === mediaKey ) { mediaKeyLabel = 'Images'; } jQuery( '#fusion-loader .awb-studio-import-status' ).html( fusionBuilderText.studio_importing_media + ' ' + mediaKeyLabel.replace( '_', ' ' ) ); return jQuery.ajax( { type: 'POST', url: ajaxurl, dataType: 'JSON', data: { action: 'awb_studio_import_media', data: { mediaImportKey: mediaKey, postData: postData }, overWriteType: importOptions.overWriteType, shouldInvert: importOptions.shouldInvert, imagesImport: importOptions.imagesImport, fusion_load_nonce: FusionPageBuilderApp.fusion_load_nonce }, success: function( data ) { self.studio.setImportData( data ); } } ); }, studioPreviewLoaded: function() { // Trigger event for preview update. window.dispatchEvent( new Event( 'awb-studio-update-preview' ) ); jQuery( '.studio-wrapper' ).removeClass( 'loading' ); jQuery( '.studio-wrapper' ).find( '.fusion-loader' ).hide(); }, openLibrary: function( event ) { if ( event ) { event.preventDefault(); } this.showLibrary(); $( '.fusion-tabs-menu > li:first-child > a' ).click(); }, showLibrary: function( event ) { if ( event ) { event.preventDefault(); } $( '#fusion-builder-layouts' ).show(); $( 'body' ).addClass( 'fusion_builder_inner_row_no_scroll' ).append( '<div class="fusion_builder_modal_inner_row_overlay"></div>' ); setTimeout( function() { $( '.fusion-builder-save-element-input, #new_template_name' ).focus(); }, 20 ); }, hideLibrary: function( event ) { if ( event ) { event.preventDefault(); } $( '#fusion-builder-layouts' ).hide(); $( 'body' ).removeClass( 'fusion_builder_inner_row_no_scroll' ); $( '.fusion_builder_modal_inner_row_overlay' ).remove(); $( '.fusion-save-element-fields' ).remove(); }, showLoader: function() { $( '#fusion_builder_main_container' ).css( 'height', '148px' ); $( '#fusion_builder_container' ).hide(); $( '#fusion-loader' ).fadeIn( 'fast' ); }, hideLoader: function() { $( '#fusion_builder_container' ).fadeIn( 'fast' ); $( '#fusion_builder_main_container' ).removeAttr( 'style' ); $( '#fusion-loader' ).fadeOut( 'fast' ); }, sortableContainers: function() { this.$el.sortable( { handle: '.fusion-builder-section-header', items: '.fusion_builder_container, .fusion-builder-next-page, .fusion-checkout-form, .fusion-builder-form-step', 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() { fusionHistoryManager.turnOnTracking(); fusionHistoryState = fusionBuilderText.moved_container; // jshint ignore:line FusionPageBuilderEvents.trigger( 'fusion-element-sorted' ); } } ); }, initialBuilderLayout: function( initialLoad ) { // Clear all views FusionPageBuilderViewManager.removeViews(); FusionPageBuilderEvents.trigger( 'fusion-show-loader' ); setTimeout( function() { var content = fusionBuilderGetContent( 'content', true, initialLoad ), contentErrorMarkup = '', contentErrorMarkupWrapper = '', contentErrorMarkupClone = ''; try { if ( ! jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) { content = FusionPageBuilderApp.validateContent( content ); } FusionPageBuilderApp.createBuilderLayout( content ); FusionPageBuilderEvents.trigger( 'fusion-hide-loader' ); } catch ( error ) { console.log( error ); FusionPageBuilderApp.fusionBuilderSetContent( 'content', content ); jQuery( '#fusion_toggle_builder' ).trigger( 'click' ); contentErrorMarkup = FusionPageBuilderApp.$el.find( '#content-error' ); contentErrorMarkupWrapper = FusionPageBuilderApp.$el; contentErrorMarkupClone = contentErrorMarkup.clone(); contentErrorMarkup.dialog( { dialogClass: 'fusion-builder-dialog', autoOpen: false, modal: true, closeText: '', buttons: { OK: function() { jQuery( this ).dialog( 'close' ); } }, close: function() { contentErrorMarkupWrapper.append( contentErrorMarkupClone ); } } ); contentErrorMarkup.dialog( 'open' ); } }, 50 ); }, validateContent: function( content ) { var contentIsEmpty = '' === content, textNodes = '', columns = [], containers = [], shortcodeTags, columnwrapped, insertionFlag; // Throw exception with the fullwidth shortcode. if ( -1 !== content.indexOf( '[fullwidth' ) ) { throw 'Avada 4.0.3 or earlier fullwidth container used!'; } 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_builder_form_step', 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() && '<br />' !== 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 ) { if ( 'undefined' !== typeof tag.attrs.named.dynamic_params && '' !== tag.attrs.named.dynamic_params ) { return false; } 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; }, validateLibraryContent: function( content ) { var contentIsEmpty = '' === content, openContainer = '[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]', 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 = jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ); // 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 ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) { content = openContainer + openColumn + content + closeColumn + closeContainer; } else if ( columnEdit ) { content = openContainer + content + closeContainer; } } function replaceDollars() { return '$$'; } content = content.replace( /$$/g, replaceDollars ); return content; }, clearBuilderLayout: function( blankPageLayout ) { // Remove blank page layout this.$el.find( '.fusion-builder-blank-page-content' ).each( function() { var $that = $( this ), thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeBlankPageHelper(); } } ); // Remove all containers this.$el.find( '.fusion-builder-section-content' ).each( function() { var $that = $( this ), thisView = FusionPageBuilderViewManager.getView( $that.data( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { thisView.removeContainer(); } } ); // Create blank page layout if ( blankPageLayout && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) { if ( true === this.blankPage ) { if ( ! this.$el.find( '.fusion-builder-blank-page-content' ).length ) { this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' ); } this.blankPage = false; } } }, 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 && '' !== 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( '][/fusion_gallery]', ']' + children + '[/fusion_gallery]' ).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; }, mapStudioImages: function( options, values ) { if ( 'object' !== typeof options ) { return; } _.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' ]; } } else if ( 'upload_images' === option.type && 'undefined' !== typeof values[ option.param_name ] && '' !== values[ option.param_name ] ) { if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.multiple_images ) { FusionPageBuilderApp.mediaMap.multiple_images = {}; } const key = option.param_name + '-' + values[ option.param_name ]; if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.multiple_images[ key ] ) { FusionPageBuilderApp.mediaMap.multiple_images[ key ] = {}; } // Add images URLs const images = values[ option.param_name ].split( ',' ); images.forEach( ( id ) => { const image = wp.media.attachment( id ); if ( _.isUndefined( image.get( 'url' ) ) ) { image.fetch().then( function() { FusionPageBuilderApp.mediaMap.multiple_images[ key ][ id ] = image.get( 'url' ); } ); } else { FusionPageBuilderApp.mediaMap.multiple_images[ key ][ id ] = image.get( 'url' ); } } ); } } ); }, createMultiElementParentMediaMap: function( shortcodeName, content ) { var regExp = window.wp.shortcode.regexp( shortcodeName ), innerRegExp = this.regExpShortcode( shortcodeName ), options = fusionAllElements[ shortcodeName ].params, matches = content.match( regExp ); if ( 'object' !== typeof options ) { return; } if ( matches ) { _.each( matches, function( shortcode ) { var shortcodeElement = shortcode.match( innerRegExp ), shortcodeAttributes = '' !== shortcodeElement[ 3 ] ? window.wp.shortcode.attrs( shortcodeElement[ 3 ] ) : ''; if ( 'undefined' !== typeof shortcodeAttributes.named && 'undefined' !== typeof shortcodeAttributes.named.image_id && 'undefined' !== typeof shortcodeAttributes.named.image ) { _.each( options, function( option ) { var imageID, image; if ( 'upload' === option.type && 'undefined' !== typeof shortcodeAttributes.named[ option.param_name ] ) { image = shortcodeAttributes.named[ option.param_name ]; imageID = shortcodeAttributes.named.image_id; if ( '' === image ) { return; } // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ image ] ) { FusionPageBuilderApp.mediaMap.images[ image ] = true; } // Check if we have an image ID for this param. if ( '' !== imageID && 'image' === option.param_name ) { if ( 'object' !== typeof FusionPageBuilderApp.mediaMap.images[ image ] ) { FusionPageBuilderApp.mediaMap.images[ image ] = {}; } FusionPageBuilderApp.mediaMap.images[ image ].image_id = imageID; } } } ); } // If media slide. if ( 'fusion_slide' === shortcodeName && 'undefined' !== typeof shortcodeElement[ 5 ] && '' !== shortcodeElement[ 5 ] ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.images[ shortcodeElement[ 5 ] ] ) { FusionPageBuilderApp.mediaMap.images[ shortcodeElement[ 5 ] ] = true; } } } ); } }, createBuilderLayout: function( content ) { if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) { content = FusionPageBuilderApp.validateLibraryContent( content ); } content = this.convertGalleryElement( content ); this.shortcodesToBuilder( content ); this.legacyColumnSpacing(); this.legacyContainerBorderSize(); if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) { this.libraryBuilderToShortcodes(); } else { this.builderToShortcodes(); } }, legacyContainerBorderSize: function() { this.collection.each( function( model ) { var params; if ( 'fusion_builder_container' === model.get( 'type' ) ) { params = model.get( 'params' ); // 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 = isNaN( params.border_size ) ? params.border_size : params.border_size + 'px'; params.border_sizes_bottom = params.border_sizes_top; params.border_sizes_left = '0px'; params.border_sizes_right = '0px'; } delete params.border_size; model.set( 'params', params ); } } } ); }, legacyColumnSpacing: function() { var self = this, rows = { parent: {}, nested: {} }, rowId = 0, nestedId = 0, nestedCount = 0, widthCount = 0, column; this.collection.each( function( model ) { if ( 'fusion_builder_row' === model.get( 'type' ) ) { rowId++; } else if ( 'fusion_builder_row_inner' === model.get( 'type' ) ) { nestedId++; } else if ( 'fusion_builder_column' === model.get( 'type' ) || 'fusion_builder_column_inner' === model.get( 'type' ) ) { params = model.get( 'params' ); width = self.validateColumnWidth( params.type ); column = { model: model }; if ( 'fusion_builder_column' === model.get( 'type' ) ) { widthCount += width; if ( 1 < widthCount ) { rowId += 1; widthCount = width; } if ( 'undefined' === typeof rows.parent[ rowId ] ) { rows.parent[ rowId ] = [ column ]; } else { rows.parent[ rowId ].push( column ); } } else { nestedCount += width; if ( 1 < nestedCount ) { nestedId += 1; nestedCount = width; } if ( 'undefined' === typeof rows.nested[ nestedId ] ) { rows.nested[ nestedId ] = [ column ]; } else { rows.nested[ nestedId ].push( column ); } } } } ); // Loop over parent rows. _.each( rows.parent, function( row, rowIndex ) { self.setLegacySpacing( row, rowIndex ); } ); // Loop over nested rows. if ( ! _.isEmpty( rows.nested ) ) { _.each( rows.nested, function( row, rowIndex ) { self.setLegacySpacing( row, rowIndex ); } ); } }, setLegacySpacing: function( row, rowIndex ) { var self = this, total = row.length, lastIndex = total - 1, previousSpacing = '', emptySpacing = true, lastModel = false, container = false; // Loop over columns inside virtual row _.each( row, function( col, colIndex ) { var columnFirst = false, columnLast = false, model = col.model, 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 ) { spacing = params.spacing; if ( 'yes' === spacing ) { spacing = '4%'; } else if ( 'no' === spacing ) { spacing = '0px'; } if ( '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; } lastModel = model; model.set( 'params', params ); } ); // If all columns were empty, find parent container based on last col and add 0px. if ( lastModel && emptySpacing ) { container = this.getParentContainer( lastModel.get( 'cid' ) ); if ( container ) { container.model.attributes.params.flex_column_spacing = '0px'; } } }, getHalfSpacing: function( value ) { var unitlessSpacing = parseFloat( value ), unitlessHalf = unitlessSpacing / 2; return value.replace( unitlessSpacing, unitlessHalf ); }, 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 ); }, 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; }, /** * Convert shortcodes for the builder. * * @since 2.0.0 * @param {string} content - The content. * @param {number} parentCID - The parent CID. * @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, targetEl, targetPosition ) { var thisEl, regExp, innerRegExp, matches, shortcodeTags; // Show blank page layout if ( '' === content && ! this.$el.find( '.fusion-builder-blank-page-content' ).length ) { this.createBuilderLayout( '[fusion_builder_blank_page][/fusion_builder_blank_page]' ); return; } thisEl = this; shortcodeTags = _.keys( fusionAllElements ).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 = FusionPageBuilderViewManager.generateCid(), prefixedAttributes = { params: ( {} ) }, elementSettings, key, prefixedKey, dependencyOption, dependencyOptionValue, elementContent, alpha, paging, values, buttonPrefix, radiaDirectionsNew, // Check for shortcodes inside shortcode content shortcodesInContent = 'undefined' !== typeof shortcodeContent && '' !== shortcodeContent && shortcodeContent.match( regExp ), // Check if shortcode allows generator allowGenerator = 'undefined' !== typeof fusionAllElements[ shortcodeName ].allow_generator ? fusionAllElements[ shortcodeName ].allow_generator : ''; elementSettings = { type: shortcodeName, element_type: shortcodeName, cid: elementCID, created: 'manually', multi: '', params: {}, allow_generator: allowGenerator }; if ( 'fusion_builder_container' !== shortcodeName || 'fusion_builder_next_page' !== shortcodeName || 'fusion_woo_checkout_form' !== shortcodeName || 'fusion_builder_form_step' !== shortcodeName ) { elementSettings.parent = parentCID; } if ( 'fusion_builder_container' !== shortcodeName && 'fusion_builder_row' !== shortcodeName && 'fusion_builder_column' !== shortcodeName && 'fusion_builder_column_inner' !== shortcodeName && 'fusion_builder_row_inner' !== shortcodeName && 'fusion_builder_blank_page' !== shortcodeName && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName && 'fusion_builder_form_step' !== shortcodeName ) { if ( -1 !== shortcodeName.indexOf( 'fusion_' ) || -1 !== shortcodeName.indexOf( 'layerslider' ) || -1 !== shortcodeName.indexOf( 'rev_slider' ) || 'undefined' !== typeof fusionAllElements[ shortcodeName ] ) { elementSettings.type = 'element'; } } if ( _.isObject( shortcodeAttributes.named ) ) { // If no blend mode is defined, check if we should set to overlay. if ( ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'undefined' === typeof shortcodeAttributes.named.background_blend_mode ) { backgroundColor = shortcodeAttributes.named.background_color; videoBg = 'fusion_builder_container' === shortcodeName && 'undefined' !== typeof shortcodeAttributes.named.video_bg ? shortcodeAttributes.named.video_bg : ''; if ( 'fusion_builder_container' === shortcodeName && ( 'undefined' === typeof backgroundColor || '' === backgroundColor ) ) { backgroundColor = fusionAllElements[ shortcodeName ].defaults.background_color; } if ( '' !== backgroundColor ) { alphaBackgroundColor = jQuery.AWB_Color( backgroundColor ).alpha(); if ( 1 > alphaBackgroundColor && 0 !== alphaBackgroundColor && ( '' !== shortcodeAttributes.named.background_image || '' !== videoBg ) ) { shortcodeAttributes.named.background_blend_mode = 'overlay'; } } } // Correct radial direction params. if ( ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'undefined' !== typeof shortcodeAttributes.named.radial_direction ) { radiaDirectionsNew = { 'bottom': 'center bottom', 'bottom center': 'center bottom', 'left': 'left center', 'right': 'right center', 'top': 'center top', 'center': 'center center', 'center left': 'left center' }; if ( shortcodeAttributes.named.radial_direction in radiaDirectionsNew ) { shortcodeAttributes.named.radial_direction = radiaDirectionsNew[ shortcodeAttributes.named.radial_direction ]; } } 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 ( 'fusion_builder_container' === shortcodeName ) { // Set flex mode if not set, stops migration on front-end. if ( 'undefined' === typeof shortcodeAttributes.named.type && 'object' === typeof fusionAllElements.fusion_builder_container ) { shortcodeAttributes.named.type = fusionAllElements.fusion_builder_container.defaults.type; } else if ( 'undefined' !== typeof fusionBuilderConfig.container_legacy_support && ( '0' === fusionBuilderConfig.container_legacy_support || 0 === fusionBuilderConfig.container_legacy_support || false === fusionBuilderConfig.container_legacy_support ) ) { // Is set and legacy mode is off, force to flex. shortcodeAttributes.named.type = 'flex'; } // No column align, but equal heights is on, set to stretch. if ( 'undefined' === typeof shortcodeAttributes.named.flex_align_items && 'undefined' !== typeof shortcodeAttributes.named.equal_height_columns && 'yes' === shortcodeAttributes.named.equal_height_columns ) { shortcodeAttributes.named.flex_align_items = 'stretch'; } // No align content, but it is 100% height and centered. if ( 'undefined' === typeof shortcodeAttributes.named.align_content && 'undefined' !== typeof shortcodeAttributes.named.hundred_percent_height && 'yes' === shortcodeAttributes.named.hundred_percent_height && 'undefined' !== typeof shortcodeAttributes.named.hundred_percent_height_center_content && 'yes' === shortcodeAttributes.named.hundred_percent_height_center_content ) { shortcodeAttributes.named.align_content = 'center'; } } if ( 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) { // No align self set but ignore equal heights is on. if ( 'undefined' === typeof shortcodeAttributes.named.align_self && 'undefined' !== typeof shortcodeAttributes.named.min_height && 'none' === shortcodeAttributes.named.min_height ) { shortcodeAttributes.named.align_self = 'flex-start'; } // No align content set, but legacy center_content is on. if ( 'undefined' === typeof shortcodeAttributes.named.align_content && 'undefined' !== typeof shortcodeAttributes.named.center_content && 'yes' === shortcodeAttributes.named.center_content ) { shortcodeAttributes.named.align_content = 'center'; } // Border sizes. if ( ( 'undefined' === typeof shortcodeAttributes.named.border_sizes_top || 'undefined' === typeof shortcodeAttributes.named.border_sizes_bottom || 'undefined' === typeof shortcodeAttributes.named.border_sizes_left || 'undefined' === typeof shortcodeAttributes.named.border_sizes_right ) && 'string' === typeof shortcodeAttributes.named.border_size ) { switch ( shortcodeAttributes.named.border_position ) { case 'all': shortcodeAttributes.named.border_sizes_top = shortcodeAttributes.named.border_size; shortcodeAttributes.named.border_sizes_bottom = shortcodeAttributes.named.border_size; shortcodeAttributes.named.border_sizes_left = shortcodeAttributes.named.border_size; shortcodeAttributes.named.border_sizes_right = shortcodeAttributes.named.border_size; break; default: shortcodeAttributes.named[ 'border_sizes_' + shortcodeAttributes.named.border_position ] = shortcodeAttributes.named.border_size; } delete shortcodeAttributes.named.border_size; } } if ( 'fusion_fontawesome' === shortcodeName ) { if ( 'undefined' === typeof shortcodeAttributes.named.iconcolor_hover && 'string' === typeof shortcodeAttributes.named.iconcolor ) { shortcodeAttributes.named.iconcolor_hover = shortcodeAttributes.named.iconcolor; } if ( 'undefined' === typeof shortcodeAttributes.named.circlecolor_hover && 'string' === typeof shortcodeAttributes.named.circlecolor ) { shortcodeAttributes.named.circlecolor_hover = shortcodeAttributes.named.circlecolor; } if ( 'undefined' === typeof shortcodeAttributes.named.circlebordercolor_hover && 'string' === typeof shortcodeAttributes.named.circlebordercolor ) { shortcodeAttributes.named.circlebordercolor_hover = shortcodeAttributes.named.circlebordercolor; } } if ( 'fusion_title' === shortcodeName ) { if ( 'undefined' === typeof shortcodeAttributes.named.margin_top_small && 'string' === typeof shortcodeAttributes.named.margin_top_mobile ) { shortcodeAttributes.named.margin_top_small = shortcodeAttributes.named.margin_top_mobile; } if ( 'undefined' === typeof shortcodeAttributes.named.margin_bottom_small && 'string' === typeof shortcodeAttributes.named.margin_bottom_mobile ) { shortcodeAttributes.named.margin_bottom_small = shortcodeAttributes.named.margin_bottom_mobile; } } if ( 'fusion_countdown' === shortcodeName ) { // Correct old combined border radius setting. if ( 'undefined' === typeof shortcodeAttributes.named.counter_border_radius && 'string' === typeof shortcodeAttributes.named.border_radius ) { shortcodeAttributes.named.counter_border_radius = shortcodeAttributes.named.border_radius; } // Correct the label text color. if ( 'undefined' === typeof shortcodeAttributes.named.label_color && 'string' === typeof shortcodeAttributes.named.counter_text_color ) { shortcodeAttributes.named.label_color = shortcodeAttributes.named.counter_text_color; } } if ( 'fusion_widget' === shortcodeName ) { if ( 'undefined' === typeof shortcodeAttributes.named.margin_top && 'undefined' === typeof shortcodeAttributes.named.margin_right && 'undefined' === typeof shortcodeAttributes.named.margin_bottom && 'undefined' === typeof shortcodeAttributes.named.margin_left && '' !== shortcodeAttributes.named.fusion_margin ) { shortcodeAttributes.named.margin_top = shortcodeAttributes.named.fusion_margin; shortcodeAttributes.named.margin_right = shortcodeAttributes.named.fusion_margin; shortcodeAttributes.named.margin_bottom = shortcodeAttributes.named.fusion_margin; shortcodeAttributes.named.margin_left = shortcodeAttributes.named.fusion_margin; } } for ( key in shortcodeAttributes.named ) { prefixedKey = key; if ( ( 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) && 'type' === prefixedKey ) { prefixedKey = 'layout'; prefixedAttributes[ prefixedKey ] = shortcodeAttributes.named[ 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 = prefixedAttributes.params.button_gradient_top_color = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' ); } } 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 = prefixedAttributes.params.button_gradient_top_color_hover = shortcodeAttributes.named[ key ].replace( 'transparent', 'rgba(255,255,255,0)' ); } } 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 ( 'type' === key && ( 'fusion_widget' === shortcodeName ) && -1 !== prefixedAttributes.params[ key ].indexOf( 'Tribe' ) ) { prefixedAttributes.params[ key ] = prefixedAttributes.params[ key ].replace( /\\/g, '' ).split( /(?=[A-Z])/ ).join( '\\' ).replace( '_\\', '_' ); } 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 ]; } } // Ensures backwards compatibility for the widget element border_color option of the vertical menu. if ( 'fusion_widget' === shortcodeName && 'Fusion_Widget_Vertical_Menu' === shortcodeAttributes.named.type && 'undefined' === typeof shortcodeAttributes.named.fusion_divider_color ) { prefixedAttributes.params.fusion_divider_color = shortcodeAttributes.named.fusion_widget_vertical_menu__border_color; delete prefixedAttributes.params.fusion_widget_vertical_menu__border_color; } // Ensures backwards compatibility for the table style in table element. if ( 'fusion_table' === shortcodeName && 'undefined' === typeof shortcodeAttributes.named.fusion_table_type ) { if ( '1' === shortcodeContent.charAt( 18 ) || '2' === shortcodeContent.charAt( 18 ) ) { prefixedAttributes.params.fusion_table_type = shortcodeContent.charAt( 18 ); } } // 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; } } if ( 'fusion_button' === shortcodeName || 'fusion_form_submit' === shortcodeName ) { // Split border width into 4. if ( 'undefined' === typeof shortcodeAttributes.named.border_top && 'undefined' !== typeof shortcodeAttributes.named.border_width && '' !== shortcodeAttributes.named.border_width ) { prefixedAttributes.params.border_top = parseInt( shortcodeAttributes.named.border_width ) + 'px'; prefixedAttributes.params.border_right = prefixedAttributes.params.border_top; prefixedAttributes.params.border_bottom = prefixedAttributes.params.border_top; prefixedAttributes.params.border_left = prefixedAttributes.params.border_top; delete shortcodeAttributes.named.border_width; } // Split border radius into 4. if ( 'undefined' === typeof shortcodeAttributes.named.border_radius_top_left && 'undefined' !== typeof shortcodeAttributes.named.border_radius && '' !== shortcodeAttributes.named.border_radius ) { prefixedAttributes.params.border_radius_top_left = parseInt( shortcodeAttributes.named.border_radius ) + 'px'; prefixedAttributes.params.border_radius_top_right = prefixedAttributes.params.border_radius_top_left; prefixedAttributes.params.border_radius_bottom_right = prefixedAttributes.params.border_radius_top_left; prefixedAttributes.params.border_radius_bottom_left = prefixedAttributes.params.border_radius_top_left; delete shortcodeAttributes.named.border_radius; } } if ( 'fusion_alert' === shortcodeName ) { if ( 'undefined' !== typeof shortcodeAttributes.named.dismissable && 'yes' === shortcodeAttributes.named.dismissable ) { prefixedAttributes.params.dismissable = 'boxed'; } } if ( 'fusion_tagline_box' === shortcodeName ) { // Split border radius into 4. if ( 'undefined' === typeof shortcodeAttributes.named.button_border_radius_top_left && 'undefined' !== typeof shortcodeAttributes.named.button_border_radius && '' !== shortcodeAttributes.named.button_border_radius ) { prefixedAttributes.params.button_border_radius_top_left = parseInt( shortcodeAttributes.named.border_radius ) + 'px'; prefixedAttributes.params.button_border_radius_top_right = prefixedAttributes.params.button_border_radius_top_left; prefixedAttributes.params.button_border_radius_bottom_right = prefixedAttributes.params.button_border_radius_top_left; prefixedAttributes.params.button_border_radius_bottom_left = prefixedAttributes.params.button_border_radius_top_left; delete shortcodeAttributes.named.button_border_radius; } } if ( 'fusion_tb_woo_cart' === shortcodeName || 'fusion_tb_woo_reviews' === shortcodeName || 'fusion_post_card_cart' === shortcodeName || 'fusion_tb_woo_checkout_payment' === shortcodeName ) { // Split border width into 4. if ( 'undefined' === typeof shortcodeAttributes.named.button_border_top && 'undefined' !== typeof shortcodeAttributes.named.button_border_width && '' !== shortcodeAttributes.named.button_border_width ) { prefixedAttributes.params.button_border_top = parseInt( shortcodeAttributes.named.button_border_width ) + 'px'; prefixedAttributes.params.button_border_right = prefixedAttributes.params.button_border_top; prefixedAttributes.params.button_border_bottom = prefixedAttributes.params.button_border_top; prefixedAttributes.params.button_border_left = prefixedAttributes.params.button_border_top; delete shortcodeAttributes.named.button_border_width; } } if ( 'fusion_post_card_cart' === shortcodeName ) { // Split border width into 4. if ( 'undefined' === typeof shortcodeAttributes.named.button_details_border_top && 'undefined' !== typeof shortcodeAttributes.named.button_details_border_width && '' !== shortcodeAttributes.named.button_details_border_width ) { prefixedAttributes.params.button_details_border_top = parseInt( shortcodeAttributes.named.button_details_border_width ) + 'px'; prefixedAttributes.params.button_details_border_right = prefixedAttributes.params.button_details_border_top; prefixedAttributes.params.button_details_border_bottom = prefixedAttributes.params.button_details_border_top; prefixedAttributes.params.button_details_border_left = prefixedAttributes.params.button_details_border_top; delete shortcodeAttributes.named.button_details_border_width; } } // Ensures backwards compatibility for register note in user registration element. if ( 'fusion_register' === shortcodeName && 'undefined' === typeof shortcodeAttributes.named.register_note ) { prefixedAttributes.params.register_note = fusionBuilderText.user_login_register_note; } elementSettings = _.extend( elementSettings, prefixedAttributes ); } if ( ! shortcodesInContent && 'fusion_builder_column' !== shortcodeName ) { elementSettings.params.element_content = shortcodeContent; } // Compare shortcode name to multi elements object / array if ( shortcodeName in fusionMultiElements ) { elementSettings.multi = 'multi_element_parent'; } // Set content for elements with dependency options if ( '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 ( 'fusion_builder_container' !== shortcodeName && 'fusion_builder_row' !== shortcodeName && 'fusion_builder_row_inner' !== shortcodeName && 'fusion_builder_column' !== shortcodeName && 'fusion_builder_column_inner' !== shortcodeName && 'fusion_builder_next_page' !== shortcodeName && 'fusion_woo_checkout_form' !== shortcodeName && 'fusion_builder_form_step' !== shortcodeName ) { elementSettings.params.element_content = shortcodeContent; } } if ( 'undefined' !== typeof targetEl && targetEl ) { elementSettings.targetElement = targetEl; } if ( 'undefined' !== typeof targetPosition && targetPosition ) { elementSettings.targetElementPosition = targetPosition; } thisEl.collection.add( [ elementSettings ] ); if ( shortcodesInContent ) { if ( 'fusion_builder_container' === shortcodeName || 'fusion_builder_row' === shortcodeName || 'fusion_builder_row_inner' === shortcodeName || 'fusion_builder_column' === shortcodeName || 'fusion_builder_column_inner' === shortcodeName ) { thisEl.shortcodesToBuilder( shortcodeContent, elementCID ); } } } ); }, addBuilderElement: function( element ) { var view, viewSettings = { model: element, collection: FusionPageBuilderElements }, parentModel, elementType, previewView; switch ( element.get( 'type' ) ) { case 'fusion_builder_blank_page': if ( 'undefined' !== typeof fusionBuilderConfig.post_type && 'fusion_form' === fusionBuilderConfig.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(); } // Add row if needed if ( 'manually' !== element.get( 'created' ) ) { view.addRow(); } // Check if container is toggled if ( ! _.isUndefined( element.attributes.params.admin_toggled ) && 'no' === element.attributes.params.admin_toggled || _.isUndefined( element.attributes.params.admin_toggled ) ) { FusionPageBuilderApp.toggledContainers = false; $( '.fusion-builder-layout-buttons-toggle-containers' ).find( 'span' ).addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' ); } break; case 'fusion_builder_row': view = new FusionPageBuilder.RowView( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).length ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).append( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$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 } ); } break; case 'fusion_builder_row_inner': FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' ); view = new FusionPageBuilder.InnerRowView( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); // TODO - Check appendAfter. if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) { element.get( 'appendAfter' ).after( view.render().el ); element.unset( 'appendAfter' ); } else if ( FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).length ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-section-content' ).append( 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' ) ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '> .fusion-builder-add-element' ).before( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '> .fusion-builder-column-controls' ).after( 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 } ); } break; case 'fusion_builder_column': if ( element.get( 'layout' ) ) { viewSettings.className = 'fusion-builder-column fusion-builder-column-outer fusion-builder-column-' + element.get( 'layout' ); view = new FusionPageBuilder.ColumnView( 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' ) ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container' ).append( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container .fusion-builder-empty-section' ).after( view.render().el ); } element.unset( 'from' ); } } break; case 'fusion_builder_column_inner': viewSettings.className = 'fusion-builder-column fusion-builder-column-inner fusion-builder-column-' + element.get( 'layout' ); view = new FusionPageBuilder.NestedColumnView( viewSettings ); 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' ) ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container-inner' ).append( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-row-container-inner' ).prepend( view.render().el ); } break; case 'element': viewSettings.attributes = { 'data-cid': element.get( 'cid' ) }; // Multi element child if ( 'undefined' !== typeof element.get( 'multi' ) && 'multi_element_child' === element.get( 'multi' ) ) { view = new FusionPageBuilder.MultiElementSortableChild( viewSettings ); element.targetElement = view.$el; element.attributes.view.child_views.push( view ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'targetElement' ) ) ) { 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' ) ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-sortable-options' ).append( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-sortable-options' ).prepend( view.render().el ); } // This child was cloned if ( ! _.isUndefined( element.get( 'titleLabel' ) ) ) { if ( ! _.isUndefined( element.get( 'cloned' ) ) ) { view.$el.find( '.multi-element-child-name' ).html( element.get( 'titleLabel' ) ); } element.unset( 'cloned' ); } // Standard element } else { FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' ); view = new FusionPageBuilder.ElementView( viewSettings ); // Get element parent parentModel = this.collection.find( function( model ) { return model.get( 'cid' ) === element.get( 'parent' ); } ); // Add element builder view to proper column if ( 'undefined' !== typeof parentModel && 'fusion_builder_column_inner' === parentModel.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' ) ) { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-add-element' ).before( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.prepend( 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' ) ) { // TO-DO: Check why this doesn't work. Will be wrong parent no doubt. FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.find( '.fusion-builder-add-element:not(.fusion-builder-column-inner .fusion-builder-add-element)' ).before( view.render().el ); } else { FusionPageBuilderViewManager.getView( element.get( 'parent' ) ).$el.prepend( view.render().el ); } FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); // Check if element was added manually if ( 'manually' === element.get( 'added' ) ) { viewSettings.attributes = { 'data-modal_view': 'element_settings' }; view = new FusionPageBuilder.ModalView( viewSettings ); $( 'body' ).append( view.render().el ); // Generate element preview } else { elementType = element.get( 'element_type' ); if ( 'undefined' !== typeof fusionAllElements[ elementType ].preview ) { previewView = new FusionPageBuilder.ElementPreviewView( viewSettings ); view.$el.find( '.fusion-builder-module-preview' ).append( previewView.render().el ); } } } break; case 'generated_element': FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' ); // 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' }; view = new FusionPageBuilder.ModalView( viewSettings ); $( 'body' ).append( view.render().el ); } break; case 'fusion_builder_next_page': view = new FusionPageBuilder.NextPage( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) { // TODO - Check appendAfter. if ( ! element.get( 'appendAfter' ).next().next().hasClass( 'fusion-builder-next-page' ) ) { element.get( 'appendAfter' ).after( view.render().el ); } } else { $( '.fusion_builder_container:last-child' ).after( view.render().el ); } break; case 'fusion_builder_form_step': view = new FusionPageBuilder.FormStep( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'appendAfter' ) ) && element.get( 'appendAfter' ).length ) { element.get( 'appendAfter' ).after( view.render().el ); } else { this.$el.find( '#fusion_builder_container' ).append( view.render().el ); this.$el.find( '.fusion_builder_blank_page' ).remove(); } break; case 'fusion_woo_checkout_form': view = new FusionPageBuilder.checkoutForm( viewSettings ); FusionPageBuilderViewManager.addView( element.get( 'cid' ), view ); if ( ! _.isUndefined( element.get( 'appendAfter' ) ) ) { // TODO - Check appendAfter. if ( 2 > this.$el.find( '.fusion-checkout-form' ).length ) { element.get( 'appendAfter' ).after( view.render().el ); } } else if ( ! $( '.fusion_builder_container:last-child' ).length ) { $( '#fusion_builder_container' ).append( view.render().el ); } else { $( '.fusion_builder_container:last-child' ).after( view.render().el ); } break; } }, regExpShortcode: _.memoize( function( tag ) { return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' ); } ), findShortcodeMatches: function( content, match ) { var shortcodeMatches, shortcodeRegExp, shortcodeInnerRegExp; if ( _.isObject( content ) ) { content = content.value; } shortcodeMatches = ''; content = 'undefined' !== typeof content ? content : ''; shortcodeRegExp = window.wp.shortcode.regexp( match ); shortcodeInnerRegExp = new RegExp( '\\[(\\[?)(' + match + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)' ); if ( 'undefined' !== typeof content && '' !== content ) { shortcodeMatches = content.match( shortcodeRegExp ); } return shortcodeMatches; }, beforeGenerateShortcode: function( elementCID ) { var elementView = FusionPageBuilderViewManager.getView( elementCID ), elementType = elementView.model.get( 'element_type' ), options = fusionAllElements[ elementType ].params, values = jQuery.extend( true, {}, fusionAllElements[ elementType ].defaults, elementView.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 fusionBuilderConfig.replaceAssets && fusionBuilderConfig.replaceAssets && ( '-1' !== jQuery( 'body' ).attr( 'class' ).indexOf( 'fusion-element-post-type-' ) || 'fusion_template' === fusionBuilderConfig.post_type ) ) { this.mapStudioImages( options, values ); if ( 'undefined' !== typeof elementView.model.get( 'multi' ) && 'multi_element_parent' === elementView.model.get( 'multi' ) && '' !== values.element_content ) { this.createMultiElementParentMediaMap( fusionAllElements[ elementType ].element_child, values.element_content ); } // TODO: should just be on image view. if ( 'fusion_imageframe' === elementType && '' !== 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; } } // TODO: move to menu view. if ( 'fusion_menu' === elementType && '' !== values.menu ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.menus[ values.menu ] ) { FusionPageBuilderApp.mediaMap.menus[ values.menu ] = true; } } // TODO: move this when above are moved as well. 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 custom icons that used in forms to media map. if ( this.isString( elementType ) && elementType.startsWith( 'fusion_form_' ) && this.isString( values.input_field_icon ) && 'fusion-prefix-' === values.input_field_icon.substr( 0, 14 ) ) { if ( 'undefined' !== typeof fusionBuilderConfig.customIcons ) { iconWithoutFusionPrefix = values.input_field_icon.substr( 14 ); // TODO: try to optimize this check. jQuery.each( fusionBuilderConfig.customIcons, function( iconPostName, iconSet ) { if ( 0 === iconWithoutFusionPrefix.indexOf( iconSet.css_prefix ) ) { FusionPageBuilderApp.mediaMap.icons[ iconSet.post_id ] = iconSet.css_prefix; return false; } } ); } } // TODO: move this when above are moved as well. if ( ( 'fusion_tb_post_card_archives' === elementType || 'fusion_post_cards' === elementType ) && '' !== 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; } } // TODO: move this when above are moved as well. if ( 'fusion_video' === elementType && '' !== values.video ) { // If its not within object already, add it. if ( 'undefined' === typeof FusionPageBuilderApp.mediaMap.videos[ values.video ] ) { FusionPageBuilderApp.mediaMap.videos[ values.video ] = true; } } // TODO: move this when above are moved as well. if ( 'fusion_builder_container' === elementType && '' !== 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; } } // TODO: move this when above are moved as well. if ( 'fusion_fontawesome' === elementType && '' !== values.icon && 'fusion-prefix-' === values.icon.substr( 0, 14 ) ) { if ( 'undefined' !== typeof fusionBuilderConfig.customIcons ) { iconWithoutFusionPrefix = values.icon.substr( 14 ); // TODO: try to optimize this check. jQuery.each( fusionBuilderConfig.customIcons, function( iconPostName, iconSet ) { if ( 0 === iconWithoutFusionPrefix.indexOf( iconSet.css_prefix ) ) { FusionPageBuilderApp.mediaMap.icons[ iconSet.post_id ] = iconSet.css_prefix; return false; } } ); } } } }, libraryBuilderToShortcodes: function() { var shortcode = '', cid, view; // Editing element if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-elements' ) ) { if ( jQuery( '.fusion-builder-column-outer .fusion_builder_row_inner' ).length ) { cid = jQuery( '.fusion-builder-column-outer .fusion_builder_row_inner' ).data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getInnerRowContent(); } else if ( jQuery( '.fusion_module_block' ).length ) { shortcode = FusionPageBuilderApp.generateElementShortcode( jQuery( '.fusion_module_block' ), false ); } // Editing column. } else if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-columns' ) || jQuery( 'body' ).hasClass( 'fusion-element-post-type-post_cards' ) ) { if ( jQuery( '.fusion-builder-column-outer' ).length ) { cid = jQuery( '.fusion-builder-column-outer' ).data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getColumnContent( jQuery( '.fusion-builder-column-outer' ) ); } // Editing container } else if ( jQuery( 'body' ).hasClass( 'fusion-element-post-type-sections' ) ) { if ( jQuery( '.fusion-builder-section-content' ).length ) { cid = jQuery( '.fusion-builder-section-content.fusion-builder-data-cid' ).data( 'cid' ); view = FusionPageBuilderViewManager.getView( cid ); shortcode = view.getContainerContent(); } } setTimeout( function() { FusionPageBuilderApp.fusionBuilderSetContent( 'content', shortcode ); FusionPageBuilderEvents.trigger( 'fusion-save-history-state' ); FusionPageBuilderApp.setGoogleFonts( shortcode ); }, 500 ); }, builderToShortcodes: function() { var shortcode = '', thisEl = this, plugins = 'object' === typeof fusionBuilderConfig.plugins_active ? fusionBuilderConfig.plugins_active : false, offCanvases; this.simplifiedMap = []; // Reset the media map. this.mediaMap = { images: {}, menus: {}, forms: {}, post_cards: {}, videos: {}, icons: {}, off_canvases: {} }; if ( jQuery( 'body' ).hasClass( 'fusion-builder-library-edit' ) && ! jQuery( 'body' ).hasClass( 'fusion-element-post-type-mega_menus' ) ) { this.libraryBuilderToShortcodes(); } else if ( 'undefined' !== this.pauseBuilder && ! this.pauseBuilder ) { this.$el.find( '.fusion_builder_container, .fusion-builder-form-step' ).each( function( index, value ) { var $thisContainer = $( this ).find( '.fusion-builder-section-content' ), stepId, stepView; // Form step shortcode. if ( $( this ).hasClass( 'fusion-builder-form-step' ) ) { stepId = $( this ).find( '.fusion-builder-data-cid' ).attr( 'data-cid' ); stepView = stepId ? FusionPageBuilderViewManager.getView( stepId ) : false; if ( stepView ) { shortcode += stepView.getContent(); } else { shortcode += '[fusion_builder_form_step /]'; } return; } shortcode += thisEl.generateElementShortcode( $( this ), true ); $thisContainer.find( '.fusion_builder_row' ).each( function() { var $thisRow = $( this ); shortcode += '[fusion_builder_row]'; $thisRow.find( '.fusion-builder-column-outer' ).each( function() { var $thisColumn = $( this ), columnCID = $thisColumn.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent( $thisColumn ); } ); shortcode += '[/fusion_builder_row]'; } ); shortcode += '[/fusion_builder_container]'; // Check for next page shortcode if ( $( this ).next().hasClass( 'fusion-builder-next-page' ) ) { shortcode += '[fusion_builder_next_page]'; } // Check for checkout form shortcode if ( $( this ).next().hasClass( 'fusion-checkout-form' ) ) { shortcode += '[fusion_woo_checkout_form]'; } if ( $( this ).prev().hasClass( 'fusion-checkout-form' ) && 0 === index ) { shortcode = '[fusion_woo_checkout_form]' + shortcode; } } ); setTimeout( function() { FusionPageBuilderApp.fusionBuilderSetContent( 'content', shortcode ); FusionPageBuilderEvents.trigger( 'fusion-save-history-state' ); FusionPageBuilderApp.setGoogleFonts( shortcode ); jQuery( document ).trigger( 'fusion-builder-content-updated' ); }, 500 ); } // Add Off Canvases to media map. if ( false !== plugins && true === plugins.awb_studio ) { offCanvases = jQuery( '#pyre_off_canvases' ).val(); if ( 'undefined' !== typeof offCanvases && offCanvases.length ) { _.each( offCanvases, function( key, value ) { FusionPageBuilderApp.mediaMap.off_canvases[ key ] = true; } ); } } // If media map exists, add to post meta for saving. if ( ! _.isEmpty( this.mediaMap ) && 'undefined' !== typeof fusionBuilderConfig.replaceAssets && fusionBuilderConfig.replaceAssets ) { jQuery( '#fusion-studio-media-map-field' ).val( JSON.stringify( FusionPageBuilderApp.mediaMap ) ); } }, /** * Checks page content for font dependencies. * * @since 2.0.0 * @return {Object} */ setGoogleFonts: function( content ) { var self = this, googleFonts = {}, fontFamily, $input = jQuery( '#fusion-google-fonts-field' ), savedData = $input.val(); if ( savedData && '' !== savedData ) { try { savedData = JSON.parse( savedData ); } catch ( error ) { console.log( error ); } } googleFonts = this.setElementFonts( content, googleFonts ); googleFonts = this.setInlineFonts( content, googleFonts ); // Delete global typographies. for ( fontFamily in googleFonts ) { if ( fontFamily.includes( 'var(' ) ) { // awbOriginalPalette is a variable present only on studio plugin. if ( window.awbOriginalPalette ) { addOverwriteTypographyToMeta( fontFamily ); } } } if ( 'object' === typeof savedData ) { _.each( savedData, function( fontData, fontFamily ) { _.each( fontData, function( values, key ) { savedData[ fontFamily ][ key ] = _.values( values ); } ); } ); // We have existing values and existing value is not the same as new. if ( ! _.isEqual( savedData, googleFonts ) ) { if ( _.isEmpty( googleFonts ) ) { googleFonts = ''; } savedData = googleFonts; // eslint-disable-line camelcase } } else if ( ! _.isEmpty( googleFonts ) ) { // We do not have existing values and we do have fonts now. savedData = googleFonts; // eslint-disable-line camelcase } // Set the json encoded value to text area. $input.val( JSON.stringify( savedData ) ); function addOverwriteTypographyToMeta( globalVar ) { var typoMatch = globalVar.match( /--awb-typography(\d)/ ), fontName, fontVariant, uniqueFontVariant, variantMatch, i, typoId; if ( ! typoMatch[ 1 ] || ! Array.isArray( googleFonts[ globalVar ].variants ) ) { delete googleFonts[ globalVar ]; return; } // Get the font family. typoId = typoMatch[ 1 ]; fontName = awbTypoData.data[ 'typography' + typoId ][ 'font-family' ]; fontVariant = []; // Get the global font variants and merge with non-global ones. for ( i = 0; i < googleFonts[ globalVar ].variants.length; i++ ) { if ( googleFonts[ globalVar ].variants[ i ].includes( 'var(' ) ) { variantMatch = googleFonts[ globalVar ].variants[ i ].match( /--awb-typography(\d)/ ); if ( variantMatch[ 1 ] ) { if ( awbTypoData.data[ 'typography' + variantMatch[ 1 ] ].variant ) { fontVariant.push( awbTypoData.data[ 'typography' + variantMatch[ 1 ] ].variant ); } else { fontVariant.push( '400' ); } } } else { fontVariant.push( googleFonts[ globalVar ].variants[ i ] ); } } // Update the font variant. If exist then concat them. if ( googleFonts[ fontName ] ) { if ( googleFonts[ fontName ].variants ) { googleFonts[ fontName ].variants = googleFonts[ fontName ].variants.concat( fontVariant ); } else { googleFonts[ fontName ].variants = fontVariant; } } else { googleFonts[ fontName ] = {}; googleFonts[ fontName ].variants = fontVariant; } // Remove duplicate variants. uniqueFontVariant = []; googleFonts[ fontName ].variants.forEach( function( el ) { if ( ! uniqueFontVariant.includes( el ) ) { uniqueFontVariant.push( el ); } } ); googleFonts[ fontName ].variants = uniqueFontVariant; // Finally, delete global variant. delete googleFonts[ globalVar ]; } }, /** * Checks page content for element font families. * * @since 2.0.0 * @param object googleFonts * @return {Object} */ setElementFonts: function( postContent, googleFonts ) { var regexp, elementFonts, tempFonts = {}, saveFonts = []; if ( '' !== postContent && -1 !== postContent.indexOf( 'fusion_font_' ) ) { regexp = new RegExp( '(fusion_font_[^=]*=")([^"]*)"', 'g' ); elementFonts = postContent.match( regexp ); if ( 'object' === typeof elementFonts ) { _.each( elementFonts, function( match, key ) { var matches = match.slice( 0, -1 ).split( '="' ), unique = matches[ 0 ].replace( 'fusion_font_family_', '' ).replace( 'fusion_font_variant_', '' ), type = 'family'; if ( -1 !== matches[ 0 ].indexOf( 'fusion_font_variant_' ) ) { type = 'variant'; } if ( '' === matches[ 1 ] && 'family' === type ) { return; } if ( 'object' !== typeof tempFonts[ unique ] ) { tempFonts[ unique ] = {}; } else if ( 'family' === type ) { // If we are setting family again for something already in process, then save out incomplete and start fresh saveFonts.push( tempFonts[ unique ] ); tempFonts[ unique ] = {}; } tempFonts[ unique ][ type ] = matches[ 1 ]; // If both are set, add to save fonts and delete from temporary holder so others can be collected with same ID. if ( 'undefined' !== typeof tempFonts[ unique ].family && 'undefined' !== typeof tempFonts[ unique ].variant ) { saveFonts.push( tempFonts[ unique ] ); delete tempFonts[ unique ]; } } ); } // Check for incomplete ones with family and add them too. _.each( tempFonts, function( font, option ) { if ( 'undefined' !== typeof font.family && '' !== font.family ) { saveFonts.push( tempFonts[ option ] ); } } ); // Look all fonts for saving and save. _.each( saveFonts, function( font, option ) { if ( 'undefined' === typeof font.family || '' === font.family ) { return; } if ( 'undefined' === typeof googleFonts[ font.family ] ) { googleFonts[ font.family ] = { variants: [] }; } // Add the variant if it does not exist already. if ( 'string' === typeof font.variant && ! googleFonts[ font.family ].variants.includes( font.variant ) ) { googleFonts[ font.family ].variants.push( font.variant ); } } ); } return googleFonts; }, /** * Checks page content for inline font families. * * @since 2.0.0 * @param object googleFonts * @return {Object} */ setInlineFonts: function( postContent, googleFonts ) { var regexp, inlineFonts, current = {}, tempFonts = [], saveFonts = []; if ( '' !== postContent && -1 !== postContent.indexOf( 'data-fusion-google-' ) ) { regexp = new RegExp( 'data-fusion-google-[^=]*="([^"]*)"', 'g' ); inlineFonts = postContent.match( regexp ); if ( 'object' === typeof inlineFonts ) { _.each( inlineFonts, function( match, key ) { var matches = match.slice( 0, -1 ).split( '="' ), type = 'family'; if ( -1 !== matches[ 0 ].indexOf( 'data-fusion-google-variant' ) ) { type = 'variant'; } // Unfilled font family and reached another, bump to temporary and reset current. if ( 'string' === typeof current.family && 'family' === type ) { tempFonts.push( current ); current = {}; } current[ type ] = matches[ 1 ]; // If both are set, add to save fonts and delete from temporary holder so others can be collected with same ID. if ( 'undefined' !== typeof current.family && 'undefined' !== typeof current.variant ) { saveFonts.push( current ); current = {}; } } ); } // Check for incomplete ones with family and add them too. _.each( tempFonts, function( font, option ) { if ( 'undefined' !== typeof font.family ) { saveFonts.push( tempFonts[ option ] ); } } ); // Look all fonts for saving and save. _.each( saveFonts, function( font, option ) { if ( 'undefined' === typeof googleFonts[ font.family ] ) { googleFonts[ font.family ] = { variants: [], subsets: [] }; } // Add the variant. if ( 'string' === typeof font.variant ) { googleFonts[ font.family ].variants.push( font.variant ); } } ); } return googleFonts; }, syncGlobalLayouts: function() { var $mainContainer = $( '#fusion_builder_main_container' ), childChanged = false, updated = [], elementCID, element; // Return if no globals. if ( 0 === $mainContainer.find( 'div[class^="fusion-global-"],div[class*=" fusion-global-"]' ).length ) { return; } // Loop through all global elements. $( 'div[class^="fusion-global-"],div[class*=" fusion-global-"]' ).each( function() { var globalLayoutID = $( this ).attr( 'fusion-global-layout' ); // Check if multiple instances exist. if ( 1 < $mainContainer.find( '[fusion-global-layout="' + globalLayoutID + '"]' ).length ) { // Loop through all multiple instances. $( '[fusion-global-layout="' + globalLayoutID + '"]' ).each( function() { childChanged = false; // Check for child element changes. if ( $( this ).hasClass( 'fusion-global-container' ) ) { childChanged = FusionPageBuilderApp.isChildElementChanged( $( this ), 'container' ); } else if ( $( this ).hasClass( 'fusion-global-column' ) ) { childChanged = FusionPageBuilderApp.isChildElementChanged( $( this ), 'column' ); } // Get cid from html element. elementCID = 'undefined' === typeof $( this ).data( 'cid' ) ? $( this ).find( '.fusion-builder-data-cid' ).data( 'cid' ) : $( this ).data( 'cid' ); // Get model by cid. element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === elementCID; } ); if ( ( 0 < _.keys( element.changed ).length || true === childChanged ) && -1 === $.inArray( globalLayoutID, updated ) ) { // Sync models / Update layout template. FusionPageBuilderApp.updateGlobalLayouts( this, element, globalLayoutID ); updated.push( globalLayoutID ); } } ); } } ); }, isChildElementChanged: function( currentElement, section ) { // TO DO :: Check for clone and delete too. var isChanged = false, $thisColumn, columnCID, column; if ( 'container' === section ) { // Parse rows. currentElement.find( '.fusion-builder-row-content:not(.fusion_builder_row_inner .fusion-builder-row-content)' ).each( function() { var thisRow = $( this ), rowCID = thisRow.data( 'cid' ), row; // Get model from collection by cid. row = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === rowCID; } ); if ( 0 < _.keys( row.changed ).length ) { isChanged = true; return false; } // Parse columns. thisRow.find( '.fusion-builder-column-outer' ).each( function() { // Parse column elements. var thisColumn = $( this ), columnCID = thisColumn.data( 'cid' ), // Get model from collection by cid. column = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === columnCID; } ); if ( 0 < _.keys( column.changed ).length ) { isChanged = true; return false; } // Find column elements. thisColumn.children( '.fusion_module_block, .fusion_builder_row_inner' ).each( function() { var thisElement, elementCID, element, thisInnerRow, InnerRowCID, innerRowView; // Regular element. if ( $( this ).hasClass( 'fusion_module_block' ) ) { thisElement = $( this ); elementCID = thisElement.data( 'cid' ); // Get model from collection by cid. element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === elementCID; } ); if ( 0 < _.keys( element.changed ).length ) { isChanged = true; return false; } } else if ( $( this ).hasClass( 'fusion_builder_row_inner' ) ) { // Inner row element thisInnerRow = $( this ); InnerRowCID = thisInnerRow.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( InnerRowCID ); // Check inner row. if ( 'undefined' !== typeof innerRowView ) { isChanged = FusionPageBuilderApp.isNestedRowChanged( '', columnCID ); } } } ); } ); } ); } else if ( 'column' === section ) { $thisColumn = ''; columnCID = currentElement.data( 'cid' ); // Get model from collection by cid. column = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === columnCID; } ); if ( 0 < _.keys( column.changed ).length ) { isChanged = true; return false; } // Parse column elements. $thisColumn = currentElement; $thisColumn.find( '.fusion_builder_column_element:not(.fusion-builder-column-inner .fusion_builder_column_element)' ).each( function() { var $thisModule, moduleCID, module, $thisInnerRow, innerRowCID, innerRowView; // Standard element. if ( $( this ).hasClass( 'fusion_module_block' ) ) { $thisModule = $( 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; } ); if ( 0 < _.keys( module.changed ).length ) { isChanged = true; return false; } // Inner row/nested element. } else if ( $( this ).hasClass( 'fusion_builder_row_inner' ) ) { $thisInnerRow = $( 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 ) { isChanged = FusionPageBuilderApp.isNestedRowChanged( '', columnCID ); } } } ); } return isChanged; }, isNestedRowChanged: function( event ) { var thisInnerRow, isChanged; if ( event ) { event.preventDefault(); } if ( 0 < _.keys( this.model.changed ).length ) { isChanged = true; return false; } // Parse inner columns. thisInnerRow = this.$el; thisInnerRow.find( '.fusion-builder-column-inner' ).each( function() { var $thisColumnInner = $( this ), columnInnerCID = $thisColumnInner.data( 'cid' ), innerColumnModule = FusionPageBuilderElements.findWhere( { cid: columnInnerCID } ); if ( 0 < _.keys( innerColumnModule.changed ).length ) { isChanged = true; return false; } // Parse elements inside inner col. $thisColumnInner.find( '.fusion_module_block' ).each( function() { var thisModule = $( 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; } ); if ( 0 < _.keys( module.changed ).length ) { isChanged = true; return false; } } ); } ); return isChanged; }, checkGlobalParents: function( parentCID ) { var $mainContainer = $( '#fusion_builder_main_container' ), thisView; module = FusionPageBuilderElements.find( function( model ) { // jshint ignore:line return model.get( 'cid' ) === parentCID; } ); if ( 'undefined' === typeof module ) { return; } if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.attributes.params.fusion_global && 1 < $mainContainer.find( '[fusion-global-layout="' + module.attributes.params.fusion_global + '"]' ).length ) { // Get element view. thisView = FusionPageBuilderViewManager.getView( module.get( 'cid' ) ); if ( 'undefined' !== typeof thisView ) { // Update global layout. FusionPageBuilderApp.updateGlobalLayouts( thisView.$el, module, module.attributes.params.fusion_global ); } } if ( 'undefined' !== typeof module.attributes.params && 'undefined' !== typeof module.get( 'parent' ) ) { FusionPageBuilderApp.checkGlobalParents( module.get( 'parent' ) ); } }, updateGlobalLayouts: function( html, element, layoutID ) { var $thisContainer = $( html ), shortcode = '', columnCID, columnView, innerRowCID, innerRowView; if ( $( html ).hasClass( 'fusion_builder_column_element' ) && ! $( html ).hasClass( 'fusion_builder_row_inner' ) ) { shortcode += FusionPageBuilderApp.generateElementShortcode( $( html ), false ); } else if ( $( html ).hasClass( 'fusion_builder_row_inner' ) ) { innerRowCID = $thisContainer.data( 'cid' ); innerRowView = FusionPageBuilderViewManager.getView( innerRowCID ); shortcode += innerRowView.getInnerRowContent( $thisContainer ); } else if ( $( html ).hasClass( 'fusion-builder-column' ) ) { columnCID = $( html ).data( 'cid' ); columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent( $( html ) ); } else if ( $( html ).hasClass( 'fusion_builder_container' ) ) { shortcode += FusionPageBuilderApp.generateElementShortcode( $( html ), true ); $thisContainer.find( '.fusion_builder_row' ).each( function() { var $thisRow = $( this ); shortcode += '[fusion_builder_row]'; $thisRow.find( '.fusion-builder-column-outer' ).each( function() { var $thisColumn = $( this ), columnCID = $thisColumn.data( 'cid' ), columnView = FusionPageBuilderViewManager.getView( columnCID ); shortcode += columnView.getColumnContent( $thisColumn ); } ); shortcode += '[/fusion_builder_row]'; } ); shortcode += '[/fusion_builder_container]'; } // Update layout in DB. $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, dataType: 'json', data: { action: 'fusion_builder_update_layout', fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce, fusion_layout_id: layoutID, fusion_layout_content: shortcode }, complete: function() { // Do Stuff. } } ); }, saveHistoryState: function() { if ( true === this.newLayoutLoaded ) { fusionHistoryManager.clearEditor(); this.newLayoutLoaded = false; } fusionHistoryManager.captureEditor(); fusionHistoryManager.turnOffTracking(); }, generateElementShortcode: function( $element, openTagOnly, generator ) { var attributes = '', content = '', element, $thisElement, elementCID, elementType, elementSettings = '', shortcode, ignoredAtts, optionDependency, optionDependencyValue, key, setting, settingName, settingValue, param, keyName, optionValue, ignored, paramDependency, paramDependencyElement, paramDependencyValue, 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' ); // Get model by cid element = FusionPageBuilderElements.find( function( model ) { return model.get( 'cid' ) === elementCID; } ); } elementView = FusionPageBuilderViewManager.getView( elementCID ); if ( 'undefined' !== typeof elementView && 'function' === typeof this.beforeGenerateShortcode ) { this.beforeGenerateShortcode( elementCID ); } elementType = 'undefined' !== typeof element ? element.get( 'element_type' ) : 'undefined'; shortcode = ''; elementSettings = element.attributes; // 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 ( 'undefined' !== typeof elementSettings.params ) { settingValue = 'undefined' !== typeof element.get( 'params' ) ? element.get( 'params' ) : ''; // 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 ) { 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 < $.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 = ''; } if ( ( 'on' === fusionBuilderConfig.removeEmptyAttributes && '' !== optionValue ) || 'off' === fusionBuilderConfig.removeEmptyAttributes ) { attributes += ' ' + param + '="' + optionValue + '"'; } } } } } shortcode = '[' + elementType + attributes; if ( '' === content && 'fusion_tab' !== elementType && 'fusion_text' !== elementType && 'fusion_code' !== elementType && ( 'undefined' !== typeof elementSettings.type && 'element' === elementSettings.type ) ) { openTagOnly = true; shortcode += ' /]'; } else { shortcode += ']'; } if ( ! openTagOnly ) { shortcode += content + '[/' + elementType + ']'; } if ( 'object' !== typeof this.simplifiedMap ) { this.simplifiedMap = []; } this.simplifiedMap.push( { shortcode: shortcode, params: settingValue, type: elementType } ); return shortcode; }, 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; }, toggleCodeFields: function( event ) { event.preventDefault(); jQuery( '.awb-po-code-fields' ).slideToggle(); jQuery( '.fusion-custom-css' ).slideUp(); }, codeFields: function() { console.log( "here0", jQuery( '.awb-po-code-field .awb-code' ) ); jQuery( '.awb-po-code-field textarea' ).on( 'change keyup paste', function() { console.log("here", jQuery( '#pyre_tab_code_fields' ).find( '#pyre_' + jQuery( this ).attr( 'id' ) ) ); jQuery( '#pyre_tab_code_fields' ).find( '#pyre_' + jQuery( this ).attr( 'id' ) ).val( jQuery( this ).val() ); } ); }, customCSS: function( event ) { if ( event ) { event.preventDefault(); } jQuery( '.fusion-custom-css' ).slideToggle(); jQuery( '.awb-po-code-fields' ).slideUp(); }, toggleAllContainers: function( event ) { var toggleButton, containerCID, that = this; if ( event ) { event.preventDefault(); } toggleButton = $( '.fusion-builder-layout-buttons-toggle-containers' ).find( 'span' ); if ( toggleButton.hasClass( 'dashicons-arrow-up' ) ) { toggleButton.removeClass( 'dashicons-arrow-up' ).addClass( 'dashicons-arrow-down' ); jQuery( '.fusion_builder_container' ).each( function() { var containerModel; containerCID = jQuery( this ).find( '.fusion-builder-data-cid' ).data( 'cid' ); containerModel = that.collection.find( function( model ) { return model.get( 'cid' ) === containerCID; } ); containerModel.attributes.params.admin_toggled = 'yes'; jQuery( this ).addClass( 'fusion-builder-section-folded' ); jQuery( this ).find( '.fusion-builder-toggle > span' ).removeClass( 'dashicons-arrow-up' ).addClass( 'dashicons-arrow-down' ); } ); } else { toggleButton.addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' ); jQuery( '.fusion_builder_container' ).each( function() { var containerModel; containerCID = jQuery( this ).find( '.fusion-builder-data-cid' ).data( 'cid' ); containerModel = that.collection.find( function( model ) { return model.get( 'cid' ) === containerCID; } ); containerModel.attributes.params.admin_toggled = 'no'; jQuery( this ).removeClass( 'fusion-builder-section-folded' ); jQuery( this ).find( '.fusion-builder-toggle > span' ).addClass( 'dashicons-arrow-up' ).removeClass( 'dashicons-arrow-down' ); } ); } FusionPageBuilderEvents.trigger( 'fusion-element-edited' ); }, showSavedElements: function( elementType, container ) { var data = jQuery( '#fusion-builder-layouts-' + elementType ).find( '.fusion-page-layouts' ).clone(), 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">' + data.html() + '</div>' ); }, rangeOptionPreview: function( view ) { view.find( '.fusion-range-option' ).each( function() { $( this ).next().html( $( this ).val() ); $( this ).on( 'change mousemove', function() { $( this ).next().html( $( this ).val() ); } ); } ); }, addClassToElement: function( builderElement, className, layoutID, cid ) { var tooltip = fusionBuilderText.global_element; builderElement.addClass( className ); builderElement.attr( 'fusion-global-layout', layoutID ); if ( 'fusion-global-column' === className ) { tooltip = fusionBuilderText.global_column; } else if ( 'fusion-global-container' === className ) { tooltip = fusionBuilderText.global_container; } // If container add to utility toolbar area. if ( builderElement.find( '.fusion-builder-container-utility-toolbar' ).length ) { builderElement.find( '.fusion-builder-container-utility-toolbar' ).append( '<div class="fusion-builder-global-tooltip" data-cid="' + cid + '"><span>' + tooltip + '</span></div>' ); } else { builderElement.append( '<div class="fusion-builder-global-tooltip" data-cid="' + cid + '"><span>' + tooltip + '</span></div>' ); } }, calculateTableData: function( params, view ) { var tableDOM, tr, rowsOld, thTdOld, tdOld, columnsOld; if ( 'undefined' === typeof params.element_content || '' === params.element_content ) { return params; } tableDOM = jQuery.parseHTML( params.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 ); params.fusion_table_columns = columnsOld; params.fusion_table_rows = rowsOld; return params; }, checkOptionDependency: function( view, thisEl, parentValues, repeaterFields, parentEl ) { var $dependencies = {}, $dependencyIds = '', $parentDependencyIds = '', params = view.params, $currentVal, $currentId, $optionId, $passedArray, dividerType, upAndDown, centerOption, $targetElement, containerView, elementCid, containerParams; if ( 'undefined' !== typeof repeaterFields ) { params = repeaterFields; } function doesTestPass( current, comparison, operator ) { if ( '==' === operator && current == comparison ) { // jshint ignore:line return true; } if ( '!=' === operator && current != comparison ) { // jshint ignore:line return true; } if ( '>' === operator && current > comparison ) { return true; } if ( '<' === operator && current < comparison ) { return true; } if ( 'contains' === operator && -1 !== current.toString().indexOf( comparison ) ) { return true; } if ( ( 'not_contain' === operator || 'doesnt_contain' === operator ) && -1 === current.toString().indexOf( comparison ) ) { return true; } if ( 'is_empty' === operator ) { if ( ! current || '' === current || null === current ) { return true; } } if ( 'is_transparent' === operator ) { if ( 0 === jQuery.AWB_Color( current ).alpha() ) { return true; } } if ( 'is_not_transparent' === operator ) { if ( 0 !== jQuery.AWB_Color( current ).alpha() ) { return true; } } return false; } // Special check for section separator. if ( 'undefined' !== typeof view.shortcode && 'fusion_section_separator' === view.shortcode ) { dividerType = thisEl.find( '#divider_type' ); upAndDown = dividerType.parents( 'ul' ).find( 'li[data-option-id="divider_candy"]' ).find( '.fusion-option-divider_candy' ).find( '.ui-button[data-value="bottom,top"]' ); centerOption = dividerType.parents( '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(); } } ); } // Menu direction modes. if ( 'fusion_menu' === view.shortcode ) { const $tabs = thisEl.find( '.fusion-tabs' ); $tabs.find( 'input#direction' ).on( 'change', function() { if ( $tabs.find( 'input#submenu_mode' ).length && 'accordion' === $tabs.find( 'input#submenu_mode' ).val() ) { $tabs.find( '.fusion-option-submenu_mode a[data-value="dropdown"]' ).click(); } } ); } // Initial checks and create helper objects. jQuery.each( params, function( index, value ) { if ( 'undefined' !== typeof value.dependency ) { $optionId = index; $passedArray = []; // Check each dependency for this option jQuery.each( value.dependency, function( index, dependency ) { // Create IDs of fields to check for. if ( 'undefined' !== typeof repeaterFields && 'parent_' === dependency.element.substring( 0, 7 ) && 0 > $parentDependencyIds.indexOf( '#' + dependency.element.replace( 'parent_', '' ) ) ) { $parentDependencyIds += ', [data-option-id="' + dependency.element.replace( 'parent_', '' ) + '"]'; } else if ( 0 > $dependencyIds.indexOf( '[data-option-id="' + dependency.element + '"]' ) ) { $dependencyIds += ', [data-option-id="' + dependency.element + '"]'; } // If option has dependency add to check array. if ( 'undefined' === typeof $dependencies[ dependency.element ] ) { $dependencies[ dependency.element ] = [ { option: $optionId, or: value.or } ]; } else { $dependencies[ dependency.element ].push( { option: $optionId, or: value.or } ); } // Check a value on parent container. if ( 'fusion_builder_container' === dependency.element ) { $currentVal = 'legacy'; elementCid = thisEl.attr( 'data-cid' ); if ( elementCid ) { elementCid = FusionPageBuilderApp.$el.find( '[data-cid=' + elementCid + ']' ).closest( '.fusion-builder-section-content' ).attr( 'data-cid' ); if ( elementCid ) { containerView = FusionPageBuilderViewManager.getView( elementCid ); if ( 'object' === typeof containerView ) { containerParams = containerView.model.get( 'params' ); containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, containerParams ); $currentVal = containerParams[ ( 'undefined' !== typeof dependency.param ? dependency.param : 'type' ) ]; } } } // If parentValues is an object and this is a parent dependency, then we should take value from there. } else if ( 'parent_' === dependency.element.substring( 0, 7 ) ) { if ( 'undefined' !== typeof repeaterFields ) { $currentVal = thisEl.parents( '.fusion-builder-main-settings' ).find( '#' + dependency.element.replace( 'parent_', '' ) ).val(); } else if ( 'object' === typeof parentValues && parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ] ) { $currentVal = parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ]; } else { $currentVal = ''; } } else { $currentVal = thisEl.find( '[data-option-id="' + dependency.element + '"]' ).filter( function() { return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length; } ).find( '#' + dependency.element ).val(); // Use fake value if dynamic data is set. if ( '' === $currentVal && 'true' === thisEl.find( '#' + dependency.element ).closest( '.fusion-builder-option' ).attr( 'data-dynamic' ) ) { $currentVal = 'using-dynamic-value'; } // Check for current post type dependency. if ( '_post_type_edited' === dependency.element ) { $currentVal = jQuery( '#post_type' ).val(); } } $passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) ); } ); $targetElement = thisEl.find( '[name ="' + index + '"]' ).closest( '.fusion-builder-option' ); if ( 0 === $targetElement.length && 'element_content' !== index ) { $targetElement = thisEl.find( '[data-option-id="' + index + '"]' ); } // Check if it passes for regular "and" test. if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) { $targetElement.fadeIn( 300 ); // Check if it passes "or" test. } else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) { $targetElement.fadeIn( 300 ); // If it fails. } else { $targetElement.hide(); } } } ); // Listen for changes to options which other are dependent on. if ( $dependencyIds.length ) { thisEl.find( $dependencyIds.substring( 2 ) ).filter( function() { return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length; } ).on( 'change paste keyup', function() { $currentId = jQuery( this ).attr( 'data-option-id' ); // Loop through each option id that is dependent on this option. jQuery.each( $dependencies[ $currentId ], function( index, value ) { $passedArray = []; // Check each dependency for that id. jQuery.each( params[ value.option ].dependency, function( index, dependency ) { if ( 'fusion_builder_container' === dependency.element ) { $currentVal = 'legacy'; elementCid = thisEl.attr( 'data-cid' ); if ( elementCid ) { elementCid = FusionPageBuilderApp.$el.find( '[data-cid=' + elementCid + ']' ).closest( '.fusion-builder-section-content' ).attr( 'data-cid' ); if ( elementCid ) { containerView = FusionPageBuilderViewManager.getView( elementCid ); if ( 'object' === typeof containerView ) { containerParams = containerView.model.get( 'params' ); containerParams = jQuery.extend( true, {}, fusionAllElements.fusion_builder_container.defaults, containerParams ); $currentVal = containerParams[ ( 'undefined' !== typeof dependency.param ? dependency.param : 'type' ) ]; } } } // If parentValues is an object and this is a parent dependency, then we should take value from there. } else if ( 'parent_' === dependency.element.substring( 0, 7 ) ) { if ( 'object' === typeof parentValues && parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ] ) { $currentVal = parentValues[ dependency.element.replace( dependency.element.substring( 0, 7 ), '' ) ]; } else { $currentVal = ''; } } else { $currentVal = thisEl.find( '[data-option-id="' + dependency.element + '"]' ).filter( function() { return 0 === jQuery( this ).closest( '.dynamic-param-fields' ).length; } ).find( '#' + dependency.element ).val(); } // Use fake value if dynamic data is set. if ( '' === $currentVal && 'true' === jQuery( '#' + $currentId ).closest( '.fusion-builder-option' ).attr( 'data-dynamic' ) ) { $currentVal = 'using-dynamic-value'; } $passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) ); } ); $targetElement = thisEl.find( '[data-option-id="' + value.option + '"]' ); // Check if it passes for regular "and" test. if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) { $targetElement.fadeIn( 300 ); // Check if it passes "or" test. } else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) { $targetElement.fadeIn( 300 ); // If it fails. } else { $targetElement.hide(); } } ); } ); } // Repeater element row, listen for changes to parent options. if ( 'undefined' !== typeof repeaterFields && 'undefined' !== typeof parentEl && $parentDependencyIds.length ) { parentEl.on( 'change paste keyup', $parentDependencyIds.substring( 2 ), function() { $currentId = jQuery( this ).attr( 'id' ); // Loop through each option id that is dependent on this option. jQuery.each( $dependencies[ 'parent_' + $currentId ], function( index, value ) { $passedArray = []; // Check each dependency for that id. jQuery.each( params[ value.option ].dependency, function( index, dependency ) { if ( 'parent_' === dependency.element.substring( 0, 7 ) ) { $currentVal = parentEl.find( '#' + dependency.element.replace( 'parent_', '' ) ).val(); } else { $currentVal = parentEl.find( '#' + dependency.element ).val(); } $passedArray.push( doesTestPass( $currentVal, dependency.value, dependency.operator ) ); } ); $targetElement = thisEl.find( '#' + value.option ).parents( '.fusion-builder-option' ).first(); // Check if it passes for regular "and" test. if ( -1 === $.inArray( false, $passedArray ) && 'undefined' === typeof value.or ) { $targetElement.fadeIn( 300 ); // Check if it passes "or" test. } else if ( -1 !== $.inArray( true, $passedArray ) && 'undefined' !== typeof value.or ) { $targetElement.fadeIn( 300 ); // If it fails. } else { $targetElement.hide(); } } ); } ); } }, 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 || 'undefined' === typeof view.model.get ) { 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 || 'undefined' === typeof view.model.get ) { return false; } // View found and is container, return that. if ( 'fusion_builder_column' === view.model.get( 'element_type' ) || 'fusion_builder_column_inner' === view.model.get( 'element_type' ) ) { return view; } // Not container 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; }, isBlockLayoutColumn: function( view ) { var params; if ( ! view || 'undefined' === typeof view.model.get ) { return false; } params = view.model.get( 'params' ); return params && 'block' === params.content_layout; }, isFlex: function( view ) { var params, legacySupport = 'undefined' === typeof fusionBuilderConfig.container_legacy_support ? false : fusionBuilderConfig.container_legacy_support; if ( false === legacySupport || 0 === legacySupport || '0' === legacySupport ) { return true; } if ( ! view || 'undefined' === typeof view.model.get ) { return false; } params = view.model.get( 'params' ); return params && 'flex' === params.type; }, isString( s ) { if ( 'string' === typeof s || s instanceof String ) { return true; } return false; } } ); // Instantiate Builder App FusionPageBuilderApp = new FusionPageBuilder.AppView( { // jshint ignore:line model: FusionPageBuilder.Element, collection: FusionPageBuilderElements } ); // Stores 'active' value in fusion_builder_status meta key if builder is activa $useBuilderMetaField = $( '#fusion_use_builder' ); // Avada Builder Toggle Button $toggleBuilderButton = $( '#fusion_toggle_builder' ); // Avada Builder div $builder = $( '#fusion_builder_layout' ); // Main wrap for the main editor $mainEditorWrapper = $( '#fusion_main_editor_wrap' ); // Show builder div if it's activated if ( $toggleBuilderButton.hasClass( 'fusion_builder_is_active' ) ) { $builder.show(); FusionPageBuilderApp.builderActive = true; // Sticky header fusionBuilderEnableStickyHeader(); jQuery( 'body' ).addClass( 'fusion-builder-enabled' ); } // Builder toggle button event $toggleBuilderButton.click( function( event ) { var isBuilderUsed; if ( event ) { event.preventDefault(); } isBuilderUsed = $( this ).hasClass( 'fusion_builder_is_active' ); if ( isBuilderUsed ) { fusionBuilderDeactivate( $( this ) ); FusionPageBuilderApp.builderActive = false; jQuery( 'body' ).removeClass( 'fusion-builder-enabled' ); jQuery( 'body' ).trigger( 'scroll' ); } else { fusionBuilderActivate( $( this ) ); FusionPageBuilderApp.builderActive = true; jQuery( 'body' ).addClass( 'fusion-builder-enabled' ); } } ); // Front End Editor button. jQuery( '#fusion_toggle_front_end' ).on( 'click', function( event ) { var $wpTitle = jQuery( '#title' ), $link = jQuery( this ); event.preventDefault(); if ( window.confirm( fusionBuilderText.front_end_redirect_confirm ) ) { if ( ! $wpTitle.val() ) { $wpTitle.val( 'FB #' + jQuery( '#post_ID' ).val() ); } if ( wp.autosave ) { wp.autosave.server.triggerSave(); } // Autosave callback. jQuery( document ).on( 'heartbeat-tick.autosave', function() { // Changes saved, so need for "are you sure you want to navigate away" alert. jQuery( window ).off( 'beforeunload.edit-post' ); $.ajax( { type: 'POST', url: fusionBuilderConfig.ajaxurl, data: { action: 'update_page_template_post_meta', fusion_load_nonce: fusionBuilderConfig.fusion_load_nonce, post_id: jQuery( '#post_ID' ).val() } } ) .done( function() { // Redirect user. window.location = $link.attr( 'href' ); } ); } ); } } ); // Sticky builder header function fusionBuilderEnableStickyHeader() { var builderHeader = document.getElementById( 'fusion_builder_controls' ), adminbarHeight = jQuery( '#wpadminbar' ).length ? jQuery( '#wpadminbar' ).height() : 0; fusionBuilderStickyHeader( builderHeader, adminbarHeight ); } function fusionBuilderActivate( toggle ) { fusionBuilderReset(); FusionPageBuilderApp.initialBuilderLayout(); $useBuilderMetaField.val( 'active' ); $builder.show(); toggle.children( 'span' ).text( toggle.data( 'editor' ) ); toggle.toggleClass( 'fusion_builder_is_active' ).toggleClass( 'button-primary' ).toggleClass( 'fusiona-FB_logo_black' ); $mainEditorWrapper.toggleClass( 'fusion_builder_hidden' ); // Sticky header fusionBuilderEnableStickyHeader(); } function fusionBuilderReset() { // Clear all models and views FusionPageBuilderElements.reset(); FusionPageBuilderViewManager.set( 'elementCount', 0 ); FusionPageBuilderViewManager.set( 'views', {} ); // Clear layout $( '#fusion_builder_container' ).html( '' ); FusionPageBuilderApp.shortcodeGenerator = false; } function fusionBuilderDeactivate() { var $body, pagePosition; fusionBuilderReset(); $body = $( 'body' ); pagePosition = 0; window.wpActiveEditor = 'content'; $useBuilderMetaField.val( 'off' ); $builder.hide(); $toggleBuilderButton.children( 'span' ).text( $toggleBuilderButton.data( 'builder' ) ); $toggleBuilderButton.toggleClass( 'fusion_builder_is_active' ).toggleClass( 'button-primary' ).toggleClass( 'fusiona-FB_logo_black' ); $mainEditorWrapper.toggleClass( 'fusion_builder_hidden' ); FusionPageBuilderApp.$el.find( '.fusion_builder_container' ).remove(); pagePosition = $body.scrollTop(); jQuery( 'html, body' ).scrollTop( pagePosition + 1 ); } // Remove preview image. $container = $( 'body' ); $container.on( 'click', '.upload-image-remove', function( event ) { var $field, $preview, $upload, imageIDField; if ( event ) { event.preventDefault(); } $field = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-field' ); $preview = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-preview' ); $upload = $( this ).parents( '.fusion-builder-option-container' ).find( '.fusion-builder-upload-button' ); $field.val( '' ).trigger( 'change' ); $upload.val( 'Upload Image' ); $preview.remove(); FusionPageBuilderEvents.trigger( 'awb-image-upload-url-' + $upload.data( 'param' ), '' ); // Remove image ID if image is removed. imageIDField = $upload.closest( '.fusion-builder-module-settings' ).find( '#' + $upload.data( 'param' ) + '_id' ); if ( 'element_content' === $upload.data( 'param' ) ) { imageIDField = $upload.parents( '.fusion-builder-option' ).next().find( '#image_id' ); } if ( imageIDField.length ) { imageIDField.val( '' ); } jQuery( this ).remove(); } ); // History steps. $( 'body' ).on( 'click', '.fusion-builder-history-list li', function( event ) { var step; if ( event ) { event.preventDefault(); } step = $( event.currentTarget ).data( 'state-id' ); fusionHistoryManager.historyStep( step ); } ); $( 'body' ).on( 'click', '.fusion-studio-preview-active .awb-import-studio-item-in-preview', function( event ) { var $wrapper = jQuery( event.currentTarget ).closest( '.studio-wrapper ' ), dataID = $wrapper.data( 'layout-id' ); event.preventDefault(); jQuery( '.fusion-studio-preview-active .fusion-studio-preview-back' ).trigger( 'click' ); jQuery( '.fusion-page-layout[data-layout-id="' + dataID + '"]' ).find( '.awb-import-studio-item' ).trigger( 'click' ); } ); // Studio preview. $( 'body' ).on( 'click', '.studio-wrapper .fusion-page-layout:not(.awb-demo-pages-layout) img', function( event ) { var $item = jQuery( event.currentTarget ).closest( '.fusion-page-layout' ), url = $item.data( 'url' ), $wrapper = $( event.currentTarget ).closest( '.studio-wrapper' ); $wrapper.addClass( 'loading fusion-studio-preview-active' ); $wrapper.find( '.awb-import-options' ).addClass( 'open' ); $wrapper.find( '.fusion-loader' ).show(); $wrapper.append( '<iframe class="awb-studio-preview-frame" src="' + url + '" frameBorder="0" scrolling="auto" onload="FusionPageBuilderApp.studioPreviewLoaded();" allowfullscreen=""></iframe>' ); $wrapper.data( 'layout-id', $item.data( 'layout-id' ) ); } ); // Remove studio preview. $( 'body' ).on( 'click', '.fusion-studio-preview-back', function( event ) { var $wrapper = $( event.currentTarget ).closest( '.studio-wrapper' ); event.preventDefault(); $wrapper.removeClass( 'fusion-studio-preview-active' ); $wrapper.find( '.awb-import-options' ).removeClass( 'open' ); $wrapper.find( '.awb-studio-preview-frame' ).remove(); } ); // Element option tabs. $( 'body' ).on( 'click', '.fusion-tabs-menu a', function( event ) { var tab, view, viewWeb; if ( event ) { event.preventDefault(); } FusionPageBuilderEvents.trigger( 'fusion-switch-element-option-tabs' ); FusionPageBuilderEvents.trigger( 'fusion-switch-element-option-tabs' ); $( this ).parent().addClass( 'current' ).removeClass( 'inactive' ); $( this ).parent().siblings().removeClass( 'current' ).addClass( 'inactive' ); tab = $( this ).attr( 'href' ); $( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-tab-content' ).not( tab ).css( 'display', 'none' ); $( '.fusion-builder-layouts-tab' ).hide(); if ( $( this ).parents( '.fusion-builder-modal-container' ).length ) { $( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-tab-content' + tab ).fadeIn( 'fast' ); } else { $( tab ).fadeIn( 'fast' ); } $( this ).parents( '.fusion-builder-modal-container' ).find( '.fusion-builder-main-settings' ).scrollTop( 0 ); if ( jQuery( '.fusion-builder-modal-top-container' ).find( '.fusion-elements-filter' ).length ) { setTimeout( function() { jQuery( '.fusion-builder-modal-top-container' ).find( '.fusion-elements-filter' ).focus(); }, 50 ); } // Trigger ajax for studio. if ( '#fusion-builder-fusion_template-studio' === tab ) { view = new FusionPageBuilder.BaseLibraryView(); view.loadStudio( 'fusion_template' ); } // Trigger ajax for website. if ( '#fusion-builder-layouts-demos' === tab ) { viewWeb = new FusionPageBuilder.BaseLibraryView(); viewWeb.loadWebsite(); } } ); // Viewport options. $( 'body' ).on( 'click', '.fusion-viewport-indicator a', function( event ) { var $portLink = jQuery( event.target ), port = $portLink.closest( 'li' ).data( 'viewport' ); if ( event ) { event.preventDefault(); } // EOs. $portLink.closest( '.fusion-builder-modal-settings-container' ).find( '.fusion-builder-main-settings' ).removeClass( 'fusion-large fusion-medium fusion-small' ).addClass( port ); $portLink.closest( 'ul' ).find( 'li' ).removeClass( 'active' ); $portLink.closest( 'li' ).addClass( 'active' ); // POs. $portLink.closest( '.postbox' ).removeClass( 'fusion-large fusion-medium fusion-small' ).addClass( port ); $portLink.closest( '.postbox' ).find( 'ul.fusion-viewport-indicator li' ).removeClass( 'active' ); $portLink.closest( '.postbox' ).find( 'ul.fusion-viewport-indicator' ).find( 'li[data-viewport="' + port + '"]' ).addClass( 'active' ); } ); // Responsive setup on option change. $( 'body' ).on( 'click', '.fusion_builder_module_settings[data-type="fusion_builder_container"] li.fusion-builder-option[data-option-id="type"] a', function( event ) { var $option = jQuery( event.target ), $container = jQuery( event.target ).closest( '.fusion_builder_module_settings' ); 'flex' === $option.data( 'value' ) ? $container.addClass( 'has-flex' ) : $container.removeClass( 'has-flex' ); } ); // Close modal on overlick click. jQuery( '.fusion_builder_modal_overlay' ).on( 'click', function() { FusionPageBuilderEvents.trigger( 'fusion-remove-modal-view' ); FusionPageBuilderEvents.trigger( 'fusion-close-modal' ); } ); // Close nested modal on overlick click. jQuery( '.fusion_builder_modal_inner_row_overlay' ).on( 'click', function() { FusionPageBuilderEvents.trigger( 'fusion-close-inner-modal' ); FusionPageBuilderEvents.trigger( 'fusion-hide-library' ); } ); // Demo select. $selectedDemo = jQuery( '.fusion-builder-demo-select' ).val(); jQuery( '#fusion-builder-layouts-demos .demo-' + $selectedDemo ).show(); jQuery( '.fusion-builder-demo-select' ).on( 'change', function() { $selectedDemo = jQuery( '.fusion-builder-demo-select' ).val(); jQuery( '#fusion-builder-layouts-demos .fusion-page-layouts' ).hide(); jQuery( '#fusion-builder-demo-url-invalid' ).hide(); jQuery( '.fusion-builder-demo-page-link' ).val( '' ); jQuery( '#fusion-builder-layouts-demos .demo-' + $selectedDemo ).show(); } ); jQuery( '.fusion-builder-demo-page-link' ).on( 'input', function() { var demoPageLink = jQuery( this ).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' ).hide(); jQuery( '#fusion-builder-demo-url-invalid' ).hide(); if ( _.isEmpty( demoPageLink ) ) { demoSelectorVal = jQuery( '.fusion-builder-demo-select' ).val(); jQuery( '#fusion-builder-layouts-demos .demo-' + demoSelectorVal ).show(); } else if ( ! demoPage.length ) { jQuery( '#fusion-builder-demo-url-invalid' ).show(); } else { parentDemo.show(); parentDemo.find( '.fusion-page-layout' ).hide(); demoPage.show(); } } ); // Iconpicker select/deselect handler. jQuery( 'body' ).on( 'click', '.icon_select_container .icon_preview', function( e ) { var fontName, subset = 'fas', $i = jQuery( this ).find( 'i' ), value = '', $containerParent = jQuery( this ).closest( '.fusion-iconpicker' ); e.preventDefault(); fontName = 'fa-' + jQuery( this ).find( 'i' ).attr( 'data-name' ); if ( ! $i.hasClass( 'fas' ) && ! $i.hasClass( 'fab' ) && ! $i.hasClass( 'far' ) && ! $i.hasClass( 'fal' ) ) { // Custom icon set, so we need to add prefix. value = 'fusion-prefix-' + jQuery( this ).find( 'i' ).attr( 'class' ); } else if ( $i.hasClass( 'fab' ) ) { subset = 'fab'; } else if ( $i.hasClass( 'far' ) ) { subset = 'far'; } else if ( $i.hasClass( 'fal' ) ) { subset = 'fal'; } // FA icon. if ( '' === value ) { value = fontName + ' ' + subset; } if ( $( this ).hasClass( 'selected-element' ) ) { $containerParent.find( '.selected-element' ).removeClass( 'selected-element' ); $containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', '' ).trigger( 'change' ); } else { $containerParent.find( '.selected-element' ).removeClass( 'selected-element' ); $( this ).find( 'i' ).parent().addClass( 'selected-element' ); $containerParent.find( '.fusion-iconpicker-input' ).attr( 'value', value ).trigger( 'change' ); } } ); // Copy icon name to clipboard. jQuery( 'body' ).on( 'contextmenu', '.icon_select_container .icon_preview', function( event ) { const iconName = jQuery( this ).children( 'i' ).attr( 'class' ); if ( 'clipboard' in navigator ) { navigator.clipboard.writeText( iconName ); } else { const textArea = document.createElement('textarea'); textArea.value = iconName; textArea.style.opacity = 0; document.body.appendChild( textArea ); textArea.focus(); textArea.select(); const success = document.execCommand( 'copy' ); document.body.removeChild( textArea ); } jQuery( this ).fadeOut( 100 ); jQuery( this ).fadeIn( 100 ); return false; } ); // Open shortcode generator. $( document ).on( 'click', '#qt_content_fusion_shortcodes_text_mode, #qt_excerpt_fusion_shortcodes_text_mode, #qt_element_content_fusion_shortcodes_text_mode', function() { openShortcodeGenerator( $( this ) ); } ); $( 'input[type="radio"][name="screen_columns"]' ).on( 'click', function() { $( window ).trigger( 'resize' ); } ); $( '.notice-dismiss, #show-settings-link' ).on( 'click', function() { setTimeout( function() { $( window ).trigger( 'resize' ); }, 750 ); } ); // Save layout template on return key. $( '#new_template_name' ).on( 'keydown', function( e ) { if ( 13 === e.keyCode || '13' === e.keyCode ) { e.preventDefault(); e.stopPropagation(); FusionPageBuilderEvents.trigger( 'fusion-save-layout' ); return false; } return true; } ); // Save elements on return key. $( 'body' ).on( 'keydown', '#fusion-builder-save-element-input', function( e ) { if ( 13 === e.keyCode || '13' === e.keyCode ) { e.preventDefault(); e.stopPropagation(); $( '.fusion-builder-element-button-save' ).trigger( 'click' ); return false; } return true; } ); // Handle the sticky publish buttons. jQuery( '.fusion-preview' ).click( function( e ) { e.preventDefault(); jQuery( '#post-preview' ).trigger( 'click' ); } ); jQuery( '.fusion-save-draft' ).click( function( e ) { e.preventDefault(); jQuery( '#save-post' ).trigger( 'click' ); } ); jQuery( '.fusion-update' ).click( function( e ) { e.preventDefault(); jQuery( '#publish' ).trigger( 'click' ); } ); function fusionInitIconPicker() { var icons = fusionBuilderConfig.fontawesomeicons, output = '<div class="fusion-icons-rendered" style="position:relative; height:0px; overflow:hidden;">', outputSets = { fas: '', fab: '', far: '', fal: '' }, iconSubsets = { fas: 'Solid', far: 'Regular', fal: 'Light', fab: 'Brands' }, outputNav = '<div class="fusion-icon-picker-nav-rendered" style="height:0px; overflow:hidden;">', isSearchDefined = 'undefined' !== typeof fusionIconSearch && Array.isArray( fusionIconSearch ); // Iterate through all FA icons and divide them into sets (one icon can belong to multiple sets). _.each( icons, function( icon, key ) { _.each( icon[ 1 ], function( iconSubset ) { if ( -1 !== fusionBuilderConfig.fontawesomesubsets.indexOf( iconSubset ) ) { outputSets[ iconSubset ] += '<span class="icon_preview ' + key + '" title="' + key + ' - ' + iconSubsets[ iconSubset ] + '"><i class="' + icon[ 0 ] + ' ' + iconSubset + '" data-name="' + icon[ 0 ].substr( 3 ) + '" aria-hidden="true"></i></span>'; } } ); } ); // Add FA sets to output. _.each( iconSubsets, function( label, key ) { if ( -1 !== fusionBuilderConfig.fontawesomesubsets.indexOf( key ) ) { outputNav += '<a href="#fusion-' + key + '">' + label + '</a>'; output += '<div id="fusion-' + key + '" class="fusion-icon-set">' + outputSets[ key ] + '</div>'; } } ); // WIP: Add custom icons. icons = fusionBuilderConfig.customIcons; _.each( icons, function( iconSet, IconSetKey ) { outputNav += '<a href="#' + IconSetKey + '">' + iconSet.name + '</a>'; output += '<div id="' + IconSetKey + '" class="fusion-icon-set fusion-custom-icon-set">'; _.each( iconSet.icons, function( icon ) { if ( isSearchDefined ) { fusionIconSearch.push( { name: icon } ); } output += '<span class="icon_preview ' + icon + '" title="' + iconSet.css_prefix + icon + '"><i class="' + iconSet.css_prefix + icon + '" data-name="' + icon + '" aria-hidden="true"></i></span>'; } ); output += '</div>'; } ); outputNav += '</div>'; output += '</div>'; $( 'body' ).append( output + outputNav ).trigger( 'awb-icon-picker-init' ); } // Init icon picker on page load. fusionInitIconPicker(); /** * Reinit icon picker. * * @since 2.0 * @return {void} */ FusionPageBuilder.reInitIconPicker = function() { jQuery( '.fusion-icons-rendered' ).remove(); jQuery( '.fusion-icon-picker-nav-rendered' ).remove(); fusionInitIconPicker(); }; } ); }( jQuery ) );
Upload Files
Cancel
Upload
Create New
Cancel
Create
Change Permissions
Cancel
Save
Change Date
Cancel
Save
Rename Item
Cancel
Save
Confirm Delete
Are you sure you want to delete the selected items?
Cancel
Delete