1(function($) { 2 'use strict'; 3 4 function initCalendar() { 5 console.log('Ronin Adventskalender wird initialisiert...'); 6 7 // Prüfen ob roninAdvent verfügbar ist 8 if (typeof roninAdvent === 'undefined') { 9 console.error('roninAdvent ist nicht definiert!'); 10 return; 11 } 12 13 const calendarElement = $('#advent-calendar'); 14 15 if (calendarElement.length === 0) { 16 console.error('Kalender-Element #advent-calendar nicht gefunden!'); 17 return; 18 } 19 20 const modal = $('#door-modal'); 21 const closeModal = $('.modal-close'); 22 23 // Deals aus WordPress holen 24 const deals = roninAdvent.deals || []; 25 console.log('Anzahl Deals:', deals.length); 26 27 // Logik: Datum und Monats-Check 28 const today = new Date().getDate(); 29 const currentMonth = new Date().getMonth(); // 11 ist Dezember 30 const currentYear = new Date().getFullYear(); 31 32 console.log('Heute ist der:', today, 'Monat:', currentMonth); 33 34 // LocalStorage-Funktionen 35 const getOpenedDoors = function() { 36 try { 37 const stored = localStorage.getItem('ronin_advent_doors_' + currentYear); 38 return stored ? JSON.parse(stored) : []; 39 } catch (e) { 40 console.error('LocalStorage Fehler:', e); 41 return []; 42 } 43 }; 44 45 const saveOpenedDoor = function(day) { 46 let openedDoors = getOpenedDoors(); 47 if (!openedDoors.includes(day)) { 48 openedDoors.push(day); 49 // Nur im Dezember speichern 50 if (currentMonth === 11) { 51 try { 52 localStorage.setItem('ronin_advent_doors_' + currentYear, JSON.stringify(openedDoors)); 53 } catch(e) { 54 console.error('Fehler beim Speichern:', e); 55 } 56 } 57 } 58 }; 59 60 // 1. Alle Türchen generieren 61 console.log('Generiere Türchen...'); 62 for (let i = 1; i <= 24; i++) { 63 const door = $('<div></div>') 64 .addClass('advent-door') 65 .attr('data-day', i); 66 67 const doorNumber = $('<span></span>') 68 .addClass('advent-door-number') 69 .text(i); 70 71 door.append(doorNumber); 72 73 // Ist der Kalender aktiv und das Datum in der Zukunft? 74 // Türchen ist gesperrt wenn: Tag noch nicht erreicht (im Dezember) ODER nicht Dezember 75 const isLocked = (i > today && currentMonth === 11) || currentMonth !== 11; 76 const hasBeenOpened = getOpenedDoors().includes(i); 77 const deal = deals.find(function(d) { return parseInt(d.day) === i; }); 78 79 if (hasBeenOpened && deal) { 80 door.addClass('is-open'); 81 // Produktbild als Hintergrund setzen 82 door.css('background-image', 'url(' + deal.img + ')'); 83 door.css('background-size', 'cover'); 84 door.css('background-position', 'center'); 85 doorNumber.hide(); // Nummer ausblenden bei geöffnetem Türchen 86 } 87 88 if (isLocked) { 89 door.addClass('is-locked'); 90 } 91 92 if (deal) { 93 door.data('deal', deal); 94 } 95 96 calendarElement.append(door); 97 } 98 99 console.log('24 Türchen generiert!'); 100 101 // 2. Klick-Handler für die Türchen 102 calendarElement.on('click', '.advent-door', function() { 103 const door = $(this); 104 const day = parseInt(door.attr('data-day')); 105 106 if (door.hasClass('is-locked')) { 107 // Hinweis für gesperrte Türchen 108 const monthName = currentMonth === 11 ? 'Dezember' : 'Advent'; 109 alert('ð Dieses Türchen kann erst am ' + day + '. ' + monthName + ' geöffnet werden!\n\nBitte habe noch etwas Geduld. â°'); 110 return; 111 } 112 113 const deal = door.data('deal'); 114 115 if (deal) { 116 const wasAlreadyOpen = door.hasClass('is-open'); 117 118 // Türchen-Label und Titel getrennt setzen
119 $('#modal-day-label').text('Türchen ' + day); 120 $('#modal-title').text(deal.title); 121 $('#modal-image').attr('src', deal.img).attr('alt', deal.title); 122 $('#modal-text').html(deal.text); 123 124 // Button-Text: wenn schon geöffnet "Zum Bestseller", sonst Custom-Text 125 const buttonText = wasAlreadyOpen ? 'Zum Bestseller' : (roninAdvent.buttonText || 'Nur HEUTE für 5 EUR sichern >'); 126 $('#modal-button').attr('href', deal.url).text(buttonText); 127 128 modal.show(); 129 130 // Türchen als geöffnet markieren (nur wenn noch nicht offen) 131 if (!wasAlreadyOpen) { 132 door.addClass('is-open'); 133 // Produktbild als Hintergrund setzen 134 door.css('background-image', 'url(' + deal.img + ')'); 135 door.css('background-size', 'cover'); 136 door.css('background-position', 'center'); 137 // Nummer ausblenden 138 door.find('.advent-door-number').fadeOut(300); 139 140 saveOpenedDoor(day); 141 } 142 } else { 143 alert('Türchen ' + day + ' ist offen, aber der Deal muss noch eingetragen werden!'); 144 } 145 }); 146 147 // 3. Modal schlieÃen 148 closeModal.on('click', function() { 149 modal.hide(); 150 }); 151 152 $(window).on('click', function(event) { 153 if ($(event.target).is('#door-modal')) { 154 modal.hide(); 155 } 156 }); 157 158 // ESC-Taste zum SchlieÃen 159 $(document).on('keydown', function(event) { 160 if (event.key === 'Escape' && modal.is(':visible')) { 161 modal.hide(); 162 } 163 }); 164 165 console.log('Kalender erfolgreich initialisiert!'); 166 } 167 168 // Initialisieren wenn DOM bereit ist 169 $(document).ready(function() { 170 console.log('DOM Ready - starte Kalender'); 171 initCalendar(); 172 }); 173 174})(jQuery);
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.