/* 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( /

\[/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( '

  • ' + $element.find( '.fusion-form-option-template' ).html() + '
  • ' ), $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( '
  • ' + $element.find( '.fusion-logic-template' ).html() + '
  • ' ), $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 += '