File: /var/www/html/triad-infosec/wp-content/plugins/fusion-builder/js/app.js
/* 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 ) );