HEX
Server: LiteSpeed
System: Linux server107.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: iddeczhh (1154)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/iddeczhh/public_html/wp-content/plugins/pagelayer/js/pagelayer-admin.js
// Pagelayer Admin UI - Modern Sidebar Navigation
jQuery(document).ready(function($){

	/* ======================================================
	   1. NEW SIDEBAR NAV → Tab Panel switching
	   ====================================================== */
	// Helper to update hash with full element style state
	window.pl_block_hash_update = false;
	function pl_update_hash() {
		if (window.pl_block_hash_update) return;
		if ($('#headings').hasClass('pagelayer-tab-active')) {
			var activeHeadingTab = $('.pagelayer-heading-wrapper a.nav-tab-active');
			if (activeHeadingTab.length) {
				var heading_href = activeHeadingTab.attr('href'); // e.g. "#tab_body"
				var active_panel = $(heading_href);
				var active_screen_tab = active_panel.find('.pagelayer-styles-screens a.nav-tab-active');
				if (active_screen_tab.length) {
					var screen_href = active_screen_tab.attr('href'); // e.g. "#tab_body_desktop"
					var new_hash = screen_href + '_tab';
					if (location.hash !== new_hash) {
						if (history.replaceState) {
							history.replaceState(null, null, new_hash);
						} else {
							location.hash = new_hash;
						}
					}
					return;
				}
				var new_hash = heading_href + '_desktop_tab';
				if (location.hash !== new_hash) {
					if (history.replaceState) {
						history.replaceState(null, null, new_hash);
					} else {
						location.hash = new_hash;
					}
				}
				return;
			}
		}
		
		var active_sidebar_tab = $('#pagelayer-sidebar-nav a.pagelayer-nav-item.pagelayer-nav-active');
		if (active_sidebar_tab.length) {
			var new_hash = '#' + active_sidebar_tab.data('tab') + '_tab';
			if (location.hash !== new_hash) {
				if (history.replaceState) {
					history.replaceState(null, null, new_hash);
				} else {
					location.hash = new_hash;
				}
			}
		}
	}

	function pl_activate_sidebar_tab(tab_id){

		// Hide all panels
		$('.pagelayer-tab-panel').removeClass('pagelayer-tab-active').hide();

		// Show target
		var $panel = $('#'+tab_id);
		if($panel.length){
			$panel.addClass('pagelayer-tab-active').show();
		}

		// Update sidebar active state
		$('#pagelayer-sidebar-nav a.pagelayer-nav-item').removeClass('pagelayer-nav-active');
		$('#pagelayer-sidebar-nav a[data-tab="'+tab_id+'"]').addClass('pagelayer-nav-active');

		if (typeof pagelayer_admin_data !== 'undefined' && parseInt(pagelayer_admin_data.is_sitepad) === 1) {
			if (tab_id === 'export_theme') {
				$('#pagelayer-admin-wrap').addClass('pl-no-sidebar');
			} else {
				$('#pagelayer-admin-wrap').removeClass('pl-no-sidebar');
			}
		}

		// Update URL hash without scrolling
		if (!window.pl_block_hash_update) {
			if (tab_id === 'headings') {
				pl_update_hash();
			} else {
				if(history.replaceState){
					history.replaceState(null, null, '#'+tab_id+'_tab');
				}else{
					location.hash = '#'+tab_id+'_tab';
				}
			}
		}
	}

	// Sidebar nav click
	$('#pagelayer-sidebar-nav').on('click', 'a.pagelayer-nav-item', function(e){
		var tab_id = $(this).data('tab');
		if(tab_id && $('#'+tab_id).length > 0){
			e.preventDefault();
			pl_activate_sidebar_tab(tab_id);
		}
	});

	// Init: check hash first and handle sub-tabs + screen tabs
	var raw_hash = location.hash;
	if (raw_hash) {
		var match = raw_hash.match(/^#(tab_[a-zA-Z0-9\-]+)_(desktop|tablet|mobile)_tab$/);
		var match_old = raw_hash.match(/^#(tab_[a-zA-Z0-9\-]+)_tab$/);
		
		if (match || match_old) {
			var heading_id = match ? match[1] : match_old[1];
			var screen = match ? match[2] : 'desktop';
			
			pl_activate_sidebar_tab('headings');
			
			var $headingTab = $('.pagelayer-heading-wrapper a[href="#' + heading_id + '"]');
			if ($headingTab.length) {
				window.pl_block_hash_update = true;
				$headingTab.click();
				
				var $screenTab = $('#' + heading_id).find('.pagelayer-styles-screen-tab[href="#' + heading_id + '_' + screen + '"]');
				if ($screenTab.length) {
					$screenTab.click();
				}
				window.pl_block_hash_update = false;
				pl_update_hash();
			}
		} else {
			var outer_tab = raw_hash.replace('#','').replace('_tab','');
			if(outer_tab && $('#'+outer_tab).length && $('#pagelayer-sidebar-nav a[data-tab="'+outer_tab+'"]').length){
				pl_activate_sidebar_tab(outer_tab);
			} else {
				var $firstNav = $('#pagelayer-sidebar-nav a.pagelayer-nav-item').first();
				if($firstNav.length){
					var first_tab_id = $firstNav.data('tab');
					if(first_tab_id && $('#'+first_tab_id).length > 0){
						pl_activate_sidebar_tab(first_tab_id);
					}
				}
			}
		}
	} else {
		var $firstNav = $('#pagelayer-sidebar-nav a.pagelayer-nav-item').first();
		if($firstNav.length){
			var first_tab_id = $firstNav.data('tab');
			if(first_tab_id && $('#'+first_tab_id).length > 0){
				pl_activate_sidebar_tab(first_tab_id);
			}
		}
	}

	/* ======================================================
	   2. LEGACY: nav-tab-wrapper tabs (website settings, etc.)
	   ====================================================== */
	function pl_admin_tabs(){
		$('.nav-tab-wrapper a').not('.pagelayer-nav-item').click(function(){

			var tEle = $(this);
			var sel = tEle.attr('tab-class') || 'pagelayer-tab-panel';

			// Limit effect to container
			var context = tEle.closest('.nav-tab-wrapper').parent().parent();
			context.find('.nav-tab-wrapper a').removeClass('nav-tab-active');
			tEle.addClass('nav-tab-active');
			context.find('.'+sel).hide().removeClass('pagelayer-tab-active');
			context.find(tEle.attr('href')).show().addClass('pagelayer-tab-active');
			location.hash = tEle.attr('href')+'_tab';

			return false;
		});

		// Activate first or hash-based tab in legacy wrappers
		$('.nav-tab-wrapper.pagelayer-wrapper').each(function(){
			var jEle = $(this);
			// Skip sidebar nav (already handled above)
			if(jEle.closest('#pagelayer-sidebar-nav').length) return;

			// If modern sidebar nav is present, do not click legacy tabs automatically
			if($('#pagelayer-sidebar-nav').length > 0) return;

			var hash = location.hash.slice(1, -4);
			if(hash){
				var active_tab_ele = jEle.find('[href="#'+hash+'"]');
				if(active_tab_ele.length > 0){
					active_tab_ele.click();
					return;
				}
			}
			jEle.find('a').not('.pagelayer-nav-item').first().click();
		});
	}

	/* ======================================================
	   3. Accordion for FAQ panel
	   ====================================================== */
	function pl_admin_accordion(){
		$('.pagelayer-acc-wrapper .pagelayer-acc-tab').click(function(){
			var tEle = $(this);
			if(tEle.hasClass('nav-tab-active')){
				tEle.toggleClass('nav-tab-active').next('.pagelayer-acc-panel').toggle();
			}else{
				var context = tEle.closest('.pagelayer-acc-wrapper');
				context.find('.pagelayer-acc-tab').removeClass('nav-tab-active');
				context.find('.pagelayer-acc-panel').hide();
				tEle.addClass('nav-tab-active');
				tEle.next('.pagelayer-acc-panel').show();
			}
		});

		$('.pagelayer-acc-wrapper').each(function(){
			var jEle = $(this);
			var active_acc_ele = jEle.find('.nav-tab-active');
			if(active_acc_ele.length > 0){
				active_acc_ele.click();
			}else{
				jEle.find('.pagelayer-acc-tab').first().click();
			}
		});
	}

	/* ======================================================
	   4. Heading tabs (website settings sub-tabs)
	   ====================================================== */
	$('.pagelayer-heading-tab').click(function(e){
		e.stopImmediatePropagation();
		var tEle = $(this);
		var sel = tEle.attr('tab-class') || 'pagelayer-heading-tab-panel';
		var context = tEle.closest('#headings').length ? tEle.closest('#headings') : tEle.closest('.nav-tab-wrapper').parent();
		tEle.closest('.nav-tab-wrapper').find('a').removeClass('nav-tab-active');
		tEle.addClass('nav-tab-active');
		context.find('.'+sel).hide();
		var $targetPanel = context.find(tEle.attr('href'));
		$targetPanel.show();
		
		// Keep the currently active screen tab (Desktop/Tablet/Mobile) when switching headings, or default to desktop
		var current_active_screen_name = $('.pagelayer-styles-screens a.nav-tab-active').first().text().trim().toLowerCase() || 'desktop';
		var $screenTab = $targetPanel.find('.pagelayer-styles-screen-tab').filter(function() {
			return $(this).text().trim().toLowerCase() === current_active_screen_name;
		});
		if ($screenTab.length) {
			$screenTab.click();
		} else {
			$targetPanel.find('.pagelayer-styles-screen-tab').first().click();
		}
		
		pl_update_hash();
		return false;
	});

	var isTabHash = location.hash && location.hash.indexOf('#tab_') === 0;

	if (!isTabHash) {
		$('.pagelayer-heading-wrapper').each(function(){
			$(this).find('a').first().click();
		});
	}

	/* ======================================================
	   5. Screen sub-tabs (desktop/tablet/mobile) in website settings
	   ====================================================== */
	$('.pagelayer-styles-screen-tab').click(function(e){
		e.stopImmediatePropagation();
		var tEle = $(this);
		var sel = tEle.attr('tab-class') || 'pagelayer-styles-screen-panel';
		var context = tEle.closest('.pagelayer-heading-tab-panel').length ? tEle.closest('.pagelayer-heading-tab-panel') : tEle.closest('.nav-tab-wrapper').parent();
		tEle.closest('.nav-tab-wrapper').find('a').removeClass('nav-tab-active');
		tEle.addClass('nav-tab-active');
		context.find('.'+sel).hide();
		context.find(tEle.attr('href')).show();
		pl_update_hash();
		return false;
	});

	if (!isTabHash) {
		$('.pagelayer-styles-screens').each(function(){
			$(this).find('a').first().click();
		});
	}

	// Run legacy and accordion
	pl_admin_tabs();
	pl_admin_accordion();

	/* ======================================================
	   6. REDESIGN: Theme Templates & Custom Fonts CPT page edit.php
	   ====================================================== */
	var is_templates_page = $('body').hasClass('post-type-pagelayer-template') && $('body').hasClass('edit-php');
	var is_fonts_page = $('body').hasClass('post-type-pagelayer-fonts') && $('body').hasClass('edit-php');

	if((is_templates_page || is_fonts_page) && typeof pagelayer_admin_data !== 'undefined'){
		
		var logo_url = pagelayer_admin_data.logo;
		var version = pagelayer_admin_data.version;
		
		// Build the templates sub-navigation list from the existing tabs wrapper
		var templates_nav_html = '';
		var $tabs = $('#pagelayer-template-tabs-wrapper');
		
		if($tabs.length){
			$tabs.find('a.nav-tab').each(function(){
				var $tab = $(this);
				var label = $tab.text().trim();
				var href = $tab.attr('href');
				var isActive = $tab.hasClass('nav-tab-active');
				
				// Determine icon based on label text
				var icon = 'dashicons-welcome-widgets-menus';
				var lower_label = label.toLowerCase();
				if(lower_label.indexOf('all') !== -1) {
					icon = 'dashicons-admin-home';
				} else if(lower_label.indexOf('header') !== -1) {
					icon = 'dashicons-editor-insertmore';
				} else if(lower_label.indexOf('footer') !== -1) {
					icon = 'dashicons-editor-break';
				} else if(lower_label.indexOf('single') !== -1) {
					icon = 'dashicons-admin-page';
				} else if(lower_label.indexOf('archive') !== -1) {
					icon = 'dashicons-database';
				} else if(lower_label.indexOf('popup') !== -1) {
					icon = 'dashicons-external';
				} else if(lower_label.indexOf('global section') !== -1) {
					icon = 'dashicons-admin-site-alt3';
				} else if(lower_label.indexOf('global widget') !== -1) {
					icon = 'dashicons-screenoptions';
				} else if(lower_label.indexOf('section') !== -1) {
					icon = 'dashicons-layout';
				}
				
				var active_class = isActive ? ' pagelayer-nav-active' : '';
				templates_nav_html += '<a href="' + href + '" class="pagelayer-nav-item' + active_class + '">';
				templates_nav_html += '<span class="pl-nav-icon dashicons ' + icon + '"></span>' + label;
				templates_nav_html += '</a>';
			});
		} else {
			if (is_fonts_page) {
				// Build the entire unified navigation sidebar
				var isPremium = pagelayer_admin_data.is_premium;
				var admin_url = pagelayer_admin_data.admin_url;
				
				var items = [
					{ label: 'Add New Template', icon: 'dashicons-plus-alt', url: admin_url + 'admin.php?page=pagelayer_tools#add_new_template_tab', active: false },
					{ label: 'Export Theme', icon: 'dashicons-upload', url: admin_url + 'admin.php?page=pagelayer_tools#export_theme_tab', active: false },
					{ label: 'Import Theme', icon: 'dashicons-download', url: admin_url + 'admin.php?page=pagelayer_tools#import_theme_tab', active: false },
					{ label: 'Custom Fonts', icon: 'dashicons-editor-bold', url: admin_url + 'edit.php?post_type=pagelayer-fonts', active: true }
				];

				$.each(items, function(i, item) {
					var active_class = item.active ? ' pagelayer-nav-active' : '';
					templates_nav_html += '<a href="' + item.url + '" class="pagelayer-nav-item' + active_class + '">';
					templates_nav_html += '<span class="pl-nav-icon dashicons ' + item.icon + '"></span>' + item.label;
					templates_nav_html += '</a>';
				});
			} else {
				// Fallback: If no CPT sub-tabs exist, show active post type link
				var label = 'Theme Templates';
				var icon = 'dashicons-welcome-widgets-menus';
				var href = window.location.href;
				templates_nav_html += '<a href="' + href + '" class="pagelayer-nav-item pagelayer-nav-active">';
				templates_nav_html += '<span class="pl-nav-icon dashicons ' + icon + '"></span>' + label;
				templates_nav_html += '</a>';
			}
		}

		// Build Sidebar
		var sidebar_html = '<div id="pagelayer-sidebar">';
		if (typeof pagelayer_admin_data !== 'undefined' && parseInt(pagelayer_admin_data.is_sitepad) !== 1) {
			sidebar_html += '<div id="pagelayer-sidebar-logo">' +
				'<img src="' + logo_url + '" alt="Pagelayer Logo">' +
				'<div class="pl-logo-details">' +
					'<span class="pl-logo-text">pagelayer</span>' +
					'<span class="pl-version">v' + version + '</span>' +
				'</div>' +
			'</div>';
		}
		sidebar_html += '<nav id="pagelayer-sidebar-nav">' +
				templates_nav_html +
			'</nav>' +
		'</div>';

		// Extract original elements
		var title_text = $('.wp-heading-inline').text() || (is_fonts_page ? 'Custom Fonts' : 'Theme Templates');
		
		// Build actions
		var actions_html = '';
		var $addNewBtn = $('.page-title-action');
		var $exportBtn = $('.pagelayer-temp-export-but');
		
		if($addNewBtn.length){
			actions_html += $addNewBtn[0].outerHTML;
		}
		if($exportBtn.length){
			actions_html += $exportBtn[0].outerHTML;
		}
		
		// Build top header
		var top_header_html = '<div id="pagelayer-top-header">' +
			'<h1>' + title_text + '</h1>' +
			'<div class="pagelayer-header-actions">' +
				actions_html +
			'</div>' +
		'</div>';

		// Get the original wrap element
		var $wrap = $('#wpbody-content .wrap').first();
		
		if($wrap.length){
			// Create the modern layout structures
			var $adminWrap = $('<div id="pagelayer-admin-wrap"></div>');
			var $main_content = $('<div id="pagelayer-main-content"></div>');
			var $body_row = $('<div id="pagelayer-body-row"></div>');
			var $settings_content = $('<div id="pagelayer-settings-content"></div>');
			
			// Assemble the new structures
			$main_content.append(top_header_html);
			$body_row.append($settings_content);
			$main_content.append($body_row);
			if (!(is_fonts_page && typeof pagelayer_admin_data !== 'undefined' && parseInt(pagelayer_admin_data.is_sitepad) === 1)) {
				$adminWrap.append(sidebar_html);
			} else {
				$adminWrap.addClass('pl-no-sidebar');
			}
			$adminWrap.append($main_content);
			
			// Prepend our admin wrapper directly into #wpbody-content
			$('#wpbody-content').prepend($adminWrap);
			
			// Move the entire .wrap inside the settings content!
			$settings_content.append($wrap);
			
			// Hide the duplicate/original title and actions inside .wrap
			$wrap.find('.wp-heading-inline, .page-title-action, .pagelayer-temp-export-but, hr-wp-header-end').hide();
			$wrap.find('> h1, > hr').hide();
			
			// Hide the legacy tabs wrapper since we have it in the sidebar
			if($tabs.length){
				$tabs.hide();
			}
		}
	}

	// Recommended plugins install/activate handler (AJAX)
	$(document).on('click', '.pagelayer-plugin-install-btn, .pagelayer-plugin-activate-btn', function(e){
		e.preventDefault();
		var $btn = $(this);
		var slug = $btn.data('slug');
		var is_install = $btn.hasClass('pagelayer-plugin-install-btn');
		var originalText = $btn.text();
		
		$btn.text('Processing...').prop('disabled', true);
		
		$.ajax({
			url: ajaxurl,
			method: 'POST',
			data: {
				action: is_install ? 'pagelayer_install_plugin' : 'pagelayer_activate_plugin',
				security: typeof pagelayer_recommended_nonce !== 'undefined' ? pagelayer_recommended_nonce : '',
				plugin: slug,
			},
			dataType: 'json',
			success: function(data){
				if(data.success){
					$btn.replaceWith('<span class="pl-plugin-badge pl-plugin-success">Active</span>');
				}else{
					$btn.text(originalText).prop('disabled', false);
					alert(data.data && data.data.message ? data.data.message : 'Action failed. Please try again.');
				}
			},
			error: function(){
				$btn.text(originalText).prop('disabled', false);
				alert('An error occurred. Please try again.');
			},
		});
	});

	// Add Back to List button on Add New / Edit pages for templates & fonts
	var is_post_new = $('body').hasClass('post-new-php');
	var is_post_edit = $('body').hasClass('post-php');
	
	if((is_post_new || is_post_edit) && (typeof typenow !== 'undefined')){
		if(typenow === 'pagelayer-fonts' || typenow === 'pagelayer-template'){
			var list_url = 'edit.php?post_type=' + typenow;
			var label = 'Back to Settings';
			
			var back_btn_html = '<a href="' + list_url + '" class="pl-back-to-list-btn">' +
				'<span class="dashicons dashicons-arrow-left-alt2"></span> ' + label +
			'</a>';
			
			// Find the heading or wrap and prepend it
			var $heading = $('.wp-heading-inline').first();
			if($heading.length){
				$heading.before(back_btn_html);
			} else {
				var $wrapHeading = $('.wrap h1').first();
				if($wrapHeading.length){
					$wrapHeading.before(back_btn_html);
				}
			}
		}
	}

	// SitePad check on document ready to hide sidebar for templates wizard and tools pages
	if (typeof pagelayer_admin_data !== 'undefined' && parseInt(pagelayer_admin_data.is_sitepad) === 1) {
		if ($('body').hasClass('pagelayer_page_pagelayer_template_wizard') || $('body').hasClass('pagelayer_page_pagelayer_template_export')) {
			$('#pagelayer-admin-wrap').addClass('pl-no-sidebar');
		}
	}

});