PageSourceSearch

https://mobiletabletech.com/js/main.js

js mobiletabletech.com collected 2026-10-02 01:36:03 UTC 5,053 bytes, 131 lines download raw bytes

1// DOM Elements
2const mobileMenuToggle = document.querySelector('.mobile-menu-toggle');
3const navLinks = document.querySelector('.nav-links');
4const themeToggle = document.querySelector('.theme-toggle');
5const body = document.body;
6const logoImg = document.querySelector('.logo-img');
7
8document.addEventListener('DOMContentLoaded', function() {
9    // Dark mode toggle
10    const modeText = themeToggle.querySelector('.mode-text');
11    const modeIcon = themeToggle.querySelector('.mode-icon');
12    
13    function setDarkMode(isDark) {
14        document.body.classList.toggle('dark-mode', isDark);
15        modeText.textContent = isDark ? 'Light Mode' : 'Dark Mode';
16        modeIcon.className = isDark ? 'fas fa-sun mode-icon' : 'fas fa-moon mode-icon';
17        // Update logo based on dark mode
18        if (logoImg) {
19            const baseUrl = document.body.getAttribute('data-base-url') || '';
20            logoImg.src = isDark ? baseUrl + 'images/mtt_logo_dark.png' : baseUrl + 'images/mtt_logo.png';
21        }
22        localStorage.setItem('darkMode', isDark);
23    }
24
25    // Check for saved dark mode preference
26    const isDarkMode = localStorage.getItem('darkMode') === 'true';
27    setDarkMode(isDarkMode);
28
29    themeToggle.addEventListener('click', () => {
30        setDarkMode(!document.body.classList.contains('dark-mode'));
31    });
32
33    // Mobile menu toggle
34    mobileMenuToggle?.addEventListener('click', () => {
35        navLinks.classList.toggle('active');
36        mobileMenuToggle.classList.toggle('active');
37    });
38
39    // Support form handling
40    const supportForm = document.getElementById('supportForm');
41    const submitButton = document.getElementById('submitButton');
42
43    if (supportForm) {
44        supportForm.addEventListener('submit', function(e) {
45            e.preventDefault();
46
47            // Disable submit button
48            submitButton.disabled = true;
49            submitButton.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Sending...';
50
51            // Get form data
52            const formData = {
53                name: document.getElementById('name').value,
54                email: document.getElementById('email').value,
55                subject: document.getElementById('subject').value,
56                message: document.getElementById('message').value
57            };
58
59            // Send AJAX request
60            $.ajax({
61                url: baseUrl + 'includes/send-email.php',
62                type: 'POST',
63                data: formData,
64                success: function(response) {
65                    if (response.status === 'success') {
66                        alertify.success('Message sent successfully!');
67                        supportForm.reset();
68                    } else {
69                        alertify.error(response.message || 'Failed to send message.');
70                    }
71                },
72                error: function(xhr, status, error) {
73                    alertify.error('An error occurred. Please try again later.');
74                    console.error('Error:', error);
75                },
76                complete: function() {
77                    // Re-enable submit button
78                    submitButton.disabled = false;
79                    submitButton.innerHTML = 'Send Message';
80                }
81            });
82        });
83    }
84});
85
86// Close mobile menu when clicking outside
87document.addEventListener('click', (e) => {
88    if (!mobileMenuToggle.contains(e.target) && !navLinks.contains(e.target) && navLinks.classList.contains('active')) {
89        navLinks.classList.remove('active');
90        mobileMenuToggle.classList.remove('active');
91    }
92});
93
94// Smooth scroll for anchor links
95document.querySelectorAll('a[href^="#"]').forEach(anchor => {
96    anchor.addEventListener('click', function (e) {
97        e.preventDefault();
98        const target = document.querySelector(this.getAttribute('href'));
99        if (target) {
100            target.scrollIntoView({
101                behavior: 'smooth',
102                block: 'start'
103            });
104            // Close mobile menu if open
105            if (navLinks.classList.contains('active')) {
106                navLinks.classList.remove('active');
107                mobileMenuToggle.classList.remove('active');
108            }
109        }
110    });
111});
112
113// Add active class to current navigation link
114const currentPath = window.location.pathname.replace(/\/$/, ''); // Remove trailing slash
115const navLinksAnchors = document.querySelectorAll('.nav-links a');
116
117navLinksAnchors.forEach(link => {
118    const linkPath = link.getAttribute('href').replace(/\/$/, ''); // Remove trailing slash
119    if (linkPath === currentPath || 
120        (currentPath === '' && linkPath === '/')) {
121        link.classList.add('active');
122    }
123});
124
125// Configure Alertify defaults
126alertify.defaults.notifier.position = 'top-right';
127alertify.defaults.notifier.delay = 5;
128alertify.defaults.transition = "slide";
129alertify.defaults.theme.ok = "btn btn-primary";
130alertify.defaults.theme.cancel = "btn btn-danger";
131alertify.defaults.theme.input = "form-control"; 

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.