jQuery(document).ready(function($) { // Prepare data var $generator = $('#su-generator'), $search = $('#su-generator-search'), $filter = $('#su-generator-filter'), $filters = $filter.children('a'), $choices = $('#su-generator-choices'), $choice = $choices.find('span'), $settings = $('#su-generator-settings'), $prefix = $('#su-compatibility-mode-prefix'), $result = $('#su-generator-result'), $selected = $('#su-generator-selected'), mce_selection = ''; // Hotkey if (typeof $.hotkeys == 'object' && $.hotkeys.version === '(beta)(0.0.3)' && su_generator.hotkey) { $.hotkeys.add(su_generator.hotkey, function() { $('.su-generator-button').trigger('click'); }); } // Generator button $('body').on('click', '.su-generator-button', function(e) { e.preventDefault(); // Save the target window.su_generator_target = $(this).data('target'); // Get open shortcode var shortcode = $(this).data('shortcode'); // Open magnificPopup $(this).magnificPopup({ type: 'inline', alignTop: true, callbacks: { open: function() { // Open queried shortcode if (shortcode) $choice.filter('[data-shortcode="' + shortcode + '"]').trigger('click'); // Focus search field when popup is opened else window.setTimeout(function() { $search.focus(); }, 200); // Change z-index $('body').addClass('su-mfp-shown'); // Save selection mce_selection = (typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor != null && tinyMCE.activeEditor.hasOwnProperty('selection')) ? tinyMCE.activeEditor.selection.getContent({ format: "text" }) : ''; }, close: function() { // Clear search field $search.val(''); // Hide settings $settings.html('').hide(); // Remove narrow class $generator.removeClass('su-generator-narrow'); // Show filters $filter.show(); // Show choices panel $choices.show(); $choice.show(); // Clear selection mce_selection = ''; // Change z-index $('body').removeClass('su-mfp-shown'); } } }).magnificPopup('open'); }); // Filters $filters.click(function(e) { // Prepare data var filter = $(this).data('filter'); // If filter All, show all choices if (filter === 'all') $choice.css({ opacity: 1 }).removeClass('su-generator-choice-first'); // Else run search else { var regex = new RegExp(filter, 'gi'); // Hide all choices $choice.css({ opacity: 0.2 }); // Find searched choices and show $choice.each(function() { // Get shortcode name var group = $(this).data('group'); // Show choice if matched if (group.match(regex) !== null) $(this).css({ opacity: 1 }).removeClass('su-generator-choice-first'); }); } e.preventDefault(); }); // Go to home link $('#su-generator').on('click', '.su-generator-home', function(e) { // Clear search field $search.val(''); // Hide settings $settings.html('').hide(); // Remove narrow class $generator.removeClass('su-generator-narrow'); // Show filters $filter.show(); // Show choices panel $choices.show(); $choice.show(); // Clear selection mce_selection = ''; // Focus search field $search.focus(); e.preventDefault(); }); // Generator close button $('#su-generator').on('click', '.su-generator-close', function(e) { // Close popup $.magnificPopup.close(); // Prevent default action e.preventDefault(); }); // Search field $search.on({ focus: function() { // Clear field $(this).val(''); // Hide settings $settings.html('').hide(); // Remove narrow class $generator.removeClass('su-generator-narrow'); // Show choices panel $choices.show(); $choice.css({ opacity: 1 }).removeClass('su-generator-choice-first'); // Show filters $filter.show(); }, blur: function() {}, keyup: function(e) { // Prepare vars var $first = $('.su-generator-choice-first:first'), val = $(this).val(), regex = new RegExp(val, 'gi'), best = 0; // Hotkey action if (e.keyCode === 13 && $first.length > 0) { e.preventDefault(); $(this).val('').blur(); $first.trigger('click'); } // Hide all choices $choice.css({ opacity: 0.2 }).removeClass('su-generator-choice-first'); // Loop and highlight choices $choice.each(function() { // Get choice data var data = $(this).data(), id = data.shortcode, name = data.name, desc = data.desc, group = data.group, matches = ([id, name, desc, group].join(' ')).match(regex); // Highlight choice if matched if (matches !== null) { // Highlight current choice $(this).css({ opacity: 1 }); // Check for exact match if (val === id) { // Remove primary class from all choices $choice.removeClass('su-generator-choice-first'); // Add primary class to the current choice $(this).addClass('su-generator-choice-first'); // Prevent selecting by matches number best = 999; } // Check matches length else if (matches.length > best) { // Remove primary class from all choices $choice.removeClass('su-generator-choice-first'); // Add primary class to the current choice $(this).addClass('su-generator-choice-first'); // Save the score best = matches.length; } } }); // Remove primary class if search field is empty if (val === '') $choice.removeClass('su-generator-choice-first'); } }); // Click on shortcode choice $choice.on('click', function(e) { // Prepare data var shortcode = $(this).data('shortcode'); // Load shortcode options $.ajax({ type: 'POST', url: ajaxurl, data: { action: 'su_generator_settings', shortcode: shortcode }, beforeSend: function() { // Hide preview box $('#su-generator-preview').hide(); // Hide choices panel $choices.hide(); // Show loading animation $settings.addClass('su-generator-loading').show(); // Add narrow class $generator.addClass('su-generator-narrow'); // Hide filters $filter.hide(); }, success: function(data) { // Hide loading animation $settings.removeClass('su-generator-loading'); // Insert new HTML $settings.html(data); // Apply selected text to the content field if (typeof mce_selection !== 'undefined' && mce_selection !== '') $('#su-generator-content').val(mce_selection); // Init range pickers $('.su-generator-range-picker').each(function(index) { var $picker = $(this), $val = $picker.find('input'), min = $val.attr('min'), max = $val.attr('max'), step = $val.attr('step'); // Apply noUIslider $val.simpleSlider({ snap: true, step: step, range: [min, max] }); $val.show(); $val.on('keyup blur', function(e) { $val.simpleSlider('setValue', $val.val()); }); }); // Init color pickers $('.su-generator-select-color').each(function(index) { $(this).find('.su-generator-select-color-wheel').filter(':first').farbtastic('.su-generator-select-color-value:eq(' + index + ')'); $(this).find('.su-generator-select-color-value').focus(function() { $('.su-generator-select-color-wheel:eq(' + index + ')').show(); }); $(this).find('.su-generator-select-color-value').blur(function() { $('.su-generator-select-color-wheel:eq(' + index + ')').hide(); }); }); // Init image sourse pickers $('.su-generator-isp').each(function() { var $picker = $(this), $sources = $picker.find('.su-generator-isp-sources'), $source = $picker.find('.su-generator-isp-source'), $add_media = $picker.find('.su-generator-isp-add-media'), $images = $picker.find('.su-generator-isp-images'), $cats = $picker.find('.su-generator-isp-categories'), $taxes = $picker.find('.su-generator-isp-taxonomies'), $terms = $('.su-generator-isp-terms'), $val = $picker.find('.su-generator-attr'), frame; // Update hidden value var update = function() { var val = 'none', ids = '', source = $sources.val(); // Media library if (source === 'media') { var images = []; $images.find('span').each(function(i) { images[i] = $(this).data('id'); }); if (images.length > 0) ids = images.join(','); } // Category else if (source === 'category') { var categories = $cats.val() || []; if (categories.length > 0) ids = categories.join(','); } // Taxonomy else if (source === 'taxonomy') { var tax = $taxes.val() || '', terms = $terms.val() || []; if (tax !== '0' && terms.length > 0) val = 'taxonomy: ' + tax + '/' + terms.join(','); } // Deselect else if (source === '0') { val = 'none'; } // Other options else { val = source; } if (ids !== '') val = source + ': ' + ids; $val.val(val).trigger('change'); } // Switch source $sources.on('change', function(e) { var source = $(this).val(); e.preventDefault(); $source.removeClass('su-generator-isp-source-open'); if (source.indexOf(':') === -1) $picker.find('.su-generator-isp-source-' + source).addClass('su-generator-isp-source-open'); update(); }); // Remove image $images.on('click', 'span i', function() { $(this).parent('span').css('border-color', '#f03').fadeOut(300, function() { $(this).remove(); update(); }); }); // Add image $add_media.click(function(e) { e.preventDefault(); if (typeof(frame) !== 'undefined') frame.close(); frame = wp.media.frames.su_media_frame_1 = wp.media({ title: su_generator.isp_media_title, library: { type: 'image' }, button: { text: su_generator.isp_media_insert }, multiple: true }); frame.on('select', function() { var files = frame.state().get('selection').toJSON(); $images.find('em').remove(); $.each(files, function(i) { $images.append(''); }); update(); }).open(); }); // Sort images $images.sortable({ revert: 200, containment: $picker, tolerance: 'pointer', stop: function() { update(); } }); // Select categories and terms $cats.on('change', update); $terms.on('change', update); // Select taxonomy $taxes.on('change', function() { var $cont = $(this).parents('.su-generator-isp-source'), tax = $(this).val(); // Remove terms $terms.hide().find('option').remove(); update(); // Taxonomy is not selected if (tax === '0') return; // Taxonomy selected else { var ajax_term_select = $.ajax({ url: ajaxurl, type: 'post', dataType: 'html', data: { 'action': 'su_generator_get_terms', 'tax': tax, 'class': 'su-generator-isp-terms', 'multiple': true, 'size': 10 }, beforeSend: function() { if (typeof ajax_term_select === 'object') ajax_term_select.abort(); $terms.html('').attr('disabled', true).hide(); $cont.addClass('su-generator-loading'); }, success: function(data) { $terms.html(data).attr('disabled', false).show(); $cont.removeClass('su-generator-loading'); } }); } }); }); // Init media buttons $('.su-generator-upload-button').each(function() { var $button = $(this), $val = $(this).parents('.su-generator-attr-container').find('input:text'), file; $button.on('click', function(e) { e.preventDefault(); e.stopPropagation(); // If the frame already exists, reopen it if (typeof(file) !== 'undefined') file.close(); // Create WP media frame. file = wp.media.frames.su_media_frame_2 = wp.media({ // Title of media manager frame title: su_generator.upload_title, button: { //Button text text: su_generator.upload_insert }, // Do not allow multiple files, if you want multiple, set true multiple: false }); //callback for selected image file.on('select', function() { var attachment = file.state().get('selection').first().toJSON(); $val.val(attachment.url).trigger('change'); }); // Open modal file.open(); }); }); // Init icon pickers $('.su-generator-icon-picker-button').each(function() { var $button = $(this), $field = $(this).parents('.su-generator-attr-container'), $val = $field.find('.su-generator-attr'), $picker = $field.find('.su-generator-icon-picker'), $filter = $picker.find('input:text'); $button.click(function(e) { $picker.toggleClass('su-generator-icon-picker-visible'); $filter.val('').trigger('keyup'); if ($picker.hasClass('su-generator-icon-picker-loaded')) return; // Load icons $.ajax({ type: 'post', url: ajaxurl, data: { action: 'su_generator_get_icons' }, dataType: 'html', beforeSend: function() { // Show loading animation $picker.addClass('su-generator-loading'); // Add loaded class $picker.addClass('su-generator-icon-picker-loaded'); }, success: function(data) { $picker.append(data); var $icons = $picker.children('i'); $icons.click(function(e) { $val.val('icon: ' + $(this).attr('title')); $picker.removeClass('su-generator-icon-picker-visible'); $val.trigger('change'); e.preventDefault(); }); $filter.on({ keyup: function() { var val = $(this).val(), regex = new RegExp(val, 'gi'); // Hide all choices $icons.hide(); // Find searched choices and show $icons.each(function() { // Get shortcode name var name = $(this).attr('title'); // Show choice if matched if (name.match(regex) !== null) $(this).show(); }); }, focus: function() { $(this).val(''); $icons.show(); } }); $picker.removeClass('su-generator-loading'); } }); e.preventDefault(); }); }); // Init switches $('.su-generator-switch').click(function(e) { // Prepare data var $switch = $(this), $value = $switch.parent().children('input'), is_on = $value.val() === 'yes'; // Disable if (is_on) { // Change value $value.val('no').trigger('change'); } // Enable else { // Change value $value.val('yes').trigger('change'); } e.preventDefault(); }); $('.su-generator-switch-value').on('change', function() { // Prepare data var $value = $(this), $switch = $value.parent().children('.su-generator-switch'), value = $value.val(); // Disable if (value === 'yes') $switch.removeClass('su-generator-switch-no').addClass('su-generator-switch-yes'); // Enable else if (value === 'no') $switch.removeClass('su-generator-switch-yes').addClass('su-generator-switch-no'); }); // Init tax_term selects $('select#su-generator-attr-taxonomy').on('change', function() { var $taxonomy = $(this), tax = $taxonomy.val(), $terms = $('select#su-generator-attr-tax_term'); // Load new options window.su_generator_get_terms = $.ajax({ type: 'POST', url: ajaxurl, data: { action: 'su_generator_get_terms', tax: tax, noselect: true }, dataType: 'html', beforeSend: function() { // Check previous requests if (typeof window.su_generator_get_terms === 'object') window.su_generator_get_terms.abort(); // Show loading animation $terms.parent().addClass('su-generator-loading'); }, success: function(data) { // Remove previous options $terms.find('option').remove(); // Append new options $terms.append(data); // Hide loading animation $terms.parent().removeClass('su-generator-loading'); } }); }); // Init shadow pickers $('.su-generator-shadow-picker').each(function(index) { var $picker = $(this), $fields = $picker.find('.su-generator-shadow-picker-field input'), $hoff = $picker.find('.su-generator-sp-hoff'), $voff = $picker.find('.su-generator-sp-voff'), $blur = $picker.find('.su-generator-sp-blur'), $color = { cnt: $picker.find('.su-generator-shadow-picker-color'), value: $picker.find('.su-generator-shadow-picker-color-value'), wheel: $picker.find('.su-generator-shadow-picker-color-wheel') }, $val = $picker.find('.su-generator-attr'); // Init color picker $color.wheel.farbtastic($color.value); $color.value.focus(function() { $color.wheel.show(); }); $color.value.blur(function() { $color.wheel.hide(); }); // Handle text fields $fields.on('change blur keyup', function() { $val.val($hoff.val() + 'px ' + $voff.val() + 'px ' + $blur.val() + 'px ' + $color.value.val()).trigger('change'); }); $val.on('keyup', function() { var value = $(this).val().split(' '); // Value is correct if (value.length === 4) { $hoff.val(value[0].replace('px', '')); $voff.val(value[1].replace('px', '')); $blur.val(value[2].replace('px', '')); $color.value.val(value[3]); $fields.trigger('keyup'); } }); }); // Init border pickers $('.su-generator-border-picker').each(function(index) { var $picker = $(this), $fields = $picker.find('.su-generator-border-picker-field input, .su-generator-border-picker-field select'), $width = $picker.find('.su-generator-bp-width'), $style = $picker.find('.su-generator-bp-style'), $color = { cnt: $picker.find('.su-generator-border-picker-color'), value: $picker.find('.su-generator-border-picker-color-value'), wheel: $picker.find('.su-generator-border-picker-color-wheel') }, $val = $picker.find('.su-generator-attr'); // Init color picker $color.wheel.farbtastic($color.value); $color.value.focus(function() { $color.wheel.show(); }); $color.value.blur(function() { $color.wheel.hide(); }); // Handle text fields $fields.on('change blur keyup', function() { $val.val($width.val() + 'px ' + $style.val() + ' ' + $color.value.val()).trigger('change'); }); $val.on('keyup', function() { var value = $(this).val().split(' '); // Value is correct if (value.length === 3) { $width.val(value[0].replace('px', '')); $style.val(value[1]); $color.value.val(value[2]); $fields.trigger('keyup'); } }); }); // Remove skip class when setting is changed $settings.find('.su-generator-attr').on('change keyup blur', function() { var $cnt = $(this).parents('.su-generator-attr-container'), _default = $cnt.data('default'), val = $(this).val(); // Value is changed if (val != _default) $cnt.removeClass('su-generator-skip'); else $cnt.addClass('su-generator-skip'); }); // Init value setters $('.su-generator-set-value').click(function(e) { $(this).parents('.su-generator-attr-container').find('input').val($(this).text()).trigger('change'); }); // Save selected value $selected.val(shortcode); // Load last used preset $.ajax({ type: 'GET', url: ajaxurl, data: { action: 'su_generator_get_preset', id: 'last_used', shortcode: shortcode }, beforeSend: function() { // Show loading animation // $settings.addClass('su-generator-loading'); }, success: function(data) { // Remove loading animation // $settings.removeClass('su-generator-loading'); // Set new settings set(data); // Apply selected text to the content field if (typeof mce_selection !== 'undefined' && mce_selection !== '') $('#su-generator-content').val(mce_selection); }, dataType: 'json' }); }, dataType: 'html' }); }); // Insert shortcode $('#su-generator').on('click', '.su-generator-insert', function(e) { // Prepare data var shortcode = parse(); // Save current settings to presets add_preset('last_used', su_generator.last_used); // Close popup $.magnificPopup.close(); // Save shortcode to div $result.text(shortcode); // Prevent default action e.preventDefault(); // Save original activeeditor window.su_wpActiveEditor = window.wpActiveEditor; // Set new active editor window.wpActiveEditor = window.su_generator_target; // Insert shortcode window.wp.media.editor.insert(shortcode); // Restore previous editor window.wpActiveEditor = window.su_wpActiveEditor; // Check for target content editor // if (typeof window.su_generator_target === 'undefined') return; // Insert into default content editor // else if (window.su_generator_target === 'content') window.wp.media.editor.insert(shortcode); // Insert into ET page builder (text box) // else if (window.su_generator_target === 'et_pb_content_new') window.wp.media.editor.insert(shortcode); // Insert into textarea // else { // var $target = $('textarea#' + window.su_generator_target); // if ($target.length > 0) $target.val($target.val() + shortcode); // } }); // Preview shortcode $('#su-generator').on('click', '.su-generator-toggle-preview', function(e) { // Prepare data var $preview = $('#su-generator-preview'), $button = $(this); // Hide button $button.hide(); // Show preview box $preview.addClass('su-generator-loading').show(); // Bind updating on settings changes $settings.find('input, textarea, select').on('change keyup blur', function() { update_preview(); }); // Update preview box update_preview(true); // Prevent default action e.preventDefault(); }); var gp_hover_timer; // Presets manager - mouseenter $('#su-generator').on('mouseenter click', '.su-generator-presets', function() { clearTimeout(gp_hover_timer); $('.su-gp-popup').show(); }); // Presets manager - mouseleave $('#su-generator').on('mouseleave', '.su-generator-presets', function() { gp_hover_timer = window.setTimeout(function() { $('.su-gp-popup').fadeOut(200); }, 600); }); // Presets manager - add new preset $('#su-generator').on('click', '.su-gp-new', function(e) { // Prepare data var $container = $(this).parents('.su-generator-presets'), $list = $('.su-gp-list'), id = new Date().getTime(); // Ask for preset name var name = prompt(su_generator.presets_prompt_msg, su_generator.presets_prompt_value); // Name is entered if (name !== '' && name !== null) { // Hide default text $list.find('b').hide(); // Add new option $list.append('' + name + ''); // Perform AJAX request add_preset(id, name); } }); // Presets manager - load preset $('#su-generator').on('click', '.su-gp-list span', function(e) { // Prepare data var shortcode = $('.su-generator-presets').data('shortcode'), id = $(this).data('id'), $insert = $('.su-generator-insert'); // Hide popup $('.su-gp-popup').hide(); // Disable hover timer clearTimeout(gp_hover_timer); // Get the preset $.ajax({ type: 'GET', url: ajaxurl, data: { action: 'su_generator_get_preset', id: id, shortcode: shortcode }, beforeSend: function() { // Disable insert button $insert.addClass('button-primary-disabled').attr('disabled', true); }, success: function(data) { // Enable insert button $insert.removeClass('button-primary-disabled').attr('disabled', false); // Set new settings set(data); }, dataType: 'json' }); // Prevent default action e.preventDefault(); e.stopPropagation(); }); // Presets manager - remove preset $('#su-generator').on('click', '.su-gp-list i', function(e) { // Prepare data var $list = $(this).parents('.su-gp-list'), $preset = $(this).parent('span'), id = $preset.data('id'); // Remove DOM element $preset.remove(); // Show default text if last preset was removed if ($list.find('span').length < 1) $list.find('b').show(); // Perform ajax request remove_preset(id); // Prevent action e.stopPropagation(); // Prevent default action e.preventDefault(); }); /** * Create new preset with specified name from current settings */ function add_preset(id, name) { // Prepare shortcode name and current settings var shortcode = $('.su-generator-presets').data('shortcode'), settings = get(); // Perform AJAX request $.ajax({ type: 'POST', url: ajaxurl, data: { action: 'su_generator_add_preset', id: id, name: name, shortcode: shortcode, settings: settings } }); } /** * Remove preset by ID */ function remove_preset(id) { // Get current shortcode name var shortcode = $('.su-generator-presets').data('shortcode'); // Perform AJAX request $.ajax({ type: 'POST', url: ajaxurl, data: { action: 'su_generator_remove_preset', id: id, shortcode: shortcode } }); } function parse() { // Prepare data var query = $selected.val(), prefix = $prefix.val(), $settings = $('#su-generator-settings .su-generator-attr-container:not(.su-generator-skip) .su-generator-attr'), content = $('#su-generator-content').val(), result = new String(''); // Open shortcode result += '[' + prefix + query; // Add shortcode attributes $settings.each(function() { // Prepare field and value var $this = $(this), value = ''; // Selects if ($this.is('select')) value = $this.find('option:selected').val(); // Other fields else value = $this.val(); // Check that value is not empty if (value == null) value = ''; else if (typeof value === 'array') value = value.join(','); // Add attribute if (value !== '') result += ' ' + $(this).attr('name') + '="' + $(this).val().toString().replace(/"/gi, "'") + '"'; }); // End of opening tag result += ']'; // Wrap shortcode if content presented if (content != 'false') result += content + '[/' + prefix + query + ']'; // Return result return result; } function get() { // Prepare data var query = $selected.val(), $settings = $('#su-generator-settings .su-generator-attr'), content = $('#su-generator-content').val(), data = {}; // Add shortcode attributes $settings.each(function(i) { // Prepare field and value var $this = $(this), value = '', name = $this.attr('name'); // Selects if ($this.is('select')) value = $this.find('option:selected').val(); // Other fields else value = $this.val(); // Check that value is not empty if (value == null) value = ''; // Save value data[name] = value; }); // Add content data['content'] = content.toString(); // Return data return data; } function set(data) { // Prepare data var $settings = $('#su-generator-settings .su-generator-attr'), $content = $('#su-generator-content'); // Loop through settings $settings.each(function() { var $this = $(this), name = $this.attr('name'); // Data contains value for this field if (data.hasOwnProperty(name)) { // Set new value $this.val(data[name]); $this.trigger('keyup').trigger('change').trigger('blur'); } }); // Set content if (data.hasOwnProperty('content')) $content.val(data['content']).trigger('keyup').trigger('change').trigger('blur'); // Update preview update_preview(); } var update_preview_timer, update_preview_request; function update_preview(forced) { // Prepare data var $preview = $('#su-generator-preview'), shortcode = parse(), previous = $result.text(); // Check forced mode forced = forced || false; // Break if preview box is hidden (preview isn't enabled) if (!$preview.is(':visible')) return; // Check shortcode is changed is this is not a forced mode if (shortcode === previous && !forced) return; // Run timer to filter often calls window.clearTimeout(update_preview_timer); update_preview_timer = window.setTimeout(function() { update_preview_request = $.ajax({ type: 'POST', url: ajaxurl, cache: false, data: { action: 'su_generator_preview', shortcode: shortcode }, beforeSend: function() { // Abort previous requests if (typeof update_preview_request === 'object') update_preview_request.abort(); // Show loading animation $preview.addClass('su-generator-loading').html(''); }, success: function(data) { // Hide loading animation and set new HTML $preview.html(data).removeClass('su-generator-loading'); }, dataType: 'html' }); }, 300); // Save shortcode to div $result.text(shortcode); } });