/*! elementor - v1.9.3 - 21-01-2018 */ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' + elementor.translate( 'import_template_dialog_message_attention' ), strings: { confirm: elementor.translate( 'yes' ), cancel: elementor.translate( 'no' ) } } ); }, getDialog: function() { if ( ! InsertTemplateHandler.dialog ) { InsertTemplateHandler.initDialog(); } return InsertTemplateHandler.dialog; } } ); module.exports = InsertTemplateHandler; },{}],9:[function(require,module,exports){ var TemplateLibraryTemplateModel = require( 'elementor-templates/models/template' ), TemplateLibraryCollection; TemplateLibraryCollection = Backbone.Collection.extend( { model: TemplateLibraryTemplateModel } ); module.exports = TemplateLibraryCollection; },{"elementor-templates/models/template":11}],10:[function(require,module,exports){ var TemplateLibraryLayoutView = require( 'elementor-templates/views/layout' ), TemplateLibraryCollection = require( 'elementor-templates/collections/templates' ), TemplateLibraryManager; TemplateLibraryManager = function() { var self = this, modal, deleteDialog, errorDialog, layout, config = {}, startIntent = {}, templateTypes = {}, filterTerms = {}, templatesCollection; var initLayout = function() { layout = new TemplateLibraryLayoutView(); }; var registerDefaultTemplateTypes = function() { var data = { saveDialog: { description: elementor.translate( 'save_your_template_description' ) }, ajaxParams: { success: function( data ) { self.getTemplatesCollection().add( data ); self.setTemplatesSource( 'local' ); }, error: function( data ) { self.showErrorDialog( data ); } } }; _.each( [ 'page', 'section' ], function( type ) { var safeData = jQuery.extend( true, {}, data, { saveDialog: { title: elementor.translate( 'save_your_template', [ elementor.translate( type ) ] ) } } ); self.registerTemplateType( type, safeData ); } ); }; var registerDefaultFilterTerms = function() { filterTerms = { text: { callback: function( value ) { value = value.toLowerCase(); if ( this.get( 'title' ).toLowerCase().indexOf( value ) >= 0 ) { return true; } return _.any( this.get( 'tags' ), function( tag ) { return tag.toLowerCase().indexOf( value ) >= 0; } ); } }, favorite: {} }; jQuery.each( startIntent.filters, function( filterName ) { if ( filterTerms[ filterName ] ) { jQuery.extend( filterTerms[ filterName ], this ); } else { filterTerms[ filterName ] = this; } } ); }; this.init = function() { registerDefaultTemplateTypes(); elementor.addBackgroundClickListener( 'libraryToggleMore', { element: '.elementor-template-library-template-more' } ); }; this.getTemplateTypes = function( type ) { if ( type ) { return templateTypes[ type ]; } return templateTypes; }; this.registerTemplateType = function( type, data ) { templateTypes[ type ] = data; }; this.deleteTemplate = function( templateModel, options ) { var dialog = self.getDeleteDialog(); dialog.onConfirm = function() { if ( options.onConfirm ) { options.onConfirm(); } elementor.ajax.send( 'delete_template', { data: { source: templateModel.get( 'source' ), template_id: templateModel.get( 'template_id' ) }, success: function( response ) { templatesCollection.remove( templateModel, { silent: true } ); if ( options.onSuccess ) { options.onSuccess( response ); } } } ); }; dialog.show(); }; this.importTemplate = function( templateModel, options ) { options = options || {}; layout.showLoadingView(); self.requestTemplateContent( templateModel.get( 'source' ), templateModel.get( 'template_id' ), { data: { page_settings: options.withPageSettings }, success: function( data ) { self.closeModal(); elementor.channels.data.trigger( 'template:before:insert', templateModel ); elementor.sections.currentView.addChildModel( data.content, startIntent.importOptions || {} ); elementor.channels.data.trigger( 'template:after:insert', templateModel ); if ( options.withPageSettings ) { elementor.settings.page.model.set( data.page_settings ); } }, error: function( data ) { self.showErrorDialog( data ); } } ); }; this.saveTemplate = function( type, data ) { var templateType = templateTypes[ type ]; _.extend( data, { source: 'local', type: type } ); if ( templateType.prepareSavedData ) { data = templateType.prepareSavedData( data ); } data.content = JSON.stringify( data.content ); var ajaxParams = { data: data }; if ( templateType.ajaxParams ) { _.extend( ajaxParams, templateType.ajaxParams ); } elementor.ajax.send( 'save_template', ajaxParams ); }; this.requestTemplateContent = function( source, id, ajaxOptions ) { var options = { data: { source: source, edit_mode: true, display: true, template_id: id } }; if ( ajaxOptions ) { jQuery.extend( true, options, ajaxOptions ); } return elementor.ajax.send( 'get_template_data', options ); }; this.markAsFavorite = function( templateModel, favorite ) { var options = { data: { source: templateModel.get( 'source' ), template_id: templateModel.get( 'template_id' ), favorite: favorite } }; return elementor.ajax.send( 'mark_template_as_favorite', options ); }; this.getDeleteDialog = function() { if ( ! deleteDialog ) { deleteDialog = elementor.dialogsManager.createWidget( 'confirm', { id: 'elementor-template-library-delete-dialog', headerMessage: elementor.translate( 'delete_template' ), message: elementor.translate( 'delete_template_confirm' ), strings: { confirm: elementor.translate( 'delete' ) } } ); } return deleteDialog; }; this.getErrorDialog = function() { if ( ! errorDialog ) { errorDialog = elementor.dialogsManager.createWidget( 'alert', { id: 'elementor-template-library-error-dialog', headerMessage: elementor.translate( 'an_error_occurred' ) } ); } return errorDialog; }; this.getModal = function() { if ( ! modal ) { modal = elementor.dialogsManager.createWidget( 'lightbox', { id: 'elementor-template-library-modal', closeButton: false } ); } return modal; }; this.getLayout = function() { return layout; }; this.getTemplatesCollection = function() { return templatesCollection; }; this.getConfig = function( item ) { if ( item ) { return config[ item ]; } return config; }; this.requestLibraryData = function( callback, forceUpdate, forceSync ) { if ( templatesCollection && ! forceUpdate ) { if ( callback ) { callback(); } return; } var options = { data: {}, success: function( data ) { templatesCollection = new TemplateLibraryCollection( data.templates ); config = data.config; if ( callback ) { callback(); } } }; if ( forceSync ) { options.data.sync = true; } elementor.ajax.send( 'get_library_data', options ); }; this.startModal = function( customStartIntent ) { startIntent = customStartIntent || {}; registerDefaultFilterTerms(); self.getModal().show(); self.setTemplatesSource( 'remote', true ); if ( ! layout ) { initLayout(); } layout.showLoadingView(); self.requestLibraryData( function() { if ( startIntent.onReady ) { startIntent.onReady(); } } ); }; this.closeModal = function() { self.getModal().hide(); }; this.getFilter = function( name ) { return elementor.channels.templates.request( 'filter:' + name ); }; this.setFilter = function( name, value, silent ) { elementor.channels.templates.reply( 'filter:' + name, value ); if ( ! silent ) { elementor.channels.templates.trigger( 'filter:change' ); } }; this.getFilterTerms = function( termName ) { if ( termName ) { return filterTerms[ termName ]; } return filterTerms; }; this.setTemplatesSource = function( source, silent ) { elementor.channels.templates.stopReplying(); self.setFilter( 'source', source ); if ( ! silent ) { self.showTemplates(); } }; this.showTemplates = function() { var activeSource = self.getFilter( 'source' ); var templatesToShow = templatesCollection.filter( function( model ) { if ( activeSource !== model.get( 'source' ) ) { return false; } var typeInfo = templateTypes[ model.get( 'type' ) ]; return ! typeInfo || false !== typeInfo.showInLibrary; } ); layout.showTemplatesView( new TemplateLibraryCollection( templatesToShow ) ); }; this.showTemplatesModal = function() { self.startModal( { onReady: self.showTemplates } ); }; this.showErrorDialog = function( errorMessage ) { if ( 'object' === typeof errorMessage ) { var message = ''; _.each( errorMessage, function( error ) { message += '
' + error.message + '.
'; } ); errorMessage = message; } else if ( errorMessage ) { errorMessage += '.'; } else { errorMessage = '<The error message is empty>'; } self.getErrorDialog() .setMessage( elementor.translate( 'templates_request_error' ) + '
' + errorMessage + '
' ) .show(); }; }; module.exports = new TemplateLibraryManager(); },{"elementor-templates/collections/templates":9,"elementor-templates/views/layout":12}],11:[function(require,module,exports){ var TemplateLibraryTemplateModel; TemplateLibraryTemplateModel = Backbone.Model.extend( { defaults: { template_id: 0, title: '', source: '', type: '', author: '', thumbnail: '', url: '', export_link: '', tags: [] } } ); module.exports = TemplateLibraryTemplateModel; },{}],12:[function(require,module,exports){ var TemplateLibraryHeaderView = require( 'elementor-templates/views/parts/header' ), TemplateLibraryHeaderLogoView = require( 'elementor-templates/views/parts/header-parts/logo' ), TemplateLibraryHeaderActionsView = require( 'elementor-templates/views/parts/header-parts/actions' ), TemplateLibraryHeaderMenuView = require( 'elementor-templates/views/parts/header-parts/menu' ), TemplateLibraryHeaderPreviewView = require( 'elementor-templates/views/parts/header-parts/preview' ), TemplateLibraryHeaderBackView = require( 'elementor-templates/views/parts/header-parts/back' ), TemplateLibraryLoadingView = require( 'elementor-templates/views/parts/loading' ), TemplateLibraryCollectionView = require( 'elementor-templates/views/parts/templates' ), TemplateLibrarySaveTemplateView = require( 'elementor-templates/views/parts/save-template' ), TemplateLibraryImportView = require( 'elementor-templates/views/parts/import' ), TemplateLibraryPreviewView = require( 'elementor-templates/views/parts/preview' ), TemplateLibraryLayoutView; TemplateLibraryLayoutView = Marionette.LayoutView.extend( { el: '#elementor-template-library-modal', regions: { modalContent: '.dialog-message', modalHeader: '.dialog-widget-header' }, initialize: function() { this.getRegion( 'modalHeader' ).show( new TemplateLibraryHeaderView() ); }, getHeaderView: function() { return this.getRegion( 'modalHeader' ).currentView; }, getTemplateActionButton: function( templateData ) { var viewId = '#tmpl-elementor-template-library-' + ( templateData.isPro ? 'get-pro-button' : 'insert-button' ); viewId = elementor.hooks.applyFilters( 'elementor/editor/template-library/template/action-button', viewId, templateData ); var template = Marionette.TemplateCache.get( viewId ); return Marionette.Renderer.render( template ); }, showLoadingView: function() { this.modalContent.show( new TemplateLibraryLoadingView() ); }, showTemplatesView: function( templatesCollection ) { this.modalContent.show( new TemplateLibraryCollectionView( { collection: templatesCollection } ) ); var headerView = this.getHeaderView(); headerView.tools.show( new TemplateLibraryHeaderActionsView() ); headerView.menuArea.show( new TemplateLibraryHeaderMenuView() ); headerView.logoArea.show( new TemplateLibraryHeaderLogoView() ); }, showImportView: function() { this.getHeaderView().menuArea.reset(); this.modalContent.show( new TemplateLibraryImportView() ); }, showSaveTemplateView: function( elementModel ) { this.getHeaderView().menuArea.reset(); this.modalContent.show( new TemplateLibrarySaveTemplateView( { model: elementModel } ) ); }, showPreviewView: function( templateModel ) { this.modalContent.show( new TemplateLibraryPreviewView( { url: templateModel.get( 'url' ) } ) ); var headerView = this.getHeaderView(); headerView.menuArea.reset(); headerView.tools.show( new TemplateLibraryHeaderPreviewView( { model: templateModel } ) ); headerView.logoArea.show( new TemplateLibraryHeaderBackView() ); } } ); module.exports = TemplateLibraryLayoutView; },{"elementor-templates/views/parts/header":18,"elementor-templates/views/parts/header-parts/actions":13,"elementor-templates/views/parts/header-parts/back":14,"elementor-templates/views/parts/header-parts/logo":15,"elementor-templates/views/parts/header-parts/menu":16,"elementor-templates/views/parts/header-parts/preview":17,"elementor-templates/views/parts/import":19,"elementor-templates/views/parts/loading":20,"elementor-templates/views/parts/preview":21,"elementor-templates/views/parts/save-template":22,"elementor-templates/views/parts/templates":24}],13:[function(require,module,exports){ module.exports = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-header-actions', id: 'elementor-template-library-header-actions', ui: { 'import': '#elementor-template-library-header-import i', sync: '#elementor-template-library-header-sync i', save: '#elementor-template-library-header-save i' }, events: { 'click @ui.import': 'onImportClick', 'click @ui.sync': 'onSyncClick', 'click @ui.save': 'onSaveClick' }, onImportClick: function() { elementor.templates.getLayout().showImportView(); }, onSyncClick: function() { var self = this; self.ui.sync.addClass( 'eicon-animation-spin' ); elementor.templates.requestLibraryData( function() { self.ui.sync.removeClass( 'eicon-animation-spin' ); elementor.templates.showTemplates(); }, true, true ); }, onSaveClick: function() { elementor.templates.getLayout().showSaveTemplateView(); } } ); },{}],14:[function(require,module,exports){ module.exports = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-header-back', id: 'elementor-template-library-header-preview-back', events: { 'click': 'onClick' }, onClick: function() { elementor.templates.showTemplates(); } } ); },{}],15:[function(require,module,exports){ module.exports = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-header-logo', id: 'elementor-template-library-header-logo', events: { 'click': 'onClick' }, onClick: function() { elementor.templates.setTemplatesSource( 'remote' ); } } ); },{}],16:[function(require,module,exports){ module.exports = Marionette.ItemView.extend( { options: { activeClass: 'elementor-active' }, template: '#tmpl-elementor-template-library-header-menu', id: 'elementor-template-library-header-menu', ui: { menuItems: '.elementor-template-library-menu-item' }, events: { 'click @ui.menuItems': 'onMenuItemClick' }, $activeItem: null, activateMenuItem: function( $item ) { var activeClass = this.getOption( 'activeClass' ); if ( this.$activeItem === $item ) { return; } if ( this.$activeItem ) { this.$activeItem.removeClass( activeClass ); } $item.addClass( activeClass ); this.$activeItem = $item; }, onRender: function() { var currentSource = elementor.templates.getFilter( 'source' ), $sourceItem = this.ui.menuItems.filter( '[data-template-source="' + currentSource + '"]' ); this.activateMenuItem( $sourceItem ); }, onMenuItemClick: function( event ) { var item = event.currentTarget; this.activateMenuItem( jQuery( item ) ); elementor.templates.setTemplatesSource( item.dataset.templateSource ); } } ); },{}],17:[function(require,module,exports){ var TemplateLibraryInsertTemplateBehavior = require( 'elementor-templates/behaviors/insert-template' ); module.exports = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-header-preview', id: 'elementor-template-library-header-preview', behaviors: { insertTemplate: { behaviorClass: TemplateLibraryInsertTemplateBehavior } } } ); },{"elementor-templates/behaviors/insert-template":8}],18:[function(require,module,exports){ var TemplateLibraryHeaderView; TemplateLibraryHeaderView = Marionette.LayoutView.extend( { id: 'elementor-template-library-header', template: '#tmpl-elementor-template-library-header', regions: { logoArea: '#elementor-template-library-header-logo-area', tools: '#elementor-template-library-header-tools', menuArea: '#elementor-template-library-header-menu-area' }, ui: { closeModal: '#elementor-template-library-header-close-modal' }, events: { 'click @ui.closeModal': 'onCloseModalClick' }, onCloseModalClick: function() { elementor.templates.closeModal(); } } ); module.exports = TemplateLibraryHeaderView; },{}],19:[function(require,module,exports){ var TemplateLibraryImportView; TemplateLibraryImportView = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-import', id: 'elementor-template-library-import', ui: { uploadForm: '#elementor-template-library-import-form', fileInput: '#elementor-template-library-import-form-input' }, events: { 'change @ui.fileInput': 'onFileInputChange' }, droppedFiles: null, submitForm: function() { var layout = elementor.templates.getLayout(), data = new FormData(); if ( this.droppedFiles ) { data.append( 'file', this.droppedFiles[0] ); this.droppedFiles = null; } else { data.append( 'file', this.ui.fileInput[0].files[0] ); this.ui.uploadForm[0].reset(); } var options = { data: data, processData: false, contentType: false, success: function( data ) { elementor.templates.getTemplatesCollection().add( data ); elementor.templates.setTemplatesSource( 'local' ); }, error: function( data ) { elementor.templates.showErrorDialog( data ); layout.showImportView(); } }; elementor.ajax.send( 'import_template', options ); layout.showLoadingView(); }, onRender: function() { this.ui.uploadForm.on( { 'drag dragstart dragend dragover dragenter dragleave drop': this.onFormActions.bind( this ), dragenter: this.onFormDragEnter.bind( this ), 'dragleave drop': this.onFormDragLeave.bind( this ), drop: this.onFormDrop.bind( this ) } ); }, onFormActions: function( event ) { event.preventDefault(); event.stopPropagation(); }, onFormDragEnter: function() { this.ui.uploadForm.addClass( 'elementor-drag-over' ); }, onFormDragLeave: function( event ) { if ( jQuery( event.relatedTarget ).closest( this.ui.uploadForm ).length ) { return; } this.ui.uploadForm.removeClass( 'elementor-drag-over' ); }, onFormDrop: function( event ) { this.droppedFiles = event.originalEvent.dataTransfer.files; this.submitForm(); }, onFileInputChange: function() { this.submitForm(); } } ); module.exports = TemplateLibraryImportView; },{}],20:[function(require,module,exports){ var TemplateLibraryLoadingView; TemplateLibraryLoadingView = Marionette.ItemView.extend( { id: 'elementor-template-library-loading', template: '#tmpl-elementor-template-library-loading' } ); module.exports = TemplateLibraryLoadingView; },{}],21:[function(require,module,exports){ var TemplateLibraryPreviewView; TemplateLibraryPreviewView = Marionette.ItemView.extend( { template: '#tmpl-elementor-template-library-preview', id: 'elementor-template-library-preview', ui: { iframe: '> iframe' }, onRender: function() { this.ui.iframe.attr( 'src', this.getOption( 'url' ) ); } } ); module.exports = TemplateLibraryPreviewView; },{}],22:[function(require,module,exports){ var TemplateLibrarySaveTemplateView; TemplateLibrarySaveTemplateView = Marionette.ItemView.extend( { id: 'elementor-template-library-save-template', template: '#tmpl-elementor-template-library-save-template', ui: { form: '#elementor-template-library-save-template-form', submitButton: '#elementor-template-library-save-template-submit' }, events: { 'submit @ui.form': 'onFormSubmit' }, getSaveType: function() { return this.model ? this.model.get( 'elType' ) : 'page'; }, templateHelpers: function() { var saveType = this.getSaveType(), templateType = elementor.templates.getTemplateTypes( saveType ); return templateType.saveDialog; }, onFormSubmit: function( event ) { event.preventDefault(); var formData = this.ui.form.elementorSerializeObject(), saveType = this.model ? this.model.get( 'elType' ) : 'page', JSONParams = { removeDefault: true }; formData.content = this.model ? [ this.model.toJSON( JSONParams ) ] : elementor.elements.toJSON( JSONParams ); this.ui.submitButton.addClass( 'elementor-button-state' ); elementor.templates.saveTemplate( saveType, formData ); } } ); module.exports = TemplateLibrarySaveTemplateView; },{}],23:[function(require,module,exports){ var TemplateLibraryTemplatesEmptyView; TemplateLibraryTemplatesEmptyView = Marionette.ItemView.extend( { id: 'elementor-template-library-templates-empty', template: '#tmpl-elementor-template-library-templates-empty', ui: { title: '.elementor-template-library-blank-title', message: '.elementor-template-library-blank-message' }, modesStrings: { empty: { title: elementor.translate( 'templates_empty_title' ), message: elementor.translate( 'templates_empty_message' ) }, noResults: { title: elementor.translate( 'templates_no_results_title' ), message: elementor.translate( 'templates_no_results_message' ) }, noFavorites: { title: elementor.translate( 'templates_no_favorites_title' ), message: elementor.translate( 'templates_no_favorites_message' ) } }, getCurrentMode: function() { if ( elementor.templates.getFilter( 'text' ) ) { return 'noResults'; } if ( elementor.templates.getFilter( 'favorite' ) ) { return 'noFavorites'; } return 'empty'; }, onRender: function() { var modeStrings = this.modesStrings[ this.getCurrentMode() ]; this.ui.title.html( modeStrings.title ); this.ui.message.html( modeStrings.message ); } } ); module.exports = TemplateLibraryTemplatesEmptyView; },{}],24:[function(require,module,exports){ var TemplateLibraryTemplateLocalView = require( 'elementor-templates/views/template/local' ), TemplateLibraryTemplateRemoteView = require( 'elementor-templates/views/template/remote' ), TemplateLibraryCollectionView; TemplateLibraryCollectionView = Marionette.CompositeView.extend( { template: '#tmpl-elementor-template-library-templates', id: 'elementor-template-library-templates', childViewContainer: '#elementor-template-library-templates-container', reorderOnSort: true, emptyView: function() { var EmptyView = require( 'elementor-templates/views/parts/templates-empty' ); return new EmptyView(); }, ui: { filterText: '#elementor-template-library-filter-text', myFavoritesFilter: '#elementor-template-library-filter-my-favorites', orderInputs: '.elementor-template-library-order-input', orderLabels: '.elementor-template-library-order-label' }, events: { 'input @ui.filterText': 'onFilterTextInput', 'change @ui.myFavoritesFilter': 'onMyFavoritesFilterChange', 'mousedown @ui.orderLabels': 'onOrderLabelsClick' }, comparators: { title: function( model ) { return model.get( 'title' ).toLowerCase(); }, popularityIndex: function( model ) { var popularityIndex = model.get( 'popularityIndex' ); if ( ! popularityIndex ) { popularityIndex = model.get( 'date' ); } return -popularityIndex; }, trendIndex: function( model ) { var trendIndex = model.get( 'trendIndex' ); if ( ! trendIndex ) { trendIndex = model.get( 'date' ); } return -trendIndex; } }, getChildView: function( childModel ) { if ( 'remote' === childModel.get( 'source' ) ) { return TemplateLibraryTemplateRemoteView; } return TemplateLibraryTemplateLocalView; }, initialize: function() { this.listenTo( elementor.channels.templates, 'filter:change', this._renderChildren ); }, filter: function( childModel ) { var filterTerms = elementor.templates.getFilterTerms(), passingFilter = true; jQuery.each( filterTerms, function( filterTermName ) { var filterValue = this.value || elementor.templates.getFilter( filterTermName ); if ( ! filterValue ) { return; } if ( this.callback ) { var callbackResult = this.callback.call( childModel, filterValue ); if ( ! callbackResult ) { passingFilter = false; } return callbackResult; } var filterResult = filterValue === childModel.get( filterTermName ); if ( ! filterResult ) { passingFilter = false; } return filterResult; } ); return passingFilter; }, order: function( by, reverseOrder ) { var comparator = this.comparators[ by ] || by; if ( reverseOrder ) { comparator = this.reverseOrder( comparator ); } this.collection.comparator = comparator; this.collection.sort(); }, reverseOrder: function( comparator ) { if ( 'function' !== typeof comparator ) { var comparatorValue = comparator; comparator = function( model ) { return model.get( comparatorValue ); }; } return function( left, right ) { var l = comparator( left ), r = comparator( right ); if ( undefined === l ) { return -1; } if ( undefined === r ) { return 1; } return l < r ? 1 : l > r ? -1 : 0; }; }, addSourceData: function() { var isEmpty = this.children.isEmpty(); this.$el.attr( 'data-template-source', isEmpty ? 'empty' : elementor.templates.getFilter( 'source' ) ); }, toggleFilterClass: function() { this.$el.toggleClass( 'elementor-templates-filter-active', !! ( elementor.templates.getFilter( 'text' ) || elementor.templates.getFilter( 'favorite' ) ) ); }, onRenderCollection: function() { this.addSourceData(); this.toggleFilterClass(); }, onBeforeRenderEmpty: function() { this.addSourceData(); }, onFilterTextInput: function() { elementor.templates.setFilter( 'text', this.ui.filterText.val() ); }, onMyFavoritesFilterChange: function( ) { elementor.templates.setFilter( 'favorite', this.ui.myFavoritesFilter[0].checked ); }, onOrderLabelsClick: function( event ) { var $clickedInput = jQuery( event.currentTarget.control ), toggle; if ( ! $clickedInput[0].checked ) { toggle = 'asc' !== $clickedInput.data( 'default-ordering-direction' ); } $clickedInput.toggleClass( 'elementor-template-library-order-reverse', toggle ); this.order( $clickedInput.val(), $clickedInput.hasClass( 'elementor-template-library-order-reverse' ) ); } } ); module.exports = TemplateLibraryCollectionView; },{"elementor-templates/views/parts/templates-empty":23,"elementor-templates/views/template/local":26,"elementor-templates/views/template/remote":27}],25:[function(require,module,exports){ var TemplateLibraryInsertTemplateBehavior = require( 'elementor-templates/behaviors/insert-template' ), TemplateLibraryTemplateView; TemplateLibraryTemplateView = Marionette.ItemView.extend( { className: function() { var classes = 'elementor-template-library-template elementor-template-library-template-' + this.model.get( 'source' ); if ( this.model.get( 'isPro' ) ) { classes += ' elementor-template-library-pro-template'; } return classes; }, ui: function() { return { previewButton: '.elementor-template-library-template-preview' }; }, events: function() { return { 'click @ui.previewButton': 'onPreviewButtonClick' }; }, behaviors: { insertTemplate: { behaviorClass: TemplateLibraryInsertTemplateBehavior } } } ); module.exports = TemplateLibraryTemplateView; },{"elementor-templates/behaviors/insert-template":8}],26:[function(require,module,exports){ var TemplateLibraryTemplateView = require( 'elementor-templates/views/template/base' ), TemplateLibraryTemplateLocalView; TemplateLibraryTemplateLocalView = TemplateLibraryTemplateView.extend( { template: '#tmpl-elementor-template-library-template-local', ui: function() { return _.extend( TemplateLibraryTemplateView.prototype.ui.apply( this, arguments ), { deleteButton: '.elementor-template-library-template-delete', morePopup: '.elementor-template-library-template-more', toggleMore: '.elementor-template-library-template-more-toggle', toggleMoreIcon: '.elementor-template-library-template-more-toggle i' } ); }, events: function() { return _.extend( TemplateLibraryTemplateView.prototype.events.apply( this, arguments ), { 'click @ui.deleteButton': 'onDeleteButtonClick', 'click @ui.toggleMore': 'onToggleMoreClick' } ); }, onDeleteButtonClick: function() { var toggleMoreIcon = this.ui.toggleMoreIcon; elementor.templates.deleteTemplate( this.model, { onConfirm: function() { toggleMoreIcon.removeClass( 'eicon-ellipsis-h' ).addClass( 'fa fa-circle-o-notch fa-spin' ); }, onSuccess: function() { elementor.templates.showTemplates(); } } ); }, onToggleMoreClick: function() { this.ui.morePopup.show(); }, onPreviewButtonClick: function() { open( this.model.get( 'url' ), '_blank' ); } } ); module.exports = TemplateLibraryTemplateLocalView; },{"elementor-templates/views/template/base":25}],27:[function(require,module,exports){ var TemplateLibraryTemplateView = require( 'elementor-templates/views/template/base' ), TemplateLibraryTemplateRemoteView; TemplateLibraryTemplateRemoteView = TemplateLibraryTemplateView.extend( { template: '#tmpl-elementor-template-library-template-remote', ui: function() { return jQuery.extend( TemplateLibraryTemplateView.prototype.ui.apply( this, arguments ), { favoriteCheckbox: '.elementor-template-library-template-favorite-input' } ); }, events: function() { return jQuery.extend( TemplateLibraryTemplateView.prototype.events.apply( this, arguments ), { 'change @ui.favoriteCheckbox': 'onFavoriteCheckboxChange' } ); }, onPreviewButtonClick: function() { elementor.templates.getLayout().showPreviewView( this.model ); }, onFavoriteCheckboxChange: function() { var isFavorite = this.ui.favoriteCheckbox[0].checked; this.model.set( 'favorite', isFavorite ); elementor.templates.markAsFavorite( this.model, isFavorite ); if ( ! isFavorite && elementor.templates.getFilter( 'favorite' ) ) { elementor.channels.templates.trigger( 'filter:change' ); } } } ); module.exports = TemplateLibraryTemplateRemoteView; },{"elementor-templates/views/template/base":25}],28:[function(require,module,exports){ var Module = require( 'elementor-utils/module' ), Validator; Validator = Module.extend( { errors: [], __construct: function( settings ) { var customValidationMethod = settings.customValidationMethod; if ( customValidationMethod ) { this.validationMethod = customValidationMethod; } }, getDefaultSettings: function() { return { validationTerms: {} }; }, isValid: function() { var validationErrors = this.validationMethod.apply( this, arguments ); if ( validationErrors.length ) { this.errors = validationErrors; return false; } return true; }, validationMethod: function( newValue ) { var validationTerms = this.getSettings( 'validationTerms' ), errors = []; if ( validationTerms.required ) { if ( ! ( '' + newValue ).length ) { errors.push( 'Required value is empty' ); } } return errors; } } ); module.exports = Validator; },{"elementor-utils/module":123}],29:[function(require,module,exports){ var Validator = require( 'elementor-validator/base' ); module.exports = Validator.extend( { validationMethod: function( newValue ) { var validationTerms = this.getSettings( 'validationTerms' ), errors = []; if ( _.isFinite( newValue ) ) { if ( undefined !== validationTerms.min && newValue < validationTerms.min ) { errors.push( 'Value is less than minimum' ); } if ( undefined !== validationTerms.max && newValue > validationTerms.max ) { errors.push( 'Value is greater than maximum' ); } } return errors; } } ); },{"elementor-validator/base":28}],30:[function(require,module,exports){ var ControlBaseView = require( 'elementor-controls/base' ), Validator = require( 'elementor-validator/base' ), ControlBaseDataView; ControlBaseDataView = ControlBaseView.extend( { ui: function() { var ui = ControlBaseView.prototype.ui.apply( this, arguments ); _.extend( ui, { input: 'input[data-setting][type!="checkbox"][type!="radio"]', checkbox: 'input[data-setting][type="checkbox"]', radio: 'input[data-setting][type="radio"]', select: 'select[data-setting]', textarea: 'textarea[data-setting]', responsiveSwitchers: '.elementor-responsive-switcher' } ); return ui; }, templateHelpers: function() { var controlData = ControlBaseView.prototype.templateHelpers.apply( this, arguments ); controlData.data.controlValue = this.getControlValue(); return controlData; }, events: function() { return { 'input @ui.input': 'onBaseInputChange', 'change @ui.checkbox': 'onBaseInputChange', 'change @ui.radio': 'onBaseInputChange', 'input @ui.textarea': 'onBaseInputChange', 'change @ui.select': 'onBaseInputChange', 'click @ui.responsiveSwitchers': 'onSwitcherClick' }; }, initialize: function( options ) { ControlBaseView.prototype.initialize.apply( this, arguments ); this.registerValidators(); this.listenTo( this.elementSettingsModel, 'change:external:' + this.model.get( 'name' ), this.onSettingsExternalChange ); }, getControlValue: function() { return this.elementSettingsModel.get( this.model.get( 'name' ) ); }, setValue: function( value ) { this.setSettingsModel( value ); }, setSettingsModel: function( value ) { this.elementSettingsModel.set( this.model.get( 'name' ), value ); this.triggerMethod( 'settings:change' ); }, applySavedValue: function() { this.setInputValue( '[data-setting="' + this.model.get( 'name' ) + '"]', this.getControlValue() ); }, getEditSettings: function( setting ) { var settings = this.getOption( 'elementEditSettings' ).toJSON(); if ( setting ) { return settings[ setting ]; } return settings; }, setEditSetting: function( settingKey, settingValue ) { var settings = this.getOption( 'elementEditSettings' ); settings.set( settingKey, settingValue ); }, getInputValue: function( input ) { var $input = this.$( input ), inputValue = $input.val(), inputType = $input.attr( 'type' ); if ( -1 !== [ 'radio', 'checkbox' ].indexOf( inputType ) ) { return $input.prop( 'checked' ) ? inputValue : ''; } if ( 'number' === inputType && _.isFinite( inputValue ) ) { return +inputValue; } // Temp fix for jQuery (< 3.0) that return null instead of empty array if ( 'SELECT' === input.tagName && $input.prop( 'multiple' ) && null === inputValue ) { inputValue = []; } return inputValue; }, setInputValue: function( input, value ) { var $input = this.$( input ), inputType = $input.attr( 'type' ); if ( 'checkbox' === inputType ) { $input.prop( 'checked', !! value ); } else if ( 'radio' === inputType ) { $input.filter( '[value="' + value + '"]' ).prop( 'checked', true ); } else { $input.val( value ); } }, addValidator: function( validator ) { this.validators.push( validator ); }, registerValidators: function() { this.validators = []; var validationTerms = {}; if ( this.model.get( 'required' ) ) { validationTerms.required = true; } if ( ! jQuery.isEmptyObject( validationTerms ) ) { this.addValidator( new Validator( { validationTerms: validationTerms } ) ); } }, onSettingsError: function() { this.$el.addClass( 'elementor-error' ); }, onSettingsChange: function() { this.$el.removeClass( 'elementor-error' ); }, onRender: function() { ControlBaseView.prototype.onRender.apply( this, arguments ); this.applySavedValue(); this.renderResponsiveSwitchers(); this.triggerMethod( 'ready' ); this.toggleControlVisibility(); this.addTooltip(); }, onBaseInputChange: function( event ) { clearTimeout( this.correctionTimeout ); var input = event.currentTarget, value = this.getInputValue( input ), validators = this.validators.slice( 0 ), settingsValidators = this.elementSettingsModel.validators[ this.model.get( 'name' ) ]; if ( settingsValidators ) { validators = validators.concat( settingsValidators ); } if ( validators ) { var oldValue = this.getControlValue( input.dataset.setting ); var isValidValue = validators.every( function( validator ) { return validator.isValid( value, oldValue ); } ); if ( ! isValidValue ) { this.correctionTimeout = setTimeout( this.setInputValue.bind( this, input, oldValue ), 1200 ); return; } } this.updateElementModel( value, input ); this.triggerMethod( 'input:change', event ); }, onSwitcherClick: function( event ) { var device = jQuery( event.currentTarget ).data( 'device' ); elementor.changeDeviceMode( device ); this.triggerMethod( 'responsive:switcher:click', device ); }, onSettingsExternalChange: function() { this.applySavedValue(); this.triggerMethod( 'after:external:change' ); }, renderResponsiveSwitchers: function() { if ( _.isEmpty( this.model.get( 'responsive' ) ) ) { return; } var templateHtml = Marionette.Renderer.render( '#tmpl-elementor-control-responsive-switchers', this.model.attributes ); this.ui.controlTitle.after( templateHtml ); }, onAfterExternalChange: function() { this.hideTooltip(); this.render(); }, addTooltip: function() { // Create tooltip on controls this.$( '.tooltip-target' ).tipsy( { gravity: function() { // `n` for down, `s` for up var gravity = jQuery( this ).data( 'tooltip-pos' ); if ( undefined !== gravity ) { return gravity; } else { return 'n'; } }, title: function() { return this.getAttribute( 'data-tooltip' ); } } ); }, hideTooltip: function() { jQuery( '.tipsy' ).hide(); }, updateElementModel: function( value ) { this.setValue( value ); } }, { // Static methods getStyleValue: function( placeholder, controlValue ) { return controlValue; } } ); module.exports = ControlBaseDataView; },{"elementor-controls/base":33,"elementor-validator/base":28}],31:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlBaseMultipleItemView; ControlBaseMultipleItemView = ControlBaseDataView.extend( { applySavedValue: function() { var values = this.getControlValue(), $inputs = this.$( '[data-setting]' ), self = this; _.each( values, function( value, key ) { var $input = $inputs.filter( function() { return key === this.dataset.setting; } ); self.setInputValue( $input, value ); } ); }, getControlValue: function( key ) { var values = this.elementSettingsModel.get( this.model.get( 'name' ) ); if ( ! jQuery.isPlainObject( values ) ) { return {}; } if ( key ) { var value = values[ key ]; if ( undefined === value ) { value = ''; } return value; } return elementor.helpers.cloneObject( values ); }, setValue: function( key, value ) { var values = this.getControlValue(); if ( 'object' === typeof key ) { _.each( key, function( internalValue, internalKey ) { values[ internalKey ] = internalValue; } ); } else { values[ key ] = value; } this.setSettingsModel( values ); }, updateElementModel: function( value, input ) { var key = input.dataset.setting; this.setValue( key, value ); } }, { // Static methods getStyleValue: function( placeholder, controlValue ) { if ( ! _.isObject( controlValue ) ) { return ''; // invalid } return controlValue[ placeholder ]; } } ); module.exports = ControlBaseMultipleItemView; },{"elementor-controls/base-data":30}],32:[function(require,module,exports){ var ControlBaseMultipleItemView = require( 'elementor-controls/base-multiple' ), ControlBaseUnitsItemView; ControlBaseUnitsItemView = ControlBaseMultipleItemView.extend( { getCurrentRange: function() { return this.getUnitRange( this.getControlValue( 'unit' ) ); }, getUnitRange: function( unit ) { var ranges = this.model.get( 'range' ); if ( ! ranges || ! ranges[ unit ] ) { return false; } return ranges[ unit ]; } } ); module.exports = ControlBaseUnitsItemView; },{"elementor-controls/base-multiple":31}],33:[function(require,module,exports){ var ControlBaseView; ControlBaseView = Marionette.CompositeView.extend( { ui: function() { return { controlTitle: '.elementor-control-title' }; }, behaviors: function() { var behaviors = {}; return elementor.hooks.applyFilters( 'controls/base/behaviors', behaviors, this ); }, getBehavior: function( name ) { return this._behaviors[ Object.keys( this.behaviors() ).indexOf( name ) ]; }, className: function() { // TODO: Any better classes for that? var classes = 'elementor-control elementor-control-' + this.model.get( 'name' ) + ' elementor-control-type-' + this.model.get( 'type' ), modelClasses = this.model.get( 'classes' ), responsive = this.model.get( 'responsive' ); if ( ! _.isEmpty( modelClasses ) ) { classes += ' ' + modelClasses; } if ( ! _.isEmpty( responsive ) ) { classes += ' elementor-control-responsive-' + responsive.max; } return classes; }, templateHelpers: function() { var controlData = { _cid: this.model.cid }; return { data: _.extend( {}, this.model.toJSON(), controlData ) }; }, getTemplate: function() { return Marionette.TemplateCache.get( '#tmpl-elementor-control-' + this.model.get( 'type' ) + '-content' ); }, initialize: function( options ) { this.elementSettingsModel = options.elementSettingsModel; var controlType = this.model.get( 'type' ), controlSettings = jQuery.extend( true, {}, elementor.config.controls[ controlType ], this.model.attributes ); this.model.set( controlSettings ); this.listenTo( this.elementSettingsModel, 'change', this.toggleControlVisibility ); }, toggleControlVisibility: function() { var isVisible = elementor.helpers.isActiveControl( this.model, this.elementSettingsModel.attributes ); this.$el.toggleClass( 'elementor-hidden-control', ! isVisible ); elementor.channels.data.trigger( 'scrollbar:update' ); }, onRender: function() { var layoutType = this.model.get( 'label_block' ) ? 'block' : 'inline', showLabel = this.model.get( 'show_label' ), elClasses = 'elementor-label-' + layoutType; elClasses += ' elementor-control-separator-' + this.model.get( 'separator' ); if ( ! showLabel ) { elClasses += ' elementor-control-hidden-label'; } this.$el.addClass( elClasses ); this.toggleControlVisibility(); } } ); module.exports = ControlBaseView; },{}],34:[function(require,module,exports){ var ControlMultipleBaseItemView = require( 'elementor-controls/base-multiple' ), ControlBoxShadowItemView; ControlBoxShadowItemView = ControlMultipleBaseItemView.extend( { ui: function() { var ui = ControlMultipleBaseItemView.prototype.ui.apply( this, arguments ); ui.sliders = '.elementor-slider'; ui.colors = '.elementor-shadow-color-picker'; return ui; }, events: function() { return _.extend( ControlMultipleBaseItemView.prototype.events.apply( this, arguments ), { 'slide @ui.sliders': 'onSlideChange' } ); }, initSliders: function() { var value = this.getControlValue(); this.ui.sliders.each( function() { var $slider = jQuery( this ), $input = $slider.next( '.elementor-slider-input' ).find( 'input' ); $slider.slider( { value: value[ this.dataset.input ], min: +$input.attr( 'min' ), max: +$input.attr( 'max' ) } ); } ); }, initColors: function() { var self = this; elementor.helpers.wpColorPicker( this.ui.colors, { change: function() { var $this = jQuery( this ), type = $this.data( 'setting' ); self.setValue( type, $this.wpColorPicker( 'color' ) ); }, clear: function() { self.setValue( this.dataset.setting, '' ); } } ); }, onInputChange: function( event ) { var type = event.currentTarget.dataset.setting, $slider = this.ui.sliders.filter( '[data-input="' + type + '"]' ); $slider.slider( 'value', this.getControlValue( type ) ); }, onReady: function() { this.initSliders(); this.initColors(); }, onSlideChange: function( event, ui ) { var type = event.currentTarget.dataset.input, $input = this.ui.input.filter( '[data-setting="' + type + '"]' ); $input.val( ui.value ); this.setValue( type, ui.value ); }, onBeforeDestroy: function() { this.ui.colors.each( function() { var $color = jQuery( this ); if ( $color.wpColorPicker( 'instance' ) ) { $color.wpColorPicker( 'close' ); } } ); this.$el.remove(); } } ); module.exports = ControlBoxShadowItemView; },{"elementor-controls/base-multiple":31}],35:[function(require,module,exports){ var ControlBaseView = require( 'elementor-controls/base' ); module.exports = ControlBaseView.extend( { ui: function() { var ui = ControlBaseView.prototype.ui.apply( this, arguments ); ui.button = 'button'; return ui; }, events: { 'click @ui.button': 'onButtonClick' }, onButtonClick: function() { var eventName = this.model.get( 'event' ); elementor.channels.editor.trigger( eventName, this ); } } ); },{"elementor-controls/base":33}],36:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlChooseItemView; ControlChooseItemView = ControlBaseDataView.extend( { ui: function() { var ui = ControlBaseDataView.prototype.ui.apply( this, arguments ); ui.inputs = '[type="radio"]'; return ui; }, events: function() { return _.extend( ControlBaseDataView.prototype.events.apply( this, arguments ), { 'mousedown label': 'onMouseDownLabel', 'click @ui.inputs': 'onClickInput', 'change @ui.inputs': 'onBaseInputChange' } ); }, onMouseDownLabel: function( event ) { var $clickedLabel = this.$( event.currentTarget ), $selectedInput = this.$( '#' + $clickedLabel.attr( 'for' ) ); $selectedInput.data( 'checked', $selectedInput.prop( 'checked' ) ); }, onClickInput: function( event ) { if ( ! this.model.get( 'toggle' ) ) { return; } var $selectedInput = this.$( event.currentTarget ); if ( $selectedInput.data( 'checked' ) ) { $selectedInput.prop( 'checked', false ).trigger( 'change' ); } }, onRender: function() { ControlBaseDataView.prototype.onRender.apply( this, arguments ); var currentValue = this.getControlValue(); if ( currentValue ) { this.ui.inputs.filter( '[value="' + currentValue + '"]' ).prop( 'checked', true ); } } } ); module.exports = ControlChooseItemView; },{"elementor-controls/base-data":30}],37:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlCodeEditorItemView; ControlCodeEditorItemView = ControlBaseDataView.extend( { ui: function() { var ui = ControlBaseDataView.prototype.ui.apply( this, arguments ); ui.editor = '.elementor-code-editor'; return ui; }, onReady: function() { var self = this; if ( 'undefined' === typeof ace ) { return; } var langTools = ace.require( 'ace/ext/language_tools' ); self.editor = ace.edit( this.ui.editor[0] ); jQuery( self.editor.container ).addClass( 'elementor-input-style elementor-code-editor' ); self.editor.setOptions( { mode: 'ace/mode/' + self.model.attributes.language, minLines: 10, maxLines: Infinity, showGutter: true, useWorker: true, enableBasicAutocompletion: true, enableLiveAutocompletion: true } ); self.editor.getSession().setUseWrapMode( true ); elementor.panel.$el.on( 'resize.aceEditor', self.onResize.bind( this ) ); if ( 'css' === self.model.attributes.language ) { var selectorCompleter = { getCompletions: function( editor, session, pos, prefix, callback ) { var list = [], token = session.getTokenAt( pos.row, pos.column ); if ( 0 < prefix.length && 'selector'.match( prefix ) && 'constant' === token.type ) { list = [ { name: 'selector', value: 'selector', score: 1, meta: 'Elementor' } ]; } callback( null, list ); } }; langTools.addCompleter( selectorCompleter ); } self.editor.setValue( self.getControlValue(), -1 ); // -1 = move cursor to the start self.editor.on( 'change', function() { self.setValue( self.editor.getValue() ); } ); if ( 'html' === self.model.attributes.language ) { // Remove the `doctype` annotation var session = self.editor.getSession(); session.on( 'changeAnnotation', function() { var annotations = session.getAnnotations() || [], annotationsLength = annotations.length, index = annotations.length; while ( index-- ) { if ( /doctype first\. Expected/.test( annotations[ index ].text ) ) { annotations.splice( index, 1 ); } } if ( annotationsLength > annotations.length ) { session.setAnnotations( annotations ); } } ); } }, onResize: function() { this.editor.resize(); }, onDestroy: function() { elementor.panel.$el.off( 'resize.aceEditor' ); } } ); module.exports = ControlCodeEditorItemView; },{"elementor-controls/base-data":30}],38:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlColorItemView; ControlColorItemView = ControlBaseDataView.extend( { onReady: function() { var self = this; elementor.helpers.wpColorPicker( self.ui.input, { change: function() { self.ui.input.val( self.ui.input.wpColorPicker( 'color' ) ).trigger( 'input' ); }, clear: function() { self.setValue( '' ); } } ); }, onBeforeDestroy: function() { if ( this.ui.input.wpColorPicker( 'instance' ) ) { this.ui.input.wpColorPicker( 'close' ); } this.$el.remove(); } } ); module.exports = ControlColorItemView; },{"elementor-controls/base-data":30}],39:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlDateTimePickerItemView; ControlDateTimePickerItemView = ControlBaseDataView.extend( { onReady: function() { var self = this; var options = _.extend( { onClose: function() { self.saveValue(); }, enableTime: true, minuteIncrement: 1 }, this.model.get( 'picker_options' ) ); this.ui.input.flatpickr( options ); }, saveValue: function() { this.setValue( this.ui.input.val() ); }, onBeforeDestroy: function() { this.saveValue(); this.ui.input.flatpickr().destroy(); } } ); module.exports = ControlDateTimePickerItemView; },{"elementor-controls/base-data":30}],40:[function(require,module,exports){ var ControlBaseUnitsItemView = require( 'elementor-controls/base-units' ), ControlDimensionsItemView; ControlDimensionsItemView = ControlBaseUnitsItemView.extend( { ui: function() { var ui = ControlBaseUnitsItemView.prototype.ui.apply( this, arguments ); ui.controls = '.elementor-control-dimension > input:enabled'; ui.link = 'button.elementor-link-dimensions'; return ui; }, events: function() { return _.extend( ControlBaseUnitsItemView.prototype.events.apply( this, arguments ), { 'click @ui.link': 'onLinkDimensionsClicked' } ); }, defaultDimensionValue: 0, initialize: function() { ControlBaseUnitsItemView.prototype.initialize.apply( this, arguments ); // TODO: Need to be in helpers, and not in variable this.model.set( 'allowed_dimensions', this.filterDimensions( this.model.get( 'allowed_dimensions' ) ) ); }, getPossibleDimensions: function() { return [ 'top', 'right', 'bottom', 'left' ]; }, filterDimensions: function( filter ) { filter = filter || 'all'; var dimensions = this.getPossibleDimensions(); if ( 'all' === filter ) { return dimensions; } if ( ! _.isArray( filter ) ) { if ( 'horizontal' === filter ) { filter = [ 'right', 'left' ]; } else if ( 'vertical' === filter ) { filter = [ 'top', 'bottom' ]; } } return filter; }, onReady: function() { var self = this, currentValue = self.getControlValue(); if ( ! self.isLinkedDimensions() ) { self.ui.link.addClass( 'unlinked' ); self.ui.controls.each( function( index, element ) { var value = currentValue[ element.dataset.setting ]; if ( _.isEmpty( value ) ) { value = self.defaultDimensionValue; } self.$( element ).val( value ); } ); } self.fillEmptyDimensions(); }, updateDimensionsValue: function() { var currentValue = {}, dimensions = this.getPossibleDimensions(), $controls = this.ui.controls, defaultDimensionValue = this.defaultDimensionValue; dimensions.forEach( function( dimension ) { var $element = $controls.filter( '[data-setting="' + dimension + '"]' ); currentValue[ dimension ] = $element.length ? $element.val() : defaultDimensionValue; } ); this.setValue( currentValue ); }, fillEmptyDimensions: function() { var dimensions = this.getPossibleDimensions(), allowedDimensions = this.model.get( 'allowed_dimensions' ), $controls = this.ui.controls, defaultDimensionValue = this.defaultDimensionValue; if ( this.isLinkedDimensions() ) { return; } dimensions.forEach( function( dimension ) { var $element = $controls.filter( '[data-setting="' + dimension + '"]' ), isAllowedDimension = -1 !== _.indexOf( allowedDimensions, dimension ); if ( isAllowedDimension && $element.length && _.isEmpty( $element.val() ) ) { $element.val( defaultDimensionValue ); } } ); }, updateDimensions: function() { this.fillEmptyDimensions(); this.updateDimensionsValue(); }, resetDimensions: function() { this.ui.controls.val( '' ); this.updateDimensionsValue(); }, onInputChange: function( event ) { var inputSetting = event.target.dataset.setting; if ( 'unit' === inputSetting ) { this.resetDimensions(); } if ( ! _.contains( this.getPossibleDimensions(), inputSetting ) ) { return; } if ( this.isLinkedDimensions() ) { var $thisControl = this.$( event.target ); this.ui.controls.val( $thisControl.val() ); } this.updateDimensions(); }, onLinkDimensionsClicked: function( event ) { event.preventDefault(); event.stopPropagation(); this.ui.link.toggleClass( 'unlinked' ); this.setValue( 'isLinked', ! this.ui.link.hasClass( 'unlinked' ) ); if ( this.isLinkedDimensions() ) { // Set all controls value from the first control. this.ui.controls.val( this.ui.controls.eq( 0 ).val() ); } this.updateDimensions(); }, isLinkedDimensions: function() { return this.getControlValue( 'isLinked' ); } } ); module.exports = ControlDimensionsItemView; },{"elementor-controls/base-units":32}],41:[function(require,module,exports){ var ControlSelect2View = require( 'elementor-controls/select2' ); module.exports = ControlSelect2View.extend( { getSelect2Options: function() { return { dir: elementor.config.is_rtl ? 'rtl' : 'ltr' }; }, templateHelpers: function() { var helpers = ControlSelect2View.prototype.templateHelpers.apply( this, arguments ), fonts = this.model.get( 'options' ); helpers.getFontsByGroups = function( groups ) { var filteredFonts = {}; _.each( fonts, function( fontType, fontName ) { if ( _.isArray( groups ) && _.contains( groups, fontType ) || fontType === groups ) { filteredFonts[ fontName ] = fontType; } } ); return filteredFonts; }; return helpers; } } ); },{"elementor-controls/select2":52}],42:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlMediaItemView; ControlMediaItemView = ControlBaseDataView.extend( { ui: function() { var ui = ControlBaseDataView.prototype.ui.apply( this, arguments ); ui.addImages = '.elementor-control-gallery-add'; ui.clearGallery = '.elementor-control-gallery-clear'; ui.galleryThumbnails = '.elementor-control-gallery-thumbnails'; return ui; }, events: function() { return _.extend( ControlBaseDataView.prototype.events.apply( this, arguments ), { 'click @ui.addImages': 'onAddImagesClick', 'click @ui.clearGallery': 'onClearGalleryClick', 'click @ui.galleryThumbnails': 'onGalleryThumbnailsClick' } ); }, onReady: function() { var hasImages = this.hasImages(); this.$el .toggleClass( 'elementor-gallery-has-images', hasImages ) .toggleClass( 'elementor-gallery-empty', ! hasImages ); this.initRemoveDialog(); }, hasImages: function() { return !! this.getControlValue().length; }, openFrame: function( action ) { this.initFrame( action ); this.frame.open(); }, initFrame: function( action ) { var frameStates = { create: 'gallery', add: 'gallery-library', edit: 'gallery-edit' }; var options = { frame: 'post', multiple: true, state: frameStates[ action ], button: { text: elementor.translate( 'insert_media' ) } }; if ( this.hasImages() ) { options.selection = this.fetchSelection(); } this.frame = wp.media( options ); // When a file is selected, run a callback. this.frame.on( { 'update': this.select, 'menu:render:default': this.menuRender, 'content:render:browse': this.gallerySettings }, this ); }, menuRender: function( view ) { view.unset( 'insert' ); view.unset( 'featured-image' ); }, gallerySettings: function( browser ) { browser.sidebar.on( 'ready', function() { browser.sidebar.unset( 'gallery' ); } ); }, fetchSelection: function() { var attachments = wp.media.query( { orderby: 'post__in', order: 'ASC', type: 'image', perPage: -1, post__in: _.pluck( this.getControlValue(), 'id' ) } ); return new wp.media.model.Selection( attachments.models, { props: attachments.props.toJSON(), multiple: true } ); }, /** * Callback handler for when an attachment is selected in the media modal. * Gets the selected image information, and sets it within the control. */ select: function( selection ) { var images = []; selection.each( function( image ) { images.push( { id: image.get( 'id' ), url: image.get( 'url' ) } ); } ); this.setValue( images ); this.render(); }, onBeforeDestroy: function() { if ( this.frame ) { this.frame.off(); } this.$el.remove(); }, resetGallery: function() { this.setValue( '' ); this.render(); }, initRemoveDialog: function() { var removeDialog; this.getRemoveDialog = function() { if ( ! removeDialog ) { removeDialog = elementor.dialogsManager.createWidget( 'confirm', { message: elementor.translate( 'dialog_confirm_gallery_delete' ), headerMessage: elementor.translate( 'delete_gallery' ), strings: { confirm: elementor.translate( 'delete' ), cancel: elementor.translate( 'cancel' ) }, defaultOption: 'confirm', onConfirm: this.resetGallery.bind( this ) } ); } return removeDialog; }; }, onAddImagesClick: function() { this.openFrame( this.hasImages() ? 'add' : 'create' ); }, onClearGalleryClick: function() { this.getRemoveDialog().show(); }, onGalleryThumbnailsClick: function() { this.openFrame( 'edit' ); } } ); module.exports = ControlMediaItemView; },{"elementor-controls/base-data":30}],43:[function(require,module,exports){ var ControlSelect2View = require( 'elementor-controls/select2' ), ControlIconView; ControlIconView = ControlSelect2View.extend( { initialize: function() { ControlSelect2View.prototype.initialize.apply( this, arguments ); this.filterIcons(); }, filterIcons: function() { var icons = this.model.get( 'options' ), include = this.model.get( 'include' ), exclude = this.model.get( 'exclude' ); if ( include ) { var filteredIcons = {}; _.each( include, function( iconKey ) { filteredIcons[ iconKey ] = icons[ iconKey ]; } ); this.model.set( 'options', filteredIcons ); return; } if ( exclude ) { _.each( exclude, function( iconKey ) { delete icons[ iconKey ]; } ); } }, iconsList: function( icon ) { if ( ! icon.id ) { return icon.text; } return jQuery( ' ' + icon.text + '' ); }, getSelect2Options: function() { return { allowClear: true, templateResult: this.iconsList.bind( this ), templateSelection: this.iconsList.bind( this ) }; } } ); module.exports = ControlIconView; },{"elementor-controls/select2":52}],44:[function(require,module,exports){ var ControlMultipleBaseItemView = require( 'elementor-controls/base-multiple' ), ControlImageDimensionsItemView; ControlImageDimensionsItemView = ControlMultipleBaseItemView.extend( { ui: function() { return { inputWidth: 'input[data-setting="width"]', inputHeight: 'input[data-setting="height"]', btnApply: 'button.elementor-image-dimensions-apply-button' }; }, // Override the base events events: function() { return { 'click @ui.btnApply': 'onApplyClicked' }; }, onApplyClicked: function( event ) { event.preventDefault(); this.setValue( { width: this.ui.inputWidth.val(), height: this.ui.inputHeight.val() } ); } } ); module.exports = ControlImageDimensionsItemView; },{"elementor-controls/base-multiple":31}],45:[function(require,module,exports){ var ControlMultipleBaseItemView = require( 'elementor-controls/base-multiple' ), ControlMediaItemView; ControlMediaItemView = ControlMultipleBaseItemView.extend( { ui: function() { var ui = ControlMultipleBaseItemView.prototype.ui.apply( this, arguments ); ui.controlMedia = '.elementor-control-media'; ui.frameOpeners = '.elementor-control-media-upload-button, .elementor-control-media-image'; ui.deleteButton = '.elementor-control-media-delete'; return ui; }, events: function() { return _.extend( ControlMultipleBaseItemView.prototype.events.apply( this, arguments ), { 'click @ui.frameOpeners': 'openFrame', 'click @ui.deleteButton': 'deleteImage' } ); }, onReady: function() { if ( _.isEmpty( this.getControlValue( 'url' ) ) ) { this.ui.controlMedia.addClass( 'media-empty' ); } }, openFrame: function() { if ( ! this.frame ) { this.initFrame(); } this.frame.open(); }, deleteImage: function() { this.setValue( { url: '', id: '' } ); this.render(); }, /** * Create a media modal select frame, and store it so the instance can be reused when needed. */ initFrame: function() { this.frame = wp.media( { button: { text: elementor.translate( 'insert_media' ) }, states: [ new wp.media.controller.Library( { title: elementor.translate( 'insert_media' ), library: wp.media.query( { type: 'image' } ), multiple: false, date: false } ) ] } ); // When a file is selected, run a callback. this.frame.on( 'insert select', this.select.bind( this ) ); }, /** * Callback handler for when an attachment is selected in the media modal. * Gets the selected image information, and sets it within the control. */ select: function() { this.trigger( 'before:select' ); // Get the attachment from the modal frame. var attachment = this.frame.state().get( 'selection' ).first().toJSON(); if ( attachment.url ) { this.setValue( { url: attachment.url, id: attachment.id } ); this.render(); } this.trigger( 'after:select' ); }, onBeforeDestroy: function() { this.$el.remove(); } } ); module.exports = ControlMediaItemView; },{"elementor-controls/base-multiple":31}],46:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), NumberValidator = require( 'elementor-validator/number' ), ControlNumberItemView; ControlNumberItemView = ControlBaseDataView.extend( { registerValidators: function() { ControlBaseDataView.prototype.registerValidators.apply( this, arguments ); var validationTerms = {}, model = this.model; [ 'min', 'max' ].forEach( function( term ) { var termValue = model.get( term ); if ( _.isFinite( termValue ) ) { validationTerms[ term ] = termValue; } } ); if ( ! jQuery.isEmptyObject( validationTerms ) ) { this.addValidator( new NumberValidator( { validationTerms: validationTerms } ) ); } } } ); module.exports = ControlNumberItemView; },{"elementor-controls/base-data":30,"elementor-validator/number":29}],47:[function(require,module,exports){ var ControlMultipleBaseItemView = require( 'elementor-controls/base-multiple' ), ControlOrderItemView; ControlOrderItemView = ControlMultipleBaseItemView.extend( { ui: function() { var ui = ControlMultipleBaseItemView.prototype.ui.apply( this, arguments ); ui.reverseOrderLabel = '.elementor-control-order-label'; return ui; }, changeLabelTitle: function() { var reverseOrder = this.getControlValue( 'reverse_order' ); this.ui.reverseOrderLabel.attr( 'title', elementor.translate( reverseOrder ? 'asc' : 'desc' ) ); }, onRender: function() { ControlMultipleBaseItemView.prototype.onRender.apply( this, arguments ); this.changeLabelTitle(); }, onInputChange: function() { this.changeLabelTitle(); } } ); module.exports = ControlOrderItemView; },{"elementor-controls/base-multiple":31}],48:[function(require,module,exports){ var ControlChooseView = require( 'elementor-controls/choose' ), ControlPopoverStarterView; ControlPopoverStarterView = ControlChooseView.extend( { ui: function() { var ui = ControlChooseView.prototype.ui.apply( this, arguments ); ui.popoverToggle = '.elementor-control-popover-toggle-toggle'; return ui; }, events: function() { return _.extend( ControlChooseView.prototype.events.apply( this, arguments ), { 'click @ui.popoverToggle': 'onPopoverToggleClick' } ); }, onPopoverToggleClick: function() { this.$el.next( '.elementor-controls-popover' ).toggle(); } } ); module.exports = ControlPopoverStarterView; },{"elementor-controls/choose":36}],49:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), RepeaterRowView; RepeaterRowView = Marionette.CompositeView.extend( { template: Marionette.TemplateCache.get( '#tmpl-elementor-repeater-row' ), className: 'repeater-fields', ui: { duplicateButton: '.elementor-repeater-tool-duplicate', editButton: '.elementor-repeater-tool-edit', removeButton: '.elementor-repeater-tool-remove', itemTitle: '.elementor-repeater-row-item-title' }, behaviors: { HandleInnerTabs: { behaviorClass: require( 'elementor-behaviors/inner-tabs' ) } }, triggers: { 'click @ui.removeButton': 'click:remove', 'click @ui.duplicateButton': 'click:duplicate', 'click @ui.itemTitle': 'click:edit' }, templateHelpers: function() { return { itemIndex: this.getOption( 'itemIndex' ) }; }, childViewContainer: '.elementor-repeater-row-controls', getChildView: function( item ) { var controlType = item.get( 'type' ); return elementor.getControlView( controlType ); }, childViewOptions: function() { return { elementSettingsModel: this.model }; }, checkConditions: function() { var self = this; self.collection.each( function( model ) { var conditions = model.get( 'conditions' ), parentConditions = model.get( 'parent_conditions' ), isVisible = true; if ( conditions ) { isVisible = elementor.conditions.check( conditions, self.model.attributes ); } if ( parentConditions ) { isVisible = elementor.conditions.check( parentConditions, self.getOption( 'parentModel' ).attributes ); } var child = self.children.findByModelCid( model.cid ); child.$el.toggleClass( 'elementor-panel-hide', ! isVisible ); } ); }, updateIndex: function( newIndex ) { this.itemIndex = newIndex; this.setTitle(); }, setTitle: function() { var self = this, titleField = self.getOption( 'titleField' ), title = ''; if ( titleField ) { var values = {}; self.children.each( function( child ) { if ( ! ( child instanceof ControlBaseDataView ) ) { return; } values[ child.model.get( 'name' ) ] = child.getControlValue(); } ); title = Marionette.TemplateCache.prototype.compileTemplate( titleField )( values ); } if ( ! title ) { title = elementor.translate( 'Item #{0}', [ self.getOption( 'itemIndex' ) ] ); } self.ui.itemTitle.html( title ); }, initialize: function( options ) { var self = this; self.elementSettingsModel = options.elementSettingsModel; self.itemIndex = 0; // Collection for Controls list self.collection = new Backbone.Collection( options.controlFields ); self.listenTo( self.model, 'change', self.checkConditions ); self.listenTo( self.getOption( 'parentModel' ), 'change', self.checkConditions ); if ( options.titleField ) { self.listenTo( self.model, 'change', self.setTitle ); } }, onRender: function() { this.setTitle(); this.checkConditions(); }, onChildviewResponsiveSwitcherClick: function( childView, device ) { if ( 'desktop' === device ) { elementor.getPanelView().getCurrentPageView().$el.toggleClass( 'elementor-responsive-switchers-open' ); } } } ); module.exports = RepeaterRowView; },{"elementor-behaviors/inner-tabs":68,"elementor-controls/base-data":30}],50:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), RepeaterRowView = require( 'elementor-controls/repeater-row' ), BaseSettingsModel = require( 'elementor-elements/models/base-settings' ), ControlRepeaterItemView; ControlRepeaterItemView = ControlBaseDataView.extend( { ui: { btnAddRow: '.elementor-repeater-add', fieldContainer: '.elementor-repeater-fields' }, events: function() { return { 'click @ui.btnAddRow': 'onButtonAddRowClick', 'sortstart @ui.fieldContainer': 'onSortStart', 'sortupdate @ui.fieldContainer': 'onSortUpdate', 'sortstop @ui.fieldContainer': 'onSortStop' }; }, childView: RepeaterRowView, childViewContainer: '.elementor-repeater-fields', templateHelpers: function() { return { data: _.extend( {}, this.model.toJSON(), { controlValue: [] } ) }; }, childViewOptions: function() { return { controlFields: this.model.get( 'fields' ), titleField: this.model.get( 'title_field' ), parentModel: this.elementSettingsModel // For parentConditions in repeaterRow }; }, createItemModel: function( attrs, options, controlView ) { options = options || {}; options.controls = controlView.model.get( 'fields' ); if ( ! attrs._id ) { attrs._id = elementor.helpers.getUniqueID(); } return new BaseSettingsModel( attrs, options ); }, fillCollection: function() { var controlName = this.model.get( 'name' ); this.collection = this.elementSettingsModel.get( controlName ); if ( ! ( this.collection instanceof Backbone.Collection ) ) { this.collection = new Backbone.Collection( this.collection, { // Use `partial` to supply the `this` as an argument, but not as context // the `_` i sa place holder for original arguments: `attrs` & `options` model: _.partial( this.createItemModel, _, _, this ) } ); // Set the value silent this.elementSettingsModel.set( controlName, this.collection, { silent: true } ); this.listenTo( this.collection, 'change', this.onRowControlChange ); this.listenTo( this.collection, 'update', this.onRowUpdate, this ); } }, initialize: function( options ) { ControlBaseDataView.prototype.initialize.apply( this, arguments ); this.fillCollection(); this.listenTo( this.collection, 'change', this.onRowControlChange ); this.listenTo( this.collection, 'update', this.onRowUpdate, this ); }, addRow: function( data, options ) { var id = elementor.helpers.getUniqueID(); if ( data instanceof Backbone.Model ) { data.set( '_id', id ); } else { data._id = id; } return this.collection.add( data, options ); }, editRow: function( rowView ) { if ( this.currentEditableChild ) { var currentEditable = this.currentEditableChild.getChildViewContainer( this.currentEditableChild ); currentEditable.removeClass( 'editable' ); // If the repeater contains TinyMCE editors, fire the `hide` trigger to hide floated toolbars currentEditable.find( '.elementor-wp-editor' ).each( function() { tinymce.get( this.id ).fire( 'hide' ); } ); } if ( this.currentEditableChild === rowView ) { delete this.currentEditableChild; return; } rowView.getChildViewContainer( rowView ).addClass( 'editable' ); this.currentEditableChild = rowView; this.updateActiveRow(); }, toggleMinRowsClass: function() { if ( ! this.model.get( 'prevent_empty' ) ) { return; } this.$el.toggleClass( 'elementor-repeater-has-minimum-rows', 1 >= this.collection.length ); }, updateActiveRow: function() { var activeItemIndex = 0; if ( this.currentEditableChild ) { activeItemIndex = this.currentEditableChild.itemIndex; } this.setEditSetting( 'activeItemIndex', activeItemIndex ); }, updateChildIndexes: function() { var collection = this.collection; this.children.each( function( view ) { view.updateIndex( collection.indexOf( view.model ) + 1 ); } ); }, onRender: function() { ControlBaseDataView.prototype.onRender.apply( this, arguments ); this.ui.fieldContainer.sortable( { axis: 'y', handle: '.elementor-repeater-row-tools' } ); this.toggleMinRowsClass(); }, onSortStart: function( event, ui ) { ui.item.data( 'oldIndex', ui.item.index() ); }, onSortStop: function( event, ui ) { // Reload TinyMCE editors (if exist), it's a bug that TinyMCE content is missing after stop dragging var self = this, sortedIndex = ui.item.index(); if ( -1 === sortedIndex ) { return; } var sortedRowView = self.children.findByIndex( ui.item.index() ), rowControls = sortedRowView.children._views; jQuery.each( rowControls, function() { if ( 'wysiwyg' === this.model.get( 'type' ) ) { sortedRowView.render(); delete self.currentEditableChild; return false; } } ); }, onSortUpdate: function( event, ui ) { var oldIndex = ui.item.data( 'oldIndex' ), model = this.collection.at( oldIndex ), newIndex = ui.item.index(); this.collection.remove( model ); this.addRow( model, { at: newIndex } ); }, onAddChild: function() { this.updateChildIndexes(); this.updateActiveRow(); }, onRemoveChild: function( childView ) { if ( childView === this.currentEditableChild ) { delete this.currentEditableChild; } this.updateChildIndexes(); this.updateActiveRow(); }, onRowUpdate: function( collection, event ) { // Simulate `changed` and `_previousAttributes` values var settings = this.elementSettingsModel, collectionCloned = collection.clone(), controlName = this.model.get( 'name' ); if ( event.add ) { collectionCloned.remove( event.changes.added[0] ); } else { collectionCloned.add( event.changes.removed[0], { at: event.index } ); } settings.changed = {}; settings.changed[ controlName ] = collection; settings._previousAttributes = {}; settings._previousAttributes[ controlName ] = collectionCloned.toJSON(); settings.trigger( 'change', settings, settings._pending ); delete settings.changed; delete settings._previousAttributes; this.toggleMinRowsClass(); }, onRowControlChange: function( model ) { // Simulate `changed` and `_previousAttributes` values var changed = Object.keys( model.changed ); if ( ! changed.length ) { return; } var collectionCloned = model.collection.toJSON(), modelIndex = model.collection.findIndex( model ), element = this._parent.model, settings = element.get( 'settings' ), controlName = this.model.get( 'name' ); // Save it with old values collectionCloned[ modelIndex ] = model._previousAttributes; settings.changed = {}; settings.changed[ controlName ] = model.collection; settings._previousAttributes = {}; settings._previousAttributes[ controlName ] = collectionCloned; settings.trigger( 'change', settings ); delete settings.changed; delete settings._previousAttributes; }, onButtonAddRowClick: function() { var defaults = {}; _.each( this.model.get( 'fields' ), function( field ) { defaults[ field.name ] = field['default']; } ); var newModel = this.addRow( defaults ), newChildView = this.children.findByModel( newModel ); this.editRow( newChildView ); this.render(); }, onChildviewClickRemove: function( childView ) { childView.model.destroy(); this.render(); }, onChildviewClickDuplicate: function( childView ) { var newModel = this.createItemModel( childView.model.toJSON(), {}, this ); this.addRow( newModel, { at: childView.itemIndex } ); this.render(); }, onChildviewClickEdit: function( childView ) { this.editRow( childView ); }, onAfterExternalChange: function() { // Update the collection with current value this.fillCollection(); ControlBaseDataView.prototype.onAfterExternalChange.apply( this, arguments ); } } ); module.exports = ControlRepeaterItemView; },{"elementor-controls/base-data":30,"elementor-controls/repeater-row":49,"elementor-elements/models/base-settings":61}],51:[function(require,module,exports){ var ControlBaseView = require( 'elementor-controls/base' ), ControlSectionItemView; ControlSectionItemView = ControlBaseView.extend( { ui: function() { var ui = ControlBaseView.prototype.ui.apply( this, arguments ); ui.heading = '.elementor-panel-heading'; return ui; }, triggers: { 'click': 'control:section:clicked' } } ); module.exports = ControlSectionItemView; },{"elementor-controls/base":33}],52:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlSelect2ItemView; ControlSelect2ItemView = ControlBaseDataView.extend( { getSelect2Options: function() { var placeholder = this.ui.select.children( 'option:first[value=""]' ).text(); return { allowClear: true, placeholder: placeholder }; }, onReady: function() { this.ui.select.select2( this.getSelect2Options() ); }, onBeforeDestroy: function() { if ( this.ui.select.data( 'select2' ) ) { this.ui.select.select2( 'destroy' ); } this.$el.remove(); } } ); module.exports = ControlSelect2ItemView; },{"elementor-controls/base-data":30}],53:[function(require,module,exports){ var ControlBaseUnitsItemView = require( 'elementor-controls/base-units' ), ControlSliderItemView; ControlSliderItemView = ControlBaseUnitsItemView.extend( { ui: function() { var ui = ControlBaseUnitsItemView.prototype.ui.apply( this, arguments ); ui.slider = '.elementor-slider'; return ui; }, events: function() { return _.extend( ControlBaseUnitsItemView.prototype.events.apply( this, arguments ), { 'slide @ui.slider': 'onSlideChange' } ); }, initSlider: function() { var size = this.getControlValue( 'size' ), unitRange = this.getCurrentRange(); this.ui.input.attr( unitRange ).val( size ); this.ui.slider.slider( _.extend( {}, unitRange, { value: size } ) ); }, resetSize: function() { this.setValue( 'size', '' ); this.initSlider(); }, onReady: function() { this.initSlider(); }, onSlideChange: function( event, ui ) { this.setValue( 'size', ui.value ); this.ui.input.val( ui.value ); }, onInputChange: function( event ) { var dataChanged = event.currentTarget.dataset.setting; if ( 'size' === dataChanged ) { this.ui.slider.slider( 'value', this.getControlValue( 'size' ) ); } else if ( 'unit' === dataChanged ) { this.resetSize(); } }, onBeforeDestroy: function() { if ( this.ui.slider.data( 'uiSlider' ) ) { this.ui.slider.slider( 'destroy' ); } this.$el.remove(); } } ); module.exports = ControlSliderItemView; },{"elementor-controls/base-units":32}],54:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlStructureItemView; ControlStructureItemView = ControlBaseDataView.extend( { ui: function() { var ui = ControlBaseDataView.prototype.ui.apply( this, arguments ); ui.resetStructure = '.elementor-control-structure-reset'; return ui; }, events: function() { return _.extend( ControlBaseDataView.prototype.events.apply( this, arguments ), { 'click @ui.resetStructure': 'onResetStructureClick' } ); }, templateHelpers: function() { var helpers = ControlBaseDataView.prototype.templateHelpers.apply( this, arguments ); helpers.getMorePresets = this.getMorePresets.bind( this ); return helpers; }, getCurrentEditedSection: function() { var editor = elementor.getPanelView().getCurrentPageView(); return editor.getOption( 'editedElementView' ); }, getMorePresets: function() { var parsedStructure = elementor.presetsFactory.getParsedStructure( this.getControlValue() ); return elementor.presetsFactory.getPresets( parsedStructure.columnsCount ); }, onInputChange: function() { this.getCurrentEditedSection().redefineLayout(); this.render(); }, onResetStructureClick: function() { this.getCurrentEditedSection().resetColumnsCustomSize(); } } ); module.exports = ControlStructureItemView; },{"elementor-controls/base-data":30}],55:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ); module.exports = ControlBaseDataView.extend( { setInputValue: function( input, value ) { // Make sure is string value // TODO: Remove in v1.6 value = '' + value; this.$( input ).prop( 'checked', this.model.get( 'return_value' ) === value ); } } ); },{"elementor-controls/base-data":30}],56:[function(require,module,exports){ var ControlBaseView = require( 'elementor-controls/base' ), ControlTabItemView; ControlTabItemView = ControlBaseView.extend( { triggers: { 'click': { event: 'control:tab:clicked', stopPropagation: false } } } ); module.exports = ControlTabItemView; },{"elementor-controls/base":33}],57:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlWPWidgetItemView; ControlWPWidgetItemView = ControlBaseDataView.extend( { ui: function() { var ui = ControlBaseDataView.prototype.ui.apply( this, arguments ); ui.form = 'form'; ui.loading = '.wp-widget-form-loading'; return ui; }, events: function() { return { 'keyup @ui.form :input': 'onFormChanged', 'change @ui.form :input': 'onFormChanged' }; }, onFormChanged: function() { var idBase = 'widget-' + this.model.get( 'id_base' ), settings = this.ui.form.elementorSerializeObject()[ idBase ].REPLACE_TO_ID; this.setValue( settings ); }, onReady: function() { var self = this; elementor.ajax.send( 'editor_get_wp_widget_form', { data: { // Fake Widget ID id: self.model.cid, widget_type: self.model.get( 'widget' ), data: JSON.stringify( self.elementSettingsModel.toJSON() ) }, success: function( data ) { self.ui.form.html( data ); // WP >= 4.8 if ( wp.textWidgets ) { self.ui.form.addClass( 'open' ); var event = new jQuery.Event( 'widget-added' ); wp.textWidgets.handleWidgetAdded( event, self.ui.form ); wp.mediaWidgets.handleWidgetAdded( event, self.ui.form ); // WP >= 4.9 if ( wp.customHtmlWidgets ) { wp.customHtmlWidgets.handleWidgetAdded( event, self.ui.form ); } } elementor.hooks.doAction( 'panel/widgets/' + self.model.get( 'widget' ) + '/controls/wp_widget/loaded', self ); } } ); } } ); module.exports = ControlWPWidgetItemView; },{"elementor-controls/base-data":30}],58:[function(require,module,exports){ var ControlBaseDataView = require( 'elementor-controls/base-data' ), ControlWysiwygItemView; ControlWysiwygItemView = ControlBaseDataView.extend( { events: function() { return _.extend( ControlBaseDataView.prototype.events.apply( this, arguments ), { 'keyup textarea.elementor-wp-editor': 'onBaseInputChange' } ); }, // List of buttons to move {buttonToMove: afterButton} buttons: { addToBasic: { underline: 'italic' }, addToAdvanced: {}, moveToAdvanced: { blockquote: 'removeformat', alignleft: 'blockquote', aligncenter: 'alignleft', alignright: 'aligncenter' }, moveToBasic: {}, removeFromBasic: [ 'unlink', 'wp_more' ], removeFromAdvanced: [] }, initialize: function() { ControlBaseDataView.prototype.initialize.apply( this, arguments ); var self = this; self.editorID = 'elementorwpeditor' + self.cid; // Wait a cycle before initializing the editors. _.defer( function() { // Initialize QuickTags, and set as the default mode. quicktags( { buttons: 'strong,em,del,link,img,close', id: self.editorID } ); if ( elementor.config.rich_editing_enabled ) { switchEditors.go( self.editorID, 'tmce' ); } delete QTags.instances[ 0 ]; } ); if ( ! elementor.config.rich_editing_enabled ) { self.$el.addClass( 'elementor-rich-editing-disabled' ); return; } var editorConfig = { id: self.editorID, selector: '#' + self.editorID, setup: function( editor ) { // Save the bind callback to allow overwrite it externally self.saveEditor = self.saveEditor.bind( self, editor ); editor.on( 'keyup change undo redo SetContent', self.saveEditor ); } }; tinyMCEPreInit.mceInit[ self.editorID ] = _.extend( _.clone( tinyMCEPreInit.mceInit.elementorwpeditor ), editorConfig ); if ( ! elementor.config.tinymceHasCustomConfig ) { self.rearrangeButtons(); } }, saveEditor: function( editor ) { editor.save(); this.setValue( editor.getContent() ); }, attachElContent: function() { var editorTemplate = elementor.config.wp_editor.replace( /elementorwpeditor/g, this.editorID ).replace( '%%EDITORCONTENT%%', this.getControlValue() ); this.$el.html( editorTemplate ); return this; }, moveButtons: function( buttonsToMove, from, to ) { if ( ! to ) { to = from; from = null; } _.each( buttonsToMove, function( afterButton, button ) { var afterButtonIndex = to.indexOf( afterButton ); if ( from ) { var buttonIndex = from.indexOf( button ); if ( -1 === buttonIndex ) { throw new ReferenceError( 'Trying to move non-existing button `' + button + '`' ); } from.splice( buttonIndex, 1 ); } if ( -1 === afterButtonIndex ) { throw new ReferenceError( 'Trying to move button after non-existing button `' + afterButton + '`' ); } to.splice( afterButtonIndex + 1, 0, button ); } ); }, rearrangeButtons: function() { var editorProps = tinyMCEPreInit.mceInit[ this.editorID ], editorBasicToolbarButtons = editorProps.toolbar1.split( ',' ), editorAdvancedToolbarButtons = editorProps.toolbar2.split( ',' ); editorBasicToolbarButtons = _.difference( editorBasicToolbarButtons, this.buttons.removeFromBasic ); editorAdvancedToolbarButtons = _.difference( editorAdvancedToolbarButtons, this.buttons.removeFromAdvanced ); this.moveButtons( this.buttons.moveToBasic, editorAdvancedToolbarButtons, editorBasicToolbarButtons ); this.moveButtons( this.buttons.moveToAdvanced, editorBasicToolbarButtons, editorAdvancedToolbarButtons ); this.moveButtons( this.buttons.addToBasic, editorBasicToolbarButtons ); this.moveButtons( this.buttons.addToAdvanced, editorAdvancedToolbarButtons ); editorProps.toolbar1 = editorBasicToolbarButtons.join( ',' ); editorProps.toolbar2 = editorAdvancedToolbarButtons.join( ',' ); }, onAfterExternalChange: function() { var controlValue = this.getControlValue(); tinymce.get( this.editorID ).setContent( controlValue ); // Update also the plain textarea jQuery( '#' + this.editorID ).val( controlValue ); }, onBeforeDestroy: function() { // Remove TinyMCE and QuickTags instances delete QTags.instances[ this.editorID ]; if ( ! elementor.config.rich_editing_enabled ) { return; } tinymce.EditorManager.execCommand( 'mceRemoveEditor', true, this.editorID ); // Cleanup PreInit data delete tinyMCEPreInit.mceInit[ this.editorID ]; delete tinyMCEPreInit.qtInit[ this.editorID ]; } } ); module.exports = ControlWysiwygItemView; },{"elementor-controls/base-data":30}],59:[function(require,module,exports){ /* global ElementorConfig */ var App; Marionette.TemplateCache.prototype.compileTemplate = function( rawTemplate, options ) { options = { evaluate: /<#([\s\S]+?)#>/g, interpolate: /{{{([\s\S]+?)}}}/g, escape: /{{([^}]+?)}}(?!})/g }; return _.template( rawTemplate, options ); }; App = Marionette.Application.extend( { helpers: require( 'elementor-editor-utils/helpers' ), heartbeat: require( 'elementor-editor-utils/heartbeat' ), imagesManager: require( 'elementor-editor-utils/images-manager' ), debug: require( 'elementor-editor-utils/debug' ), schemes: require( 'elementor-editor-utils/schemes' ), presetsFactory: require( 'elementor-editor-utils/presets-factory' ), templates: require( 'elementor-templates/manager' ), ajax: require( 'elementor-editor-utils/ajax' ), conditions: require( 'elementor-editor-utils/conditions' ), hotKeys: require( 'elementor-utils/hot-keys' ), history: require( 'modules/history/assets/js/module' ), channels: { editor: Backbone.Radio.channel( 'ELEMENTOR:editor' ), data: Backbone.Radio.channel( 'ELEMENTOR:data' ), panelElements: Backbone.Radio.channel( 'ELEMENTOR:panelElements' ), dataEditMode: Backbone.Radio.channel( 'ELEMENTOR:editmode' ), deviceMode: Backbone.Radio.channel( 'ELEMENTOR:deviceMode' ), templates: Backbone.Radio.channel( 'ELEMENTOR:templates' ) }, // Exporting modules that can be used externally modules: { element: { Model: require( 'elementor-elements/models/element' ) }, ControlsStack: require( 'elementor-views/controls-stack' ), Module: require( 'elementor-utils/module' ), RepeaterRowView: require( 'elementor-controls/repeater-row' ), SettingsModel: require( 'elementor-elements/models/base-settings' ), WidgetView: require( 'elementor-elements/views/widget' ), panel: { Menu: require( 'elementor-panel/pages/menu/menu' ) }, controls: { Base: require( 'elementor-controls/base' ), BaseData: require( 'elementor-controls/base-data' ), BaseMultiple: require( 'elementor-controls/base-multiple' ), Button: require( 'elementor-controls/button' ), Color: require( 'elementor-controls/color' ), Dimensions: require( 'elementor-controls/dimensions' ), Image_dimensions: require( 'elementor-controls/image-dimensions' ), Media: require( 'elementor-controls/media' ), Slider: require( 'elementor-controls/slider' ), Wysiwyg: require( 'elementor-controls/wysiwyg' ), Choose: require( 'elementor-controls/choose' ), Url: require( 'elementor-controls/base-multiple' ), Font: require( 'elementor-controls/font' ), Section: require( 'elementor-controls/section' ), Tab: require( 'elementor-controls/tab' ), Repeater: require( 'elementor-controls/repeater' ), Wp_widget: require( 'elementor-controls/wp_widget' ), Icon: require( 'elementor-controls/icon' ), Gallery: require( 'elementor-controls/gallery' ), Select2: require( 'elementor-controls/select2' ), Date_time: require( 'elementor-controls/date-time' ), Code: require( 'elementor-controls/code' ), Box_shadow: require( 'elementor-controls/box-shadow' ), Text_shadow: require( 'elementor-controls/box-shadow' ), Structure: require( 'elementor-controls/structure' ), Animation: require( 'elementor-controls/select2' ), Hover_animation: require( 'elementor-controls/select2' ), Order: require( 'elementor-controls/order' ), Switcher: require( 'elementor-controls/switcher' ), Number: require( 'elementor-controls/number' ), Popover_toggle: require( 'elementor-controls/popover-toggle' ) }, saver: { footerBehavior: require( './components/saver/behaviors/footer-saver' ) }, templateLibrary: { ElementsCollectionView: require( 'elementor-panel/pages/elements/views/elements' ) } }, backgroundClickListeners: { popover: { element: '.elementor-controls-popover', ignore: '.elementor-control-popover-toggle-toggle, .elementor-control-popover-toggle-toggle-label' } }, _defaultDeviceMode: 'desktop', addControlView: function( controlID, ControlView ) { this.modules.controls[ controlID[0].toUpperCase() + controlID.slice( 1 ) ] = ControlView; }, checkEnvCompatibility: function() { return this.envData.gecko || this.envData.webkit; }, getElementData: function( modelElement ) { var elType = modelElement.get( 'elType' ); if ( 'widget' === elType ) { var widgetType = modelElement.get( 'widgetType' ); if ( ! this.config.widgets[ widgetType ] ) { return false; } return this.config.widgets[ widgetType ]; } if ( ! this.config.elements[ elType ] ) { return false; } return this.config.elements[ elType ]; }, getElementControls: function( modelElement ) { var self = this, elementData = self.getElementData( modelElement ); if ( ! elementData ) { return false; } var isInner = modelElement.get( 'isInner' ), controls = {}; _.each( elementData.controls, function( controlData, controlKey ) { if ( isInner && controlData.hide_in_inner || ! isInner && controlData.hide_in_top ) { return; } controls[ controlKey ] = _.extend( {}, self.config.controls[ controlData.type ], controlData ); } ); return controls; }, getControlView: function( controlID ) { var capitalizedControlName = controlID[0].toUpperCase() + controlID.slice( 1 ), View = this.modules.controls[ capitalizedControlName ]; if ( ! View ) { var controlData = this.config.controls[ controlID ], isUIControl = -1 !== controlData.features.indexOf( 'ui' ); View = this.modules.controls[ isUIControl ? 'Base' : 'BaseData' ]; } return View; }, getPanelView: function() { return this.getRegion( 'panel' ).currentView; }, initEnvData: function() { this.envData = _.pick( tinymce.EditorManager.Env, [ 'desktop', 'webkit', 'gecko', 'ie', 'opera' ] ); }, initComponents: function() { var EventManager = require( 'elementor-utils/hooks' ), Settings = require( 'elementor-editor/components/settings/settings' ), Saver = require( 'elementor-editor/components/saver/manager' ), Notifications = require( 'elementor-editor-utils/notifications' ); this.hooks = new EventManager(); this.saver = new Saver(); this.settings = new Settings(); /** * @deprecated - use `this.settings.page` instead */ this.pageSettings = this.settings.page; this.templates.init(); this.initDialogsManager(); this.notifications = new Notifications(); this.ajax.init(); }, initDialogsManager: function() { this.dialogsManager = new DialogsManager.Instance(); }, initElements: function() { var ElementCollection = require( 'elementor-elements/collections/elements' ), config = this.config.data; // If it's an reload, use the not-saved data if ( this.elements ) { config = this.elements.toJSON(); } this.elements = new ElementCollection( config ); }, initPreview: function() { var $ = jQuery; this.$previewWrapper = $( '#elementor-preview' ); this.$previewResponsiveWrapper = $( '#elementor-preview-responsive-wrapper' ); var previewIframeId = 'elementor-preview-iframe'; // Make sure the iFrame does not exist. if ( ! this.$preview ) { this.$preview = $( '