function getRandomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; } function getRandomLetter() { const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; return getRandomItem(alphabet.split('')); } function getRandomLetterUpToL() { const alphabet = 'ABCDEFGHIJKL'; return getRandomItem(alphabet.split('')); } function getRandomPrefixFirstLetter() { const letters = ['A', 'K', 'N', 'W']; return getRandomItem(letters); } function getRandomRegionNumber() { const numbers = '0123456789'; return getRandomItem(numbers.split('')); } function generateRandomCallsignForFormat(format) { let prefix = ''; let suffix = ''; const regionNum = getRandomRegionNumber(); switch (format) { case '1x3': const oneLetterPrefixes = ['K', 'N', 'W']; prefix = getRandomItem(oneLetterPrefixes); suffix = getRandomLetter() + getRandomLetter() + getRandomLetter(); break; case '2x3': prefix = getTwoLetterPrefix(); suffix = getRandomLetter() + getRandomLetter() + getRandomLetter(); // Exclude 'X' as first letter of suffix for 2x3 while (suffix.charAt(0) === 'X') { suffix = getRandomLetter() + getRandomLetter() + getRandomLetter(); } break; case '1x2': // 1 letter prefix (K, N, or W), 1 number, 2 letter suffix (Extra Class only) const shortPrefixes = ['K', 'N', 'W']; prefix = getRandomItem(shortPrefixes); suffix = getRandomLetter() + getRandomLetter(); break; case '2x1': prefix = getTwoLetterPrefix(); suffix = getRandomLetter(); break; case '2x2': prefix = getTwoLetterPrefix(); suffix = getRandomLetter() + getRandomLetter() + getRandomLetter(); break; default: return "ERR"; } return prefix + regionNum + suffix; } function getTwoLetterPrefix() { var prefixes = ['A', 'K', 'N', 'W']; var prefix = getRandomItem(prefixes); if (prefix == 'A'){ prefix += getRandomLetterUpToL(); } else { prefix += getRandomLetter(); } return prefix; } function generateRandomCallsign() { const formats = ['1x2']; // const formats = ['1x2', '2x1', '2x2', '1x3', '2x3']; var format = getRandomItem(formats); return generateRandomCallsignForFormat(format); }