1//Globale Variablen für Checkbox "PDF erstellen" 2var pdf = false; 3 4//Array mit Arbeitsanweisungen als Objekte 5var zuchtkalender = [ 6 { 7 Offset: 0, 8 Stadium: "", 9 Taetigkeit: "Sammelbrutableger erstellen", 10 Bemerkung: 11 "Aus starken Wirtschaftsvölkern werden 1-2 bienenbesetzte Brutwaben als Pflegebienen für den Zuchtstoff entnommen. Mit 8-10 solcher Waben wird ein Sammelbrutableger gebildet. Er sollte mit genügend Futter versorgt sein.", 12 showInShort: true, 13 }, 14 { 15 Offset: 7, 16 Stadium: "Tag 1: Stift stehend", 17 Taetigkeit: "Leerwabe einhängen", 18 Bemerkung: 19 "Eine Leerwabe in das Brutnest des Volkes einhängen, von dem der Zuchtstoff für die Zuchtserie verwendet werden soll. Die Königin bestiftet diese Leerwabe und nach 3 Tagen stehen jüngste Maden zur Verfügung. Alternative: Nicot-Copularve einhängen und Königin in Copularve einsperren.", 20 showInShort: true, 21 }, 22 { 23 Offset: 8, 24 Stadium: "Tag 2: Stift hängend", 25 Taetigkeit: "", 26 Bemerkung: "", 27 showInShort: false, 28 }, 29 { 30 Offset: 9, 31 Stadium: "Tag 3: Stift liegend", 32 Taetigkeit: "Nachschaffungszellen brechen", 33 Bemerkung: 34 "Es müssen ALLE Nachschaffungszellen gefunden und entfernt werden. Das Volk muss hoffnungslos weisellos sein.", 35 showInShort: true, 36 }, 37 { 38 Offset: 10, 39 Stadium: "Tag 4:<br>Rundmade/Larve<br>1. Häutung", 40 Taetigkeit: "Umlarven", 41 Bemerkung: 42 "Der Zuchtstoff wird nun dem Sammelableger zur Aufzucht angeboten. Hierzu wird die Leerwabe, die am <span id='Leerwabe'></span> in das Zuchtvolk eingehangen wurde, wieder entnommen und die Maden in Weiselbecher umgelarvt (alternativ hierzu z.B. Zellen schneiden bzw. bestiftete Nicot-Becher aus Copularve auf die Trägerleiste geben und Königin wieder freilassen). Bei mangelnden Trachtverhältnissen nun regelmäÃig mit Zuckerwasser 1:1 in kleinen Gaben füttern.", 43 showInShort: true, 44 }, 45 { 46 Offset: 11, 47 Stadium: "Tag 5:<br>Rundmade/Larve<br>2. Häutung", 48 Taetigkeit: "Annahmekontrolle", 49 Bemerkung: 50 "Nach 1 Tag wird die Annahme der Weiselzellen kontrolliert (Ausbau, Fütterung).", 51 showInShort: true, 52 }, 53 { 54 Offset: 12, 55 Stadium: "Tag 6:<br>Rundmade/Larve<br>3. Häutung", 56 Taetigkeit: "", 57 Bemerkung: "", 58 showInShort: false, 59 }, 60 { 61 Offset: 13, 62 Stadium: "Tag 7:<br>Rundmade/Larve", 63 Taetigkeit: "", 64 Bemerkung: "", 65 showInShort: false, 66 }, 67 { 68 Offset: 14, 69 Stadium: 70 "Tag 8:<br>Rundmade wird zu Streckmade<br>4. Häutung<br>Verdeckelung", 71 Taetigkeit: "", 72 Bemerkung: "", 73 showInShort: false, 74 }, 75 { 76 Offset: 15, 77 Stadium: " Tag 9:<br>Streckmade", 78 Taetigkeit: "Verschulung<br>1. Möglichkeit", 79 Bemerkung: 80 "Kurz nach der Verdeckelung besteht die erste Möglichkeit die Weiselzelle zu verschulen.", 81 showInShort: true, 82 }, 83 { 84 Offset: 16, 85 Stadium: "Tag 10:<br>Vorpuppe<br>5. Häutung", 86 Taetigkeit: "", 87 Bemerkung: "Absolute Ruhe, sehr empfindlich gegen Erschütterungen", 88 showInShort: false, 89 }, 90 { 91 Offset: 17, 92 Stadium: "Tag 11:<br>Puppe", 93 Taetigkeit: "", 94 Bemerkung: "Absolute Ruhe, sehr empfindlich gegen Erschütterungen", 95 showInShort: false, 96 }, 97 { 98 Offset: 18, 99 Stadium: "Tag 12:<br>Puppe", 100 Taetigkeit: "", 101 Bemerkung: "", 102 showInShort: false, 103 }, 104 { 105 Offset: 19, 106 Stadium: "Tag 13:<br>Puppe", 107 Taetigkeit: "", 108 Bemerkung: "", 109 showInShort: false, 110 }, 111 { 112 Offset: 20, 113 Stadium: "Tag 14:<br>Puppe", 114 Taetigkeit: "", 115 Bemerkung: "", 116 showInShort: false, 117 }, 118 { 119 Offset: 21, 120 Stadium: "Tag 15:<br>Puppe<br>6. Häutung", 121 Taetigkeit: "Verschulung<br>2. Möglichkeit", 122 Bemerkung: 123 "Falls noch nicht geschehen ist jetzt der letztmögliche Zeitpunkt die Weiselzelle zu verschulen. Schlüpft auch nur eine Königin vorzeitig werden alle anderen Königinnen sonst abgetötet.", 124 showInShort: true, 125 }, 126 { 127 Offset: 22, 128 Stadium: "Tag 16:<br>Schlupf", 129 Taetigkeit: "Aus Käfig befreien, leere Weiselzelle entfernen", 130 Bemerkung: "3 - 5 - 8, Königin ist gemacht!", 131 showInShort: true, 132 }, 133]; 134 135//Eventlistener 136document 137 .getElementById("btn_erstellen") 138 .addEventListener("click", Zuchtkalender_erstellen); 139document.getElementById("PDF").addEventListener("click", togglePDF); 140 141function Zuchtkalender_erstellen() { 142 //Variablen aus DOM einlesen 143 144 //Bei fehlendem Datum Alarm ausgeben 145 try { 146 var termin = new Date(document.getElementById("termin").value); 147 148 if (termin == "Invalid Date") { 149 throw "Datumsfehler"; 150 } 151 } catch (Datumsfehler) { 152 alert("Bitte ein Datum eingeben"); 153 return; //bricht die Funktion ab 154 } 155 156 //Schalter für kurzen oder ausführlichen Zuchtkalender 157 var form = document.getElementById("Umfang"); 158 var umfang = form.elements["Umfang"].value; 159
160 //eingegebenes Datum umrechnen auf den Starttermin, je nach Fixdatum 161 var terminart = document.getElementById("terminart").value; 162 switch (terminart) { 163 case "Zuchtbeginn": 164 termin.setDate(termin.getDate() - 0); 165 break; 166 case "Umlarftermin": 167 termin.setDate(termin.getDate() - 10); 168 break; 169 case "Schlupftermin": 170 termin.setDate(termin.getDate() - 22); 171 break; 172 } 173 174 //Optionen für Datumsanzeige 175 var options = { 176 weekday: "long", 177 year: "numeric", 178 month: "long", 179 day: "numeric", 180 }; 181 182 //Lösche evtl. alte Tabellencontainer aus vorherigen Berechnungen 183 if (document.getElementById("Tabellencontainer")) { 184 var clear = document.getElementById("Tabellencontainer"); 185 clear.parentNode.removeChild(clear); 186 } 187 188 //Erstelle Tabelle 189 var container = document.createElement("div"); 190 container.classList.add("container"); 191 container.classList.add("justify-content-center"); 192 container.classList.add("table-responsive"); 193 container.setAttribute("id", "Tabellencontainer"); 194 195 var tabelle = document.createElement("table"); 196 tabelle.classList.add("table"); 197 tabelle.classList.add("table-sm"); 198 tabelle.classList.add("table-bordered"); 199 tabelle.setAttribute("id", "Tabelle"); 200 201 var tabellenkopf = document.createElement("thead"); 202 var kopfzeile = document.createElement("tr"); 203 tabellenkopf.classList.add("thead-light"); 204 tabellenkopf.classList.add("sticky-top"); 205 tabelle.appendChild(tabellenkopf); 206 tabellenkopf.appendChild(kopfzeile); 207 208 var tabellenbody = document.createElement("tbody"); 209 210 if (umfang == "kurz") { 211 //Tabellenkopf für kurzen Zuchtkalender erstellen 212 beschrifteHead(["Datum", "Tätigkeit"], kopfzeile); 213 214 zuchtkalender.forEach((element) => { 215 if (element.showInShort == true) { 216 let row = document.createElement("tr"); 217 218 let terminZelle = document.createElement("td"); 219 let taetigkeitZelle = document.createElement("td"); 220 221 let zeilentermin = new Date(termin.toUTCString()); 222 zeilentermin.setDate(termin.getDate() + element.Offset); 223 let inhaltTerminzelle = document.createTextNode( 224 zeilentermin.toLocaleString("de-DE", options) 225 ); 226 227 terminZelle.appendChild(inhaltTerminzelle); 228 taetigkeitZelle.innerHTML = element.Taetigkeit; 229 230 row.appendChild(terminZelle); 231 row.appendChild(taetigkeitZelle); 232 tabellenbody.appendChild(row); 233 } 234 }); 235 } else { 236 //Tabellenkopf für langen Zuchtkalender erstellen 237 beschrifteHead(["Datum", "Tätigkeit", "Stadium", "Bemerkungen"], kopfzeile); 238 239 zuchtkalender.forEach((element) => { 240 let row = document.createElement("tr"); 241 242 let terminZelle = document.createElement("td"); 243 let taetigkeitZelle = document.createElement("td"); 244 let stadiumZelle = document.createElement("td"); 245 let bemerkungZelle = document.createElement("td"); 246 247 let zeilentermin = new Date(termin.toUTCString()); 248 zeilentermin.setDate(termin.getDate() + element.Offset); 249 let inhaltTerminzelle = document.createTextNode( 250 zeilentermin.toLocaleString("de-DE", options) 251 ); 252 253 terminZelle.appendChild(inhaltTerminzelle); 254 255 bemerkungZelle.innerHTML = element.Bemerkung; 256 stadiumZelle.innerHTML = element.Stadium; 257 taetigkeitZelle.innerHTML = element.Taetigkeit; 258 row.appendChild(terminZelle); 259 row.appendChild(taetigkeitZelle); 260 row.appendChild(stadiumZelle); 261 row.appendChild(bemerkungZelle); 262 tabellenbody.appendChild(row); 263 }); 264 } 265 266 tabelle.appendChild(tabellenbody); 267 268 container.appendChild(tabelle); 269 document.getElementById("auswahl").appendChild(container); 270 //Umhängetermin nachträglich in SPAN einfügen 271 let umhaengetermin = new Date(termin.setDate(termin.getDate() + 7)); 272 document.getElementById("Leerwabe").innerHTML = umhaengetermin.toLocaleString( 273 "de-DE", 274 options 275 ); 276 //Aufruf PDF-Funktion 277 if (pdf) makePDF(); 278} 279 280//Nach Eingabe der Parameter kann Auswahlmenü ausgeblendet werden 281function toggleAuswahlVisibility() {
282 let auswahl = document.getElementById("auswahl"); 283 auswahl.classList.toggle("invisible"); 284} 285 286//Schaltet die Variable PDF zwischen true und false hin und her 287function togglePDF() { 288 pdf = !pdf; 289} 290 291function makePDF() { 292 console.log("PDF-Funktion aufgerufen"); 293 var doc = new jsPDF(); 294 //Schriften: Helvetica, courier, times, ZapfDingbats, Symbol 295 296 doc.addFont("Savoye"); 297 doc.setFont("Savoye"); 298 299 let tabelle = document.getElementById("Tabelle").innerHTML; 300 301 let textOptions = { 302 maxWidth: 180, 303 angle: 0, 304 charSpace: 0, 305 lineHeightFactor: 1.15, 306 renderingMode: "fill", 307 /*Set how the text should be rendered, possible values: fill, stroke, fillThenStroke, 308 invisible, fillAndAddForClipping, strokeAndAddPathForClipping, 309 fillThenStrokeAndAddToPathForClipping, addToPathForClipping.*/ 310 }; 311 312 /*bis zu vier Parameter, Kommagetrennt können eingegeben werden CMYK. 313 * ! Farbpalette unter http://www.farb-tabelle.de/de/farbtabelle.htm 314 * Kopfdeko in PDF*/ 315 316 // !TODO - Schrift Savoye funktioniert aktuell nicht, daher Auskommentierung des Deko-Schriftzuges 317 /* doc.setTextColor("gold"); 318 doc.setFontSize(20); 319 doc.text(10, 30, "Imkerei Eifel-Gold", null, 30); 320 doc.text(165, 10, "Imkerei Eifel-Gold", null, -30); */ 321 322 //Ãberschrift 323 doc.setFont("helvetica"); 324 doc.setTextColor("black"); 325 doc.setFontSize(24); 326 doc.text("Zuchtkalender", 80, 20); 327 doc.setFontSize(14); 328 doc.setTextColor("gray"); 329 doc.text("für Bienenköniginnen", 83, 27, textOptions); 330 331 //Tabelle mit library autotable, Details: https://github.com/simonbengtsson/jsPDF-AutoTable 332 doc.autoTable({ 333 html: "#Tabelle", 334 startY: 40, 335 styles: { minCellWidth: 33, fontSize: 8 }, 336 }); 337 //Google-Bewertung 338 339 //Footer 340 doc.setFontSize(10); 341 doc.text( 342 "Die Imkerei Eifel-Gold wünscht in viel Erfolg bei der Königinnenzucht!", 343 55, 344 285 345 ); 346 347 //Speichern der Datei 348 doc.save("Zuchtkalender.pdf"); 349} 350 351//Tabellenkopf wird anhand von übergebenem Array mit Spaltenüberschriften gefüllt, header gibt das DOM-Element an 352function beschrifteHead(headings_array, header) { 353 headings_array.forEach((element) => { 354 let head = document.createElement("th"); 355 head.innerText = element; 356 header.appendChild(head); 357 }); 358}
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.