Add massive collection of CSS, JavaScript and theme assets that were previously excluded: **CSS Files (681 total):** - HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup - Theme framework files (Astra, builder systems, layouts): 200+ files - Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files - WordPress core and editor styles: 50+ files - Responsive and RTL language support: 200+ files **JavaScript Files (400+ total):** - HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations - Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope - Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS - WordPress core functionality: customizer, admin, block editor compatibility - Third-party integrations: Stripe, SMTP, analytics, search functionality **Assets:** - Certificate background images and logos - Comprehensive theme styling infrastructure - Mobile-responsive design systems - Cross-browser compatibility assets - Performance-optimized minified versions **Updated .gitignore:** - Fixed asset directory whitelisting patterns to properly include CSS/JS/images - Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.) - Maintains security by excluding sensitive files while including essential assets This commit provides the complete frontend infrastructure needed for: - Full theme functionality and styling - Plugin feature implementations - Mobile responsiveness and accessibility - Cross-browser compatibility - Performance optimization - Developer workflow support
270 lines
No EOL
9.2 KiB
JavaScript
270 lines
No EOL
9.2 KiB
JavaScript
/**
|
|
* HVAC Safari Debug System
|
|
* Comprehensive debugging for Safari compatibility issues
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
// Debug logger that works in all browsers
|
|
var SafariDebug = {
|
|
logs: [],
|
|
|
|
log: function(message, data) {
|
|
var timestamp = new Date().toISOString();
|
|
var logEntry = {
|
|
time: timestamp,
|
|
message: message,
|
|
data: data || null,
|
|
userAgent: navigator.userAgent
|
|
};
|
|
|
|
this.logs.push(logEntry);
|
|
|
|
// Also log to console
|
|
if (console && console.log) {
|
|
console.log('[SAFARI-DEBUG]', timestamp, message, data);
|
|
}
|
|
|
|
// Send to server for logging (ES5 compatible) - only if actually Safari
|
|
if (this.isActualSafari()) {
|
|
this.sendToServer(logEntry);
|
|
}
|
|
},
|
|
|
|
error: function(message, error) {
|
|
var timestamp = new Date().toISOString();
|
|
var errorEntry = {
|
|
time: timestamp,
|
|
message: 'ERROR: ' + message,
|
|
error: error ? error.toString() : null,
|
|
stack: error && error.stack ? error.stack : null,
|
|
userAgent: navigator.userAgent
|
|
};
|
|
|
|
this.logs.push(errorEntry);
|
|
|
|
if (console && console.error) {
|
|
console.error('[SAFARI-DEBUG]', timestamp, message, error);
|
|
}
|
|
|
|
if (this.isActualSafari()) {
|
|
this.sendToServer(errorEntry);
|
|
}
|
|
},
|
|
|
|
isActualSafari: function() {
|
|
var userAgent = navigator.userAgent;
|
|
// Check for Safari but not Chrome/Chromium (more precise detection)
|
|
return (userAgent.indexOf('Safari') !== -1 &&
|
|
userAgent.indexOf('Chrome') === -1 &&
|
|
userAgent.indexOf('Chromium') === -1 &&
|
|
userAgent.indexOf('Version/') !== -1); // Safari always has Version/
|
|
},
|
|
|
|
sendToServer: function(logEntry) {
|
|
// Only send if we have AJAX capability
|
|
if (typeof XMLHttpRequest !== 'undefined') {
|
|
try {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('POST', '/wp-admin/admin-ajax.php', true);
|
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
xhr.send('action=hvac_safari_debug&log=' + encodeURIComponent(JSON.stringify(logEntry)));
|
|
} catch(e) {
|
|
// Silent fail - don't break the page
|
|
}
|
|
}
|
|
},
|
|
|
|
getSummary: function() {
|
|
return {
|
|
totalLogs: this.logs.length,
|
|
errors: this.logs.filter(function(log) { return log.message.indexOf('ERROR:') === 0; }),
|
|
userAgent: navigator.userAgent,
|
|
logs: this.logs
|
|
};
|
|
}
|
|
};
|
|
|
|
// Make SafariDebug globally available
|
|
window.SafariDebug = SafariDebug;
|
|
|
|
// Log initial load
|
|
SafariDebug.log('Safari Debug System Initialized', {
|
|
url: window.location.href,
|
|
userAgent: navigator.userAgent,
|
|
documentReadyState: document.readyState
|
|
});
|
|
|
|
// Test basic JavaScript features
|
|
SafariDebug.log('Testing JavaScript Features');
|
|
|
|
try {
|
|
// Test variable declarations
|
|
var testVar = 'test';
|
|
SafariDebug.log('✓ var declaration works');
|
|
|
|
// Test function declarations
|
|
function testFunction() {
|
|
return 'function test';
|
|
}
|
|
SafariDebug.log('✓ function declaration works', testFunction());
|
|
|
|
// Test object creation
|
|
var testObj = {
|
|
prop: 'value',
|
|
method: function() {
|
|
return 'method test';
|
|
}
|
|
};
|
|
SafariDebug.log('✓ object creation works', testObj.method());
|
|
|
|
// Test array operations
|
|
var testArray = [1, 2, 3];
|
|
SafariDebug.log('✓ array creation works', testArray.length);
|
|
|
|
// Test DOM access
|
|
if (document) {
|
|
SafariDebug.log('✓ document object available');
|
|
if (document.getElementById) {
|
|
SafariDebug.log('✓ getElementById available');
|
|
}
|
|
}
|
|
|
|
// Test jQuery detection
|
|
if (typeof jQuery !== 'undefined') {
|
|
SafariDebug.log('✓ jQuery available', jQuery.fn.jquery);
|
|
} else if (typeof $ !== 'undefined') {
|
|
SafariDebug.log('✓ $ available but not jQuery');
|
|
} else {
|
|
SafariDebug.log('⚠ jQuery/$ not detected');
|
|
}
|
|
|
|
// Test HVAC plugin detection
|
|
if (typeof hvac_ajax !== 'undefined') {
|
|
SafariDebug.log('✓ HVAC AJAX object available', hvac_ajax);
|
|
} else {
|
|
SafariDebug.log('⚠ HVAC AJAX object not available');
|
|
}
|
|
|
|
} catch (error) {
|
|
SafariDebug.error('JavaScript feature test failed', error);
|
|
}
|
|
|
|
// Monitor for errors
|
|
if (window.addEventListener) {
|
|
window.addEventListener('error', function(event) {
|
|
SafariDebug.error('Global JavaScript Error', {
|
|
message: event.message,
|
|
filename: event.filename,
|
|
lineno: event.lineno,
|
|
colno: event.colno,
|
|
error: event.error
|
|
});
|
|
});
|
|
|
|
SafariDebug.log('✓ Error monitoring enabled');
|
|
}
|
|
|
|
// Monitor unhandled promise rejections (if supported)
|
|
if (window.addEventListener && typeof Promise !== 'undefined') {
|
|
window.addEventListener('unhandledrejection', function(event) {
|
|
SafariDebug.error('Unhandled Promise Rejection', {
|
|
reason: event.reason,
|
|
promise: event.promise
|
|
});
|
|
});
|
|
SafariDebug.log('✓ Promise rejection monitoring enabled');
|
|
}
|
|
|
|
// DOM Ready monitoring
|
|
var domReadyChecks = 0;
|
|
var maxDomChecks = 50; // 5 seconds max
|
|
|
|
function checkDOMReady() {
|
|
domReadyChecks++;
|
|
SafariDebug.log('DOM Ready Check #' + domReadyChecks, {
|
|
readyState: document.readyState,
|
|
body: document.body ? 'present' : 'missing'
|
|
});
|
|
|
|
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
SafariDebug.log('✓ DOM Ready State Achieved', document.readyState);
|
|
initializePageDebug();
|
|
} else if (domReadyChecks < maxDomChecks) {
|
|
setTimeout(checkDOMReady, 100);
|
|
} else {
|
|
SafariDebug.error('DOM Ready State Never Achieved', {
|
|
finalState: document.readyState,
|
|
checksPerformed: domReadyChecks
|
|
});
|
|
}
|
|
}
|
|
|
|
function initializePageDebug() {
|
|
SafariDebug.log('Initializing Page-Specific Debug');
|
|
|
|
try {
|
|
// Check for critical page elements
|
|
var criticalElements = [
|
|
'body',
|
|
'.hvac-trainer-grid',
|
|
'.hvac-map-container',
|
|
'#hvac-trainer-modal',
|
|
'.hvac-filter-controls'
|
|
];
|
|
|
|
for (var i = 0; i < criticalElements.length; i++) {
|
|
var selector = criticalElements[i];
|
|
var element = document.querySelector ? document.querySelector(selector) : null;
|
|
|
|
if (element) {
|
|
SafariDebug.log('✓ Found critical element: ' + selector);
|
|
} else {
|
|
SafariDebug.log('⚠ Missing critical element: ' + selector);
|
|
}
|
|
}
|
|
|
|
// Check for script loading
|
|
var scripts = document.getElementsByTagName('script');
|
|
var hvacScripts = [];
|
|
|
|
for (var j = 0; j < scripts.length; j++) {
|
|
if (scripts[j].src && scripts[j].src.indexOf('hvac') !== -1) {
|
|
hvacScripts.push({
|
|
src: scripts[j].src,
|
|
loaded: scripts[j].readyState || 'unknown'
|
|
});
|
|
}
|
|
}
|
|
|
|
SafariDebug.log('HVAC Scripts Found', hvacScripts);
|
|
|
|
// Test MapGeo integration
|
|
if (typeof window.hvacShowTrainerModal === 'function') {
|
|
SafariDebug.log('✓ MapGeo integration function available');
|
|
} else {
|
|
SafariDebug.log('⚠ MapGeo integration function missing');
|
|
}
|
|
|
|
} catch (error) {
|
|
SafariDebug.error('Page debug initialization failed', error);
|
|
}
|
|
}
|
|
|
|
// Start DOM monitoring
|
|
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
initializePageDebug();
|
|
} else {
|
|
checkDOMReady();
|
|
}
|
|
|
|
// Create global debug function for manual testing
|
|
window.getSafariDebugReport = function() {
|
|
return SafariDebug.getSummary();
|
|
};
|
|
|
|
// Log completion
|
|
SafariDebug.log('Safari Debug System Setup Complete');
|
|
|
|
})(); |