/** * Developer's Notice: * * Note: JS in this file (and this file itself) is not garunteed backwards compatibility. JS can be added, changed or removed at any time without notice. * For more information see the `Backwards Compatibility Guidelines for Developers` section of the README.md file. */ /** * Handles: * - Copy to Clipboard functionality * - Dismissable Notices * * @since 6.0.0 */ (function() { var list, dbjsError, errors = []; window.onerror = function( errorMsg, url, lineNumber ) { if ( ! document.getElementById( 'monsterinsights-ublock-origin-error' ) ) errors[ errors.length ] = [errorMsg, url, lineNumber]; else dbjsError(errorMsg, url, lineNumber); }; jQuery(document).ready( function(){ for ( var err in errors ) dbjsError( errors[err][0], errors[err][1], errors[err][2] ); }); dbjsError = function( errorMsg, url, lineNumber ) { var errorLine, place, button, tab; if ( !list ) list = document.getElementById( 'monsterinsights-ublock-origin-error' ); if (!list ) return; // threw way too early... @todo cache these? errorLine = document.createElement( 'li' ); errorLine.className = 'debug-bar-js-error'; errorLine.textContent = errorMsg + ' on '; place = document.createElement( 'span' ); place.textContent = url + ' line ' + lineNumber; errorLine.appendChild( place ); list.appendChild( errorLine ); }; })(); jQuery( document ).ready( function( $ ) { // Disable function jQuery.fn.extend({ disable: function(state) { return this.each(function() { this.disabled = state; }); } }); jQuery("#screen-meta-links").prependTo("#monsterinsights-header-temp"); jQuery("#screen-meta").prependTo("#monsterinsights-header-temp"); // Tooltips jQuery('.monsterinsights-help-tip').tooltip({ content: function() { return jQuery(this).prop('title'); }, tooltipClass: 'monsterinsights-ui-tooltip', position: { my: 'center top', at: 'center bottom+10', collision: 'flipfit', }, hide: { duration: 200, }, show: { duration: 200, }, }); // Reports Tooltips jQuery("body").tooltip({ selector: '.monsterinsights-reports-uright-tooltip', items: "[data-tooltip-title], [data-tooltip-description]", content: function() { return '
' + jQuery(this).data("tooltip-title") + '
' + '
' + jQuery(this).data("tooltip-description") + '
'; }, tooltipClass: 'monsterinsights-reports-ui-tooltip', position: { my: "right-10 top", at: "left top", collision: "flipfit" }, hide: {duration: 200}, show: {duration: 200}, }); /** * Copy to Clipboard */ if ( typeof Clipboard !== 'undefined' ) { var monsterinsights_clipboard = new Clipboard( '.monsterinsights-copy-to-clipboard' ); jQuery( document ).on( 'click', '.monsterinsights-copy-to-clipboard', function( e ) { e.preventDefault(); } ); function fallbackMessage(action){ var actionMsg='';var actionKey=(action==='cut'?'X':'C'); if (/iPhone|iPad/i.test(navigator.userAgent ) ) { actionMsg='No support :('; } else if (/Mac/i.test(navigator.userAgent ) ) { actionMsg='Press ⌘-'+ actionKey+' to '+ action; } else { actionMsg='Press Ctrl-'+ actionKey+' to '+ action; } return actionMsg; } monsterinsights_clipboard.on('success',function(e){ e.trigger.textContent = monsterinsights_admin.copied; window.setTimeout(function() { e.trigger.textContent = monsterinsights_admin.copytoclip; }, 2000); }); monsterinsights_clipboard.on('error',function(e){ e.trigger.textContent = fallbackMessage(e.action); }); } function modelMatcher(params, data) { data.parentText = data.parentText || ""; // Always return the object if there is nothing to compare if (jQuery.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; child.parentText += data.parentText + " " + data.text; var matches = modelMatcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return modelMatcher(params, match); } // If the typed-in term matches the text of this term, or the text from any // parent term, then it's a match. var original = (data.parentText + ' ' + data.text).toUpperCase(); var term = params.term.toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } // Setup Select2 jQuery('.monsterinsights-select300').select300(); var fields_changed = false; jQuery(document).on('change', '#monsterinsights-settings :input', function(){ fields_changed = true; }); jQuery(document).on('click', 'a:not(.monsterinsights-settings-click-excluded)', function( e ){ if ( fields_changed ) { var answer = confirm( monsterinsights_admin.settings_changed_confirm ); if ( answer ){ fields_changed = false; return true; } else { e.preventDefault(); return false; } } }); // Auth Actions // Auth and Reauth jQuery('#monsterinsights-google-authenticate-submit').on( "click", function( e ) { e.preventDefault(); swal({ type: 'info', title: monsterinsights_admin.redirect_loading_title_text, text: monsterinsights_admin.redirect_loading_text_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, onOpen: function () { swal.showLoading(); } }).catch(swal.noop); var data = { 'action': 'monsterinsights_maybe_authenticate', 'nonce': monsterinsights_admin.admin_nonce, 'isnetwork': monsterinsights_admin.isnetwork }; jQuery.post(ajaxurl, data, function( response ) { if ( response.success ) { window.location = response.data.redirect; } else { swal({ type: 'error', title: monsterinsights_admin.redirect_loading_error_title, text: response.data.message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); } }).fail( function(xhr, textStatus, errorThrown) { var message = jQuery(xhr.responseText).text(); message = message.substring(0, message.indexOf("Call Stack")); swal({ type: 'error', title: monsterinsights_admin.redirect_loading_error_title, text: message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); }); }); // Reauth jQuery('#monsterinsights-google-reauthenticate-submit').on( "click", function( e ) { e.preventDefault(); swal({ type: 'info', title: monsterinsights_admin.redirect_loading_title_text, text: monsterinsights_admin.redirect_loading_text_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, onOpen: function () { swal.showLoading(); } }).catch(swal.noop); var data = { 'action': 'monsterinsights_maybe_reauthenticate', 'nonce': monsterinsights_admin.admin_nonce, 'isnetwork': monsterinsights_admin.isnetwork }; jQuery.post(ajaxurl, data, function( response ) { if ( response.success ) { window.location = response.data.redirect; } else { swal({ type: 'error', title: monsterinsights_admin.redirect_loading_error_title, text: response.data.message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); } }).fail( function(xhr, textStatus, errorThrown) { var message = jQuery(xhr.responseText).text(); message = message.substring(0, message.indexOf("Call Stack")); swal({ type: 'error', title: monsterinsights_admin.redirect_loading_error_title, text: message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); }); }); // Verify jQuery('#monsterinsights-google-verify-submit').on( "click", function( e ) { e.preventDefault(); swal({ type: 'info', title: monsterinsights_admin.verify_loading_title_text, text: monsterinsights_admin.verify_loading_text_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, onOpen: function () { swal.showLoading(); } }).catch(swal.noop); var data = { 'action': 'monsterinsights_maybe_verify', 'nonce': monsterinsights_admin.admin_nonce, 'isnetwork': monsterinsights_admin.isnetwork }; jQuery.post(ajaxurl, data, function( response ) { if ( response.success ) { swal({ type: 'success', title: monsterinsights_admin.verify_success_title_text, text: monsterinsights_admin.verify_success_text_text, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); } else { swal({ type: 'error', title: monsterinsights_admin.verify_loading_error_title, text: response.data.message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); } }).fail( function(xhr, textStatus, errorThrown) { var message = jQuery(xhr.responseText).text(); message = message.substring(0, message.indexOf("Call Stack")); swal({ type: 'error', title: monsterinsights_admin.verify_loading_error_title, text: message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); }); }); // Delete jQuery(document).on('click','#monsterinsights-google-deauthenticate-submit', function( e ){ e.preventDefault(); monsterinsights_delete_auth( $(this), false ); }); // Force Delete jQuery(document).on('click','#monsterinsights-google-force-deauthenticate-submit', function( e ){ e.preventDefault(); monsterinsights_delete_auth( $(this), true ); }); function monsterinsights_delete_auth( buttonObject, force ) { swal({ type: 'info', title: monsterinsights_admin.deauth_loading_title_text, text: monsterinsights_admin.deauth_loading_text_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, onOpen: function () { swal.showLoading(); } }).catch(swal.noop); var data = { 'action': 'monsterinsights_maybe_delete', 'nonce': monsterinsights_admin.admin_nonce, 'isnetwork': monsterinsights_admin.isnetwork, 'forcedelete' : force.toString(), }; jQuery.post(ajaxurl, data, function( response ) { if ( response.success ) { swal({ type: 'success', title: monsterinsights_admin.deauth_success_title_text, text: monsterinsights_admin.deauth_success_text_text, confirmButtonText: monsterinsights_admin.ok_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, }).then(function () { location.reload(); }).catch(swal.noop); } else { if ( ! force ) { // Replace name, ID, value buttonObject.attr('name', 'monsterinsights-google-force-deauthenticate-submit' ); buttonObject.attr('id', 'monsterinsights-google-force-deauthenticate-submit' ); buttonObject.attr('value', monsterinsights_admin.force_deauth_button_text ); } swal({ type: 'error', title: monsterinsights_admin.deauth_loading_error_title, text: response.data.message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); } }).fail( function(xhr, textStatus, errorThrown) { var message = jQuery(xhr.responseText).text(); message = message.substring(0, message.indexOf("Call Stack")); swal({ type: 'error', title: monsterinsights_admin.deauth_loading_error_title, text: message, confirmButtonText: monsterinsights_admin.ok_text, }).catch(swal.noop); }); }; // Tools JS jQuery('#monsterinsights-url-builder input').keyup(monsterinsights_update_campaign_url); jQuery('#monsterinsights-url-builder input').click(monsterinsights_update_campaign_url); function monsterinsights_update_campaign_url() { var domain = jQuery('#monsterinsights-url-builer-domain').val().trim(); var source = jQuery('#monsterinsights-url-builer-source').val().trim(); var medium = jQuery('#monsterinsights-url-builer-medium').val().trim(); var term = jQuery('#monsterinsights-url-builer-term').val().trim(); var content = jQuery('#monsterinsights-url-builer-content').val().trim(); var name = jQuery('#monsterinsights-url-builer-name').val().trim(); var fragment = jQuery('#monsterinsights-url-builer-fragment').is(':checked'); var file = domain.substring(domain.lastIndexOf("/") + 1); if ( fragment && file.length > 0 && file.indexOf('#') > -1 ) { // If we're going to use hash, but there's already a hash, use & fragment = '&'; } else if ( ! fragment && file.length > 0 && file.indexOf('?') > -1 ) { // If we're going to use ?, but there's already one of those, use & fragment = '&'; } else { // The attachment we want to use doesn't exist yet, use requested (? or #) fragment = fragment ? '#' : '?'; } var html = domain + fragment + 'utm_source=' + encodeURIComponent(source); if (medium) { html = html + '&utm_medium=' + encodeURIComponent(medium); } if (name) { html = html + '&utm_campaign=' + encodeURIComponent(name); } if (term) { html = html + '&utm_term=' + encodeURIComponent(term); } if (content) { html = html + '&utm_content=' + encodeURIComponent(content); } if ( domain && source ) { jQuery('#monsterinsights-url-builer-url').html(html.replace(/&/g, "&").replace(//g, ">")); } else { jQuery('#monsterinsights-url-builer-url').html(''); } } // Addons JS // Addon background color if ( jQuery( "#monsterinsights-addons" ).length !== 0 ) { jQuery( "#wpbody").css("background-color", "#f1f1f1"); jQuery( "body").css("background-color", "#f1f1f1"); jQuery( "#wpfooter").css("background-color", "#f1f1f1"); jQuery( "#wpbody-content").css("padding-bottom", "0px"); } // Addons Search var addon_search_timeout; jQuery( 'form#add-on-search input#add-on-searchbox' ).on( 'keyup', function() { // Clear timeout clearTimeout( addon_search_timeout ); // Get the search input, heading, results and cancel elements var search = jQuery( this ), search_terms = jQuery( search ).val().toLowerCase(), search_heading = jQuery( search ).data( 'heading' ), search_results = jQuery( search ).data( 'results' ), search_cancel = jQuery( search ).data( 'cancel' ); // Show the Spinner jQuery( 'form#add-on-search .spinner' ).css( 'visibility', 'visible' ); // If the search terms is less than 3 characters, show all Addons if ( search_terms.length < 3 ) { jQuery( 'div.monsterinsights-addon' ).fadeIn( 'fast', function() { // Hide the Spinner jQuery( 'form#add-on-search .spinner' ).css( 'visibility', 'hidden' ); } ); return; } // Iterate through the Addons, showing or hiding them depending on whether they // match the given search terms. jQuery( 'div.monsterinsights-addon' ).each( function() { if ( jQuery( 'h3.monsterinsights-addon-title', jQuery( this ) ).text().toLowerCase().search( search_terms ) >= 0 ) { // This Addon's title does match the search terms // Show jQuery( this ).fadeIn(); } else { // This Addon's title does not match the search terms // Hide jQuery( this ).fadeOut(); } } ); // Hide the Spinner jQuery( 'form#add-on-search .spinner' ).css( 'visibility', 'hidden' ); } ); // Addons Sorting var monsterinsights_addons_licensed_sorting = new List( 'monsterinsights-addons-licensed', { valueNames: [ 'monsterinsights-addon-title' ] } ); var monsterinsights_addons_unlicensed_sorting = new List( 'monsterinsights-addons-unlicensed', { valueNames: [ 'monsterinsights-addon-title' ] } ); jQuery( 'select#monsterinsights-filter-select' ).on( 'change', function() { if ( typeof monsterinsights_addons_licensed_sorting.sort !== 'undefined' ) { monsterinsights_addons_licensed_sorting.sort( 'monsterinsights-addon-title', { order: jQuery( this ).val(), } ); } if ( typeof monsterinsights_addons_unlicensed_sorting.sort !== 'undefined' ) { monsterinsights_addons_unlicensed_sorting.sort( 'monsterinsights-addon-title', { order: jQuery( this ).val(), } ); } } ); // Re-enable install button if user clicks on it, needs creds but tries to install another addon instead. jQuery('#monsterinsights-addons').on('click.refreshInstallAddon', '.monsterinsights-addon-action-button', function(e) { var el = jQuery(this); var buttons = jQuery('#monsterinsights-addons').find('.monsterinsights-addon-action-button'); $.each(buttons, function(i, element) { if ( el == element ) { return true; } monsterinsightsAddonRefresh(element); }); }); // Activate Addon jQuery('#monsterinsights-addons').on('click.activateAddon', '.monsterinsights-activate-addon', function(e) { e.preventDefault(); var $this = jQuery(this); // Remove any leftover error messages, output an icon and get the plugin basename that needs to be activated. jQuery('.monsterinsights-addon-error').remove(); jQuery(this).html(' ' + monsterinsights_admin.activating); jQuery(this).next().css({'display' : 'inline-block', 'margin-top' : '0px'}); var button = jQuery(this); var plugin = jQuery(this).attr('rel'); var el = jQuery(this).parent().parent(); var message = jQuery(this).parent().parent().find('.addon-status'); // Process the Ajax to perform the activation. var opts = { url: ajaxurl, type: 'post', async: true, cache: false, dataType: 'json', data: { action: 'monsterinsights_activate_addon', nonce: monsterinsights_admin.activate_nonce, plugin: plugin, isnetwork: monsterinsights_admin.isnetwork }, success: function(response) { // If there is a WP Error instance, output it here and quit the script. if ( response && true !== response ) { jQuery(el).slideDown('normal', function() { jQuery(this).after('
' + response.error + '
'); $this.next().hide(); jQuery('.monsterinsights-addon-error').delay(3000).slideUp(); }); return; } // The Ajax request was successful, so let's update the output. if ( monsterinsights_admin.isnetwork ) { jQuery(button).html(' ' + monsterinsights_admin.networkdeactivate).removeClass('monsterinsights-activate-addon').addClass('monsterinsights-deactivate-addon'); } else { jQuery(button).html(' ' + monsterinsights_admin.deactivate).removeClass('monsterinsights-activate-addon').addClass('monsterinsights-deactivate-addon'); } jQuery(message).text(monsterinsights_admin.active); // Trick here to wrap a span around he last word of the status var heading = jQuery(message), word_array, last_word, first_part; word_array = heading.html().split(/\s+/); // split on spaces last_word = word_array.pop(); // pop the last word first_part = word_array.join(' '); // rejoin the first words together heading.html([first_part, ' ', last_word, ''].join('')); // Proceed with CSS changes jQuery(el).removeClass('monsterinsights-addon-inactive').addClass('monsterinsights-addon-active'); $this.next().hide(); }, error: function(xhr, textStatus ,e) { $this.next().hide(); return; } }; $.ajax(opts); }); // Deactivate Addon jQuery('#monsterinsights-addons').on('click.deactivateAddon', '.monsterinsights-deactivate-addon', function(e) { e.preventDefault(); var $this = jQuery(this); // Remove any leftover error messages, output an icon and get the plugin basename that needs to be activated. jQuery('.monsterinsights-addon-error').remove(); jQuery(this).html(' ' + monsterinsights_admin.deactivating); jQuery(this).next().css({'display' : 'inline-block', 'margin-top' : '0px'}); var button = jQuery(this); var plugin = jQuery(this).attr('rel'); var el = jQuery(this).parent().parent(); var message = jQuery(this).parent().parent().find('.addon-status'); // Process the Ajax to perform the activation. var opts = { url: ajaxurl, type: 'post', async: true, cache: false, dataType: 'json', data: { action: 'monsterinsights_deactivate_addon', nonce: monsterinsights_admin.deactivate_nonce, plugin: plugin, isnetwork: monsterinsights_admin.isnetwork }, success: function(response) { // If there is a WP Error instance, output it here and quit the script. if ( response && true !== response ) { jQuery(el).slideDown('normal', function() { jQuery(this).after('
' + response.error + '
'); $this.next().hide(); jQuery('.monsterinsights-addon-error').delay(3000).slideUp(); }); return; } // The Ajax request was successful, so let's update the output. if ( monsterinsights_admin.isnetwork ) { jQuery(button).html(' ' + monsterinsights_admin.networkactivate).removeClass('monsterinsights-deactivate-addon').addClass('monsterinsights-activate-addon'); } else { jQuery(button).html(' ' + monsterinsights_admin.activate).removeClass('monsterinsights-deactivate-addon').addClass('monsterinsights-activate-addon'); } jQuery(message).text(monsterinsights_admin.inactive); // Trick here to wrap a span around he last word of the status var heading = jQuery(message), word_array, last_word, first_part; word_array = heading.html().split(/\s+/); // split on spaces last_word = word_array.pop(); // pop the last word first_part = word_array.join(' '); // rejoin the first words together heading.html([first_part, ' ', last_word, ''].join('')); // Proceed with CSS changes jQuery(el).removeClass('monsterinsights-addon-active').addClass('monsterinsights-addon-inactive'); $this.next().hide(); }, error: function(xhr, textStatus ,e) { $this.next().hide(); return; } }; $.ajax(opts); }); // Install Addon jQuery('#monsterinsights-addons').on('click.installAddon', '.monsterinsights-install-addon', function(e) { e.preventDefault(); var $this = jQuery(this); // Remove any leftover error messages, output an icon and get the plugin basename that needs to be activated. jQuery('.monsterinsights-addon-error').remove(); jQuery(this).html(' ' + monsterinsights_admin.installing); jQuery(this).next().css({'display' : 'inline-block', 'margin-top' : '0px'}); var button = jQuery(this); var plugin = jQuery(this).attr('rel'); var el = jQuery(this).parent().parent(); var message = jQuery(this).parent().parent().find('.addon-status'); // Process the Ajax to perform the activation. var opts = { url: ajaxurl, type: 'post', async: true, cache: false, dataType: 'json', data: { action: 'monsterinsights_install_addon', nonce: monsterinsights_admin.install_nonce, plugin: plugin }, success: function(response) { // If there is a WP Error instance, output it here and quit the script. if ( response.error ) { jQuery(el).slideDown('normal', function() { jQuery(button).parent().parent().after('

' + response.error + '

'); jQuery(button).html(' ' + monsterinsights_admin.install); $this.next().hide(); jQuery('.monsterinsights-addon-error').delay(4000).slideUp(); }); return; } // If we need more credentials, output the form sent back to us. if ( response.form ) { // Display the form to gather the users credentials. jQuery(el).slideDown('normal', function() { jQuery(this).after('
' + response.form + '
'); $this.next().hide(); }); // Add a disabled attribute the install button if the creds are needed. jQuery(button).attr('disabled', true); jQuery('#monsterinsights-addons').on('click.installCredsAddon', '#upgrade', function(e) { // Prevent the default action, let the user know we are attempting to install again and go with it. e.preventDefault(); $this.next().hide(); jQuery(this).html(' ' + monsterinsights_admin.installing); jQuery(this).next().css({'display' : 'inline-block', 'margin-top' : '0px'}); // Now let's make another Ajax request once the user has submitted their credentials. var hostname = jQuery(this).parent().parent().find('#hostname').val(); var username = jQuery(this).parent().parent().find('#username').val(); var password = jQuery(this).parent().parent().find('#password').val(); var proceed = jQuery(this); var connect = jQuery(this).parent().parent().parent().parent(); var cred_opts = { url: ajaxurl, type: 'post', async: true, cache: false, dataType: 'json', data: { action: 'monsterinsights_install_addon', nonce: monsterinsights_admin.install_nonce, plugin: plugin, hostname: hostname, username: username, password: password }, success: function(response) { // If there is a WP Error instance, output it here and quit the script. if ( response.error ) { jQuery(el).slideDown('normal', function() { jQuery(button).parent().parent().after('
' + response.error + '
'); jQuery(button).html(' ' + monsterinsights_admin.install); $this.next().hide(); jQuery('.monsterinsights-addon-error').delay(4000).slideUp(); }); return; } if ( response.form ) { $this.next().hide(); jQuery('.monsterinsights-inline-error').remove(); jQuery(proceed).val(monsterinsights_admin.proceed); jQuery(proceed).after('' + monsterinsights_admin.connect_error + ''); return; } // The Ajax request was successful, so let's update the output. jQuery(connect).remove(); jQuery(button).show(); if ( monsterinsights_admin.isnetwork ) { jQuery(button).text(monsterinsights_admin.networkactivate).removeClass('monsterinsights-install-addon').addClass('monsterinsights-activate-addon'); } else { jQuery(button).text(monsterinsights_admin.activate).removeClass('monsterinsights-install-addon').addClass('monsterinsights-activate-addon'); } jQuery(button).attr('rel', response.plugin); jQuery(button).removeAttr('disabled'); jQuery(message).text(monsterinsights_admin.inactive); // Trick here to wrap a span around he last word of the status var heading = jQuery(message), word_array, last_word, first_part; word_array = heading.html().split(/\s+/); // split on spaces last_word = word_array.pop(); // pop the last word first_part = word_array.join(' '); // rejoin the first words together heading.html([first_part, ' ', last_word, ''].join('')); // Proceed with CSS changes jQuery(el).removeClass('monsterinsights-addon-not-installed').addClass('monsterinsights-addon-inactive'); $this.next().hide(); }, error: function(xhr, textStatus ,e) { $this.next().hide(); return; } }; $.ajax(cred_opts); }); // No need to move further if we need to enter our creds. return; } // The Ajax request was successful, so let's update the output. if ( monsterinsights_admin.isnetwork ) { jQuery(button).html(' ' + monsterinsights_admin.networkactivate).removeClass('monsterinsights-install-addon').addClass('monsterinsights-activate-addon'); } else { jQuery(button).html(' ' + monsterinsights_admin.activate).removeClass('monsterinsights-install-addon').addClass('monsterinsights-activate-addon'); } jQuery(button).attr('rel', response.plugin); jQuery(message).text(monsterinsights_admin.inactive); // Trick here to wrap a span around he last word of the status var heading = jQuery(message), word_array, last_word, first_part; word_array = heading.html().split(/\s+/); // split on spaces last_word = word_array.pop(); // pop the last word first_part = word_array.join(' '); // rejoin the first words together heading.html([first_part, ' ', last_word, ''].join('')); // Proceed with CSS changes jQuery(el).removeClass('monsterinsights-addon-not-installed').addClass('monsterinsights-addon-inactive'); $this.next().hide(); }, error: function(xhr, textStatus ,e) { $this.next().hide(); return; } }; $.ajax(opts); }); // Function to clear any disabled buttons and extra text if the user needs to add creds but instead tries to install a different addon. function monsterinsightsAddonRefresh(element) { if ( jQuery(element).attr('disabled') ) { jQuery(element).removeAttr('disabled'); } if ( jQuery(element).parent().parent().hasClass('monsterinsights-addon-not-installed') ) { jQuery(element).text( monsterinsights_admin.install ); } } jQuery(document).ready(function($) { monsterinsights_equalheight2column(); }); jQuery(document).on('click', ".monsterinsights-reports-show-selector-group > .btn", function( e ){ e.preventDefault(); var id = jQuery(this).attr("data-tid"); jQuery(this).addClass("active").disable(true).siblings().removeClass("active").disable(false); if ( jQuery(this).hasClass("ten") ) { jQuery("#" + id + " .monsterinsights-reports-pages-list > .monsterinsights-listing-table-row").slice(10,50).hide(); jQuery("#" + id + " .monsterinsights-reports-pages-list > .monsterinsights-listing-table-row").slice(0,10).show(); } else if ( jQuery(this).hasClass("twentyfive") ) { jQuery("#" + id + " .monsterinsights-reports-pages-list > .monsterinsights-listing-table-row").slice(25,50).hide(); jQuery("#" + id + " .monsterinsights-reports-pages-list > .monsterinsights-listing-table-row").slice(0,25).show(); } else if ( jQuery(this).hasClass("fifty") ) { jQuery("#" + id + " .monsterinsights-reports-pages-list > .monsterinsights-listing-table-row").slice(0,50).show(); } }); /** * Handles tabbed interfaces within MonsterInsights: * - Settings Page * - Reports Page * - Tools Page */ /* @todo: remove this comment, convert other comments to multiline (reduction safe), and namespace all variables (reduction safe) */ // Reports graph tabs jQuery(document).on('click', '.monsterinsights-tabbed-nav > .monsterinsights-tabbed-nav-tab-title', function( e ){ e.preventDefault(); var tabname = jQuery(this).attr("data-tab"); jQuery(this).addClass("active").siblings().removeClass("active"); jQuery('.monsterinsights-tabbed-nav-panel').hide(); jQuery('.monsterinsights-tabbed-nav-panel.' + tabname ).show(); }); jQuery( function() { MonsterInsightsTriggerTabs( true ); }); jQuery( window ).on( "hashchange", function( e ) { e.preventDefault(); MonsterInsightsTriggerTabs( false ); }); function MonsterInsightsTriggerTabs( init ) { var window_hash = window.location.hash; var current_tab = ''; var tab_nav = '.monsterinsights-main-nav-container'; var tabs_section = '.monsterinsights-main-nav-tabs'; var current_sub_tab = ''; var sub_tabs_nav = '.monsterinsights-sub-nav-container'; var sub_tabs_section = '.monsterinsights-sub-nav-tabs'; var current_sub_tab_div = ''; // If there's no hash, then we're on the default, which the page will auto load first tab + subtab as active if ( window_hash.indexOf( '#' ) > -1 ) { if ( window_hash.indexOf( '?' ) < 1 ) { // No ?, but there is a # current_tab = window_hash; var firstchildclick = jQuery( sub_tabs_nav ); // If there's no subtab defined, let's see if the page has subtabs, and if so select the first one. if ( "0" in firstchildclick && "firstElementChild" in firstchildclick[0] && "hash" in firstchildclick[0].firstElementChild ) { current_sub_tab = firstchildclick[0].firstElementChild.hash; current_sub_tab_div = '#' + ( firstchildclick[0].firstElementChild.hash ).split( '?' )[1]; } } else { // ? and a # var tab_split = window_hash.split( '?' ); current_tab = tab_split[0]; current_sub_tab = window_hash; current_sub_tab_div = '#' + tab_split[1]; } // @todo: if the tab doesn't exist, we should fallback to finding the first tab and opening that // If we fallback, we should clear the sub_tab so we ensure we land on the first subtab of the new // tab, if that pages has subtabs. jQuery( tab_nav ).find( '.monsterinsights-active' ).removeClass( 'monsterinsights-active' ); jQuery( tabs_section ).find( '.monsterinsights-active' ).removeClass( 'monsterinsights-active' ); jQuery( sub_tabs_nav ).find( '.monsterinsights-active' ).removeClass( 'monsterinsights-active' ); jQuery( sub_tabs_section ).find( '.monsterinsights-active' ).removeClass( 'monsterinsights-active' ); jQuery( tab_nav ).find( 'a[href="' + current_tab + '"]' ).addClass( 'monsterinsights-active' ); jQuery( tabs_section ).find( current_tab ).addClass( 'monsterinsights-active' ); // Check to make sure the subtab given in the url exists, and then open it. if ( jQuery( sub_tabs_nav ).find( 'a[href="' + current_sub_tab + '"]' ).length == 1 ) { jQuery( sub_tabs_nav ).find( 'a[href="' + current_sub_tab + '"]' ).addClass( 'monsterinsights-active' ); jQuery( sub_tabs_section ).find( current_sub_tab_div ).addClass( 'monsterinsights-active' ); } else { // If the subtab given in the URL doesn't exist, let's see if the page has subtabs, and if so select the first one. var firstchildclick = jQuery( sub_tabs_nav ); if ( "0" in firstchildclick && "firstElementChild" in firstchildclick[0] && "hash" in firstchildclick[0].firstElementChild ) { jQuery( sub_tabs_nav ).find( 'a[href="#' + (firstchildclick[0].firstElementChild.hash).split( '?' )[1] + '"]' ).addClass( 'monsterinsights-active' ); jQuery( sub_tabs_section ).find( '#' + (firstchildclick[0].firstElementChild.hash).split( '?' )[1] ).addClass( 'monsterinsights-active' ); } } if ( jQuery('.monsterinsights-main-nav-tabs .monsterinsights-main-nav-tab:not(".monsterinsights-active") .monsterinsights-tab-settings-notices .monsterinsights-notice' ).length > 0 ) { jQuery('.monsterinsights-main-nav-tabs .monsterinsights-main-nav-tab:not(".monsterinsights-active") .monsterinsights-tab-settings-notices .monsterinsights-notice' ).remove(); } if ( jQuery('.monsterinsights-sub-nav-tabs .monsterinsights-sub-nav-tab:not("' + current_sub_tab_div + '") .monsterinsights-subtab-settings-notices .monsterinsights-notice' ).length > 0 ) { jQuery('.monsterinsights-sub-nav-tabs .monsterinsights-sub-nav-tab:not("' + current_sub_tab_div + '") .monsterinsights-subtab-settings-notices .monsterinsights-notice' ).remove(); } if ( current_tab !== '#monsterinsights-main-tab-tracking' ) { if ( jQuery('.monsterinsights-sub-nav-tabs .monsterinsights-sub-nav-tab .monsterinsights-subtab-settings-notices .monsterinsights-notice' ).length > 0 ) { jQuery('.monsterinsights-sub-nav-tabs .monsterinsights-sub-nav-tab .monsterinsights-subtab-settings-notices .monsterinsights-notice' ).remove(); } } // Is the window taller than the #adminmenuwrap? if (jQuery(window).height() > jQuery("#adminmenuwrap").height()) { // ...if so, make the #adminmenuwrap fixed jQuery('#adminmenuwrap').css('position', 'fixed'); } else { //...otherwise, leave it relative jQuery('#adminmenuwrap').css('position', 'relative'); } } else if ( init ) { // If we have a default open, else open one if ( jQuery(tab_nav + " .monsterinsights-active").length > 0 ){ return; } jQuery(tab_nav).find('a:first').addClass( 'monsterinsights-active' ); jQuery( tabs_section ).find('div:first').addClass( 'monsterinsights-active' ); jQuery(sub_tabs_nav).find('a:first').addClass( 'monsterinsights-active' ); jQuery( sub_tabs_section ).find('div:first').addClass( 'monsterinsights-active' ); } } }); function monsterinsights_equalheight2column(){ jQuery('.monsterinsights-reports-2-column-container').each(function(i, elem) { jQuery(elem) .find('.monsterinsights-reports-data-table-tbody') // Only children of this row .matchHeight({byRow: false}); // Row detection gets confused so disable it jQuery(elem) .find('.monsterinsights-reports-2-column-panel') // Only children of this row .matchHeight({byRow: true}); // Row detection gets confused so disable it }); } function monsterinsights_show_manual( ){ document.getElementById("monsterinsights-google-ua-box").className = ""; } var uorigindetected = 'no'; // Reports: // Thanks ChartJS for making us have to do this nonsense. // A huge Thanks ChartJS for making us have to do this nonsense. Why ChartJS can't just fix non-initalization on hidden elements (or at least // give a generic action to re-fire initialization for in-view charts generically is beyond me) jQuery(document).ready(function($) { var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; jQuery.fn.attrchange = function(callback) { if (MutationObserver) { var options = { subtree: false, attributes: true, attributeName: "class", }; var observer = new MutationObserver(function(mutations) { mutations.forEach(function(e) { callback.call(e.target, e.attributeName); }); }); return this.each(function() { observer.observe(this, options); }); } }; jQuery('#monsterinsights-reports-page-main-nav .monsterinsights-main-nav-item.monsterinsights-nav-item').attrchange(function(attrName) { if ( attrName != 'class' ){ return; } // Which report? var reportname = jQuery("#monsterinsights-reports-pages").find( "div.monsterinsights-main-nav-tab.monsterinsights-active" ).attr("id").replace("monsterinsights-main-tab-", "" ); var reportid = jQuery("#monsterinsights-reports-pages").find( "div.monsterinsights-main-nav-tab.monsterinsights-active" ).attr("id"); var start = moment( moment().subtract(30, 'days') ).tz(monsterinsights_admin.timezone).format('YYYY-MM-DD'); var end = moment( moment().subtract( 1, 'days' ) ).tz(monsterinsights_admin.timezone).format('YYYY-MM-DD'); if ( reportname === 'realtime' ) { return; } // Blur report shown jQuery( "#monsterinsights-reports-pages" ).addClass( "monsterinsights-mega-blur" ); swal({ type: 'info', title: monsterinsights_admin.refresh_report_title, text: monsterinsights_admin.refresh_report_text, allowOutsideClick: false, allowEscapeKey: false, allowEnterKey: false, onOpen: function () { swal.showLoading(); var data = { 'action' : 'monsterinsights_refresh_reports', 'security' : monsterinsights_admin.admin_nonce, 'isnetwork': monsterinsights_admin.isnetwork, 'start' : start, 'end' : end, 'report' : reportname, }; jQuery.post(ajaxurl, data, function( response ) { if ( response.success && response.data.html ) { // Insert new data here jQuery("#monsterinsights-main-tab-" + reportname + " > .monsterinsights-reports-wrap").html( response.data.html ); // Resize divs monsterinsights_equalheight2column(); swal.close(); } else { var swal_settings = { type: 'error', title: monsterinsights_admin.refresh_report_failure_title, html: response.data.message, }; if ( response.data.data && response.data.data.footer ) { swal_settings.footer = response.data.data.footer; } swal(swal_settings).catch(swal.noop); } }).then(function (result) { // Unblur reports jQuery( "#monsterinsights-reports-pages" ).removeClass( "monsterinsights-mega-blur" ); }).fail( function(xhr, textStatus, errorThrown) { var message = jQuery(xhr.responseText).text(); message = message.substring(0, message.indexOf("Call Stack")); swal({ type: 'error', title: monsterinsights_admin.refresh_report_failure_title, text: message, }).catch(swal.noop); // Unblur reports jQuery( "#monsterinsights-reports-pages" ).removeClass( "monsterinsights-mega-blur" ); }); } }); }); });