diff --git a/package.nw/gt_roster.html b/package.nw/gt_roster.html index d1129bc8..d75bddfa 100644 --- a/package.nw/gt_roster.html +++ b/package.nw/gt_roster.html @@ -189,6 +189,9 @@
+
+ +
diff --git a/package.nw/lib/gt.js b/package.nw/lib/gt.js index 5c148ae5..39e9a258 100644 --- a/package.nw/lib/gt.js +++ b/package.nw/lib/gt.js @@ -1065,6 +1065,10 @@ function addDeDx( finalSatName = "" ) { + var currentYear = new Date().getFullYear(); + var qsoDate = new Date(1970, 0, 1); qsoDate.setSeconds(finalTime); + var isCurrentYear = (qsoDate.getFullYear() == currentYear); + var callsign = null; var rect = null; var worked = false; @@ -1262,6 +1266,10 @@ function addDeDx( g_tracker.worked.cqz[details.cqz + "dg"] = true; g_tracker.worked.cqz[details.cqz + band + "dg"] = true; } + if (isCurrentYear) + { + g_tracker.worked.cqz[`${details.cqz}-${currentYear}`] = true; + } } if (details.dxcc > 0) @@ -1276,6 +1284,10 @@ function addDeDx( g_tracker.worked.dxcc[sDXCC + "dg"] = true; g_tracker.worked.dxcc[sDXCC + band + "dg"] = true; } + if (isCurrentYear) + { + g_tracker.worked.dxcc[`${sDXCC}-${currentYear}`] = true; + } } if (details.px) diff --git a/package.nw/lib/roster.js b/package.nw/lib/roster.js index 5e6ed375..9d487442 100644 --- a/package.nw/lib/roster.js +++ b/package.nw/lib/roster.js @@ -98,6 +98,7 @@ var g_defaultSettings = { huntDXCC: true, huntCQz: false, huntITUz: false, + huntMarathon: false, huntState: false, huntCounty: false, huntCont: false, diff --git a/package.nw/lib/roster/processRosterHunting.js b/package.nw/lib/roster/processRosterHunting.js index 22ac9757..15ee2c7b 100644 --- a/package.nw/lib/roster/processRosterHunting.js +++ b/package.nw/lib/roster/processRosterHunting.js @@ -13,6 +13,9 @@ function processRosterHunting(callRoster, rosterSettings) let layeredUnconf = "background-clip:padding-box;box-shadow: 0 0 4px 2px inset "; let layeredUnconfAlpha = "AA"; + const currentYear = new Date().getFullYear(); + const currentYearSuffix = `’${currentYear - 2000}`; + // TODO: Hunting results might be used to filter, based on the "Callsigns: Only Wanted" option, // so maybe we can move this loop first, and add a check to the filtering loop? @@ -335,6 +338,27 @@ function processRosterHunting(callRoster, rosterSettings) } } } + + callObj.dxccSuffix = null + if (huntMarathon.checked && callObj.hunting.dxcc != "hunted" && callObj.hunting.dxcc != "checked") + { + callObj.reason.push("dxcc-marathon"); + + let hash = `${callObj.dxcc}-${currentYear}`; + if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.dxcc)) + { + if (!rosterSettings.workedIndex || !(hash in rosterSettings.workedIndex.dxcc)) + { + callObj.dxccSuffix = currentYearSuffix; + + callObj.hunting.dxccMarathon = "hunted"; + if (!callObj.hunting.dxcc) + { + dxccConf = `${unconf}${dxcc}${layeredAlpha};`; + } + } + } + } } // Hunting for US States @@ -513,17 +537,23 @@ function processRosterHunting(callRoster, rosterSettings) if (huntCQz.checked == true) { let huntTotal = callObj.cqza.length; - let huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0; + let huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0, marathonFound = 0; for (index in callObj.cqza) { let hash = callObj.cqza[index] + workHashSuffix; - let layeredHash = rosterSettings.layeredMode && (callObj.cqza[index] + layeredHashSuffix) + let layeredHash = rosterSettings.layeredMode && (callObj.cqza[index] + layeredHashSuffix); + let marathonHash = huntMarathon.checked && `${callObj.cqza[index]}-${currentYear}`; if (rosterSettings.huntIndex && hash in rosterSettings.huntIndex.cqz) huntFound++; if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.cqz) layeredFound++; if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.cqz) workedFound++; if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.cqz) layeredWorkedFound++; + if (marathonHash) + { + if (rosterSettings.huntIndex && marathonHash in rosterSettings.huntIndex.cqz) marathonFound++; + else if (rosterSettings.workedIndex && marathonHash in rosterSettings.workedIndex.cqz) marathonFound++; + } } if (huntFound != huntTotal) { @@ -566,6 +596,23 @@ function processRosterHunting(callRoster, rosterSettings) } } } + + callObj.cqzSuffix = null + if (huntMarathon.checked && callObj.hunting.cqz != "hunted" && callObj.hunting.cqz != "worked") + { + if (marathonFound != huntTotal) + { + callObj.reason.push("cqz-marathon"); + + callObj.cqzSuffix = currentYearSuffix; + + callObj.hunting.cqzMarathon = "hunted"; + if (!callObj.hunting.cqz) + { + cqzConf = `${unconf}${cqz}${layeredAlpha};`; + } + } + } } // Hunting for ITU Zones diff --git a/package.nw/lib/roster/rosterColumns.js b/package.nw/lib/roster/rosterColumns.js index 457ab686..9dc2b50b 100644 --- a/package.nw/lib/roster/rosterColumns.js +++ b/package.nw/lib/roster/rosterColumns.js @@ -117,9 +117,9 @@ const ROSTER_COLUMNS = { compare: (a, b) => window.opener.myDxccCompare(a.callObj, b.callObj), tableData: (callObj) => ({ title: window.opener.g_worldGeoData[window.opener.g_dxccToGeoData[callObj.dxcc]].pp, - name: `DXCC (${callObj.dxcc})`, + name: `${callObj.dxcc}`, rawAttrs: callObj.style.dxcc, - html: window.opener.g_dxccToAltName[callObj.dxcc] + html: [window.opener.g_dxccToAltName[callObj.dxcc], callObj.dxccSuffix].join(" ") }) }, @@ -216,7 +216,7 @@ const ROSTER_COLUMNS = { tableData: (callObj) => ({ name: "CQz", rawAttrs: callObj.style.cqz, - html: callObj.cqza.join(",") + html: [callObj.cqza.join(","), callObj.cqzSuffix].join(" ") }) }, @@ -397,12 +397,14 @@ const ROSTER_COLUMNS = { } } -WANTED_ORDER = ["call", "qrz", "cont", "dxcc", "cqz", "ituz", "state", "grid", "cnty", "wpx", "oams"]; +WANTED_ORDER = ["call", "qrz", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "grid", "cnty", "wpx", "oams"]; WANTED_LABELS = { cont: "Continent", cqz: "CQ Zone", ituz: "ITU Zone", dxcc: "DXCC", + dxccMarathon: "Marathon DXCC", + cqzMarathon: "Marathon CQ Zone", state: "State", grid: "Grid", cnty: "County", @@ -424,7 +426,8 @@ function wantedColumnParts(callObj, options) let wanted = callObj.hunting[field]; if (wanted == "calling") { parts.push("Calling"); } - else if (wanted == "hunted" && field == "qrz") { parts.push("QRZ"); } + // else if (wanted == "caller") { parts.push("Called"); } + else if (wanted == "hunted" && field == "qrz") { parts.push("Caller"); } else if (wanted == "hunted" && field == "oams") { parts.push("OAMS User"); } else if (wanted == "hunted") { parts.push(`${options.html ? "" : ""}New ${WANTED_LABELS[field]}${options.html ? "" : ""}`); } else if (wanted == "worked") { parts.push(`Worked ${WANTED_LABELS[field]}`); } @@ -433,7 +436,7 @@ function wantedColumnParts(callObj, options) else if (wanted == "worked-and-mixed") { parts.push(`Worked ${callObj.band} ${WANTED_LABELS[field]}`); } }) - if (parts[0] == "Calling" && parts[1] == "Calling") + if (parts[0] == "Calling" && parts[1] == "Caller") { parts.shift(); parts.shift(); parts.unshift(`${options.html ? "" : ""}Working${options.html ? "" : ""}`);