(function ($) { 'use strict'; if (typeof mcGalleryPro === 'undefined') { console.error('MC Gallery Pro: Configuration not found.'); return; } const api = mcGalleryPro.restBase.replace(/\/?$/, ''); const ajaxUrl = mcGalleryPro.uploadUrl; const maxUploads = mcGalleryPro.maxUploads || 5; let originalBodyPadding = ''; let scrollbarWidth = 0; let sessionData = { token: null, username: null, serverId: null, verified: false }; let selectedFiles = []; function getScrollbarWidth() { if (scrollbarWidth > 0) return scrollbarWidth; const outer = document.createElement('div'); outer.style.visibility = 'hidden'; outer.style.width = '100px'; outer.style.msOverflowStyle = 'scrollbar'; document.body.appendChild(outer); const widthNoScroll = outer.offsetWidth; outer.style.overflow = 'scroll'; const inner = document.createElement('div'); inner.style.width = '100%'; outer.appendChild(inner); const widthWithScroll = inner.offsetWidth; outer.parentNode.removeChild(outer); scrollbarWidth = widthNoScroll - widthWithScroll; return scrollbarWidth; } function showFeedback(msg, type = 'info') { const $fb = $('#mc-feedback-msg'); $fb.removeClass('mc-msg-success mc-msg-error'); if (type === 'success') { $fb.addClass('mc-msg-success'); } else if (type === 'error') { $fb.addClass('mc-msg-error'); } $fb.html(msg).fadeIn(300); } function switchStep(stepNum) { $('.mc-step').removeClass('active'); $(`.mc-step[data-step="${stepNum}"]`).addClass('active'); } function resetModal() { $('#mc-upload-username').val(''); $('#mc-token-text').text('Waiting...'); $('#mc-upload-file').val(''); $('#mc-file-name').text('Keine Bilder gewählt').css('color', ''); $('.mc-file-drop').css('border-color', '').css('background', ''); $('#mc-feedback-msg').hide().empty(); $('#mc-file-preview').empty(); $('#mc-upload-progress').hide(); $('#mc-btn-upload-more').hide(); $('#mc-btn-final-upload').show(); selectedFiles = []; sessionData = { token: null, username: null, serverId: null, verified: false }; switchStep(1); } function loadServers() { const $select = $('#mc-upload-server'); if (!$select.length) return; $select.html('').prop('disabled', true); fetch(api + '/servers') .then(response => { if (!response.ok) throw new Error('Server response not OK'); return response.json(); }) .then(data => { if (data.success && Array.isArray(data.data) && data.data.length > 0) { $select.empty().prop('disabled', false); data.data.forEach(server => { const displayText = server.host ? `${server.title} (${server.host})` : server.title; $select.append($(''); } }) .catch(error => { console.error('Failed to load servers:', error); $select.html(''); }); } function loadAlbums() { const $select = $('#mc-upload-album'); $select.html('').prop('disabled', true); if (!sessionData.token || !sessionData.verified) return; fetch(api + '/albums', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: sessionData.token, username: sessionData.username, server_id: sessionData.serverId }) }) .then(response => response.json()) .then(data => { if (data.success && data.data.albums) { $select.prop('disabled', false); data.data.albums.forEach(album => { $select.append($('