Widget:Zeitumrechner
<!DOCTYPE html> <html lang="de"> <head>
<meta charset="UTF-8">
<title>Xal'thorei Zeitumrechner – Bidirektional</title>
<style>
body {
background: linear-gradient(135deg, #0f2027, #203a43, #2c5364);
color: #fff;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 0;
}
.nav {
display: flex;
justify-content: center;
background-color: #203a43;
}
.nav button {
background: none;
border: none;
color: #fff;
font-size: 1.1em;
padding: 15px 25px;
cursor: pointer;
}
.nav button.active {
background-color: #4CAF50;
}
.container {
padding: 20px 30px;
max-width: 600px;
margin: 20px auto;
background: rgba(0, 0, 0, 0.75);
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0,0,0,0.5);
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input, textarea {
width: 100%;
padding: 8px;
margin-bottom: 15px;
border: none;
border-radius: 5px;
font-size: 1em;
}
button.action, button.copy {
width: 100%;
padding: 10px;
font-size: 1.1em;
border: none;
border-radius: 5px;
background-color: #4CAF50;
color: white;
cursor: pointer;
margin-top: 10px;
}
button.action:hover, button.copy:hover {
background-color: #45a049;
}
.output {
margin-top: 20px;
padding: 15px;
background: rgba(255,255,255,0.1);
border-radius: 5px;
font-size: 1.1em;
text-align: center;
word-wrap: break-word;
}
.hidden { display: none; }
</style>
</head> <body>
Xal'thorei Zeitumrechner (Vorwärts)
<label for="jahr">Jahr (JJJJ):</label> <input type="number" id="jahr" placeholder="z.B. 2025" required> <label for="monat">Monat (MM):</label> <input type="number" id="monat" placeholder="z.B. 03" required> <label for="tag">Tag (TT):</label> <input type="number" id="tag" placeholder="z.B. 21" required> <label for="stunde">Stunde (HH):</label> <input type="number" id="stunde" placeholder="z.B. 15" required> <label for="minute">Minute (mm):</label> <input type="number" id="minute" placeholder="z.B. 42" required> <label for="sekunde">Sekunde (ss):</label> <input type="number" id="sekunde" placeholder="z.B. 30" required> <label for="sternensystem">Sternensystem (Name):</label> <input type="text" id="sternensystem" placeholder="Standard: Sonnensystem"> <label for="galaxiensystem">Galaxiensystem (Name):</label> <input type="text" id="galaxiensystem" placeholder="Standard: Milchstrasse"> <button class="action" onclick="convertToXalThorei()">Umrechnen</button>
Deine Xal'thoreiische Zeitangabe erscheint hier...
<button class="copy" onclick="copyToClipboard('outputForward')">Ergebnis kopieren</button>
<script>
// Navigation zum Wechseln zwischen den Modi
function showSection(section) {
document.getElementById('forwardSection').classList.add('hidden');
document.getElementById('reverseSection').classList.add('hidden');
document.getElementById('btnForward').classList.remove('active');
document.getElementById('btnReverse').classList.remove('active');
if (section === 'forward') {
document.getElementById('forwardSection').classList.remove('hidden');
document.getElementById('btnForward').classList.add('active');
} else {
document.getElementById('reverseSection').classList.remove('hidden');
document.getElementById('btnReverse').classList.add('active');
}
}
// Verbesserte pad-Funktion: Füllt mit führenden Nullen bis zur gewünschten Länge.
function pad(num, size) {
let s = num.toString();
while (s.length < size) {
s = "0" + s;
}
return s;
}
// Caesar-Chiffre (Shift +n oder -n)
function caesarShift(str, shift) {
let result = "";
for (let i = 0; i < str.length; i++) {
let c = str.charCodeAt(i);
if (c >= 65 && c <= 90) { // Großbuchstaben
result += String.fromCharCode(((c - 65 + shift + 26) % 26) + 65);
} else if (c >= 97 && c <= 122) { // Kleinbuchstaben
result += String.fromCharCode(((c - 97 + shift + 26) % 26) + 97);
} else {
result += str.charAt(i);
}
}
return result;
}
// Mappings für griechische Darstellung
const greekTens = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta"];
const greekOnes = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa"];
function digitToGreekTens(digit) {
return greekTens[digit];
}
function digitToGreekOnes(digit) {
return greekOnes[digit];
}
function greekTensToDigit(word) {
return greekTens.indexOf(word);
}
function greekOnesToDigit(word) {
return greekOnes.indexOf(word);
}
// Feste Xal'thorei-Begriffe für Stundenwerte (0 bis 23)
const xalHourMapping = [
"Zerex", // 0
"Onar", // 1
"Duvar", // 2
"Trion", // 3
"Quarix", // 4
"Pentor", // 5
"Hexor", // 6
"Septor", // 7
"Octor", // 8
"Nonor", // 9
"Decor", // 10
"Elvar", // 11
"Dozen", // 12
"Tredor", // 13
"Quintor", // 14
"Sexor", // 15
"Septon", // 16
"Octon", // 17
"Novor", // 18
"Vigintar", // 19
"Vigintun", // 20
"Vigintdu", // 21
"Viginttri",// 22
"Vigintqua" // 23
];
// Vorwärtsmodus: Menschliche Zeit → Xal'thorei-Zeit
function convertToXalThorei() {
const jahr = parseInt(document.getElementById('jahr').value, 10);
const monat = parseInt(document.getElementById('monat').value, 10);
const tag = parseInt(document.getElementById('tag').value, 10);
const stunde = parseInt(document.getElementById('stunde').value, 10);
const minute = parseInt(document.getElementById('minute').value, 10);
const sekunde = parseInt(document.getElementById('sekunde').value, 10);
if (isNaN(jahr) || isNaN(monat) || isNaN(tag) || isNaN(stunde) || isNaN(minute) || isNaN(sekunde)) {
document.getElementById('outputForward').textContent = "Bitte fülle alle Felder korrekt aus.";
return;
}
// Chrono-Intervall:
// Erstelle den 8-stelligen String: YYMMDDHH (JJJJ mod 100)
const jahrStr = pad(jahr % 100, 2);
const monatStr = pad(monat, 2);
const tagStr = pad(tag, 2);
const stundeStr = pad(stunde, 2);
const ciNumberStr = jahrStr + monatStr + tagStr + stundeStr;
const ciNumber = parseInt(ciNumberStr, 10);
// Umrechnung in Basis36 und auf 6 Stellen polstern
let ciExotic = ciNumber.toString(36).toUpperCase();
ciExotic = pad(ciExotic, 6);
// Minute in griechische Darstellung (Tens/Ones, getrennt durch "/")
const mTens = digitToGreekTens(Math.floor(minute / 10));
const mOnes = digitToGreekOnes(minute % 10);
// Solare Impulsphase: Sekunde in griechische Darstellung
const sTens = digitToGreekTens(Math.floor(sekunde / 10));
const sOnes = digitToGreekOnes(sekunde % 10);
// Sternensystem:
let ssInput = document.getElementById('sternensystem').value.trim();
if (!ssInput) ssInput = "Sonnensystem";
const encryptedSS = caesarShift(ssInput, 2);
// Suffix: Monat (2-stellig) + Tag (2-stellig) + "_" + fester Xal'thorei-Stundenbegriff
const suffixSS = monatStr + tagStr + "_" + xalHourMapping[stunde];
// Galaxiensystem:
let gsInput = document.getElementById('galaxiensystem').value.trim();
if (!gsInput) gsInput = "Milchstrasse";
const encryptedGS = caesarShift(gsInput, 2);
// Suffix: Minute (2-stellig) + Sekunde (2-stellig)
const suffixGS = pad(minute, 2) + pad(sekunde, 2);
const xalString = `Chrono-Intervall ${ciExotic}-${mTens}/${mOnes}; Solare Impulsphase ${sTens}/${sOnes}; Sternensystem ${encryptedSS}-${suffixSS}; Galaxiensystem ${encryptedGS}-${suffixGS}`;
document.getElementById('outputForward').textContent = xalString;
}
// Rückwärtsmodus: Xal'thorei-Zeit → Menschliche Zeit
function convertToHuman() {
const inputStr = document.getElementById('xalInput').value.trim();
if (!inputStr) {
document.getElementById('outputReverse').textContent = "Bitte gib eine Xal'thorei-Zeitangabe ein.";
return;
}
try {
// Aufteilen in Komponenten anhand von ";"
const parts = inputStr.split(";");
if (parts.length < 4) throw "Ungültiges Format";
// 1. Chrono-Intervall: Format: "Chrono-Intervall {ciExotic}-{mTens}/{mOnes}"
const ciPart = parts[0].trim().replace("Chrono-Intervall ", "");
const ciSplit = ciPart.split("-");
if (ciSplit.length !== 2) throw "Fehler bei Chrono-Intervall";
const ciExotic = ciSplit[0].trim();
const minuteGreekPart = ciSplit[1].trim();
const mgSplit = minuteGreekPart.split("/");
if (mgSplit.length !== 2) throw "Fehler bei Minute-Greek";
const mTensWord = mgSplit[0].trim();
const mOnesWord = mgSplit[1].trim();
const minuteDecoded = greekTensToDigit(mTensWord) * 10 + greekOnesToDigit(mOnesWord);
// Umrechnung von ciExotic (Basis36) zurück in 8-stelligen String (Format: YYMMDDHH)
const ciNumber = parseInt(ciExotic, 36);
let ciStr = pad(ciNumber, 8);
const yy = ciStr.substring(0,2);
const mmFromCI = ciStr.substring(2,4);
const dd = ciStr.substring(4,6);
const hh = ciStr.substring(6,8);
// 2. Solare Impulsphase: Format: "Solare Impulsphase {sTens}/{sOnes}"
const siPart = parts[1].trim().replace("Solare Impulsphase ", "");
const siSplit = siPart.split("/");
if (siSplit.length !== 2) throw "Fehler bei Solare Impulsphase";
const sTensWord = siSplit[0].trim();
const sOnesWord = siSplit[1].trim();
const secondDecoded = greekTensToDigit(sTensWord) * 10 + greekOnesToDigit(sOnesWord);
// 3. Sternensystem: Format: "Sternensystem {encryptedSS}-{suffixSS}"
const ssPart = parts[2].trim().replace("Sternensystem ", "");
const ssSplit = ssPart.split("-");
if (ssSplit.length !== 2) throw "Fehler bei Sternensystem";
const encryptedSS = ssSplit[0].trim();
const suffixSS = ssSplit[1].trim();
// SuffixSS Format: MMDD_<XalHourTerm>
const suffixParts = suffixSS.split("_");
if (suffixParts.length !== 2) throw "Fehler bei Sternensystem-Suffix Format";
const mm_fromSuffix = suffixParts[0].substring(0,2);
const dd_fromSuffix = suffixParts[0].substring(2,4);
const xalHourTerm = suffixParts[1];
const hourDecoded = xalHourMapping.indexOf(xalHourTerm);
if (hourDecoded === -1) throw "Ungültiger Xal'thorei-Stundenbegriff";
// 4. Galaxiensystem: Format: "Galaxiensystem {encryptedGS}-{suffixGS}"
const gsPart = parts[3].trim().replace("Galaxiensystem ", "");
const gsSplit = gsPart.split("-");
if (gsSplit.length !== 2) throw "Fehler bei Galaxiensystem";
const encryptedGS = gsSplit[0].trim();
const suffixGS = gsSplit[1].trim();
// SuffixGS: 4-stellig: Minute (2) + Sekunde (2)
const minute_fromSuffix = parseInt(suffixGS.substring(0,2), 10);
const second_fromSuffix = parseInt(suffixGS.substring(2,4), 10);
// Optional: Konsistenzprüfung für Monat und Tag
if (mmFromCI !== mm_fromSuffix) {
console.warn("Warnung: Monatswerte stimmen nicht überein.");
}
if (dd !== dd_fromSuffix) {
console.warn("Warnung: Tageswerte stimmen nicht überein.");
}
// Bei Inkonsistenzen bei Minute und Sekunde: Wir übernehmen die Werte aus dem Galaxiensystem-Suffix.
let finalMinute = minuteDecoded;
let finalSecond = secondDecoded;
if (minute_fromSuffix !== minuteDecoded || second_fromSuffix !== secondDecoded) {
finalMinute = minute_fromSuffix;
finalSecond = second_fromSuffix;
console.warn("Warnung: Minuten/Sekunden-Werte stimmen nicht überein; es werden die Werte aus dem Galaxiensystem übernommen.");
}
// Entschlüssle Sternensystem und Galaxiensystem
const ssName = caesarShift(encryptedSS, -2);
const gsName = caesarShift(encryptedGS, -2);
// Menschliche Zeit zusammenstellen (Jahr: 20YY)
const humanYear = "20" + yy;
const humanMonth = mmFromCI;
const humanDay = dd;
// Wir nutzen den Xal'thorei-Stundenbegriff aus dem Sternensystem-Suffix
const humanHour = pad(hourDecoded, 2);
const humanMinute = pad(finalMinute, 2);
const humanSecond = pad(finalSecond, 2);
const humanTime = `Jahr: ${humanYear}, Monat: ${humanMonth}, Tag: ${humanDay}, Stunde: ${humanHour}, Minute: ${humanMinute}, Sekunde: ${humanSecond}
(Sternensystem: ${ssName}, Galaxiensystem: ${gsName})`;
document.getElementById('outputReverse').textContent = humanTime;
} catch (err) {
document.getElementById('outputReverse').textContent = "Fehler beim Umrechnen: " + err;
}
}
// Funktion zum Kopieren des Inhalts eines Elements in die Zwischenablage
function copyToClipboard(elementId) {
const text = document.getElementById(elementId).textContent;
navigator.clipboard.writeText(text).then(function() {
alert("Ergebnis wurde in die Zwischenablage kopiert.");
}, function(err) {
alert("Fehler beim Kopieren: " + err);
});
}
</script>
</body> </html>