// GridTracker Copyright © 2021 GridTracker.org // All rights reserved. // See LICENSE for more information. var fs = require("fs"); var callRoster = {}; var g_blockedCalls = {}; var g_blockedCQ = {}; var g_blockedDxcc = {}; var g_scriptReport = {}; var g_worked = {}; var g_confirmed = {}; var g_modes = {}; var g_modes_phone = {}; var g_currentUSCallsigns = null; var r_currentUSState = ""; var r_currentDXCCs = -1; var r_callsignManifest = null; var g_rosterSettings = {}; var g_day = 0; var g_menu = null; var g_callMenu = null; var g_ageMenu = null; var g_callingMenu = null; var g_compactMenu = null; var g_targetHash = ""; var g_clearIgnores = null; var g_clearIgnoresCall = null; var g_dxccMenu = null; var g_targetDxcc = -1; var g_clearDxccIgnore = null; var g_clearDxccIgnoreMainMenu = null; var g_CQMenu = null; var g_targetCQ = ""; var g_clearCQIgnore = null; var g_clearCQIgnoreMainMenu = null; var g_timerInterval = null; var g_regFocus = false; var g_awards = {}; var g_awardTypes = {}; var g_awardTracker = {}; var g_callsignDatabaseDXCC = {}; var g_callsignDatabaseUS = {}; var g_callsignDatabaseUSplus = {}; var g_developerMode = process.versions["nw-flavor"] == "sdk"; var g_modeColors = {}; g_modeColors.FT4 = "1111FF"; g_modeColors.FT8 = "11FF11"; g_modeColors.JT4 = "EE1111"; g_modeColors.JT9 = "7CFC00"; g_modeColors.JT65 = "E550E5"; g_modeColors.QRA64 = "FF00FF"; g_modeColors.MSK144 = "4949FF"; var g_defaultSettings = { callsign: "all", hunting: "dxcc", huntNeed: "confirmed", requireGrid: true, wantMaxDT: false, wantMinDB: false, wantMinFreq: false, wantMaxFreq: false, maxDT: 0.5, minDb: -25, minFreq: 0, maxFreq: 3500, noMyDxcc: false, onlyMyDxcc: false, noMsg: false, noMsgValue: "CQ RU", onlyMsg: false, onlyMsgValue: "CQ FD", cqOnly: true, usesLoTW: false, maxLoTW: 27, useseQSL: false, usesOQRS: false, onlySpot: false, allOnlyNew: false, useRegex: false, callsignRegex: "", realtime: false, wanted: { huntCallsign: false, huntGrid: true, huntDXCC: true, huntCQz: false, huntITUz: false, huntState: false, huntCounty: false, huntCont: false, huntPX: false, huntQRZ: true, huntOAMS: false }, columns: { Band: false, Mode: false, Calling: true, Msg: false, DXCC: true, Flag: true, State: true, County: true, Cont: true, dB: true, Freq: false, DT: false, Dist: false, Azim: true, CQz: false, ITUz: false, PX: true, LoTW: false, eQSL: false, OQRS: false, Spot: false, Life: false, OAMS: true, Age: true }, reference: 0, controls: true, controlsExpanded: false, compact: false, settingProfiles: false, lastSortIndex: 6, lastSortReverse: 1 }; const LOGBOOK_LIVE_BAND_LIVE_MODE = "0"; const LOGBOOK_LIVE_BAND_MIX_MODE = "1"; const LOGBOOK_LIVE_BAND_DIGI_MODE = "2"; const LOGBOOK_MIX_BAND_LIVE_MODE = "3"; const LOGBOOK_MIX_BAND_MIX_MODE = "4"; const LOGBOOK_MIX_BAND_DIGI_MODE = "5"; const LOGBOOK_AWARD_TRACKER = "6"; const LAYERED_MODE_FOR = {} LAYERED_MODE_FOR[LOGBOOK_MIX_BAND_LIVE_MODE] = LOGBOOK_LIVE_BAND_LIVE_MODE; LAYERED_MODE_FOR[LOGBOOK_MIX_BAND_MIX_MODE] = LOGBOOK_LIVE_BAND_MIX_MODE; LAYERED_MODE_FOR[LOGBOOK_MIX_BAND_DIGI_MODE] = LOGBOOK_LIVE_BAND_DIGI_MODE; document.addEventListener("dragover", function (event) { event.preventDefault(); }); document.addEventListener("drop", function (event) { event.preventDefault(); }); window.addEventListener("message", receiveMessage, false); if (typeof localStorage.blockedCQ == "undefined") { localStorage.blockedCQ = "{}"; } if (typeof localStorage.awardTracker == "undefined") { localStorage.awardTracker = "{}"; g_rosterSettings = {}; writeRosterSettings(); } g_awardTracker = JSON.parse(localStorage.awardTracker); if (typeof localStorage.blockedCalls != "undefined") { g_blockedCalls = JSON.parse(localStorage.blockedCalls); g_blockedCQ = JSON.parse(localStorage.blockedCQ); g_blockedDxcc = JSON.parse(localStorage.blockedDxcc); } function storeBlocks() { localStorage.blockedCalls = JSON.stringify(g_blockedCalls); localStorage.blockedCQ = JSON.stringify(g_blockedCQ); localStorage.blockedDxcc = JSON.stringify(g_blockedDxcc); } function storeAwardTracker() { localStorage.awardTracker = JSON.stringify(g_awardTracker); } function loadSettings() { var readSettings = {}; if (typeof localStorage.rosterSettings != "undefined") { readSettings = JSON.parse(localStorage.rosterSettings); } g_rosterSettings = deepmerge(g_defaultSettings, readSettings); if ("GT" in g_rosterSettings.columns) delete g_rosterSettings.columns.GT; writeRosterSettings(); } function writeRosterSettings() { localStorage.rosterSettings = JSON.stringify(g_rosterSettings); } function isKnownCallsignDXCC(dxcc) { if (dxcc in g_callsignDatabaseDXCC) return true; return false; } function isKnownCallsignUS(dxcc) { if (dxcc in g_callsignDatabaseUS) return true; return false; } function isKnownCallsignUSplus(dxcc) { if (dxcc in g_callsignDatabaseUSplus) return true; return false; } function timeNowSec() { return parseInt(Date.now() / 1000); } function lockNewWindows() { if (typeof nw != "undefined") { var gui = require("nw.gui"); var win = gui.Window.get(); win.on("new-win-policy", function (frame, url, policy) { gui.Shell.openExternal(url); policy.ignore(); }); } } function myCallCompare(a, b) { return a.DEcall.localeCompare(b.DEcall); } function myGridCompare(a, b) { var gridA = a.grid ? a.grid : "0"; var gridB = b.grid ? b.grid : "0"; if (gridA > gridB) return 1; if (gridA < gridB) return -1; return 0; } function myDxccCompare(a, b) { return window.opener.myDxccCompare(a, b); } function myTimeCompare(a, b) { if (a.age > b.age) return 1; if (a.age < b.age) return -1; return 0; } function myLifeCompare(a, b) { if (a.life > b.life) return 1; if (a.life < b.life) return -1; return 0; } function mySpotCompare(a, b) { if (a.spot.when > b.spot.when) return 1; if (a.spot.when < b.spot.when) return -1; return 0; } function myDbCompare(a, b) { if (a.RSTsent > b.RSTsent) return 1; if (a.RSTsent < b.RSTsent) return -1; return 0; } function myFreqCompare(a, b) { if (a.delta > b.delta) return 1; if (a.delta < b.delta) return -1; return 0; } function myDTCompare(a, b) { if (a.dt > b.dt) return 1; if (a.dt < b.dt) return -1; return 0; } function myDistanceCompare(a, b) { if (a.distance > b.distance) return 1; if (a.distance < b.distance) return -1; return 0; } function myHeadingCompare(a, b) { if (a.heading > b.heading) return 1; if (a.heading < b.heading) return -1; return 0; } function myStateCompare(a, b) { if (a.state == null) return 1; if (b.state == null) return -1; if (a.state > b.state) return 1; if (a.state < b.state) return -1; return 0; } function myCQCompare(a, b) { return a.DXcall.localeCompare(b.DXcall); } function myWPXCompare(a, b) { if (a.px == null) return 1; if (b.px == null) return -1; if (a.px > b.px) return 1; if (a.px < b.px) return -1; return 0; } function myCntyCompare(a, b) { if (a.cnty == null) return 1; if (b.cnty == null) return -1; if (a.cnty.substr(3) > b.cnty.substr(3)) return 1; if (a.cnty.substr(3) < b.cnty.substr(3)) return -1; return 0; } function myContCompare(a, b) { if (a.cont == null) return 1; if (b.cont == null) return -1; if (a.cont > b.cont) return 1; if (a.cont < b.cont) return -1; return 0; } function myGTCompare(a, b) { if (a.style.gt != 0 && b.style.gt == 0) return 1; if (a.style.gt == 0 && b.style.gt != 0) return -1; return 0; } var r_sortFunction = [ myCallCompare, myGridCompare, myDbCompare, myDTCompare, myFreqCompare, myDxccCompare, myTimeCompare, myDistanceCompare, myHeadingCompare, myStateCompare, myCQCompare, myWPXCompare, myLifeCompare, mySpotCompare, myGTCompare, myCntyCompare, myContCompare ]; function showRosterBox(sortIndex) { if (g_rosterSettings.lastSortIndex != sortIndex) { g_rosterSettings.lastSortIndex = sortIndex; g_rosterSettings.lastSortReverse = 0; } else { g_rosterSettings.lastSortReverse ^= 1; } writeRosterSettings(); window.opener.goProcessRoster(); } function hashMaker(start, callObj, reference) { if (reference == LOGBOOK_LIVE_BAND_LIVE_MODE) return `${start}${callObj.band}${callObj.mode}`; if (reference == LOGBOOK_AWARD_TRACKER) return `${start}${callObj.band}${callObj.mode}`; if (reference == LOGBOOK_LIVE_BAND_MIX_MODE) return `${start}${callObj.band}`; if (reference == LOGBOOK_LIVE_BAND_DIGI_MODE) return `${start}${callObj.band}dg`; if (reference == LOGBOOK_MIX_BAND_LIVE_MODE) return `${start}${callObj.mode}`; if (reference == LOGBOOK_MIX_BAND_MIX_MODE) return `${start}`; if (reference == LOGBOOK_MIX_BAND_DIGI_MODE) return `${start}dg`; return ""; } function processRoster(roster) { callRoster = roster; viewRoster(); } function viewRoster() { var bands = Object(); var modes = Object(); var callMode = g_rosterSettings.callsign; var onlyHits = false; var isAwardTracker = false; if (callMode == "hits") { callMode = "all"; onlyHits = true; } if (referenceNeed.value == LOGBOOK_AWARD_TRACKER) { callMode = "all"; onlyHits = false; isAwardTracker = true; g_rosterSettings.huntNeed = "confirmed"; } var canMsg = window.opener.g_mapSettings.offlineMode == false && window.opener.g_appSettings.gtShareEnable == "true" && window.opener.g_appSettings.gtMsgEnable == "true"; if (window.opener.g_callsignLookups.lotwUseEnable == true) { usesLoTWDiv.style.display = ""; if (g_rosterSettings.usesLoTW == true) { maxLoTW.style.display = ""; maxLoTWView.style.display = ""; } else { maxLoTW.style.display = "none"; maxLoTWView.style.display = "none"; } } else { usesLoTWDiv.style.display = "none"; maxLoTW.style.display = "none"; maxLoTWView.style.display = "none"; } if (window.opener.g_callsignLookups.eqslUseEnable == true) useseQSLDiv.style.display = ""; else useseQSLDiv.style.display = "none"; if (window.opener.g_callsignLookups.oqrsUseEnable == true) usesOQRSDiv.style.display = ""; else usesOQRSDiv.style.display = "none"; if (g_rosterSettings.columns.Spot == true) onlySpotDiv.style.display = ""; else onlySpotDiv.style.display = "none"; if (callMode == "all") allOnlyNewDiv.style.display = ""; else allOnlyNewDiv.style.display = "none"; var huntIndex, workedIndex, layeredMode; if (g_rosterSettings.huntNeed == "mixed") { huntIndex = g_confirmed; workedIndex = g_worked; layeredMode = LAYERED_MODE_FOR[String(g_rosterSettings.reference)]; } else if (g_rosterSettings.huntNeed == "worked") { huntIndex = g_worked; workedIndex = false; layeredMode = false; } else if (g_rosterSettings.huntNeed == "confirmed") { huntIndex = g_confirmed; workedIndex = g_worked; layeredMode = false; } else { huntIndex = false; workedIndex = false; layeredMode = false; } var now = timeNowSec(); // First loop, exclude calls, mostly based on "Exceptions" settings for (var callHash in callRoster) { var entry = callRoster[callHash]; var callObj = entry.callObj; var call = entry.DEcall; entry.tx = true; callObj.shouldAlert = false; callObj.reason = Array(); callObj.awardReason = "Callsign"; if (now - callObj.age > window.opener.g_mapSettings.rosterTime) { entry.tx = false; entry.alerted = false; callObj.qrz = false; callObj.reset = true; continue; } if (window.opener.g_instances[callObj.instance].crEnable == false) { entry.tx = false; continue; } if (call in g_blockedCalls) { entry.tx = false; continue; } if ( entry.DXcall + " from All" in g_blockedCQ || entry.DXcall + " from " + window.opener.g_dxccToAltName[callObj.dxcc] in g_blockedCQ ) { entry.tx = false; continue; } if (callObj.dxcc in g_blockedDxcc) { entry.tx = false; continue; } if (g_rosterSettings.cqOnly == true && callObj.CQ == false) { entry.tx = false; continue; } if (g_rosterSettings.useRegex && g_rosterSettings.callsignRegex.length > 0) { try { if (!call.match(g_rosterSettings.callsignRegex)) { entry.tx = false; continue; } } catch (e) {} } if (g_rosterSettings.requireGrid == true && callObj.grid.length != 4) { entry.tx = false; continue; } if (g_rosterSettings.wantMinDB == true && entry.message.SR < g_rosterSettings.minDb) { entry.tx = false; continue; } if (g_rosterSettings.wantMaxDT == true && Math.abs(entry.message.DT) > g_rosterSettings.maxDT) { entry.tx = false; continue; } if (g_rosterSettings.wantMinFreq == true && entry.message.DF < g_rosterSettings.minFreq) { entry.tx = false; continue; } if (g_rosterSettings.wantMaxFreq == true && entry.message.DF > g_rosterSettings.maxFreq) { entry.tx = false; continue; } if (g_rosterSettings.noMsg == true) { try { if (callObj.msg.match(g_rosterSettings.noMsgValue)) { entry.tx = false; continue; } } catch (e) {} } if (g_rosterSettings.onlyMsg == true) { try { if (!callObj.msg.match(g_rosterSettings.onlyMsgValue)) { entry.tx = false; continue; } } catch (e) {} } if (callObj.dxcc == window.opener.g_myDXCC) { if (g_rosterSettings.noMyDxcc == true) { entry.tx = false; continue; } } else { if (g_rosterSettings.onlyMyDxcc == true) { entry.tx = false; continue; } } if (window.opener.g_callsignLookups.lotwUseEnable == true && g_rosterSettings.usesLoTW == true) { if (!(call in window.opener.g_lotwCallsigns)) { entry.tx = false; continue; } if (g_rosterSettings.maxLoTW < 27) { var months = (g_day - window.opener.g_lotwCallsigns[call]) / 30; if (months > g_rosterSettings.maxLoTW) { entry.tx = false; continue; } } } if (window.opener.g_callsignLookups.eqslUseEnable == true && g_rosterSettings.useseQSL == true) { if (!(call in window.opener.g_eqslCallsigns)) { entry.tx = false; continue; } } if (window.opener.g_callsignLookups.oqrsUseEnable == true && g_rosterSettings.usesOQRS == true) { if (!(call in window.opener.g_oqrsCallsigns)) { entry.tx = false; continue; } } if (callMode != "all") { if (entry.DXcall == "CQ DX" && callObj.dxcc == window.opener.g_myDXCC) { entry.tx = false; continue; } var hash = hashMaker(call, callObj, g_rosterSettings.reference); if (callMode == "worked" && hash in g_worked.call) { entry.tx = false; continue; } if (callMode == "confirmed" && hash in g_confirmed.call) { entry.tx = false; continue; } if (g_rosterSettings.hunting == "grid") { var hash = hashMaker(callObj.grid.substr(0, 4), callObj, g_rosterSettings.reference); if (huntIndex && hash in huntIndex.grid) { entry.tx = false; continue; } if (callObj.grid.length == 0) { entry.tx = false; continue; } continue; } if (g_rosterSettings.hunting == "dxcc") { var hash = hashMaker(String(callObj.dxcc), callObj, g_rosterSettings.reference); if (huntIndex && (hash in huntIndex.dxcc)) { entry.tx = false; continue; } continue; } if (g_rosterSettings.hunting == "dxccs" && r_currentDXCCs != -1) { if (callObj.dxcc != r_currentDXCCs) { entry.tx = false; continue; } } if (g_rosterSettings.hunting == "wpx") { if (String(callObj.px) == null) { entry.tx = false; continue; } var hash = hashMaker(String(callObj.px), callObj, g_rosterSettings.reference); if (huntIndex && (hash in huntIndex.px)) { entry.tx = false; continue; } continue; } if (g_rosterSettings.hunting == "cq") { var huntTotal = callObj.cqza.length; if (huntTotal == 0 || !huntIndex) { entry.tx = false; continue; } var huntFound = 0; for (index in callObj.cqza) { var hash = hashMaker(callObj.cqza[index], callObj, g_rosterSettings.reference); if (hash in huntIndex.cqz) huntFound++; } if (huntFound == huntTotal) { entry.tx = false; continue; } continue; } if (g_rosterSettings.hunting == "itu") { var huntTotal = callObj.ituza.length; if (huntTotal == 0 || !huntIndex) { entry.tx = false; continue; } var huntFound = 0; for (index in callObj.ituza) { var hash = hashMaker(callObj.ituza[index], callObj, g_rosterSettings.reference); if (hash in huntIndex.ituz) huntFound++; } if (huntFound == huntTotal) { entry.tx = false; continue; } if (callObj.grid.length == 0) { entry.tx = false; continue; } continue; } if (g_rosterSettings.hunting == "usstates" && window.opener.g_callsignLookups.ulsUseEnable == true) { var state = callObj.state; var finalDxcc = callObj.dxcc; if (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6) { if (state in window.opener.g_StateData) { var hash = hashMaker(state, callObj, g_rosterSettings.reference); if (huntIndex && hash in huntIndex.state) { entry.tx = false; continue; } } else entry.tx = false; } else entry.tx = false; continue; } if (g_rosterSettings.hunting == "usstate" && g_currentUSCallsigns) { if (call in g_currentUSCallsigns) { // Do Nothing } else { entry.tx = false; continue; } continue; } } if (isAwardTracker) { var tx = false; var baseHash = hashMaker("", callObj, g_rosterSettings.reference); for (var award in g_awardTracker) { if (g_awardTracker[award].enable) { tx = testAward(award, callObj, baseHash); if (tx) { var x = g_awardTracker[award]; callObj.awardReason = g_awards[x.sponsor].awards[x.name].tooltip + " (" + g_awards[x.sponsor].sponsor + ")"; break; } } } entry.tx = tx; } } var hasGtPin = false; var newCallList = Array(); var inversionAlpha = "DD"; var row = "#000000"; var bold = "#000000;font-weight: bold;"; var unconf = "background-clip:padding-box;box-shadow: 0 0 7px 3px inset "; var layeredAlpha = "77"; var layeredInversionAlpha = "66"; var layeredUnconf = "background-clip:padding-box;box-shadow: 0 0 4px 2px inset "; var layeredUnconfAlpha = "AA"; // Second loop, hunting and highlighting for (var callHash in callRoster) { var entry = callRoster[callHash]; var callObj = entry.callObj; // Special case check for called station if (callObj.qrz == true && entry.tx == false) { // The instance has to be enabled if (window.opener.g_instances[callObj.instance].crEnable == true) { // Calling us, but we wouldn't normally display // If they are not ignored or we're in a QSO with them, var it through if ((!(entry.DEcall in g_blockedCalls) && !(callObj.dxcc in g_blockedDxcc)) || window.opener.g_instances[callObj.instance].status.DXcall == entry.DEcall) { entry.tx = true; } } } // Only render entries with `tx == true`, ignore the rest if (callObj.dxcc != -1 && entry.tx == true) { // In layered mode ("Hunting: mixed") the workHashSuffix becomes a more stricter 'live band', // while the layered suffix is a broader 'mixed band' var workHashSuffix, layeredHashSuffix; if (layeredMode) { workHashSuffix = hashMaker("", callObj, layeredMode); layeredHashSuffix = hashMaker("", callObj, g_rosterSettings.reference); } else { workHashSuffix = hashMaker("", callObj, g_rosterSettings.reference); layeredHashSuffix = false } var workHash = workHashSuffix; // TODO: Remove after replacing all occurrences with Suffix var callsign = entry.DEcall; callObj.hunting = {} callObj.callFlags = {} var colorObject = Object(); var callPointer = callObj.CQ == true ? "cursor:pointer" : ""; var didWork = false; var call = "#FFFF00"; var grid = "#00FFFF"; var calling = "#90EE90"; var dxcc = "#FFA500"; var state = "#90EE90"; var cnty = "#CCDD00"; var cont = "#00DDDD"; var cqz = "#DDDDDD"; var ituz = "#DDDDDD"; var wpx = "#FFFF00"; hasGtPin = false; var shouldAlert = false; var callBg, gridBg, callingBg, dxccBg, stateBg, cntyBg, contBg, cqzBg, ituzBg, wpxBg, gtBg; var callConf, gridConf, callingConf, dxccConf, stateConf, cntyConf, contConf, cqzConf, ituzConf, wpxConf; callBg = gridBg = callingBg = dxccBg = stateBg = cntyBg = contBg = cqzBg = ituzBg = wpxBg = gtBg = row; callConf = gridConf = callingConf = dxccConf = stateConf = cntyConf = contConf = cqzConf = ituzConf = wpxConf = ""; var hash = callsign + workHashSuffix; var layeredHash = layeredHashSuffix && (callsign + layeredHashSuffix) // Call worked in current logbook settings, regardless of hunting mode if (hash in g_worked.call) { callObj.callFlags.worked = true; didWork = true; callConf = `${unconf}${call}${inversionAlpha};`; if (hash in g_confirmed.call) { callObj.callFlags.confirmed = true; callPointer = "text-decoration: line-through; "; callConf = ""; } } // Calls that have OAMS chat support if ( callsign in window.opener.g_gtCallsigns && window.opener.g_gtCallsigns[callsign] in window.opener.g_gtFlagPins && window.opener.g_gtFlagPins[window.opener.g_gtCallsigns[callsign]].canmsg == true ) { callObj.callFlags.oams = true; // grab the CID colorObject.gt = window.opener.g_gtCallsigns[callsign]; hasGtPin = true; } else { colorObject.gt = 0; } // We only do hunt highlighting when showing all entries // This means "Callsigns: All Traffic", "Callsigns: All Traffic/Only Wanted" and "Logbook: Award Tracker" // There is no highlighting in other modes if (callMode == "all") { // Skip when "only new calls" // Questions: Move to the first loop? Why only skip new calls in "all traffic" and not other modes? if (allOnlyNew.checked == true && didWork && callObj.qrz == false) { entry.tx = false; continue; } // Hunting for callsigns if (huntCallsign.checked == true) { var hash = callsign + workHashSuffix; var layeredHash = layeredMode && (callsign + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.call)) { shouldAlert = true; callObj.reason.push("call"); if (workedIndex && hash in workedIndex.call) { if (layeredMode && layeredHash in huntIndex.call) { callObj.hunting.call = "worked-and-mixed"; callConf = `${layeredUnconf}${call}${layeredUnconfAlpha};`; callBg = `${call}${layeredInversionAlpha}`; call = bold; } // /* Currently we don't have a way to figure out // * if the call is worked only in this band or also others, // * so we cannot cover this particular combination // * and have to default to just showing it as plain "worked" // */ // else if (layeredMode && layeredHash in workedIndex.call) // { // callObj.hunting.call = "worked-and-mixed-worked"; // callConf = `${layeredUnconf}${call}${layeredAlpha};`; // } else { callObj.hunting.call = "worked"; callConf = `${unconf}${call}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.call) { callObj.hunting.call = "mixed"; callBg = `${call}${layeredAlpha};`; call = bold; } else if (layeredMode && layeredHash in workedIndex.call) { callObj.hunting.call = "mixed-worked"; callConf = `${unconf}${call}${layeredAlpha};`; } else { callObj.hunting.call = "hunted"; callBg = `${call}${inversionAlpha};`; call = bold; } } } } // Hunting for "stations calling you" if (huntQRZ.checked == true && callObj.qrz == true) { callObj.callFlags.calling = true shouldAlert = true; callObj.reason.push("qrz"); } // Hunting for stations with OAMS if (huntOAMS.checked == true && hasGtPin == true) { callObj.hunting.oams = "hunted"; shouldAlert = true; callObj.reason.push("oams"); } // Hunting for grids if (huntGrid.checked == true && callObj.grid.length > 1) { var hash = callObj.grid.substr(0, 4) + workHashSuffix; var layeredHash = layeredMode && (callObj.grid.substr(0, 4) + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.grid)) { shouldAlert = true; callObj.reason.push("grid"); if (workedIndex && hash in workedIndex.grid) { if (layeredMode && layeredHash in huntIndex.grid) { callObj.hunting.grid = "worked-and-mixed"; gridConf = `${layeredUnconf}${grid}${layeredUnconfAlpha};`; gridBg = `${grid}${layeredInversionAlpha}`; grid = bold; } else { callObj.hunting.grid = "worked"; gridConf = `${unconf}${grid}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.grid) { callObj.hunting.grid = "mixed"; gridBg = `${grid}${layeredAlpha};`; grid = bold; } else if (layeredMode && layeredHash in workedIndex.grid) { callObj.hunting.grid = "mixed-worked"; gridConf = `${unconf}${grid}${layeredAlpha};`; } else { callObj.hunting.grid = "hunted"; gridBg = `${grid}${inversionAlpha};`; grid = bold; } } } } // Hunting for DXCC if (huntDXCC.checked == true) { var hash = String(callObj.dxcc) + workHashSuffix; var layeredHash = layeredMode && (String(callObj.dxcc) + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.dxcc)) { shouldAlert = true; callObj.reason.push("dxcc"); if (workedIndex && hash in workedIndex.dxcc) { if (layeredMode && layeredHash in huntIndex.dxcc) { callObj.hunting.dxcc = "worked-and-mixed"; dxccConf = `${layeredUnconf}${dxcc}${layeredUnconfAlpha};`; dxccBg = `${dxcc}${layeredInversionAlpha}`; dxcc = bold; } else { callObj.hunting.dxcc = "worked"; dxccConf = `${unconf}${dxcc}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.dxcc) { callObj.hunting.dxcc = "mixed"; dxccBg = `${dxcc}${layeredAlpha};`; dxcc = bold; } else if (layeredMode && layeredHash in workedIndex.dxcc) { callObj.hunting.dxcc = "mixed-worked"; dxccConf = `${unconf}${dxcc}${layeredAlpha};`; } else { callObj.hunting.dxcc = "hunted"; dxccBg = `${dxcc}${inversionAlpha};`; dxcc = bold; } } } } // Hunting for US States if (huntState.checked == true && window.opener.g_callsignLookups.ulsUseEnable == true) { var stateSearch = callObj.state; var finalDxcc = callObj.dxcc; if (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6) { if (stateSearch in window.opener.g_StateData) { var hash = stateSearch + workHashSuffix; var layeredHash = layeredMode && (stateSearch + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.state)) { shouldAlert = true; callObj.reason.push("state"); if (workedIndex && hash in workedIndex.state) { if (layeredMode && layeredHash in huntIndex.state) { callObj.hunting.state = "worked-and-mixed"; stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`; stateBg = `${state}${layeredInversionAlpha}`; state = bold; } else { callObj.hunting.state = "worked"; stateConf = `${unconf}${state}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.state) { callObj.hunting.state = "mixed"; stateBg = `${state}${layeredAlpha};`; state = bold; } else if (layeredMode && layeredHash in workedIndex.state) { callObj.hunting.state = "mixed-worked"; stateConf = `${unconf}${state}${layeredAlpha};`; } else { callObj.hunting.state = "hunted"; stateBg = `${state}${inversionAlpha};`; state = bold; } } } } } } // Hunting for US Counties if (huntCounty.checked == true && window.opener.g_callsignLookups.ulsUseEnable == true) { var finalDxcc = callObj.dxcc; if ( callObj.cnty && (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) && callObj.cnty.length > 0 ) { var hash = callObj.cnty + (layeredMode ? layeredHashSuffix : workHashSuffix); if ((huntIndex && !(hash in huntIndex.cnty)) || callObj.qual == false) { if (callObj.qual == false) { var counties = window.opener.g_zipToCounty[callObj.zipcode]; var foundHit = false; for (var cnt in counties) { var hh = counties[cnt] + workHash; callObj.cnty = counties[cnt]; if (huntIndex && !(hh in huntIndex.cnty)) { foundHit = true; break; } } if (foundHit) shouldAlert = true; } else { shouldAlert = true; } if (shouldAlert) { callObj.reason.push("cnty"); if (workedIndex && hash in workedIndex.cnty) { callObj.hunting.cnty = "worked"; cntyConf = `${unconf}${cnty}${inversionAlpha};`; } else { callObj.hunting.cnty = "hunted"; cntyBg = `${cnty}${inversionAlpha}`; cnty = bold; } } } } } // Hunting for CQ Zones if (huntCQz.checked == true) { var huntTotal = callObj.cqza.length; var huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0; for (index in callObj.cqza) { var hash = callObj.cqza[index] + workHashSuffix; var layeredHash = layeredMode && (callObj.cqza[index] + layeredHashSuffix) if (huntIndex && hash in huntIndex.cqz) huntFound++; if (layeredMode && layeredHash in huntIndex.cqz) layeredFound++; if (workedIndex && hash in workedIndex.cqz) workedFound++; if (layeredMode && layeredHash in workedIndex.cqz) layeredWorkedFound++; } if (huntFound != huntTotal) { shouldAlert = true; callObj.reason.push("cqz"); if (workedIndex && workedFound == huntTotal) { if (layeredMode && layeredFound == huntTotal) { callObj.hunting.cqz = "worked-and-mixed"; cqzConf = `${layeredUnconf}${cqz}${layeredUnconfAlpha};`; cqzBg = `${cqz}${layeredInversionAlpha}`; cqz = bold; } else { callObj.hunting.cqz = "worked"; cqzConf = `${unconf}${cqz}${inversionAlpha};`; } } else { if (layeredMode && layeredFound == huntTotal) { callObj.hunting.cqz = "mixed"; cqzBg = `${cqz}${layeredAlpha};`; cqz = bold; } else if (layeredMode && layeredWorkedFound == huntTotal) { callObj.hunting.cqz = "mixed-worked"; cqzConf = `${unconf}${cqz}${layeredAlpha};`; } else { callObj.hunting.cqz = "hunted"; cqzBg = `${cqz}${inversionAlpha};`; cqz = bold; } } } } // Hunting for ITU Zones if (huntITUz.checked == true) { var huntTotal = callObj.ituza.length; var huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0; for (index in callObj.ituza) { var hash = callObj.ituza[index] + workHashSuffix; var layeredHash = layeredMode && (callObj.ituza[index] + layeredHashSuffix) if (huntIndex && hash in huntIndex.ituz) huntFound++; if (layeredMode && layeredHash in huntIndex.ituz) layeredFound++; if (workedIndex && hash in workedIndex.ituz) workedFound++; if (layeredMode && layeredHash in workedIndex.ituz) layeredWorkedFound++; } if (huntFound != huntTotal) { shouldAlert = true; callObj.reason.push("ituz"); if (workedIndex && workedFound == huntTotal) { if (layeredMode && layeredFound == huntTotal) { callObj.hunting.ituz = "worked-and-mixed"; ituzConf = `${layeredUnconf}${ituz}${layeredUnconfAlpha};`; ituzBg = `${ituz}${layeredInversionAlpha}`; ituz = bold; } else { callObj.hunting.ituz = "worked"; ituzConf = `${unconf}${ituz}${inversionAlpha};`; } } else { if (layeredMode && layeredFound == huntTotal) { callObj.hunting.ituz = "mixed"; ituzBg = `${ituz}${layeredAlpha};`; ituz = bold; } else if (layeredMode && layeredWorkedFound == huntTotal) { callObj.hunting.ituz = "mixed-worked"; ituzConf = `${unconf}${ituz}${layeredAlpha};`; } else { callObj.hunting.ituz = "hunted"; ituzBg = `${ituz}${inversionAlpha};`; ituz = bold; } } } } // Hunting for WPX (Prefixes) if (huntPX.checked == true && callObj.px) { var hash = String(callObj.px) + workHashSuffix; var layeredHash = layeredMode && (String(callObj.px) + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.px)) { shouldAlert = true; callObj.reason.push("wpx"); if (workedIndex && hash in workedIndex.px) { if (layeredMode && layeredHash in huntIndex.px) { callObj.hunting.wpx = "worked-and-mixed"; wpxConf = `${layeredUnconf}${wpx}${layeredUnconfAlpha};`; wpxBg = `${wpx}${layeredInversionAlpha}`; wpx = bold; } else { callObj.hunting.wpx = "worked"; wpxConf = `${unconf}${wpx}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.px) { callObj.hunting.wpx = "mixed"; wpxBg = `${wpx}${layeredAlpha};`; wpx = bold; } else if (layeredMode && layeredHash in workedIndex.px) { callObj.hunting.wpx = "mixed-worked"; wpxConf = `${unconf}${wpx}${layeredAlpha};`; } else { callObj.hunting.wpx = "hunted"; wpxBg = `${wpx}${inversionAlpha};`; wpx = bold; } } } } // Hunting for Continents if (huntCont.checked == true && callObj.cont) { var hash = String(callObj.cont) + workHashSuffix; var layeredHash = layeredMode && (String(callObj.cont) + layeredHashSuffix) if (huntIndex && !(hash in huntIndex.cont)) { shouldAlert = true; callObj.reason.push("cont"); if (workedIndex && hash in workedIndex.cont) { if (layeredMode && layeredHash in huntIndex.cont) { callObj.hunting.cont = "worked-and-mixed"; contConf = `${layeredUnconf}${cont}${layeredUnconfAlpha};`; contBg = `${cont}${layeredInversionAlpha}`; cont = bold; } else { callObj.hunting.cont = "worked"; contConf = `${unconf}${cont}${inversionAlpha};`; } } else { if (layeredMode && layeredHash in huntIndex.cont) { callObj.hunting.cont = "mixed"; contBg = `${cont}${layeredAlpha};`; cont = bold; } else if (layeredMode && layeredHash in workedIndex.cont) { callObj.hunting.cont = "mixed-worked"; contConf = `${unconf}${cont}${layeredAlpha};`; } else { callObj.hunting.cont = "hunted"; contBg = `${cont}${inversionAlpha};`; cont = bold; } } } } } // Station is calling us if (callObj.DXcall == window.opener.myDEcall) { callingBg = "#0000FF" + inversionAlpha; calling = "#FFFF00;text-shadow: 0px 0px 2px #FFFF00"; } else if (callObj.CQ == true && g_rosterSettings.cqOnly == false) { callingBg = calling + inversionAlpha; calling = bold; } // Assemble all styles colorObject.call = "style='" + callConf + "background-color:" + callBg + ";color:" + call + ";" + callPointer + "'"; colorObject.grid = "style='" + gridConf + "background-color:" + gridBg + ";color:" + grid + ";cursor:pointer'"; colorObject.calling = "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'"; colorObject.dxcc = "style='" + dxccConf + "background-color:" + dxccBg + ";color:" + dxcc + "'"; colorObject.state = "style='" + stateConf + "background-color:" + stateBg + ";color:" + state + "'"; colorObject.cnty = "style='" + cntyConf + "background-color:" + cntyBg + ";color:" + cnty + "'"; colorObject.cont = "style='" + contConf + "background-color:" + contBg + ";color:" + cont + "'"; colorObject.cqz = "style='" + cqzConf + "background-color:" + cqzBg + ";color:" + cqz + "'"; colorObject.ituz = "style='" + ituzConf + "background-color:" + ituzBg + ";color:" + ituz + "'"; colorObject.px = "style='" + wpxConf + "background-color:" + wpxBg + ";color:" + wpx + "'"; // Just in case, don't alert if we worked this callsign alread if (didWork && shouldAlert) shouldAlert = false; callObj.shouldAlert = shouldAlert; callObj.style = colorObject; if (g_rosterSettings.columns.Spot) { callObj.spot = window.opener.getSpotTime( callObj.DEcall + callObj.mode + callObj.band + callObj.grid ); if (callObj.spot == null) { callObj.spot = { when: 0, snr: 0 }; } } else { callObj.spot = { when: 0, snr: 0 }; } modes[callObj.mode] = true; bands[callObj.band] = true; newCallList.push(callObj); } } // Show the roster count in the window title var totalCount = Object.keys(callRoster).length; var visibleCount = newCallList.length; var huntedCount = newCallList.filter(obj => Object.keys(obj.hunting).length > 0).length var countParts = []; if (totalCount != visibleCount) { countParts.push(`${totalCount} heard`); } countParts.push(`${visibleCount} in roster`); if (huntedCount != visibleCount) { countParts.push(`${huntedCount} wanted`); } window.document.title = `Call Roster: ${countParts.join(" • ")}`; // Render the roster if (g_rosterSettings.compact == false) { newCallList.sort(r_sortFunction[g_rosterSettings.lastSortIndex]); if (g_rosterSettings.lastSortReverse == 1) { newCallList.reverse(); } } else { // Age sort for now... make this happen Tag newCallList.sort(r_sortFunction[6]).reverse(); } var showBands = (Object.keys(bands).length > 1) || g_rosterSettings.columns.Band; var showModes = (Object.keys(modes).length > 1) || g_rosterSettings.columns.Mode; var worker = ""; // Render the table headers for the regular roster table if (g_rosterSettings.compact == false) { worker = "
Callsign | "; if (showBands) { worker += "Band | "; } if (showModes) { worker += "Mode | "; } worker += "Grid | "; if (g_rosterSettings.columns.Calling) { worker += "Calling | "; } if (g_rosterSettings.columns.Msg) { worker += "Msg | "; } if (g_rosterSettings.columns.DXCC) { worker += "DXCC | "; } if (g_rosterSettings.columns.Flag) { worker += "Flag | "; } if (g_rosterSettings.columns.State) { worker += "State | "; } if (g_rosterSettings.columns.County) { worker += "County | "; } if (g_rosterSettings.columns.Cont) { worker += "Cont | "; } if (g_rosterSettings.columns.dB) { worker += "dB | "; } if (g_rosterSettings.columns.Freq) { worker += "Freq | "; } if (g_rosterSettings.columns.DT) { worker += "DT | "; } if (g_rosterSettings.columns.Dist) { worker += "Dist(" + window.opener.distanceUnit.value.toLowerCase() + ") | "; } if (g_rosterSettings.columns.Azim) { worker += "Azim | "; } if (g_rosterSettings.columns.CQz) { worker += "CQz | "; } if (g_rosterSettings.columns.ITUz) { worker += "ITUz | "; } if (g_rosterSettings.columns.PX) { worker += "PX | "; } if (window.opener.g_callsignLookups.lotwUseEnable == true && g_rosterSettings.columns.LoTW) { worker += "LoTW | "; } if (window.opener.g_callsignLookups.eqslUseEnable == true && g_rosterSettings.columns.eQSL) { worker += "eQSL | "; } if (window.opener.g_callsignLookups.oqrsUseEnable == true && g_rosterSettings.columns.OQRS) { worker += "OQRS | "; } if (g_rosterSettings.columns.Spot) { worker += "Spot | "; } if (g_rosterSettings.columns.Life) { worker += "Life | "; } if (g_rosterSettings.columns.OAMS) { worker += "OAMS | "; } if (g_rosterSettings.columns.Age) { worker += "Age | "; } } // No headers for compact roster table else { worker = "
---|
"; worker += "Name"; worker += " | "; worker += ""; worker += "Award"; worker += " | "; worker += ""; worker += "Track"; worker += " | "; worker += ""; worker += ""; worker += " | "; worker += "
" + award.name + " - " + award.sponsor ); cell.style.textAlign = "left"; cell.style.color = "lightblue"; createCellHtml( row, "
" + (allEndorse ? "" : baseAward ? "" : baseCount > 0 ? "" : ""), tooltip ); createCell( row, "enable", award.enable, award.enable, "Toggle Tracking", true ); createCellHtml( row, "
" ); } } function deleteAwardTracker(sender) { var id = sender.parentNode.parentNode.id; delete g_awardTracker[id]; storeAwardTracker(); resetAwardAdd(); updateAwardList(); window.opener.goProcessRoster(); } function awardCheckboxChanged(sender) { var awardId = sender.target.parentNode.parentNode.id; g_awardTracker[sender.target.parentNode.parentNode.id][sender.target.name] = sender.target.checked; storeAwardTracker(); window.opener.goProcessRoster(); } function awardValueChanged(sender) { var awardId = sender.target.parentNode.parentNode.id; g_awardTracker[sender.target.parentNode.parentNode.id][sender.target.name] = sender.target.value; storeAwardTracker(); window.opener.goProcessRoster(); } function createCell( row, target, value, data = null, title = null, checkbox = false ) { var cell = row.insertCell(); if (data == null) cell.innerHTML = value; if (title) cell.title = title; if (checkbox) { var x = document.createElement("INPUT"); x.setAttribute("type", "checkbox"); x.checked = value; x.name = target; x.addEventListener("change", awardCheckboxChanged); cell.appendChild(x); } else if (data) { cell.appendChild(createAwardSelector(cell, target, value, data)); } return cell; } function createCellHtml(row, html, title = null) { var cell = row.insertCell(); cell.innerHTML = html; if (title) cell.title = title; return cell; } function createAwardSelector(cell, target, value, forObject) { var selector = document.createElement("select"); selector.name = target; selector.value = value; selector.disabled = forObject.length == 1; selector.style.margin = "0px"; selector.style.padding = "1px"; if (selector.disabled) selector.style.cursor = "auto"; selector.addEventListener("change", awardValueChanged); for (var opt in forObject) { var option = document.createElement("option"); option.value = forObject[opt]; if (option.value == "Phone" || option.value == "CW") option.disabled = true; option.text = forObject[opt]; selector.appendChild(option); } return selector; } function resetAwardAdd() { awardName.style.display = "none"; createSelectOptions("awardName", "Select Award", null); createSelectOptions("awardSponsor", "Select Sponsor", g_awards, "sponsor"); } function openAwardPopup() { awardHunterDiv.style.display = ""; resetAwardAdd(); } function closeAwardPopup() { awardHunterDiv.style.display = "none"; resetAwardAdd(); } function toggleMoreControls() { g_rosterSettings.controlsExtended = !g_rosterSettings.controlsExtended; localStorage.rosterSettings = JSON.stringify(g_rosterSettings); setVisual(); } function setVisual() { huntNeed.style.display = "none"; stateSelect.style.display = "none"; DXCCsSelect.style.display = "none"; if (g_rosterSettings.controls) { if (g_rosterSettings.controlsExtended) { RosterControls.className = "extended"; } else { RosterControls.className = "normal"; } } else { RosterControls.className = "hidden"; } // Award Hunter if (referenceNeed.value == LOGBOOK_AWARD_TRACKER) { /* for ( key in g_rosterSettings.wanted ) { document.getElementById(key).checked = true; var t = key.replace("hunt",""); if ( t in g_rosterSettings.columns ) g_rosterSettings.columns[t] = true; } */ HuntModeControls.style.display = "none"; CallsignsControls.style.display = "none"; AwardTrackerControls.style.display = ""; huntingMatrixDiv.style.display = ""; updateAwardList(); } else { for (var key in g_rosterSettings.wanted) { if (document.getElementById(key)) { document.getElementById(key).checked = g_rosterSettings.wanted[key]; } } AwardTrackerControls.style.display = "none"; HuntModeControls.style.display = ""; huntMode.style.display = ""; CallsignsControls.style.display = ""; closeAwardPopup(); if (callsignNeed.value == "all" || callsignNeed.value == "hits") { huntingMatrixDiv.style.display = ""; huntNeed.style.display = ""; huntMode.style.display = "none"; } else { huntingMatrixDiv.style.display = "none"; huntMode.style.display = ""; if ( huntMode.value != "callsign" && huntMode.value != "usstate" && huntMode.value != "dxccs" ) { huntNeed.style.display = ""; } if (huntMode.value == "usstate") { stateSelect.style.display = ""; } if (huntMode.value == "usstates") { huntNeed.style.display = ""; } if (huntMode.value == "dxccs") { DXCCsSelect.style.display = ""; } } } if (wantMaxDT.checked == true) { maxDT.style.display = ""; maxDTView.style.display = ""; } else { maxDT.style.display = "none"; maxDTView.style.display = "none"; } if (wantMinDB.checked == true) { minDb.style.display = ""; minDbView.style.display = ""; } else { minDb.style.display = "none"; minDbView.style.display = "none"; } if (wantMinFreq.checked == true) { minFreq.style.display = ""; minFreqView.style.display = ""; } else { minFreq.style.display = "none"; minFreqView.style.display = "none"; } if (wantMaxFreq.checked == true) { maxFreq.style.display = ""; maxFreqView.style.display = ""; } else { maxFreq.style.display = "none"; maxFreqView.style.display = "none"; } if (useRegex.checked == true) { callsignRegex.style.display = ""; } else { callsignRegex.style.display = "none"; } if (window.opener.g_callsignLookups.lotwUseEnable == true) { usesLoTWDiv.style.display = ""; if (g_rosterSettings.usesLoTW == true) { maxLoTW.style.display = ""; maxLoTWView.style.display = ""; } else { maxLoTW.style.display = "none"; maxLoTWView.style.display = "none"; } } else { usesLoTWDiv.style.display = "none"; maxLoTW.style.display = "none"; maxLoTWView.style.display = "none"; } if (window.opener.g_callsignLookups.eqslUseEnable == true) { useseQSLDiv.style.display = ""; } else useseQSLDiv.style.display = "none"; if (window.opener.g_callsignLookups.oqrsUseEnable == true) { usesOQRSDiv.style.display = ""; } else usesOQRSDiv.style.display = "none"; if (g_rosterSettings.columns.Spot == true) { onlySpotDiv.style.display = ""; } else onlySpotDiv.style.display = "none"; if (g_rosterSettings.callsign == "all" || g_rosterSettings.callsign == "hits") { allOnlyNewDiv.style.display = ""; } else allOnlyNewDiv.style.display = "none"; resize(); } function wantedChanged(element) { g_rosterSettings.wanted[element.id] = element.checked; if (element.checked == true) { var t = element.id.replace("hunt", ""); if (t in g_rosterSettings.columns) { g_rosterSettings.columns[t] = true; for (var i = 0; i < g_menu.items.length; ++i) { if ( typeof g_menu.items[i].checked != "undefined" && g_menu.items[i].label == t ) { g_menu.items[i].checked = true; } } } } writeRosterSettings(); g_scriptReport = Object(); for (var callHash in window.opener.g_callRoster) { window.opener.g_callRoster[callHash].callObj.alerted = false; } window.opener.goProcessRoster(); } function valuesChanged() { setVisual(); g_rosterSettings.callsign = callsignNeed.value; g_rosterSettings.hunting = huntMode.value; g_rosterSettings.huntNeed = huntNeed.value; g_rosterSettings.requireGrid = wantGrid.checked; g_rosterSettings.wantMaxDT = wantMaxDT.checked; g_rosterSettings.wantMinDB = wantMinDB.checked; g_rosterSettings.wantMinFreq = wantMinFreq.checked; g_rosterSettings.wantMaxFreq = wantMaxFreq.checked; maxDTView.innerHTML = g_rosterSettings.maxDT = maxDT.value; minDbView.innerHTML = g_rosterSettings.minDb = minDb.value; minFreqView.innerHTML = g_rosterSettings.minFreq = minFreq.value; maxFreqView.innerHTML = g_rosterSettings.maxFreq = maxFreq.value; g_rosterSettings.maxLoTW = maxLoTW.value; maxLoTWView.innerHTML = g_rosterSettings.maxLoTW < 27 ? Number(g_rosterSettings.maxLoTW).toYM() : "∞"; g_rosterSettings.maxLoTW = maxLoTW.value; g_rosterSettings.cqOnly = cqOnly.checked; g_rosterSettings.noMyDxcc = noMyDxcc.checked; g_rosterSettings.onlyMyDxcc = onlyMyDxcc.checked; if ( noMsg.checked && onlyMsg.checked && noMsgValue.value == onlyMsgValue.value ) { if (g_rosterSettings.noMsg) noMsg.checked = false; else onlyMsg.checked = false; } g_rosterSettings.noMsg = noMsg.checked; g_rosterSettings.onlyMsg = onlyMsg.checked; g_rosterSettings.noMsgValue = noMsgValue.value; g_rosterSettings.onlyMsgValue = onlyMsgValue.value; g_rosterSettings.usesLoTW = usesLoTW.checked; g_rosterSettings.useseQSL = useseQSL.checked; g_rosterSettings.usesOQRS = usesOQRS.checked; g_rosterSettings.onlySpot = onlySpot.checked; g_rosterSettings.reference = referenceNeed.value; g_rosterSettings.allOnlyNew = allOnlyNew.checked; g_rosterSettings.useRegex = useRegex.checked; g_rosterSettings.callsignRegex = callsignRegex.value; writeRosterSettings(); g_scriptReport = Object(); for (var callHash in window.opener.g_callRoster) { window.opener.g_callRoster[callHash].callObj.alerted = false; } window.opener.goProcessRoster(); } function getBuffer(file_url, callback, flag, mode, port, cookie) { var url = require("url"); var http = require(mode); var fileBuffer = null; var options = null; if (cookie != null) { options = { host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api port: port, path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api headers: { Cookie: cookie } }; } else { options = { host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api port: port, path: url.parse(file_url).path // eslint-disable-line node/no-deprecated-api }; } http.get(options, function (res) { var fsize = res.headers["content-length"]; var cookies = null; if (typeof res.headers["set-cookie"] != "undefined") { cookies = res.headers["set-cookie"]; } res .on("data", function (data) { if (fileBuffer == null) fileBuffer = data; else fileBuffer += data; }) .on("end", function () { if (typeof callback === "function") { // Call it, since we have confirmed it is callable callback(fileBuffer, flag, cookies); } }) .on("error", function () {}); }); } function callsignResult(buffer, flag) { var rawData = JSON.parse(buffer); r_currentUSState = flag; g_currentUSCallsigns = Object(); for (var key in rawData.c) g_currentUSCallsigns[rawData.c[key]] = true; window.opener.goProcessRoster(); } function stateChangedValue(what) { if (r_currentUSState != stateSelect.value && stateSelect.value != "") { r_currentUSState = stateSelect.value; if (window.opener.g_mapSettings.offlineMode == false) { var callState = r_currentUSState.replace("CN-", ""); getBuffer( "http://app.gridtracker.org/callsigns/" + callState + ".callsigns.json", callsignResult, r_currentUSState, "http", 80 ); } else { window.opener.goProcessRoster(); r_currentUSState = ""; g_currentUSCallsigns = null; stateSelect.value = ""; return; } } if (stateSelect.value == "") { r_currentUSState = ""; g_currentUSCallsigns = null; window.opener.goProcessRoster(); } } function DXCCsChangedValue(what) { r_currentDXCCs = DXCCsSelect.value; window.opener.goProcessRoster(); } function initDXCCSelector() { var items = Object.keys(window.opener.g_dxccToAltName).sort(function (a, b) { return window.opener.g_dxccToAltName[a].localeCompare( window.opener.g_dxccToAltName[b] ); }); var newSelect = document.getElementById("DXCCsSelect"); for (var i in items) { var key = items[i]; if ( window.opener.g_worldGeoData[window.opener.g_dxccToGeoData[key]].geo != "deleted" ) { var option = document.createElement("option"); option.value = key; option.text = window.opener.g_dxccToAltName[key] + " (" + window.opener.g_worldGeoData[window.opener.g_dxccToGeoData[key]].pp + ")"; newSelect.appendChild(option); } } newSelect.oninput = DXCCsChangedValue; } function manifestResult(buffer, flag) { r_callsignManifest = JSON.parse(buffer); var newSelect = document.getElementById("stateSelect"); for (var key in r_callsignManifest.cnt) { var option = document.createElement("option"); if (window.opener.g_enums[key]) { option.value = key; option.text = window.opener.g_enums[key]; } else { option.value = "CN-" + key; option.text = window.opener.g_enums["CN-" + key]; } newSelect.appendChild(option); } newSelect.oninput = stateChangedValue; } function receiveMessage(event) {} var g_tracker = {}; function updateWorked() { g_worked = window.opener.g_tracker.worked; g_confirmed = window.opener.g_tracker.confirmed; g_modes = window.opener.g_modes; g_modes_phone = window.opener.g_modes_phone; g_tracker = window.opener.g_tracker; processAllAwardTrackers(); } function deleteCallsignIgnore(key) { delete g_blockedCalls[key]; storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function deleteDxccIgnore(key) { delete g_blockedDxcc[key]; storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function deleteCQIgnore(key) { delete g_blockedCQ[key]; storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function clearAllCallsignIgnores() { g_blockedCalls = Object(); storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function clearAllDxccIgnores() { g_blockedDxcc = Object(); storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function clearAllCQIgnores() { g_blockedCQ = Object(); storeBlocks(); openIgnoreEdit(); window.opener.goProcessRoster(); } function closeEditIgnores() { MainCallRoster.style.display = "block"; editView.style.display = "none"; } function openIgnoreEdit() { MainCallRoster.style.display = "none"; editView.style.display = "inline-block"; var worker = ""; var clearString = "