var Merlin = (function($){ var t; // callbacks from form button clicks. var callbacks = { install_child: function(btn) { var installer = new ChildTheme(); installer.init(btn); }, activate_license: function(btn) { var license = new ActivateLicense(); license.init(btn); }, install_plugins: function(btn){ var plugins = new PluginManager(); plugins.init(btn); }, install_content: function(btn){ var content = new ContentManager(); content.init(btn); } }; function window_loaded(){ var body = $('.merlin__body'), body_loading = $('.merlin__body--loading'), body_exiting = $('.merlin__body--exiting'), drawer_trigger = $('#merlin__drawer-trigger'), drawer_opening = 'merlin__drawer--opening'; drawer_opened = 'merlin__drawer--open'; setTimeout(function(){ body.addClass('loaded'); },100); drawer_trigger.on('click', function(){ body.toggleClass( drawer_opened ); }); $('.merlin__button--proceed:not(.merlin__button--closer)').click(function (e) { e.preventDefault(); var goTo = this.getAttribute("href"); body.addClass('exiting'); setTimeout(function(){ window.location = goTo; },400); }); $(".merlin__button--closer").on('click', function(e){ body.removeClass( drawer_opened ); e.preventDefault(); var goTo = this.getAttribute("href"); setTimeout(function(){ body.addClass('exiting'); },600); setTimeout(function(){ window.location = goTo; },1100); }); $(".button-next").on( "click", function(e) { e.preventDefault(); var loading_button = merlin_loading_button(this); if ( ! loading_button ) { return false; } var data_callback = $(this).data("callback"); if( data_callback && typeof callbacks[data_callback] !== "undefined"){ // We have to process a callback before continue with form submission. callbacks[data_callback](this); return false; } else { return true; } }); $( document ).on( 'change', '.js-merlin-demo-import-select', function() { var selectedIndex = $( '.js-merlin-demo-import-select:checked' ).val(); $( '.js-merlin-select-spinner' ).show(); $.post( merlin_params.ajaxurl, { action: 'merlin_update_selected_import_data_info', wpnonce: merlin_params.wpnonce, selected_index: selectedIndex, }, function( response ) { if ( response.success ) { $( '.js-merlin-drawer-import-content' ).html( response.data ); } else { alert( merlin_params.texts.something_went_wrong ); } $( '.js-merlin-select-spinner' ).hide(); } ) .fail( function() { $( '.js-merlin-select-spinner' ).hide(); alert( merlin_params.texts.something_went_wrong ) } ); } ); } function ChildTheme() { var body = $('.merlin__body'); var complete, notice = $("#child-theme-text"); function ajax_callback(r) { if (typeof r.done !== "undefined") { setTimeout(function(){ notice.addClass("lead"); },0); setTimeout(function(){ notice.addClass("success"); notice.html(r.message); },600); complete(); } else { notice.addClass("lead error"); notice.html(r.error); } } function do_ajax() { jQuery.post(merlin_params.ajaxurl, { action: "merlin_child_theme", wpnonce: merlin_params.wpnonce, }, ajax_callback).fail(ajax_callback); } return { init: function(btn) { complete = function() { setTimeout(function(){ $(".merlin__body").addClass('js--finished'); },1500); body.removeClass( drawer_opened ); setTimeout(function(){ $('.merlin__body').addClass('exiting'); },3500); setTimeout(function(){ window.location.href=btn.href; },4000); }; do_ajax(); } } } function ActivateLicense() { var body = $( '.merlin__body' ); var wrapper = $( '.merlin__content--license-key' ); var complete, notice = $( '#license-text' ); function ajax_callback(r) { if (typeof r.success !== "undefined" && r.success) { notice.siblings( '.error-message' ).remove(); setTimeout(function(){ notice.addClass("lead"); },0); setTimeout(function(){ notice.addClass("success"); notice.html(r.message); },600); complete(); } else { $( '.js-merlin-license-activate-button' ).removeClass( 'merlin__button--loading' ).data( 'done-loading', 'no' ); notice.siblings( '.error-message' ).remove(); wrapper.addClass('has-error'); notice.html(r.message); notice.siblings( '.error-message' ).addClass("lead error"); } } function do_ajax() { wrapper.removeClass('has-error'); jQuery.post(merlin_params.ajaxurl, { action: "merlin_activate_license", wpnonce: merlin_params.wpnonce, license_key: $( '.js-license-key' ).val() }, ajax_callback).fail(ajax_callback); } return { init: function(btn) { complete = function() { setTimeout(function(){ $(".merlin__body").addClass('js--finished'); },1500); body.removeClass( drawer_opened ); setTimeout(function(){ $('.merlin__body').addClass('exiting'); },3500); setTimeout(function(){ window.location.href=btn.href; },4000); }; do_ajax(); } } } function PluginManager(){ var body = $('.merlin__body'); var complete; var items_completed = 0; var current_item = ""; var $current_node; var current_item_hash = ""; function ajax_callback(response){ var currentSpan = $current_node.find("label"); if(typeof response === "object" && typeof response.message !== "undefined"){ currentSpan.removeClass( 'installing success error' ).addClass(response.message.toLowerCase()); // The plugin is done (installed, updated and activated). if(typeof response.done != "undefined" && response.done){ find_next(); }else if(typeof response.url != "undefined"){ // we have an ajax url action to perform. if(response.hash == current_item_hash){ currentSpan.removeClass( 'installing success' ).addClass("error"); find_next(); }else { current_item_hash = response.hash; jQuery.post(response.url, response, ajax_callback).fail(ajax_callback); } }else{ // error processing this plugin find_next(); } }else{ // The TGMPA returns a whole page as response, so check, if this plugin is done. process_current(); } } function process_current(){ if(current_item){ var $check = $current_node.find("input:checkbox"); if($check.is(":checked")) { jQuery.post(merlin_params.ajaxurl, { action: "merlin_plugins", wpnonce: merlin_params.wpnonce, slug: current_item, }, ajax_callback).fail(ajax_callback); }else{ $current_node.addClass("skipping"); setTimeout(find_next,300); } } } function find_next(){ if($current_node){ if(!$current_node.data("done_item")){ items_completed++; $current_node.data("done_item",1); } $current_node.find(".spinner").css("visibility","hidden"); } var $li = $(".merlin__drawer--install-plugins li"); $li.each(function(){ var $item = $(this); if ( $item.data("done_item") ) { return true; } current_item = $item.data("slug"); $current_node = $item; process_current(); return false; }); if(items_completed >= $li.length){ // finished all plugins! complete(); } } return { init: function(btn){ $(".merlin__drawer--install-plugins").addClass("installing"); $(".merlin__drawer--install-plugins").find("input").prop("disabled", true); complete = function(){ setTimeout(function(){ $(".merlin__body").addClass('js--finished'); },1000); body.removeClass( drawer_opened ); setTimeout(function(){ $('.merlin__body').addClass('exiting'); },3000); setTimeout(function(){ window.location.href=btn.href; },3500); }; find_next(); } } } function ContentManager(){ var body = $('.merlin__body'); var complete; var items_completed = 0; var current_item = ""; var $current_node; var current_item_hash = ""; var current_content_import_items = 1; var total_content_import_items = 0; var progress_bar_interval; function ajax_callback(response) { var currentSpan = $current_node.find("label"); if(typeof response == "object" && typeof response.message !== "undefined"){ if (response.message != null) { currentSpan.addClass(response.message.toLowerCase()); } if( typeof response.num_of_imported_posts !== "undefined" && 0 < total_content_import_items ) { current_content_import_items = 'all' === response.num_of_imported_posts ? total_content_import_items : response.num_of_imported_posts; update_progress_bar(); } if(typeof response.url !== "undefined"){ // we have an ajax url action to perform. if(response.hash === current_item_hash){ currentSpan.addClass("status--failed"); find_next(); }else { current_item_hash = response.hash; // Fix the undefined selected_index issue on new AJAX calls. if ( typeof response.selected_index === "undefined" ) { response.selected_index = $( '.js-merlin-demo-import-select:checked' ).val() || 0; } jQuery.post(response.url, response, ajax_callback).fail(ajax_callback); // recuurrssionnnnn } }else if(typeof response.done !== "undefined"){ // finished processing this plugin, move onto next find_next(); }else{ // error processing this plugin find_next(); } }else{ console.log(response); // error - try again with next plugin currentSpan.addClass("status--error"); find_next(); } } function process_current(){ if(current_item){ var $check = $current_node.find("input:checkbox"); if($check.is(":checked")) { jQuery.post(merlin_params.ajaxurl, { action: "merlin_content", wpnonce: merlin_params.wpnonce, content: current_item, selected_index: $( '.js-merlin-demo-import-select:checked' ).val() || 0 }, ajax_callback).fail(ajax_callback); }else{ $current_node.addClass("skipping"); setTimeout(find_next,300); } } } function find_next(){ var do_next = false; if($current_node){ if(!$current_node.data("done_item")){ items_completed++; $current_node.data("done_item",1); } $current_node.find(".spinner").css("visibility","hidden"); } var $items = $(".merlin__drawer--import-content__list-item"); var $enabled_items = $(".merlin__drawer--import-content__list-item input:checked"); $items.each(function(){ if (current_item == "" || do_next) { current_item = $(this).data("content"); $current_node = $(this); process_current(); do_next = false; } else if ($(this).data("content") == current_item) { do_next = true; } }); if(items_completed >= $items.length){ complete(); } } function init_content_import_progress_bar() { if( ! $(".merlin__drawer--import-content__list-item .checkbox-content").is( ':checked' ) ) { return false; } jQuery.post(merlin_params.ajaxurl, { action: "merlin_get_total_content_import_items", wpnonce: merlin_params.wpnonce, selected_index: $( '.js-merlin-demo-import-select:checked' ).val() || 0 }, function( response ) { total_content_import_items = response.data; if ( 0 < total_content_import_items ) { update_progress_bar(); // Change the value of the progress bar constantly for a small amount (0,2% per sec), to improve UX. progress_bar_interval = setInterval( function() { current_content_import_items = current_content_import_items + total_content_import_items/500; update_progress_bar(); }, 1000 ); } } ); } function valBetween(v, min, max) { return (Math.min(max, Math.max(min, v))); } function update_progress_bar() { $('.js-merlin-progress-bar').css( 'width', (current_content_import_items/total_content_import_items) * 100 + '%' ); var $percentage = valBetween( ((current_content_import_items/total_content_import_items) * 100) , 0, 99); $('.js-merlin-progress-bar-percentage').html( Math.round( $percentage ) + '%' ); if ( 1 === current_content_import_items/total_content_import_items ) { clearInterval( progress_bar_interval ); } } return { init: function(btn){ $(".merlin__drawer--import-content").addClass("installing"); $(".merlin__drawer--import-content").find("input").prop("disabled", true); complete = function(){ $.post(merlin_params.ajaxurl, { action: "merlin_import_finished", wpnonce: merlin_params.wpnonce, selected_index: $( '.js-merlin-demo-import-select:checked' ).val() || 0 }); setTimeout(function(){ $('.js-merlin-progress-bar-percentage').html( '100%' ); },100); setTimeout(function(){ body.removeClass( drawer_opened ); },500); setTimeout(function(){ $(".merlin__body").addClass('js--finished'); },1500); setTimeout(function(){ $('.merlin__body').addClass('exiting'); },3400); setTimeout(function(){ window.location.href=btn.href; },4000); }; init_content_import_progress_bar(); find_next(); } } } function merlin_loading_button( btn ){ var $button = jQuery(btn); if ( $button.data( "done-loading" ) == "yes" ) { return false; } var completed = false; var _modifier = $button.is("input") || $button.is("button") ? "val" : "text"; $button.data("done-loading","yes"); $button.addClass("merlin__button--loading"); return { done: function(){ completed = true; $button.attr("disabled",false); } } } return { init: function(){ t = this; $(window_loaded); }, callback: function(func){ console.log(func); console.log(this); } } })(jQuery); Merlin.init();