/* globals ajaxurl, jQuery, wp */ /* jshint esversion: 6 */ (function($) { "use strict"; var MfnBuilder = (function($) { var $builder = $('#mfn-builder'), $desktop = $('#mfn-desk'), $modal = $('.mfn-modal', $builder), $currentModal = false, $sender = false, // curent action sender $guttenberg = false; var uids = [], openedModals = [], // array of opened modals loading = true, // prevent some functions until window load timerSerch = false; // search timer // previewTab = false; // builder preview window /** * Sortable */ var sort = { // sort.desktop() desktop: function(){ $desktop.sortable({ items: '.mfn-section', cancel: '.dropdown-wrapper', cursor: 'move', cursorAt: { top:20, left:20 }, distance: 5, opacity: 0.9, forcePlaceholderSize: true, placeholder: 'mfn-placeholder', forceHelperSize: false, helper: sort.helper }); }, // sort.section() section: function( $section ){ $section.sortable({ items: '.mfn-wrap, .mfn-section-new', cancel: '.mfn-section-new', connectWith: '.mfn-sortable-section', cursor: 'move', cursorAt: { top:20, left:20 }, distance: 5, opacity: 0.9, forcePlaceholderSize: true, placeholder: 'mfn-placeholder', forceHelperSize: false, helper: sort.helper, over: sort.over, receive: sort.sectionReceive, out: sort.sectionOut }); }, // sort.helper() helper: function( event, ui ) { var title = ui.data('title'); if( ui.hasClass('divider') ){ title = ui.data('title-divider'); } return $('
'+ title +'
'); }, // sort.over() over: function( event, ui ){ var size = ui.item.attr('data-size'), parentW = ui.placeholder.parent().width(), margins = parentW * 0.01, // margin 2x 0.5% width = 0; width = ( parentW * size ) - margins ; ui.placeholder.width( width ); }, // sort.sectionReceive() sectionReceive: function( event, ui ){ var $section = ui.item.closest('.mfn-section'); var id = $section.find( '.mfn-section-id' ).val(); ui.item.find('.mfn-wrap-parent').val( id ); $section.removeClass('empty'); }, // sort.sectionOut() sectionOut: function( event, ui ){ if( ! ui.sender.find('.mfn-wrap').length ){ ui.sender.closest('.mfn-section').addClass('empty'); } }, // sort.wrap() wrap: function( $wrap ){ $wrap.sortable({ items: '.mfn-item', // .mfn-wrap-new // cancel: '.mfn-wrap-new', connectWith: '.mfn-sortable-wrap', cursor: 'move', cursorAt: { top:20, left:20 }, distance: 5, opacity: 0.9, forcePlaceholderSize: true, placeholder: 'mfn-placeholder', forceHelperSize: false, helper: sort.helper, over: sort.over, receive: sort.wrapReceive, out: sort.wrapOut }); }, // sort.wrapReceive() wrapReceive: function( event, ui ){ var $wrap = ui.item.closest('.mfn-wrap'); var id = $wrap.find( '.mfn-wrap-id' ).val(); ui.item.find('.mfn-item-parent').val( id ); $wrap.removeClass('empty'); }, // sort.wrapOut() wrapOut: function( event, ui ){ if( ! ui.sender.find('.mfn-item').length ){ ui.sender.closest('.mfn-wrap').addClass('empty'); } } }; /** * Section */ var section = { // section.add() add: function( $el ) { var $clone = '', $section = $el.closest('.mfn-section'); enableBeforeUnload(); $el.addClass('loading'); $.ajax( ajaxurl, { type : "POST", data : { 'mfn-builder-nonce': $('input[name="mfn-builder-nonce"]').val(), action: 'mfn_builder_add_element', type: 'section' } }).done(function(response){ $el.removeClass('loading'); // parse html of response $clone = $($.parseHTML( response )); // first, prev or next if ( $el.hasClass('prev') ) { $section.before($clone).siblings('.mfn-section').fadeIn(300); } else if( $el.hasClass('next') ) { $section.after($clone).siblings('.mfn-section').fadeIn(300); } else { $desktop.append($clone).find('.mfn-section').fadeIn(300); } // enable sortable sort.section( $clone.find('.mfn-sortable-section') ); // hide intro screen if ( $('.mfn-section', $desktop).length ) { $builder.removeClass( 'empty' ); } // trigger resize to recalculate some stuff triggerResize(); }); }, // section.clone() clone: function( $el ){ var $element = $el.closest('.mfn-section'), $clone = false; var oldUid = $element.find('.mfn-section-id').val(), newUid = uniqueID(); var wrapOldUid = '', wrapNewUid = ''; enableBeforeUnload(); // destroy sortable, clone element $element.find('.mfn-sortable').sortable('destroy'); $clone = $element.clone(true); // reinitialize sortable sort.section( $element.find('.mfn-sortable-section') ); sort.section( $clone.find('.mfn-sortable-section') ); sort.wrap( $element.find('.mfn-sortable-wrap') ); sort.wrap( $clone.find('.mfn-sortable-wrap') ); // set section ID and wrap parent ID $clone.find('.mfn-section-id, .mfn-wrap-parent').val( newUid ); // replace uid in field names and data-names element.fields.uid( $clone, oldUid, newUid ); // set wrap ID and items parent ID $clone.find('.mfn-wrap').each(function() { var $wrap = $(this); wrapOldUid = $wrap.find('.mfn-wrap-id').val(); wrapNewUid = uniqueID(); $wrap.find('.mfn-wrap-id, .mfn-item-parent').val( wrapNewUid ); // replace uid in field names and data-names element.fields.uid( $wrap, wrapOldUid, wrapNewUid ); }); // set items ID element.fields.itemUid( $clone ); // insert after current section $element.after( $clone ); // blink blink( $clone ); // trigger resize to recalculate some stuff triggerResize(); }, // section.preBuilt() preBuilt: function( $el ){ $sender = $el.closest('.mfn-section'); preBuiltSections.modal.open(); }, // section.template() template: function( $el ){ $sender = $el.closest('.mfn-section'); exportImport.modal.open('templates'); }, // section.hide() hide: function( $el ){ var $element = $el.closest('.mfn-section'), $input = $element.find('input[name$="[hide]"], input[data-name$="[hide]"]'); var name; if ( $element.hasClass('hide') ) { // show $element.removeClass('hide'); $('.label', $el).text( $el.data('hide') ); $input.val(0); } else { // hide $element.addClass('hide'); $('.label', $el).text( $el.data('show') ); $input.val(1); name = $input.attr('data-name'); if( name ){ $input.attr('name', name).removeAttr('data-name'); } } }, // section.collapse() collapse: function( $el ){ var $element = $el.closest('.mfn-section'), $content = $('.section-content', $element), $input = $element.find('input[name$="[collapse]"], input[data-name$="[collapse]"]'); var currentHeight = 0; if ( $element.hasClass('collapse') ) { // expand $content.height('auto'); currentHeight = $content.height(); $content.height(0); $content.height(currentHeight); $element.addClass('is-collapsing'); setTimeout(function(){ $element.removeClass('collapse is-collapsing'); $content.height('auto'); }, 300); $('.label', $el).text( $el.data('hide') ); $input.val(0); } else { // hide $content.height( $content.height() ); $content.outerHeight(0); $element.addClass('collapse'); $('.label', $el).text( $el.data('show') ); $input.val(1); name = $input.attr('data-name'); if( name ){ $input.attr('name', name).removeAttr('data-name'); } } // trigger resize to recalculate some stuff triggerResize(); }, // section.addRow() addRow: { // section.addRow.mouseEnter() mouseEnter: function( $el ){ $el.closest('.mfn-section').addClass('add-section-'+ $el.data('position')); }, // section.addRow.mouseLeave() mouseLeave: function( $el ){ $el.closest('.mfn-section').removeClass('add-section-'+ $el.data('position')); } }, // section.move() move: { // section.move.up() up: function( $el ){ var $element = $el.closest('.mfn-section'); $element.prev().insertAfter( $element ); }, // section.move.down() down: function( $el ){ var $element = $el.closest('.mfn-section'); $element.next().insertBefore( $element ); }, }, // section.info() info: function( $el ){ var $info = $('.mfn-section-info', $sender), $headerLabel = $('.header-label', $sender); var uid = $('.mfn-section-id', $sender).val(), title = $('[name="mfn-section['+uid+'][title]"]', $el).val() || '', styles = ''; var attr = {}, keys = { 'bg_image' : 'style:.mcb-section-mfnuidelement:background-image', 'bg_color' : 'style:.mcb-section-mfnuidelement:background-color', 'bg_position' : 'style:.mcb-section-mfnuidelement:background-position', 'style' : 'style', 'class' : 'classes', 'section_id' : 'custom_id', }; $.each( keys, function( keyOld, keyNew ) { if( $('[name="mfn-section['+uid+']['+keyOld+']"]', $el).val() ){ attr[keyOld] = $('[name="mfn-section['+uid+']['+keyOld+']"]', $el).val(); } else if( $('[name="mfn-section['+uid+']['+keyNew+']"]', $el).val() ){ attr[keyOld] = $('[name="mfn-section['+uid+']['+keyNew+']"]', $el).val(); } else { attr[keyOld] = ''; } }); if( 'no-repeat;center top;fixed;;still' == attr.bg_position ){ attr.bg_position = 'fixed'; } else if( 'no-repeat;center;fixed;cover;still' == attr.bg_position ){ attr.bg_position = 'fixed'; } else if( 'no-repeat;center top;fixed;cover' == attr.bg_position ){ attr.bg_position = 'parallax'; } else { attr.bg_position = attr.bg_position.split(";"); attr.bg_position = attr.bg_position[1]; } // section title bar if( attr.section_id ){ attr.section_id = '#' + attr.section_id; } $( '.header-label-title', $headerLabel ).text(title); $( '.header-label-hashtag', $headerLabel ).text(attr.section_id); // section info $( '.mfn-info-bg-image', $info ).attr('src', attr.bg_image); $( '.mfn-info-bg-color', $info ).text(attr.bg_color); $( '.mfn-info-bg-color-preview', $info ).css('background-color', attr.bg_color); $( '.mfn-info-bg-position', $info ).text(attr.bg_position); // custom $( '.mfn-info-custom-class', $info ).text(attr.class); $( '.mfn-info-custom-id', $info ).text(attr.section_id); if( attr.class ){ $( '.mfn-info-custom-class', $info ).removeClass( 'hide' ); } else { $( '.mfn-info-custom-class', $info ).addClass( 'hide' ); } if( attr.class || attr.section_id ){ $( '.dropdown-group-custom', $info ).removeClass( 'hide' ); } else { $( '.dropdown-group-custom', $info ).addClass( 'hide' ); } // styles $( '.mfn-info-style', $info ).empty(); $('.checkboxes.pseudo .active', $el).each(function(){ styles += '
  • '+ $(this).text() +'
  • '; }); if( styles ){ $( '.dropdown-group-style', $info ).removeClass( 'hide' ); $( '.mfn-info-style', $info ).html( styles ); } else { $( '.dropdown-group-style', $info ).addClass( 'hide' ); } // section classes $sender.removeClass('full-width'); if( attr.style && -1 != attr.style.indexOf('full-') ){ $sender.addClass('full-width'); } }, // section.menu() menu: function( $el ){ if( $builder.hasClass('hover-effects') ){ return false; } $el.closest('.mfn-option-dropdown').toggleClass('hover'); } }; /** * Wrap */ var wrap = { // wrap.add() add: function( $el, divider, size ){ var $clone = '', $parent = $el.closest('.mfn-section'), $parentID = $parent.find('.mfn-section-id').val(); enableBeforeUnload(); divider = typeof divider !== 'undefined' ? divider : false; size = typeof size !== 'undefined' ? size : false; $el.addClass('loading'); $.ajax( ajaxurl, { type : "POST", data : { 'mfn-builder-nonce': $('input[name="mfn-builder-nonce"]').val(), action: 'mfn_builder_add_element', type: 'wrap' } }).done(function(response){ $el.removeClass('loading'); // parse html of response $clone = $($.parseHTML( response )); // set cloned wrap as divider if ( divider ) { $clone.addClass('divider') .find('.mfn-wrap-size').val('divider'); } // set size if ( size ) { $clone.attr('data-size', sizeLabel2Index[size]); $clone.find('.mfn-wrap-size').val(size); $clone.find('.mfn-element-size-label').first().text(size); } // set wrap ID and parent section ID $clone.find('.mfn-wrap-parent').val( $parentID ); // section is no longer empty $parent.removeClass('empty'); // insert at the end of target section $parent.find('.mfn-sortable-section') .append($clone).find('.mfn-wrap').fadeIn(300); // enable sortable if ( ! divider ) { sort.wrap( $clone.find('.mfn-sortable-wrap') ); } // blink blink( $clone ); // trigger resize to recalculate some stuff triggerResize(); }); }, // wrap.predefined() predefined: function( $el ){ var layout = $el.attr('data-tooltip'); layout = layout.split(' | '); $.each( layout, function(i, obj){ wrap.add( $el, false, layout[i] ); }); }, // wrap.clone() clone: function( $el ) { var $element = $el.closest('.mfn-wrap'), $clone = false; var oldUid = $element.find('.mfn-wrap-id').val(), newUid = uniqueID(); enableBeforeUnload(); // destroy sortable, clone element $element.find('.mfn-sortable').sortable('destroy'); $clone = $element.clone(true); $clone.removeClass('hover'); // reinitialize sortable sort.wrap( $element.find('.mfn-sortable-wrap') ); sort.wrap( $clone.find('.mfn-sortable-wrap') ); // set wrap ID and items parent ID $clone.find('.mfn-wrap-id, .mfn-item-parent').val( newUid ); // replace uid in field names and data-names element.fields.uid( $clone, oldUid, newUid ); // set items ID element.fields.itemUid( $clone ); // insert after current wrap $element.after( $clone ); // blink blink( $clone ); // trigger resize to recalculate some stuff triggerResize(); }, // wrap.mouseEnter() mouseEnter: function( $el ){ $el.addClass('hover'); }, // wrap.mouseLeave() mouseLeave: function( $el ){ $el.removeClass('hover'); } }; /** * Item */ var item = { // item.add() add: function( $el ){ var position = $el.data('position') || ''; // set action sender $sender = $el.closest('.mfn-wrap'); $sender.attr('data-add-item', position); // open modal modal.open( $('.modal-add-items', $builder) ); $('.mfn-search', $currentModal).focus(); }, // item.clone() clone: function( $el ) { var $element = $el.closest('.mfn-item'), $clone = $element.clone(true) var oldUid = $element.find('.mfn-item-id').val(), newUid = uniqueID(); enableBeforeUnload(); $clone.removeClass('hover'); // set new ID $clone.find('.mfn-item-id').val( newUid ); // replace uid in field names and data-names element.fields.uid( $clone, oldUid, newUid ); // insert after current item $element.after( $clone ); // blink blink( $clone ); // trigger resize to recalculate some stuff triggerResize(); // trigger custom event $(document).trigger('mfn:builder:item:clone', [$clone, oldUid]); }, modal: { // item.modal.add() add: function( $el ){ var $target = $sender.find('.mfn-sortable-wrap').first(), $li = $el.parent('li'), $clone = false; var parentID = $sender.find('.mfn-wrap-id').val(), parentSize = $sender.closest('.mfn-wrap').attr('data-size'), type = $el.parent('li').attr('data-type'), uid = uniqueID(); enableBeforeUnload(); $li.addClass('loading'); $.ajax( ajaxurl, { type : "POST", data : { 'mfn-builder-nonce': $('input[name="mfn-builder-nonce"]').val(), action: 'mfn_builder_add_element', type: type } }).done(function(response){ $li.removeClass('loading'); modal.close(); // parse html of response $clone = $($.parseHTML( response )); // close modal modal.close(); // set item ID and parent wrap ID $clone.find('.mfn-item-parent').val( parentID ); // small wrap fix | if wrap is smaller or equal 1/4 add 1/1 item if ( parentSize <= 0.5 ) { $clone.attr('data-size', 1); $clone.find('input.mfn-item-size').val('1/1'); $clone.find('.mfn-element-size-label').text('1/1'); } // wrap is no longer empty $sender.removeClass('empty'); // insert at the end of target wrap if( 'before' == $sender.attr('data-add-item') ){ $target.prepend($clone).find('.mfn-item'); } else { $target.append($clone).find('.mfn-item'); } // blink blink( $clone ); // trigger resize to recalculate some stuff triggerResize(); // trigger custom event $(document).trigger('mfn:builder:item:add', [$clone]); }); }, // item.modal.search() search: function( value ){ var $items = $('.mfn-items-list li', $currentModal); value = value.replace(/ /g, '_').toLowerCase(); if( value ){ $items.filter('[data-type*=' + value + ']').show(); $items.not('[data-type*=' + value + ']').hide(); $('.modalbox-tabs li', $currentModal).removeClass('active'); } else { $items.show(); $('.modalbox-tabs li:first', $currentModal).addClass('active'); } // 'text' == alias for column if( ['text', 'tex', 'te', 't'].includes( value ) ){ $items.filter('[data-type*=column]').show(); } }, // item.modal.searchTimer() searchTimer: function( $input ){ clearTimeout( timerSerch ); timerSerch = setTimeout(function() { item.modal.search( $input.val() ); }, 300, $input); }, // item.modal.tabs() tabs: function( $el ){ var $items = $('.mfn-items-list', $currentModal); var filter = $el.attr('data-filter'); // clear search field $('.mfn-search', $currentModal).val(''); // add active on tab click and filter $el.addClass('active') .siblings().removeClass('active'); if ( '*' == filter ) { $items.find('li').show(); if( $('body').hasClass('post-type-template') ){ templatesPostType.set(); } } else { $items.find('li.category-' + filter).show(); $items.find('li').not('.category-' + filter).hide(); } }, // item.modal.close() close: function(){ $('.modalbox-tabs li', $currentModal).removeClass('active') .first().children('a').trigger('click'); } }, // item.preview() preview: function( $el ){ var type = $sender.attr('data-type'); var $preview = $('.item-preview', $sender), $tabs = $('.preview-tabs', $el), $images = $('.preview-images', $el); var image = $('.preview-image', $el).val(), title = $('.preview-title', $el).val(), subtitle = $('.preview-subtitle', $el).val(), content = $('.preview-content', $el).val(), style = $('.preview-style', $el).val(), number = $('.preview-number', $el).val(), category = $('.preview-category option:selected', $el).text(), categoryAll = $('.preview-category-all', $el).val(), icon = $('.preview-icon', $el).val(), align = $('.preview-align input:checked', $el).val(), placeholder = '', tabs = '', images = ''; // values if( ['code','content','fancy_divider','map','map_basic','sidebar_widget','slider_plugin','video'].includes(type) ){ // these items has the placeholder image image = 'placeholder'; } else { $( '.item-preview-image', $preview ).attr('src', image); } $( '.item-preview-title', $preview ).text(title); $( '.mfn-item-label', $sender ).text(title); // label used in simple view $( '.item-preview-subtitle', $preview ).text(subtitle); $( '.item-preview-number', $preview ).text(number); // align $preview.removeClass('align- align-left align-center align-right align-justify'); if( align ){ $preview.addClass( 'align-' + align ); } // style if( ['blog','portfolio'].includes(type) ){ if( ! style ){ style = 'grid'; } style = style.replace(/[, ]/g, '-'); placeholder = $( '.item-preview-placeholder', $preview ).attr('data-dir'); placeholder += style + '.svg'; $( '.item-preview-placeholder', $preview ).attr('src', placeholder); } // icon if( ['counter','icon_box','list'].includes(type) && image ){ // image replaces icon in some items icon = false; } $( '.item-preview-icon i', $preview ).attr('class', icon); // category if( categoryAll ){ category = categoryAll; } $( '.item-preview-category', $preview ).text(category); // content if( content ){ var excerpt; if( ['column','visual'].includes(type) ){ var allowed_tags = '