// GridTracker Copyright © 2022 GridTracker.org // All rights reserved. // See LICENSE for more information. var g_alerts = Object(); var g_classicAlerts = Object(); var g_phonetics = Object(); var g_enums = Object(); var g_speechSettings = Object(); var g_audioSettings = Object(); var g_speechAvailable = false; var g_alertSettings = Object(); function loadAlerts() { if (typeof localStorage.classicAlertsVersion == "undefined") { g_classicAlerts = { huntCallsign: false, huntGrid: false, huntDXCC: false, huntCQz: false, huntITUz: false, huntStates: false, huntCallsignNeed: "worked", huntGridNeed: "confirmed", huntDXCCNeed: "confirmed", huntCQzNeed: "confirmed", huntITUzNeed: "confirmed", huntStatesNeed: "confirmed", huntCallsignNotify: "1", huntGridNotify: "1", huntDXCCNotify: "1", huntCQzNotify: "1", huntITUzNotify: "1", huntStatesNotify: "1", huntCallsignNotifyWord: "Wanted Call", huntGridNotifyWord: "Wanted Grid", huntDXCCNotifyWord: "Wanted DXCC", huntCQzNotifyWord: "Wanted CQ Zone", huntITUzNotifyWord: "Wanted I-T-U Zone", huntStatesNotifyWord: "Wanted State", huntCallsignNotifyMedia: "none", huntGridNotifyMedia: "none", huntDXCCNotifyMedia: "none", huntCQzNotifyMedia: "none", huntITUzNotifyMedia: "none", huntStatesNotifyMedia: "none" }; localStorage.classicAlerts = JSON.stringify(g_classicAlerts); g_alertSettings = Object(); g_alertSettings.requireGrid = true; g_alertSettings.wantMaxDT = false; g_alertSettings.wantMinDB = false; g_alertSettings.wantMinFreq = false; g_alertSettings.wantMaxFreq = false; g_alertSettings.maxDT = 0.5; g_alertSettings.minDb = -24; g_alertSettings.minFreq = 400; g_alertSettings.maxFreq = 3500; g_alertSettings.noMyDxcc = false; g_alertSettings.onlyMyDxcc = false; g_alertSettings.noRoundUp = false; g_alertSettings.onlyRoundUp = false; g_alertSettings.cqOnly = true; g_alertSettings.usesLoTW = false; g_alertSettings.useseQSL = false; g_alertSettings.reference = 0; g_alertSettings.logEventMedia = "Ping-coin.mp3"; localStorage.alertSettings = JSON.stringify(g_alertSettings); localStorage.classicAlertsVersion = gtVersion; } else { g_classicAlerts = JSON.parse(localStorage.classicAlerts); g_alertSettings = JSON.parse(localStorage.alertSettings); } if (typeof g_alertSettings.reference == "undefined") { g_alertSettings.reference = 0; localStorage.alertSettings = JSON.stringify(g_alertSettings); } if (typeof g_alertSettings.logEventMedia == "undefined") { g_alertSettings.logEventMedia = "Ping-coin.mp3"; localStorage.alertSettings = JSON.stringify(g_alertSettings); } if (typeof g_classicAlerts.huntRoster == "undefined") { g_classicAlerts.huntRoster = false; g_classicAlerts.huntRosterNotify = 1; g_classicAlerts.huntRosterNotifyWord = "New hit"; g_classicAlerts.huntRosterNotifyMedia = "none"; localStorage.classicAlerts = JSON.stringify(g_classicAlerts); } loadClassicAlertView(); if (typeof localStorage.savedAlerts == "undefined") { g_alerts = { popup: { value: "QRZ", type: "4", notify: "2", repeat: "2", filename: "", shortname: "", lastMessage: "", lastTime: 0, fired: 0, needAck: 0 } }; g_speechSettings = Object(); g_audioSettings = Object(); g_speechSettings.rate = 1; g_speechSettings.pitch = 1; g_speechSettings.volume = 1; g_speechSettings.voice = 0; g_speechSettings.phonetics = true; g_audioSettings.volume = 1; saveAlerts(); } else { g_alerts = JSON.parse(localStorage.savedAlerts); for (var key in g_alerts) { if ( g_alerts[key].type != 0 && g_alerts[key].type != 2 && g_alerts[key].type != 4 && g_alerts[key].type != 5 && g_alerts[key].type != 6 ) { delete g_alerts[key]; } if (g_alerts[key].repeat == 3) delete g_alerts[key]; } g_speechSettings = JSON.parse(localStorage.speechSettings); g_audioSettings = JSON.parse(localStorage.audioSettings); } if (g_speechSettings.voice > 0) { alertVoiceInput.value = g_speechSettings.voice - 1; } speechVolume.value = g_speechSettings.volume; speechPitch.value = g_speechSettings.pitch; speechRate.value = g_speechSettings.rate; speechPhonetics.checked = g_speechSettings.phonetics; speechVolumeTd.innerText = speechVolume.value; speechPitchTd.innerText = speechPitch.value; speechRateTd.innerText = speechRate.value; audioVolume.value = g_audioSettings.volume; audioVolumeTd.innerText = parseInt(audioVolume.value * 100) + "%"; wantGrid.checked = g_alertSettings.requireGrid; wantMaxDT.checked = g_alertSettings.wantMaxDT; wantMinDB.checked = g_alertSettings.wantMinDB; wantMinFreq.checked = g_alertSettings.wantMinFreq; wantMaxFreq.checked = g_alertSettings.wantMaxFreq; maxDTView.innerHTML = maxDT.value = g_alertSettings.maxDT; minDbView.innerHTML = minDb.value = g_alertSettings.minDb; minFreqView.innerHTML = minFreq.value = g_alertSettings.minFreq; maxFreqView.innerHTML = maxFreq.value = g_alertSettings.maxFreq; cqOnly.checked = g_alertSettings.cqOnly; noMyDxcc.checked = g_alertSettings.noMyDxcc; onlyMyDxcc.checked = g_alertSettings.onlyMyDxcc; noRoundUp.checked = g_alertSettings.noRoundUp; onlyRoundUp.checked = g_alertSettings.onlyRoundUp; usesLoTW.checked = g_alertSettings.usesLoTW; useseQSL.checked = g_alertSettings.useseQSL; referenceNeed.value = g_alertSettings.reference; logEventMedia.value = g_alertSettings.logEventMedia; setAlertVisual(); } function newLogEventSetting(obj) { g_alertSettings.logEventMedia = obj.value; localStorage.alertSettings = JSON.stringify(g_alertSettings); } function exceptionValuesChanged() { setAlertVisual(); g_alertSettings.requireGrid = wantGrid.checked; g_alertSettings.wantMaxDT = wantMaxDT.checked; g_alertSettings.wantMinDB = wantMinDB.checked; g_alertSettings.wantMinFreq = wantMinFreq.checked; g_alertSettings.wantMaxFreq = wantMaxFreq.checked; maxDTView.innerHTML = g_alertSettings.maxDT = maxDT.value; minDbView.innerHTML = g_alertSettings.minDb = minDb.value; minFreqView.innerHTML = g_alertSettings.minFreq = minFreq.value; maxFreqView.innerHTML = g_alertSettings.maxFreq = maxFreq.value; g_alertSettings.cqOnly = cqOnly.checked; g_alertSettings.noMyDxcc = noMyDxcc.checked; g_alertSettings.onlyMyDxcc = onlyMyDxcc.checked; g_alertSettings.noRoundUp = noRoundUp.checked; g_alertSettings.onlyRoundUp = onlyRoundUp.checked; g_alertSettings.usesLoTW = usesLoTW.checked; g_alertSettings.useseQSL = useseQSL.checked; g_alertSettings.reference = referenceNeed.value; localStorage.alertSettings = JSON.stringify(g_alertSettings); } function hashMaker(band, mode) { // "Current Band & Mode" if (g_alertSettings.reference == 0) return band + mode; // "Current Band, Any Mode" if (g_alertSettings.reference == 1) return band; // "Current Band, Any Digi Mode" if (g_alertSettings.reference == 2) return band + "dg"; // "Current Mode, Any Band" if (g_alertSettings.reference == 3) return mode; // "Any Band, Any Mode" if (g_alertSettings.reference == 4) return ""; // "Any Band, Any Digit Mode" if (g_alertSettings.reference == 5) return "dg"; } function setAlertVisual() { if (wantMaxDT.checked == true) { maxDT.style.display = "block"; maxDTView.style.display = "block"; } else { maxDT.style.display = "none"; maxDTView.style.display = "none"; } if (wantMinDB.checked == true) { minDb.style.display = "block"; minDbView.style.display = "block"; } else { minDb.style.display = "none"; minDbView.style.display = "none"; } if (wantMinFreq.checked == true) { minFreq.style.display = "block"; minFreqView.style.display = "block"; } else { minFreq.style.display = "none"; minFreqView.style.display = "none"; } if (wantMaxFreq.checked == true) { maxFreq.style.display = "block"; maxFreqView.style.display = "block"; } else { maxFreq.style.display = "none"; maxFreqView.style.display = "none"; } if (g_callsignLookups.lotwUseEnable == true) { usesLoTWDiv.style.display = "block"; } else usesLoTWDiv.style.display = "none"; if (g_callsignLookups.eqslUseEnable == true) { useseQSLDiv.style.display = "block"; } else useseQSLDiv.style.display = "none"; } function saveAlertSettings() { localStorage.speechSettings = JSON.stringify(g_speechSettings); localStorage.audioSettings = JSON.stringify(g_audioSettings); } function saveAlerts() { localStorage.savedAlerts = JSON.stringify(g_alerts); saveAlertSettings(); } var g_testAudioTimer = null; function changeAudioValues() { if (g_testAudioTimer) clearTimeout(g_testAudioTimer); g_audioSettings.volume = audioVolume.value; audioVolumeTd.innerText = parseInt(audioVolume.value * 100) + "%"; g_testAudioTimer = setTimeout(playTestFile, 200); saveAlertSettings(); } function playTestFile() { playAlertMediaFile("Sysenter-7.mp3"); } function changeSpeechValues() { chrome.tts.stop(); g_speechSettings.volume = speechVolume.value; g_speechSettings.pitch = speechPitch.value; g_speechSettings.rate = speechRate.value; g_speechSettings.phonetics = speechPhonetics.checked; speechVolumeTd.innerText = speechVolume.value; speechPitchTd.innerText = speechPitch.value; speechRateTd.innerText = speechRate.value; saveAlertSettings(); } function addNewAlert() { var error = "Added"; var valid = true; var filename = ""; var shortname = ""; if (alertNotifySelect.value == 0) { if (alertMediaSelect.value == "none") { valid = false; error = "Select File!"; } else { filename = alertMediaSelect.value; shortname = alertMediaSelect.selectedOptions[0].innerText; } } if (valid) { if (alertTypeSelect.value == 0 || alertTypeSelect.value == 5) { valid = ValidateCallsign(alertValueInput, null); if (!valid) { error = "Invalid Callsign"; } } } if (valid) { valid = addAlert( alertValueInput.value, alertTypeSelect.value, alertNotifySelect.value, alertRepeatSelect.value, filename, shortname ); if (!valid) { error = "Duplicate!"; } } addError.innerHTML = error; displayAlerts(); } function addAlert(value, type, notify, repeat, filename, shortname) { var newKey = unique(value + type + notify + repeat + filename); if (!g_alerts.hasOwnProperty(newKey)) { var alertItem = Object(); alertItem.value = value; alertItem.type = type; alertItem.notify = notify; alertItem.repeat = repeat; alertItem.filename = filename; alertItem.shortname = shortname; alertItem.lastMessage = ""; alertItem.lastTime = 0; alertItem.fired = 0; alertItem.needAck = 0; g_alerts[newKey] = alertItem; saveAlerts(); return true; } return false; // we have this alert already } function deleteAlert(key) { delete g_alerts[key]; saveAlerts(); displayAlerts(); } function resetAlert(key) { g_alerts[key].lastMessage = ""; g_alerts[key].lastTime = 0; g_alerts[key].fired = 0; g_alerts[key].needAck = 0; displayAlerts(); } function processAlertMessage(decodeWords, message, band, mode) { if (Object.keys(g_alerts).length == 0) { // no alerts, don't bother return false; } else { var CQ = false; var validQTH = false; var theirGrid = null; var msgDEcallsign = ""; var found_callsign = null; // Grab the last word in the decoded message var grid = decodeWords[decodeWords.length - 1].trim(); if (grid.length == 4) { // maybe it's a grid var LETTERS = grid.substr(0, 2); var NUMBERS = grid.substr(2, 2); if (/^[A-R]+$/.test(LETTERS) && /^[0-9]+$/.test(NUMBERS)) { theirGrid = LETTERS + NUMBERS; if (theirGrid != "RR73") { validQTH = true; } else { theirGrid = null; validQTH = false; } } } if (validQTH) msgDEcallsign = decodeWords[decodeWords.length - 2].trim(); if (validQTH == false && decodeWords.length == 3) { msgDEcallsign = decodeWords[decodeWords.length - 2].trim(); } if (validQTH == false && decodeWords.length == 2) { msgDEcallsign = decodeWords[decodeWords.length - 1].trim(); } if (decodeWords[0] == "CQ") { CQ = true; } if (decodeWords.length >= 3 && CQ == true && validQTH == false) { if (validateNumAndLetter(decodeWords[decodeWords.length - 1].trim())) { msgDEcallsign = decodeWords[decodeWords.length - 1].trim(); } else msgDEcallsign = decodeWords[decodeWords.length - 2].trim(); } if (decodeWords.length >= 4 && CQ == false) { msgDEcallsign = decodeWords[1]; } var okayToAlert = true; if (msgDEcallsign + band + mode in g_liveCallsigns) { found_callsign = g_liveCallsigns[msgDEcallsign + band + mode]; } if (okayToAlert == true) { return checkAlerts(msgDEcallsign, theirGrid, message, found_callsign); } } return false; } function checkAlerts( DEcallsign, grid, originalMessage, callsignRecord, band, mode ) { var hadAlert = false; for (var key in g_alerts) { var nalert = g_alerts[key]; if (nalert.type == 0) { // callsign exatch match if (DEcallsign == nalert.value) { handleAlert(nalert, DEcallsign, originalMessage, callsignRecord); hadAlert = true; } } else if (grid && nalert.type == 2) { // gridsquare if ( !(DEcallsign + band + mode in g_tracker.worked.call) && grid.indexOf(nalert.value) == 0 ) { handleAlert(nalert, DEcallsign, originalMessage, callsignRecord, grid); hadAlert = true; } } else if (nalert.type == 4) { // QRZ if (myDEcall.length > 0 && originalMessage.indexOf(myDEcall + " ") == 0) { handleAlert(nalert, DEcallsign, originalMessage, callsignRecord); hadAlert = true; } } else if (nalert.type == 5) { // callsign partial if ( !(DEcallsign + band + mode in g_tracker.worked.call) && DEcallsign.indexOf(nalert.value) == 0 ) { handleAlert(nalert, DEcallsign, originalMessage, callsignRecord); hadAlert = true; } } else if (nalert.type == 6) { // callsign regex try { if ( !(DEcallsign + band + mode in g_tracker.worked.call) && DEcallsign.match(nalert.value) ) { handleAlert(nalert, DEcallsign, originalMessage, callsignRecord); hadAlert = true; } } catch (e) {} } } if (hadAlert) { displayAlerts(); return true; } return false; } function handleAlert(nAlert, target, lastMessage, callsignRecord, grid) { if (nAlert.fired > 0 && nAlert.repeat == 0) return; if (nAlert.fired == 1 && nAlert.repeat == 1) return; nAlert.lastMessage = lastMessage; nAlert.lastTime = timeNowSec(); if (callsignRecord != null) { if ( typeof callsignRecord.rect != "undefined" && callsignRecord.rect != null && nAlert.notify == 3 ) { // Fix me g_map .getView() .setCenter( ol.extent.getCenter(callsignRecord.rect.getGeometry().getExtent()) ); } } if (nAlert.notify == 2) nAlert.needAck = 1; if (nAlert.type == 0 || nAlert.type == 5 || nAlert.type == 6) { if (nAlert.notify == 0) playAlertMediaFile(nAlert.filename); if (nAlert.notify == 1) speakAlertString("Callsign", target, null); if (nAlert.notify == 2) displayAlertPopUp("Seeking", target, null); } if (nAlert.type == 2) { if (nAlert.notify == 0) playAlertMediaFile(nAlert.filename); if (nAlert.notify == 1) speakAlertString("Grid square", grid, null); if (nAlert.notify == 2) displayAlertPopUp("Gridsquare", grid, target); } if (nAlert.type == 4) { if (nAlert.notify == 0) playAlertMediaFile(nAlert.filename); if (nAlert.notify == 1) speakQRZString(target, "Calling", myDEcall); if (nAlert.notify == 2) displayAlertPopUp("QRZ", null, null); } nAlert.fired++; } function playAlertMediaFile(filename, overrideMute) { if (g_appSettings.alertMute && !overrideMute) return; // check if this is an alert stored with an older version of GT // which has a full file path given. if (path.isAbsolute(filename) && !fs.existsSync(filename)) { // full alert file name stored with old GT version referencing // the user media dir. determine basename of the file and try // constructing the path filename = path.basename(filename); } // construct the path from the user media dir or // fall back on the global media dir var fpath = path.join(g_userMediaDir, filename); if (!fs.existsSync(fpath)) fpath = path.join(g_gtMediaDir, filename); var audio = document.createElement("audio"); audio.src = "file://" + fpath; audio.setSinkId(g_soundCard); audio.volume = g_audioSettings.volume; audio.play(); } function stringToPhonetics(string) { var newMsg = ""; for (var x = 0; x < string.length; x++) { if (g_speechSettings.phonetics == true) { newMsg += g_phonetics[string.substr(x, 1)]; } else { if (string.substr(x, 1) == " ") newMsg += ", "; else newMsg += string.substr(x, 1); } if (x != string.length - 1) newMsg += " "; } return newMsg; } function speakQRZString(caller, words, you) { if (g_appSettings.alertMute == 0) { var sCaller = ""; var sYou = ""; if (caller) sCaller = stringToPhonetics(caller); if (you) sYou = stringToPhonetics(you); if (g_speechAvailable) { var speak = sCaller.trim() + ", " + words.trim() + ", " + sYou.trim(); var msg = new SpeechSynthesisUtterance(speak); msg.lang = g_localeString; if (g_speechSettings.voice > 0) { msg.voice = g_voices[g_speechSettings.voice - 1]; } msg.rate = g_speechSettings.rate; msg.pitch = g_speechSettings.pitch; msg.volume = g_speechSettings.volume; window.speechSynthesis.speak(msg); } } } function speakAlertString(what, message, target) { if (g_appSettings.alertMute == 0) { var sMsg = ""; var sTarget = ""; if (message) sMsg = stringToPhonetics(message); if (target) sTarget = stringToPhonetics(target); if (g_speechAvailable) { var speak = what.trim() + ", " + sMsg.trim() + ", " + sTarget.trim(); var msg = new SpeechSynthesisUtterance(speak); msg.lang = g_localeString; if (g_speechSettings.voice > 0) { msg.voice = g_voices[g_speechSettings.voice - 1]; } msg.rate = g_speechSettings.rate; msg.pitch = g_speechSettings.pitch; msg.volume = g_speechSettings.volume; window.speechSynthesis.speak(msg); } } } var g_alertFlasher = null; function unflashAlertPopUp() { var worker = ""; var acount = 0; alertsPopDiv.style.backgroundColor = "#000"; if (Object.keys(g_alerts).length > 0) { for (var key in g_alerts) { if (g_alerts[key].needAck) acount++; } worker += "
"; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; for (var key in g_alerts) { if (g_alerts[key].needAck) { worker += ""; worker += ""; if (g_alerts[key].type == 0) { worker += ""; } if (g_alerts[key].type == 2) { worker += ""; } if (g_alerts[key].type == 4) { worker += ""; } if (g_alerts[key].type == 5) { worker += ""; } if (g_alerts[key].type == 6) { worker += ""; } worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; ageString = userTimeString(g_alerts[key].lastTime * 1000); worker += ""; worker += ""; } } worker += "
TypeValueNotifyRepeatFilenameAlertedLast MessageWhen
" + g_alertTypeOptions[g_alerts[key].type] + "" + g_alerts[key].value + "" + g_alerts[key].value + "" + myDEcall + "" + g_alerts[key].value + "*" + g_alerts[key].value + "" + g_alertValueOptions[g_alerts[key].notify] + "" + g_alertRepeatOptions[g_alerts[key].repeat] + "" + (g_alerts[key].shortname.length > 0 ? g_alerts[key].shortname : "-") + "" + (g_alerts[key].fired > 0 ? "Yes" : "No") + "" + (g_alerts[key].lastMessage.length > 0 ? g_alerts[key].lastMessage : "-") + "" + (g_alerts[key].lastTime > 0 ? ageString : "-") + "
"; worker += "
"; } alertPopListDiv.style.height = "auto"; alertPopListDiv.innerHTML = worker; g_alertFlasher = null; } function displayAlertPopUp(what, message, target) { if (g_alertFlasher) clearTimeout(g_alertFlasher); alertPopListDiv.innerHTML = "

Gathering Alerts

"; alertsPopDiv.style.backgroundColor = "#FFF"; alertsPopDiv.style.display = "inline-block"; g_alertFlasher = setTimeout(unflashAlertPopUp, 100); } function ackAlerts() { alertsPopDiv.style.display = "none"; for (var key in g_alerts) { g_alerts[key].needAck = 0; } } function alertTypeChanged() { addError.innerHTML = ""; if (alertTypeSelect.value == 0 || alertTypeSelect.value == 5) { alertValueSelect.innerHTML = ""; alertValueSelect.innerHTML = ""; ValidateCallsign(alertValueInput, null); } else if (alertTypeSelect.value == 2) { alertValueSelect.innerHTML = ""; alertValueSelect.innerHTML = ""; ValidateGridsquareOnly4(alertValueInput, null); } else if (alertTypeSelect.value == 4) { alertValueSelect.innerHTML = ""; ValidateCallsign(alertValueInput, null); } else if (alertTypeSelect.value == 6) { alertValueSelect.innerHTML = ""; alertValueSelect.innerHTML = ""; ValidateText(alertValueInput); } } function alertNotifyChanged(who = "") { addError.innerHTML = ""; if (alertNotifySelect.value == 0) { alertMediaSelect.style.display = "block"; if (who == "media") { playAlertMediaFile(alertMediaSelect.value); } } else { alertMediaSelect.style.display = "none"; } } g_alertTypeOptions = Array(); g_alertTypeOptions["0"] = "Call (exact)"; g_alertTypeOptions["1"] = "Deprecated"; g_alertTypeOptions["2"] = "Grid"; g_alertTypeOptions["3"] = "Deprecated"; g_alertTypeOptions["4"] = "QRZ"; g_alertTypeOptions["5"] = "Call (partial)"; g_alertTypeOptions["6"] = "Call (regex)"; g_alertValueOptions = Array(); g_alertValueOptions["0"] = ""; g_alertValueOptions["1"] = "TTS"; g_alertValueOptions["2"] = "PopUp"; g_alertValueOptions["3"] = "MapCenter"; g_alertRepeatOptions = Array(); g_alertRepeatOptions["0"] = "No"; g_alertRepeatOptions["1"] = "Once"; g_alertRepeatOptions["2"] = "Inf"; g_alertRepeatOptions["3"] = "Inf(Session)"; function displayAlerts() { var worker = ""; if (Object.keys(g_alerts).length > 0) { worker += "
"; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; for (var key in g_alerts) { worker += ""; worker += ""; if (g_alerts[key].type == 0) { worker += ""; } if (g_alerts[key].type == 2) { worker += ""; } if (g_alerts[key].type == 4) { worker += ""; } if (g_alerts[key].type == 5) { worker += ""; } if (g_alerts[key].type == 6) { worker += ""; } worker += ""; worker += ""; worker += ""; worker += ""; worker += ""; ageString = userTimeString(g_alerts[key].lastTime * 1000); worker += ""; worker += ""; worker += ""; worker += ""; } worker += "
TypeValueNotifyRepeatFilenameAlertedLast MessageWhenResetDelete
" + g_alertTypeOptions[g_alerts[key].type] + "" + g_alerts[key].value + "" + g_alerts[key].value + "" + myDEcall + "" + g_alerts[key].value + "*" + g_alerts[key].value + "" + g_alertValueOptions[g_alerts[key].notify] + "" + g_alertRepeatOptions[g_alerts[key].repeat] + "" + (g_alerts[key].shortname.length > 0 ? g_alerts[key].shortname : "-") + "" + (g_alerts[key].fired > 0 ? "Yes" : "No") + "" + (g_alerts[key].lastMessage.length > 0 ? g_alerts[key].lastMessage : "-") + "" + (g_alerts[key].lastTime > 0 ? ageString : "-") + "
"; worker += "
"; } alertListDiv.innerHTML = worker; } function loadClassicAlertView() { for (node in g_classicAlerts) { what = document.getElementById(node); if (what != null) { if (what.type == "select-one" || what.type == "text") { what.value = g_classicAlerts[node]; if (what.id.endsWith("Notify")) { var mediaNode = document.getElementById(what.id + "Media"); var wordNode = document.getElementById(what.id + "Word"); if (what.value == "0") { mediaNode.style.display = "block"; wordNode.style.display = "none"; } else { mediaNode.style.display = "none"; wordNode.style.display = "block"; } } if (what.type == "text") { ValidateText(what); } } else if (what.type == "checkbox") { what.checked = g_classicAlerts[node]; } } } } function wantedChanged(what) { if (what.type == "select-one" || what.type == "text") { g_classicAlerts[what.id] = what.value; if (what.id.endsWith("Notify")) { var mediaNode = document.getElementById(what.id + "Media"); var wordNode = document.getElementById(what.id + "Word"); if (what.value == "0") { mediaNode.style.display = "block"; wordNode.style.display = "none"; } else { mediaNode.style.display = "none"; wordNode.style.display = "block"; } } if (what.id.endsWith("Media")) { if (what.value != "none") playAlertMediaFile(what.value); } } else if (what.type == "checkbox") { g_classicAlerts[what.id] = what.checked; } localStorage.classicAlerts = JSON.stringify(g_classicAlerts); } var g_classic_alert_count_template = { huntCallsign: 0, huntGrid: 0, huntDXCC: 0, huntCQz: 0, huntITUz: 0, huntStates: 0 }; var g_classic_alert_counts = Object.assign({}, g_classic_alert_count_template); var g_classic_alert_functions = { huntCallsign: alertCheckCallsign, huntGrid: alertCheckGrid, huntDXCC: alertCheckDXCC, huntCQz: alertCheckCQz, huntITUz: alertCheckITUz, huntStates: alertCheckStates }; var g_classic_alert_words = { huntCallsign: "Call", huntGrid: "Grid", huntDXCC: "DXCC", huntCQz: "CQ Zone", huntITUz: "I-T-U Zone", huntStates: "State" }; function processClassicAlerts() { for (key in g_classic_alert_counts) { if ( document.getElementById(key).checked == true && g_classic_alert_counts[key] > 0 ) { var notify = document.getElementById(key + "Notify").value; if (notify == "0") { var media = document.getElementById(key + "Notify" + "Media").value; if (media != "none") playAlertMediaFile(media); } else if (notify == "1") { speakAlertString( document.getElementById(key + "Notify" + "Word").value ); } } } g_classic_alert_counts = Object.assign({}, g_classic_alert_count_template); } function checkClassicAlerts(CQ, callObj, message, DXcall) { var didAlert = false; if (g_alertSettings.cqOnly == true && CQ == false) return didAlert; if (g_alertSettings.requireGrid == true && callObj.grid.length != 4) { return didAlert; } if (g_alertSettings.wantMinDB == true && message.SR < g_alertSettings.minDb) { return didAlert; } if ( g_alertSettings.wantMaxDT == true && Math.abs(message.DT) > g_alertSettings.maxDT ) { return didAlert; } if ( g_alertSettings.wantMinFreq == true && message.DF < g_alertSettings.minFreq ) { return didAlert; } if ( g_alertSettings.wantMaxFreq == true && message.DF > g_alertSettings.maxFreq ) { return didAlert; } if (DXcall == "CQ RU") { if (g_alertSettings.noRoundUp == true) return didAlert; } else { if (g_alertSettings.onlyRoundUp == true) return didAlert; } if (callObj.dxcc == g_myDXCC) { if (g_alertSettings.noMyDxcc == true) return didAlert; } else { if (g_alertSettings.onlyMyDxcc == true) return didAlert; } if ( g_callsignLookups.lotwUseEnable == true && g_alertSettings.usesLoTW == true ) { if (!(callObj.DEcall in g_lotwCallsigns)) return didAlert; } if ( g_callsignLookups.eqslUseEnable == true && g_alertSettings.useseQSL == true ) { if (!(callObj.DEcall in g_eqslCallsigns)) return didAlert; } if (DXcall == "CQ DX" && callObj.dxcc == g_myDXCC) return didAlert; if ( callObj.DEcall + hashMaker(callObj.band, callObj.mode) in g_tracker.worked.call ) { return didAlert; } for (key in g_classic_alert_functions) { if (document.getElementById(key).checked == true) { var alerted = g_classic_alert_functions[key](key, callObj); if (alerted == true) didAlert = true; g_classic_alert_counts[key] += alerted; } } return didAlert; } function alertCheckCallsign(key, callObj) { var status = document.getElementById(key + "Need").value; if ( status == "worked" && callObj.DEcall + hashMaker(callObj.band, callObj.mode) in g_tracker.worked.call ) { return 0; } if ( status == "confirmed" && callObj.DEcall + hashMaker(callObj.band, callObj.mode) in g_tracker.confirmed.call ) { return 0; } return 1; } function alertCheckGrid(key, callObj) { var status = document.getElementById(key + "Need").value; if (callObj.grid.length == 0) return 0; if ( status == "worked" && callObj.grid + hashMaker(callObj.band, callObj.mode) in g_tracker.worked.grid ) { return 0; } if ( status == "confirmed" && callObj.grid + hashMaker(callObj.band, callObj.mode) in g_tracker.confirmed.grid ) { return 0; } return 1; } function alertCheckDXCC(key, callObj) { var status = document.getElementById(key + "Need").value; if ( status == "worked" && String(callObj.dxcc) + hashMaker(callObj.band, callObj.mode) in g_tracker.worked.dxcc ) { return 0; } if ( status == "confirmed" && String(callObj.dxcc) + hashMaker(callObj.band, callObj.mode) in g_tracker.confirmed.dxcc ) { return 0; } return 1; } function alertCheckCQz(key, callObj) { var workedTotal = (confirmedTotal = callObj.cqza.length); if (workedTotal == 0) return 0; var workedFound = (confirmedFound = 0); for (index in callObj.cqza) { var hash = callObj.cqza[index] + hashMaker(callObj.band, callObj.mode); if (hash in g_tracker.worked.cqz) workedFound++; if (hash in g_tracker.confirmed.cqz) confirmedFound++; } var status = document.getElementById(key + "Need").value; if (status == "worked" && workedFound == workedTotal) return 0; if (status == "confirmed" && confirmedFound == confirmedTotal) return 0; return 1; } function alertCheckITUz(key, callObj) { var workedTotal = (confirmedTotal = callObj.ituza.length); if (workedTotal == 0) return 0; var workedFound = (confirmedFound = 0); for (index in callObj.ituza) { var hash = callObj.ituza[index] + hashMaker(callObj.band, callObj.mode); if (hash in g_tracker.worked.ituz) workedFound++; if (hash in g_tracker.confirmed.ituz) confirmedFound++; } var status = document.getElementById(key + "Need").value; if (status == "worked" && workedFound == workedTotal) return 0; if (status == "confirmed" && confirmedFound == confirmedTotal) return 0; return 1; } function alertCheckStates(key, callObj) { if (callObj.dxcc == 291 || callObj.dxcc == 110 || callObj.dxcc == 6) { if (callObj.state in g_StateData) { var hash = callObj.state + hashMaker(callObj.band, callObj.mode); var status = document.getElementById(key + "Need").value; if (status == "worked" && hash in g_tracker.worked.state) return 0; if (status == "confirmed" && hash in g_tracker.confirmed.state) return 0; return 1; } return 0; } return 0; }