kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Porównaj commity
36 Commity
v1.23.1217
...
master
Autor | SHA1 | Data |
---|---|---|
T Loomis | c66d2f2cf0 | |
Stephen Loomis | 7742a4cd20 | |
T Loomis | 7e9f27d68d | |
Stephen Loomis | 706458e88d | |
T Loomis | 1ea7c147e9 | |
Stephen Loomis | 96b70515f7 | |
Stephen Loomis | d34514e3b4 | |
Stephen Loomis | 5405e76126 | |
Stephen Loomis | d5798169a2 | |
Stephen Loomis | 2ef8df9e3f | |
Stephen Loomis | 17b070e976 | |
Stephen Loomis | ae594aeb48 | |
Stephen Loomis | 1485b7c3ef | |
Stephen Loomis | 8edb0c32bc | |
Stephen Loomis | eac7cdfcec | |
Stephen Loomis | 56cea00ae7 | |
Stephen Loomis | 5dc211127e | |
Tag Loomis | dfb51a8e85 | |
Tag Loomis | 2d3302bb20 | |
Tag Loomis | 02eac05181 | |
Tag Loomis | 90847ef94f | |
Tag Loomis | 8b9c7b1efc | |
T Loomis | 9014976472 | |
Christian Bayer | a53d37ac3f | |
T Loomis | 0e76e5aa58 | |
Christian Bayer | bdbf5e8c7b | |
T Loomis | 9fef97efc8 | |
Christian Bayer | 0031837190 | |
Tag Loomis | e56be5bcbd | |
Tag Loomis | 5469779198 | |
T Loomis | 134310fcee | |
Tag Loomis | 29ea9804fc | |
T Loomis | dba0444215 | |
T Loomis | e5dace4b1b | |
T Loomis | e318242e7a | |
Tag Loomis | 3a38027331 |
|
@ -2,7 +2,7 @@
|
|||
# see https://docs.gitlab.com/ee/ci/yaml/README.html for all available options
|
||||
|
||||
variables:
|
||||
DEFAULT_IMAGE: registry.gitlab.com/gridtracker.org/gtbuilder:v1-3
|
||||
DEFAULT_IMAGE: registry.gitlab.com/gridtracker.org/gtbuilder:v1-6
|
||||
APT_CACHE_DIR: $CI_PROJECT_DIR/.cache/apt
|
||||
NPM_CONFIG_CACHE: $CI_PROJECT_DIR/.cache/npm
|
||||
|
||||
|
|
4
LICENSE
4
LICENSE
|
@ -1,7 +1,7 @@
|
|||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2018-2023 Stephen Loomis
|
||||
Copyright (c) 2020-2023 GridTricker.org
|
||||
Copyright (c) 2018-2024 Stephen Loomis
|
||||
Copyright (c) 2020-2024 GridTricker.org
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -1,19 +1,59 @@
|
|||
|
||||
gridtracker (1.24.0512) unstable; urgency=low
|
||||
- System: Fixed bug in QSO unique hash algorithm
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 May 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0504) unstable; urgency=low
|
||||
- System: BIGCTY Update from April 29th (3D2CCC etc)
|
||||
- Logging: Threaded log loading and parsing > 500,000 QSOs now supported in real-time
|
||||
- Logging: Manual log loads automatically added to startup
|
||||
- System: US database refactor
|
||||
- Call Roster: Only US states and Canadian provinces recognized
|
||||
- Award Tracker: Added RAC: Worked All North America
|
||||
- Award Tracker: Added CQ Magazine: WAZ, US-CA, WPX
|
||||
- Control Panel: Re-ordered buttons based on online/offline mode
|
||||
- Control Panel: Moved 'Award Layer' button to 'Map View Filters > Award' drop-down list
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 04 May 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0104) unstable; urgency=high
|
||||
- System - fixed database creation error on new installs
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 04 Jan 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0103) unstable; urgency=low
|
||||
- Windows - NSIS installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 03 Jan 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1226) unstable; urgency=low
|
||||
- System - Improved Primary Administrative Area (State) detection
|
||||
- System - Added Canadian and Australian callsign databases
|
||||
- Map - Added - Worked All Canadian Provinces - award layer (Key 9)
|
||||
- POTA - Map marker updated when park worked
|
||||
- Call Roster - Properly show POTA worked status
|
||||
- Logbook - Filter QSO by grid - Working Grid(s)
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 26 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1217) unstable; urgency=low
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
- System - QSL location authority selector added in Settings > Logbook
|
||||
- Logbook Viewer - QSL sources added
|
||||
- Call Roster - Added Grid to Watcher and Ignores
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
- Logging - DX Keeper grid bug workaround
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
- System - QSL location authority selector added in Settings > Logbook
|
||||
- Logbook Viewer - QSL sources added
|
||||
- Call Roster - Added Grid to Watcher and Ignores
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
- Logging - DX Keeper grid bug workaround
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1207) unstable; urgency=high
|
||||
- BIGCTY - Update from December 5th
|
||||
- System - LoTW, eQSL and OQRS membership columns icon updated
|
||||
- System - Fixed major bug in how confirmation (QSL) records were handled
|
||||
- Call Roster - Returned non-slider based exceptions to the exceptions control area
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 07 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1202) unstable; urgency=low
|
||||
- BIGCTY - Update from November 29th
|
||||
- System - Returned LoTW, eQSL and OQRS membership columns to log entries
|
||||
|
@ -28,6 +68,7 @@ gridtracker (1.23.1202) unstable; urgency=low
|
|||
- New Exceptions Settings (Ctrl-E)
|
||||
- New Ignores Editor / Viewer (Ctrl-I)
|
||||
- New Columns Editor (Ctrl-C)
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 02 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1112) unstable; urgency=low
|
||||
|
@ -46,16 +87,16 @@ gridtracker (1.23.1112) unstable; urgency=low
|
|||
- Logging - Descriptive error if QRZ.com logging failure
|
||||
- Logbook Viewer - Regex enabled callsign searching
|
||||
- Settings - Logbook - New "Logbook Items Per Page" slider
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 Nov 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 Nov 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1019) unstable; urgency=low
|
||||
- HTTP - Removed timeouts on transactions affecting log downloading and uploading
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 19 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 19 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1015) unstable; urgency=low
|
||||
- ADIF – Fixed record loading failure for PSK-Reporter if FREQ present
|
||||
- WSPR – Fixed decodes not appearing
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 15 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 15 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1014) unstable; urgency=low
|
||||
- Call Roster - Fixed "All Traffic/Only Wanted" filtering
|
||||
|
@ -67,12 +108,12 @@ gridtracker (1.23.1014) unstable; urgency=low
|
|||
- System – Swaziland renamed to Eswatini
|
||||
- Logging – HamZone.cn service is now HamCQ.cn
|
||||
- Maps – Toner (online), Terrain, Watercolor and Geography Class no longer public access
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 14 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 14 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0402) unstable; urgency=low
|
||||
- Roster - fixed Hunting mode not saving
|
||||
- Packager - fixed Arm distribution
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 02 Apr 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 02 Apr 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0328) unstable; urgency=low
|
||||
- Language - added German/Deutsch
|
||||
|
@ -89,7 +130,7 @@ gridtracker (1.23.0328) unstable; urgency=low
|
|||
- Mac – “Full Stop” no longer spoken at startup
|
||||
- Satellite – framework started for satellite tracking
|
||||
- BIGCTY – update from March 19th
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 28 Mar 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 28 Mar 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0206) unstable; urgency=low
|
||||
- Bugfix for Turkey zone 1 decodes
|
||||
|
@ -161,16 +202,14 @@ gridtracker (1.22.1016) unstable; urgency=low
|
|||
- New 'No Unknown DXCC' exception in call roster
|
||||
- Award tracker now shows wanted options for highlighting
|
||||
- Small performance improvements and installation size reduction
|
||||
|
||||
-- Matthew Chambers <nr0q@gridtracker.org> Sun, 16 Oct 2022 19:55:00 -0000
|
||||
|
||||
gridtracker (1.22.1010) unstable; urgency=low
|
||||
- Fix issue with map selection not saving/restoring
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 09 Oct 2022 12:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1009) unstable; urgency=low
|
||||
- Fix issue loading logs and generating scores tab
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 08 Oct 2022 12:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1008) unstable; urgency=low
|
||||
|
|
|
@ -4,9 +4,9 @@ Upstream-Contact: GridTracker Team <contact@gridtracker.org>
|
|||
Source: https://gitlab.com/gridtracker.org/gridtracker
|
||||
|
||||
Files: *
|
||||
Copyright: Copyright (c) 2018-2023 Stephen Loomis, Copyright (c) 2020-2023 GridTracker.org
|
||||
Copyright: Copyright (c) 2018-2024 Stephen Loomis, Copyright (c) 2020-2024 GridTracker.org
|
||||
License: BSD-3-clause
|
||||
Copyright (c) 2020-2023 GridTricker.org
|
||||
Copyright (c) 2020-2024 GridTricker.org
|
||||
All rights reserved.
|
||||
.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -42,7 +42,7 @@ Run gridtracker, no arguments needed.
|
|||
|
||||
.SH COPYRIGHT
|
||||
.PP
|
||||
Copyright (c) 2020-2023 GridTracker.org. All rights reserved.
|
||||
Copyright (c) 2020-2024 GridTracker.org. All rights reserved.
|
||||
Released under BSD 3-Clause License
|
||||
https://gridtracker.org
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Name: {{{ git_name name=gridtracker }}}
|
||||
Summary: GridTracker: An Amateur Radio Companion
|
||||
Version: 1.23.1217
|
||||
Version: 1.24.0512
|
||||
Release: 1%{?dist}
|
||||
BuildArch: noarch
|
||||
Source0: {{{ git_dir_pack }}}
|
||||
|
@ -40,6 +40,32 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
|
|||
%license %{_docdir}/%{name}/
|
||||
|
||||
%changelog
|
||||
* Sun May 12 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0512-1
|
||||
- System: Fixed bug in QSO unique hash algorithm
|
||||
* Sat May 04 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0504-1
|
||||
- System: BIGCTY Update from April 29th (3D2CCC etc)
|
||||
- Logging: Threaded log loading and parsing > 500,000 QSOs now supported in real-time
|
||||
- Logging: Manual log loads automatically added to startup
|
||||
- System: US database refactor
|
||||
- Call Roster: Only US states and Canadian provinces recognized
|
||||
- Award Tracker: Added RAC: Worked All North America
|
||||
- Award Tracker: Added CQ Magazine: WAZ, US-CA, WPX
|
||||
- Control Panel: Re-ordered buttons based on online/offline mode
|
||||
- Control Panel: Moved 'Award Layer' button to 'Map View Filters > Award' drop-down list
|
||||
* Thu Jan 04 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0104-1
|
||||
- System - fixed database creation error on new installs
|
||||
* Wed Jan 03 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0103-1
|
||||
- Windows - NSIS Installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
* Tue Dec 26 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1226-1
|
||||
- System - Improved Primary Administrative Area (State) detection
|
||||
- System - Added Canadian and Australian callsign databases
|
||||
- Map - Added 'Worked All Canadian Provinces' award layer (Key 9)
|
||||
- POTA - Map marker updated when park worked
|
||||
- Call Roster - Properly show POTA worked status
|
||||
- Logbook - Filter QSO by grid “Working Grid(s)”
|
||||
* Sun Dec 17 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1217-1
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<!--
|
||||
GridTracker Copyright © 2018-2023 Stephen Loomis
|
||||
GridTracker Copyright © 2020-2023 GridTracker.org
|
||||
GridTracker Copyright © 2018-2024 Stephen Loomis
|
||||
GridTracker Copyright © 2020-2024 GridTracker.org
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -39,6 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<script src="./lib/defaults.js" type="text/javascript"></script>
|
||||
<script src="./lib/protos.js" type="text/javascript"></script>
|
||||
<script src="./lib/screens.js" type="text/javascript"></script>
|
||||
<script src="./lib/gtCommon.js" type="text/javascript"></script>
|
||||
<script src="./lib/alerts.js" type="text/javascript"></script>
|
||||
<script src="./lib/third-party.js" type="text/javascript"></script>
|
||||
<script src="./lib/grid-math.js" type="text/javascript"></script>
|
||||
|
@ -64,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<script src="./lib/gt.js" type="text/javascript"></script>
|
||||
</head>
|
||||
|
||||
<body id="mainBody" onload="initialDatabases();">
|
||||
<body id="mainBody" onload="startupApplication();">
|
||||
<div id="startupDiv">
|
||||
<div class="fill">
|
||||
<img src="gridview.png" alt="" />
|
||||
|
@ -334,7 +335,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
align="right">
|
||||
QSO
|
||||
</td>
|
||||
<td style="cursor: pointer" class="roundBorderValue" id="qsoCountStyle"
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations"
|
||||
align="center">
|
||||
<div id="qsoCount">0</div>
|
||||
|
@ -354,7 +355,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
title="Show Confirmed List" align="right">
|
||||
QSL
|
||||
</td>
|
||||
<td style="cursor: pointer" class="roundBorderValue" id="qslCountStyle"
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
|
||||
title="Show Confirmed List" align="center">
|
||||
<div id="qslCount">0</div>
|
||||
|
@ -369,9 +370,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</div>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
<div data-i18n="quickLoad.clearLog.label" style="min-width: 58px" id="clearOrLoadButton" class="button"
|
||||
<div data-i18n="callsigns.processing" style="display:none; padding-left:2px;padding-right:2px;" id="busyDiv" class="busyDiv">...</div>
|
||||
<div data-i18n="quickLoad.clearLog.label" id="clearOrLoadButton" class="button"
|
||||
onclick="clearOrLoadQSOs();updateCountStats();"
|
||||
title="Clear or Reload Log Data (does not delete files)">
|
||||
title="Clear or Reload Log Data">
|
||||
Clear Log
|
||||
</div>
|
||||
</td>
|
||||
|
@ -387,9 +389,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</tr>
|
||||
|
||||
<tr title="Select Band (Auto tracks WSJT-X)">
|
||||
<td data-i18n="mapFilter.band.label">
|
||||
<font color="lightgreen">Band</font>
|
||||
</td>
|
||||
<td data-i18n="mapFilter.band.label">Band</td>
|
||||
<td>
|
||||
<select id="gtBandFilter" onkeypress="return false;" onchange="gtBandFilterChanged(this);">
|
||||
<option data-i18n="mapFilter.band.Auto" value="auto">Auto</option>
|
||||
|
@ -431,9 +431,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</td>
|
||||
</tr>
|
||||
<tr title="Select Mode">
|
||||
<td data-i18n="mapFilter.mode.label">
|
||||
<font color="orange">Mode</font>
|
||||
</td>
|
||||
<td data-i18n="mapFilter.mode.label">Mode</td>
|
||||
<td>
|
||||
<select id="gtModeFilter" onkeypress="return false;" onchange="gtModeFilterChanged(this);">
|
||||
<option data-i18n="mapFilter.mode.Auto" value="auto">Auto</option>
|
||||
|
@ -445,9 +443,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</td>
|
||||
</tr>
|
||||
<tr title="Select Propagation Mode">
|
||||
<td data-i18n="mapFilter.prop.label">
|
||||
<font color="yellow">Prop</font>
|
||||
</td>
|
||||
<td data-i18n="mapFilter.prop.label">Prop</td>
|
||||
<td>
|
||||
<select id="gtPropFilter" onkeypress="return false;" onchange="gtPropFilterChanged(this);">
|
||||
<option data-i18n="mapFilter.prop.Mixed" value="mixed">Mixed</option>
|
||||
|
@ -476,9 +472,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="mapFilter.data.label">
|
||||
<font color="cyan">Data</font>
|
||||
</td>
|
||||
<td data-i18n="mapFilter.data.label">Data</td>
|
||||
<td>
|
||||
<div data-i18n="mapFilter.data.LogLive" id="gridViewButton" onclick="cycleGridView()" class="button"
|
||||
title="Cycle Grid View" style="
|
||||
|
@ -493,46 +487,51 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="roster.award.Award">Award</td>
|
||||
<td>
|
||||
<select id="gtTrophyLayer" onkeypress="return false;" onchange="gtTrophyLayerChanged(this);">
|
||||
<option data-i18n="settings.OAMS.message.newAlert.none" value="0">None</option>
|
||||
<option value="1">CQ</option>
|
||||
<option value="2">ITU</option>
|
||||
<option value="3">WAC</option>
|
||||
<option value="4">WAS</option>
|
||||
<option value="5">DXCC</option>
|
||||
<option value="6">USC</option>
|
||||
<option value="7">US48</option>
|
||||
<option value="8">WACP</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="buttonsDiv" style="margin-left: 0px; white-space: normal">
|
||||
<div id="callRosterButton" class="iconButton" style="padding: 0px" onclick="openCallRosterWindow();"
|
||||
title="Open Call Roster">
|
||||
<img src="./img/roster-button.png" class="buttonImgWide" />
|
||||
</div>
|
||||
<div id="pushPinButton" onclick="togglePushPinMode();" class="iconButton" title="Toggle Push-Pin Mode">
|
||||
<img id="pinImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="lookupButton" onclick="openLookupWindow(true)" class="iconButton" title="Open Lookup Window">
|
||||
<img src="./img/lookup.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="statsDiv" onclick="showRootInfoBox();" class="iconButton" title="Show Stats">
|
||||
<img src="./img/stats-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="modeModeDiv" onclick="toggleOffline()" class="iconButton" title="Toggle Online/Offline Mode">
|
||||
<img id="offlineImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="earthShadow" onclick="toggleEarth()" class="iconButton" title="Toggle Grayline">
|
||||
<img id="earthImg" src="" class="buttonImg" />
|
||||
<div id="callRosterButton" class="iconButton" onclick="openCallRosterWindow();" title="Open Call Roster">
|
||||
<img src="./img/roster-icon.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="legendToggleDiv" onclick="toggleLegend()" class="iconButton" title="Toggle Map Legend">
|
||||
<img id="legendImg" src="./img/gt_key.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gtShareButton" onclick="toggleGtShareEnable();" class="iconButton"
|
||||
title="Share your On-Air Status with other GridTracker users">
|
||||
<img id="gtShareFlagImg" src="./img/share-off.png" class="buttonImg" />
|
||||
<div id="pushPinButton" onclick="togglePushPinMode();" class="iconButton" title="Toggle Push-Pin Mode">
|
||||
<img id="pinImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="helpButton" onclick="toggleHelp();" class="iconButton" title="Toggle Hotkey List">
|
||||
<img src="./img/help.png" class="buttonImg" />
|
||||
<div id="gridModeDiv" onclick="toggleGridMode()" class="iconButton" title="Toggle Maidenhead Width">
|
||||
<img id="modeImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="trophyButton" onclick="cycleTrophyOverlay();" class="iconButton" title="Cycle Award Overlays">
|
||||
<img id="trophyImg" src="./img/blank_trophy.png" class="buttonImg" />
|
||||
<div id="statsDiv" onclick="showRootInfoBox();" class="iconButton" title="Show Stats">
|
||||
<img src="./img/stats-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="earthShadow" onclick="toggleEarth()" class="iconButton" title="Toggle Grayline">
|
||||
<img id="earthImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="lunaButton" onclick="toggleMoon();" class="iconButton" title="Toggle Moon">
|
||||
<img id="lunaButonImg" src="./img/luna.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gridModeDiv" onclick="toggleGridMode()" class="iconButton" title="Toggle Maidenhead Width">
|
||||
<img id="modeImg" src="" class="buttonImg" />
|
||||
<!--div id="trophyButton" onclick="cycleTrophyOverlay();" class="iconButton" title="Cycle Award Overlays">
|
||||
<img id="trophyImg" src="./img/blank_trophy.png" class="buttonImg" />
|
||||
</div-->
|
||||
<div id="helpButton" onclick="toggleHelp();" class="iconButton" title="Toggle Hotkey List">
|
||||
<img src="./img/help.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="alterMuteDiv" onclick="toggleAlertMute()" class="iconButton" title="Toggle Audio Mute">
|
||||
<img id="alertMuteImg" src="" class="buttonImg" />
|
||||
|
@ -543,27 +542,34 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<div id="adifLoadDiv" onclick="adifLoadDialog()" class="iconButton" title="Load ADIF Log">
|
||||
<img src="./img/adif.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonAdifCheckBoxDiv" onclick="startupAdifLoadFunction()" class="iconButton"
|
||||
title="Reload Local ADIF Files">
|
||||
<img src="./img/log_local.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
|
||||
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
|
||||
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="modeModeDiv" onclick="toggleOffline()" class="iconButton" title="Toggle Online/Offline Mode">
|
||||
<img id="offlineImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
<div id="radarButton" onclick="toggleNexrad()" class="iconButton" title="Toggle US Nexrad">
|
||||
<img id="radarImg" src="./img/radar-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="conditionsButton" onclick="showConditionsBox();" class="iconButton" title="View Current Conditions">
|
||||
<img src="./img/conditions.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonSpotsBoxDiv" onclick="cycleSpotsView()" class="iconButton" title="View Spot Reports">
|
||||
<img id="spotsButtonImg" src="./img/spots.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="donateButton" onclick="gotoDonate();" class="iconButton" title="Donate with PayPal">
|
||||
<img style="-webkit-filter: brightness(50%); filter: brightness(50%)" src="./img/donate.png"
|
||||
class="buttonImg" />
|
||||
</div>
|
||||
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
|
||||
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="radarButton" onclick="toggleNexrad()" class="iconButton" title="Toggle US Nexrad">
|
||||
<img id="radarImg" src="./img/radar-button.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
|
||||
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonSpotsBoxDiv" onClick="cycleSpotsView();" class="iconButton" title="View Spot Reports">
|
||||
<img id="spotsButtonImg" src="./img/spots.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonPsk24CheckBoxDiv" onclick="grabPsk24()" class="iconButton" title="Your PSK 24hour report">
|
||||
<img id="pskImg" src="./img/psk_24_32.png" class="buttonImg" />
|
||||
<div id="lookupButton" onclick="openLookupWindow(true)" class="iconButton" title="Open Lookup Window">
|
||||
<img src="./img/lookup.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonQRZCheckBoxDiv" onclick="if ( ValidateQrzApi(qrzApiKey ) ) grabQrzComLog()" class="iconButton"
|
||||
title="Download log from QRZ.com">
|
||||
|
@ -579,13 +585,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
title="Download log from ClubLog">
|
||||
<img id="ClubLogImg" src="./img/log_club.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonAdifCheckBoxDiv" onclick="startupAdifLoadFunction()" class="iconButton"
|
||||
title="Reload Local ADIF Files">
|
||||
<img src="./img/log_local.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="potaButton" onClick="togglePotaMap();" class="iconButton" title="Parks On The Air">
|
||||
<img id="potaImg" src="./img/pota.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gtShareButton" onclick="toggleGtShareEnable();" class="iconButton"
|
||||
title="Share your On-Air Status with other GridTracker users">
|
||||
<img id="gtShareFlagImg" src="./img/share-off.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="gtFlagButton" onclick="toggleGtMap();" class="iconButton" title="Toggle View GridTracker Users">
|
||||
<img id="gtFlagImg" src="" class="buttonImg" />
|
||||
</div>
|
||||
|
@ -715,7 +721,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<div id="printHotKeyDiv" style="border: 1px solid cyan; color: white; text-align: auto">
|
||||
<table align="center" class="darkTable">
|
||||
<tr>
|
||||
<th colspan="6">Hot Key List (v1.20.0825+)</th>
|
||||
<th colspan="6">Hot Key List (v1.23.1220+)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
|
@ -791,7 +797,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</tr>
|
||||
<tr>
|
||||
<td>9</td>
|
||||
<td align="left">Toggle Timezone Overlay</td>
|
||||
<td align="left">Show CA Provinces Award Layer</td>
|
||||
<td></td>
|
||||
<td>X</td>
|
||||
<td align="left">Toggle Map Position Info</td>
|
||||
|
@ -870,8 +876,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td>Shift-Key</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td align="left"></td>
|
||||
<td>H</td>
|
||||
<td align="left">Toggle Timezone Overlay</td>
|
||||
<td></td>
|
||||
<td>F8</td>
|
||||
<td align="left">Recall Map Position 4</td>
|
||||
|
@ -1374,13 +1380,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<th data-i18n="settings.lookup.Count.header">Count</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.lookup.db.ULS">United States ULS</td>
|
||||
<td data-i18n="settings.lookup.db.ULS">US Callsigns</td>
|
||||
<td>
|
||||
<input type="checkbox" id="ulsUseEnable" onclick="ulsValuesChanged();" />
|
||||
</td>
|
||||
<td id="ulsUpdatedTd">Never</td>
|
||||
<td id="ulsCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Canada Callsigns</td>
|
||||
<td>
|
||||
<input type="checkbox" id="cacUseEnable" onclick="cacValuesChanged();" />
|
||||
</td>
|
||||
<td id="cacUpdatedTd">Never</td>
|
||||
<td id="cacCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.lookup.db.LoTW">Logbook of The World</td>
|
||||
<td>
|
||||
|
@ -1552,7 +1566,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
title="Filter Logbook QSOs to include these Callsigns only (comma separated)">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td data-i18n="settings.logbook.callsigns.label"><b>Working Callsign(s)</b></td>
|
||||
<td data-i18n="settings.logbook.callsigns.label">Working Callsign(s)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -1569,8 +1583,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
oninput="if ( ValidateCallsigns(this) ) workingCallsignsChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="qsoCallsignsFound"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="padding: 5px" class="mapItem"
|
||||
title="Filter Logbook QSOs to include these Grids only (comma separated)">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>Working Grid(s)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="workingGridEnable">Enable?</label>
|
||||
<input title="Enable Filtering" type="checkbox" id="workingGridEnable"
|
||||
onclick="workingGridEnableChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="workingGridsTd">
|
||||
<label for="workingGridsValue">Grid(s)</label>
|
||||
<input id="workingGridsValue" type="text" class="inputTextValue" size="15"
|
||||
onkeypress="return validGridKeys(event.charCode);"
|
||||
oninput="if ( ValidateGrids(this) ) workingGridsChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="qsoGridsFound"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div style="padding: 5px" class="mapItem" title="Filter Logbook QSOs from before this Date">
|
||||
<table align="center">
|
||||
<tr>
|
||||
|
@ -1624,6 +1668,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<option value="C">Clublog</option>
|
||||
<option value="O">Other</option>
|
||||
<option value="0">Last Loaded</option>
|
||||
<option value="1">None</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -2189,23 +2234,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr id="pskTr">
|
||||
<td data-i18n="settings.logging.PSKReporter.source">PSK-Reporter</td>
|
||||
<td>
|
||||
<input type="checkbox" checked="false" id="buttonPsk24CheckBox"
|
||||
onclick="adifMenuCheckBoxChanged(this);" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" checked="false" id="loadPsk24CheckBox"
|
||||
onclick="adifStartupCheckBoxChanged(this);" />
|
||||
</td>
|
||||
<td></td>
|
||||
<td>
|
||||
<div data-i18n="settings.logging.PSKReporter.details" id="pskDaysDiv">24 Hour History</div>
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.logging.QRZcom.source">QRZ.com</td>
|
||||
<td>
|
||||
|
@ -3197,7 +3225,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<a href="#" style="cursor: pointer"
|
||||
onclick="require('nw.gui').Shell.openExternal('https://gridtracker.org/');">GridTracker.org!</a>
|
||||
</p>
|
||||
<p>Copyright © 2023 GridTracker.org</p>
|
||||
<p>Copyright © 2024 GridTracker.org</p>
|
||||
<img src="./gridview.png" /> <br />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -10373,5 +10373,277 @@
|
|||
"qsl_req": "confirmed",
|
||||
"sponsor": "QRZ.com",
|
||||
"website": "https://www.qrz.com/"
|
||||
},
|
||||
"RAC": {
|
||||
"awards": {
|
||||
"Canadaward": {
|
||||
"name": "Canadaward - Worked all Canadian Provinces/Territories",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
13
|
||||
],
|
||||
"dxcc": [
|
||||
1
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Mixed",
|
||||
"Digital",
|
||||
"Phone"
|
||||
],
|
||||
"type": "states"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Canadaward"
|
||||
},
|
||||
"WARAC": {
|
||||
"name": "WARAC - Worked All RAC",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"call": [
|
||||
"VA1RAC",
|
||||
"VA2RAC",
|
||||
"VA3RAC",
|
||||
"VA4RAC",
|
||||
"VA5RAC",
|
||||
"VA6RAC",
|
||||
"VA7RAC",
|
||||
"VE1RAC",
|
||||
"VE3RAC",
|
||||
"VE4RAC",
|
||||
"VE5RAC",
|
||||
"VE6RAC",
|
||||
"VE7RAC",
|
||||
"VE8RAC",
|
||||
"VE9RAC",
|
||||
"VO1RAC",
|
||||
"VO2RAC",
|
||||
"VY0RAC",
|
||||
"VY1RAC",
|
||||
"VY2RAC",
|
||||
"VA3RHQ",
|
||||
"VE3RHQ"
|
||||
],
|
||||
"count": [
|
||||
10
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "call"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Worked All RAC Award"
|
||||
},
|
||||
"WANA": {
|
||||
"name": "WANA - Worked All North America",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"cont": "NA",
|
||||
"count": [
|
||||
30,
|
||||
40,
|
||||
50
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "dxcc"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Worked All North America Award"
|
||||
}
|
||||
},
|
||||
"compiledBy": "WA4YA",
|
||||
"mixed": [
|
||||
"160m",
|
||||
"80m",
|
||||
"40m",
|
||||
"30m",
|
||||
"20m",
|
||||
"17m",
|
||||
"15m",
|
||||
"12m",
|
||||
"10m",
|
||||
"6m",
|
||||
"2m",
|
||||
"1.25m",
|
||||
"70cm",
|
||||
"23cm"
|
||||
],
|
||||
"qsl_req": "confirmed",
|
||||
"sponsor": "Radio Amateurs of/du Canada",
|
||||
"website": "https://www.rac.ca/"
|
||||
},
|
||||
"CQ": {
|
||||
"awards": {
|
||||
"WAZ": {
|
||||
"name": "WAZ - Worked All CQ Zones",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
40
|
||||
],
|
||||
"endorse": [
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "cqz"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "Worked All CQ Zones"
|
||||
},
|
||||
"USACA": {
|
||||
"name": "USA-CA - United States Counties Award",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
500,
|
||||
1000,
|
||||
2000,
|
||||
3181
|
||||
],
|
||||
"dxcc": [
|
||||
6,
|
||||
110,
|
||||
291
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "cnty"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "USA-CA"
|
||||
},
|
||||
"WPX": {
|
||||
"name": "WPX - Worked Prefixes",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
500,
|
||||
1000,
|
||||
1500,
|
||||
2000,
|
||||
3500,
|
||||
3000,
|
||||
3500,
|
||||
4000,
|
||||
4500,
|
||||
5000
|
||||
],
|
||||
"endorse": [
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"FT8"
|
||||
],
|
||||
"type": "px"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "Worked Prefixes"
|
||||
}
|
||||
},
|
||||
"compiledBy": "WA4YA",
|
||||
"mixed": [
|
||||
"160m",
|
||||
"80m",
|
||||
"40m",
|
||||
"30m",
|
||||
"20m",
|
||||
"17m",
|
||||
"15m",
|
||||
"12m",
|
||||
"10m",
|
||||
"6m",
|
||||
"2m",
|
||||
"1.25m",
|
||||
"70cm",
|
||||
"23cm"
|
||||
],
|
||||
"qsl_req": "confirmed",
|
||||
"sponsor": "CQ Magazine",
|
||||
"website": "https://cq-amateur-radio.com"
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -144,5 +144,17 @@
|
|||
"minZoom": 0,
|
||||
"maxZoom": 4,
|
||||
"offline": true
|
||||
},
|
||||
"GoogleMap by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
},
|
||||
"GoogleMap Satellite by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=s,m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
}
|
||||
}
|
||||
|
|
Plik diff jest za duży
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -72,12 +72,8 @@
|
|||
<button id="itubox" class="infoTablinks" onclick="openInfoTab(event, 'ituzoneBoxDiv', 'showITUzoneBox')">
|
||||
ITU Zones
|
||||
</button>
|
||||
<button
|
||||
id="waswacbox"
|
||||
class="infoTablinks"
|
||||
onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')"
|
||||
>
|
||||
WAC / WAS
|
||||
<button id="waswacbox" class="infoTablinks" onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')">
|
||||
WAC / WAS / WACP
|
||||
</button>
|
||||
<button id="wpxbox" class="infoTablinks" onclick="openInfoTab(event, 'wpxBoxDiv', 'showWPXBox')">WPX</button>
|
||||
<button id="calbox" class="infoTablinks" onclick="openInfoTab(event, 'callsignBoxDiv', 'showCallsignBox')">
|
||||
|
|
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
|
@ -183,14 +183,14 @@
|
|||
"settings.general.AppStatus.label": "應用軟件狀態",
|
||||
"settings.general.AppStatus.status": "WSJT-X或JTDX均未運行",
|
||||
"settings.general.UDP.Messages.label": "接收UDP數據",
|
||||
"settings.general.UDP.Multicast.label": "組播?",
|
||||
"settings.general.UDP.Multicast.label": "組播?",
|
||||
"settings.general.UDP.IP.label": "IP",
|
||||
"settings.general.UDP.Port.label": "埠號",
|
||||
"settings.general.Fwd.Messages.label1": "轉發UDP數據",
|
||||
"settings.general.Fwd.Messages.label2": "例如,另一台主機上的GridTracker",
|
||||
"settings.general.Fwd.IP.label": "IP地址",
|
||||
"settings.general.Fwd.Port.label": "埠號",
|
||||
"settings.general.Fwd.Enabled.label": "啟用?",
|
||||
"settings.general.Fwd.Enabled.label": "啟用?",
|
||||
"settings.general.CenterGrid.label": "所在網格",
|
||||
"settings.general.DistanceUnits.label": "距離單位",
|
||||
"settings.general.Distance.km": "公里",
|
||||
|
@ -223,7 +223,7 @@
|
|||
"settings.lookup.CallookFirst.label": "在使用其他服務之前優先使用Callook平台",
|
||||
"settings.lookup.CallookFirst.hover": "在使用其他服務之前使用Callook平台,因為免費Callook比免費QRZ.com可以獲取更多數據。",
|
||||
"settings.lookup.Databases.label": "全球呼號數據庫",
|
||||
"settings.lookup.Databases.header": "數據庫平台 (如果啟用代表您支持此平台的QSL)",
|
||||
"settings.lookup.Databases.header": "數據庫平台",
|
||||
"settings.lookup.Enabled.header": "啟用",
|
||||
"settings.lookup.LastDwnld.header": "最後下載",
|
||||
"settings.lookup.Count.header": "數量",
|
||||
|
@ -242,11 +242,11 @@
|
|||
"settings.audio.QSOLogEventFile.label": "通聯日誌記錄通知音頻",
|
||||
"settings.logbook.callsigns.hover": "通聯日誌以僅包含這些呼號的數據(逗號分隔)",
|
||||
"settings.logbook.callsigns.label": "過濾通聯呼號",
|
||||
"settings.logbook.callsigns.enable": "啟用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼號(可多選)",
|
||||
"settings.logbook.callsigns.enable": "啟用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼號",
|
||||
"settings.logbook.date.hover": "在此日期之前過濾通聯日誌",
|
||||
"settings.logbook.date.label": "通聯日期",
|
||||
"settings.logbook.date.enable": "啟用?",
|
||||
"settings.logbook.date.enable": "啟用?",
|
||||
"settings.logbook.date.date": "日期",
|
||||
"settings.logbook.date.time": "時間",
|
||||
"settings.logbook.apply.hover": "套用更改並重新匯入日誌",
|
||||
|
@ -257,7 +257,7 @@
|
|||
"settings.grids.QSO.label": "QSO/曾經通聯",
|
||||
"settings.grids.QSL.label": "QSL/已經確認",
|
||||
"settings.grids.QSX.label": "QSX/與其他正在通聯的電臺",
|
||||
"settings.grids.CQ.label": "‘CQ’的電臺",
|
||||
"settings.grids.CQ.label": "'CQ'的電臺",
|
||||
"settings.grids.CQDX.label": "'CQ DX'的電臺",
|
||||
"settings.grids.QRZ.label": "QRZ/您的通聯",
|
||||
"settings.grids.QTH.label": "QTH/您的網格",
|
||||
|
@ -286,27 +286,27 @@
|
|||
"settings.map.FitMapToQRZ.label": "將地圖匹配到QRZ",
|
||||
"settings.map.FitMapToQRZ.hover": "將地圖匹配映射切換到QRZ",
|
||||
"settings.map.CQHighlight.label": "'CQ'高亮顯示",
|
||||
"settings.map.CQHighlight.hover": "切換‘CQ XX’高亮顯示",
|
||||
"settings.map.CQHighlight.hover": "切換'CQ XX'高亮顯示",
|
||||
"settings.map.MissingGrid.label": "QRZ缺少網格\nDXCC回退",
|
||||
"settings.map.MissingGrid.hover": "如果電臺網格缺少網格則使用DXCC",
|
||||
"settings.map.RXSpotPath.color.label": "RX-Spot 顏色調整",
|
||||
"settings.map.RXSpotPath.color.default": "PSK-Spot 顏色調整",
|
||||
"settings.map.RXSpotPath.enable.label": "RX-Spot 路徑顯示",
|
||||
"settings.map.RXSpotPath.enable.hover": "切換RX-Spot路徑顯示",
|
||||
"settings.map.RXSpotPath.width.label": "RX-Spot 路徑寬度",
|
||||
"settings.map.RXSpotPath.color.label": "RX Spot 顏色調整",
|
||||
"settings.map.RXSpotPath.color.default": "PSKreporter 顏色調整",
|
||||
"settings.map.RXSpotPath.enable.label": "RX Spot 路徑顯示",
|
||||
"settings.map.RXSpotPath.enable.hover": "切換RX Spot路徑顯示",
|
||||
"settings.map.RXSpotPath.width.label": "RX Spot 路徑寬度",
|
||||
"settings.map.AutoNight.enable.label": "地圖自動夜間模式",
|
||||
"settings.map.AutoNight.enable.hover": "地圖夜間模式自動切換",
|
||||
"settings.map.NightMap.select.label": "選擇夜間地圖",
|
||||
"settings.map.NightMap.select.hover": "選擇夜間使用的地圖",
|
||||
"settings.map.NightQSXPath.color.label": "夜間QSX路徑顏色",
|
||||
"settings.map.NightQRZPath.color.label": "夜間QRZ路徑顏色",
|
||||
"settings.map.NightRXSpot.color.label": "夜間RX-Spot路徑顏色",
|
||||
"settings.map.NightRXSpot.color.default": "RX-Spot調色板",
|
||||
"settings.map.NightRXSpot.color.label": "夜間RX Spot路徑顏色",
|
||||
"settings.map.NightRXSpot.color.default": "PSKreporter調色板",
|
||||
"settings.map.NightBrightness.label": "夜間地圖區域亮度",
|
||||
"settings.logging.tableheader.source": "日誌平台/同步",
|
||||
"settings.logging.tableheader.menu": "選單?",
|
||||
"settings.logging.tableheader.startup": "啟動?",
|
||||
"settings.logging.tableheader.log": "記錄?",
|
||||
"settings.logging.tableheader.menu": "選單?",
|
||||
"settings.logging.tableheader.startup": "啟動?",
|
||||
"settings.logging.tableheader.log": "記錄?",
|
||||
"settings.logging.tableheader.details": "詳細參數",
|
||||
"settings.logging.tableheader.test": "測試",
|
||||
"settings.logging.tableheader.result": "結果",
|
||||
|
@ -488,7 +488,7 @@
|
|||
"bandactivity.title": "正在等待數據傳入",
|
||||
"bandactivity.noData": "… 還沒有數據 …",
|
||||
"COMMENT_gt_chat.html": "",
|
||||
"chat.title": "離線信息服務(OAMS)",
|
||||
"chat.title": "離線信息服務 (OAMS)",
|
||||
"chat.resume": "對話繼續",
|
||||
"chat.ended": "對話結束",
|
||||
"chat.notAvail": "…此對話不再可用…",
|
||||
|
@ -597,7 +597,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ分區",
|
||||
"stats.tabs.ITUZones": "ITU分區",
|
||||
"stats.tabs.WASWAC": "洲大陸/美國州",
|
||||
"stats.tabs.WASWAC": "洲大陸/美國州/加拿大省",
|
||||
"stats.tabs.live": "在線",
|
||||
"stats.noDecodes": "還沒有解碼",
|
||||
"stats.viewing": "檢視",
|
||||
|
@ -833,6 +833,7 @@
|
|||
"gt.ITUZoneBox.Worked": "曾通聯的 ITU分區",
|
||||
"gt.WASWACBox.WAC": "曾通聯的所有大洲",
|
||||
"gt.WASWACBox.WAS": "曾通聯的所有美國州份",
|
||||
"gt.WASWACBox.WACP": "曾通聯的所有加拿大省份",
|
||||
"gt.displayItemsList.Worked": "曾通聯",
|
||||
"gt.displayItemsList.Confirmed": "已確認",
|
||||
"gt.displayItemsList.Needed": "需要的",
|
||||
|
|
|
@ -183,14 +183,14 @@
|
|||
"settings.general.AppStatus.label": "应用软件状态",
|
||||
"settings.general.AppStatus.status": "WSJT-X或JTDX均未运行.",
|
||||
"settings.general.UDP.Messages.label": "接收UDP数据",
|
||||
"settings.general.UDP.Multicast.label": "组播?",
|
||||
"settings.general.UDP.Multicast.label": "组播?",
|
||||
"settings.general.UDP.IP.label": "IP",
|
||||
"settings.general.UDP.Port.label": "端口",
|
||||
"settings.general.Fwd.Messages.label1": "转发UDP数据",
|
||||
"settings.general.Fwd.Messages.label2": "例如,另一台主机上的GridTracker",
|
||||
"settings.general.Fwd.IP.label": "IP",
|
||||
"settings.general.Fwd.Port.label": "端口",
|
||||
"settings.general.Fwd.Enabled.label": "启用?",
|
||||
"settings.general.Fwd.Enabled.label": "启用?",
|
||||
"settings.general.CenterGrid.label": "所在网格",
|
||||
"settings.general.DistanceUnits.label": "距离单位",
|
||||
"settings.general.Distance.km": "公里",
|
||||
|
@ -223,7 +223,7 @@
|
|||
"settings.lookup.CallookFirst.label": "在使用其他服务之前优先使用Callook平台",
|
||||
"settings.lookup.CallookFirst.hover": "在使用其他服务之前使用Callook平台,因为免费Callook比免费QRZ.com可以获取更多数据。",
|
||||
"settings.lookup.Databases.label": "全球呼号数据库",
|
||||
"settings.lookup.Databases.header": "数据库平台 (如果启用代表您支持此平台的QSL)",
|
||||
"settings.lookup.Databases.header": "数据库平台",
|
||||
"settings.lookup.Enabled.header": "已启用",
|
||||
"settings.lookup.LastDwnld.header": "最后下载",
|
||||
"settings.lookup.Count.header": "数量",
|
||||
|
@ -242,11 +242,11 @@
|
|||
"settings.audio.QSOLogEventFile.label": "通联日志记录通知音频",
|
||||
"settings.logbook.callsigns.hover": "通联日志以仅包含这些呼号的数据(逗号分隔)",
|
||||
"settings.logbook.callsigns.label": "过滤通联呼号",
|
||||
"settings.logbook.callsigns.enable": "启用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼号(可多选)",
|
||||
"settings.logbook.callsigns.enable": "启用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼号",
|
||||
"settings.logbook.date.hover": "在此日期之前过滤通联日志",
|
||||
"settings.logbook.date.label": "通联日期",
|
||||
"settings.logbook.date.enable": "启用?",
|
||||
"settings.logbook.date.enable": "启用?",
|
||||
"settings.logbook.date.date": "日期",
|
||||
"settings.logbook.date.time": "时间",
|
||||
"settings.logbook.apply.hover": "应用更改并重新导入日志",
|
||||
|
@ -257,7 +257,7 @@
|
|||
"settings.grids.QSO.label": "QSO/曾经通联",
|
||||
"settings.grids.QSL.label": "QSL/已经确认",
|
||||
"settings.grids.QSX.label": "QSX/与其他正在通联的电台",
|
||||
"settings.grids.CQ.label": "‘CQ’的电台",
|
||||
"settings.grids.CQ.label": "'CQ'的电台",
|
||||
"settings.grids.CQDX.label": "'CQ DX'的电台",
|
||||
"settings.grids.QRZ.label": "QRZ/您的通联",
|
||||
"settings.grids.QTH.label": "QTH/您的网格",
|
||||
|
@ -286,13 +286,13 @@
|
|||
"settings.map.FitMapToQRZ.label": "将地图匹配到QRZ",
|
||||
"settings.map.FitMapToQRZ.hover": "将地图匹配映射切换到QRZ",
|
||||
"settings.map.CQHighlight.label": "'CQ'高亮显示",
|
||||
"settings.map.CQHighlight.hover": "切换‘CQ XX’高亮显示",
|
||||
"settings.map.CQHighlight.hover": "切换'CQ XX'高亮显示",
|
||||
"settings.map.MissingGrid.label": "QRZ缺少网格\nDXCC回退",
|
||||
"settings.map.MissingGrid.hover": "如果电台网格缺少网格则使用DXCC",
|
||||
"settings.map.RXSpotPath.color.label": "RX-Spot 颜色调整",
|
||||
"settings.map.RXSpotPath.color.default": "PSK-Spot 颜色调整",
|
||||
"settings.map.RXSpotPath.enable.label": "RX-Spot 路径显示",
|
||||
"settings.map.RXSpotPath.enable.hover": "切换RX-Spot路径显示",
|
||||
"settings.map.RXSpotPath.color.label": "RX Spot 颜色调整",
|
||||
"settings.map.RXSpotPath.color.default": "PSKreporter 颜色调整",
|
||||
"settings.map.RXSpotPath.enable.label": "RX Spot 路径显示",
|
||||
"settings.map.RXSpotPath.enable.hover": "切换RX Spot路径显示",
|
||||
"settings.map.RXSpotPath.width.label": "RX-Spot 路径宽度",
|
||||
"settings.map.AutoNight.enable.label": "地图自动夜间模式",
|
||||
"settings.map.AutoNight.enable.hover": "地图夜间模式自动切换",
|
||||
|
@ -300,13 +300,13 @@
|
|||
"settings.map.NightMap.select.hover": "选择夜间使用的地图",
|
||||
"settings.map.NightQSXPath.color.label": "夜间QSX路径颜色",
|
||||
"settings.map.NightQRZPath.color.label": "夜间QRZ路径颜色",
|
||||
"settings.map.NightRXSpot.color.label": "夜间RX-Spot路径颜色",
|
||||
"settings.map.NightRXSpot.color.default": "RX-Spot调色板",
|
||||
"settings.map.NightRXSpot.color.label": "夜间RX Spot路径颜色",
|
||||
"settings.map.NightRXSpot.color.default": "PSKreporter调色板",
|
||||
"settings.map.NightBrightness.label": "夜间地图区域亮度",
|
||||
"settings.logging.tableheader.source": "日志平台/同步",
|
||||
"settings.logging.tableheader.menu": "菜单?",
|
||||
"settings.logging.tableheader.startup": "启动?",
|
||||
"settings.logging.tableheader.log": "记录?",
|
||||
"settings.logging.tableheader.menu": "菜单?",
|
||||
"settings.logging.tableheader.startup": "启动?",
|
||||
"settings.logging.tableheader.log": "记录?",
|
||||
"settings.logging.tableheader.details": "详细参数",
|
||||
"settings.logging.tableheader.test": "测试",
|
||||
"settings.logging.tableheader.result": "结果",
|
||||
|
@ -488,7 +488,7 @@
|
|||
"bandactivity.title": "正在等待数据传入",
|
||||
"bandactivity.noData": "… 还没有数据 …",
|
||||
"COMMENT_gt_chat.html": "",
|
||||
"chat.title": "离线消息服务(OAMS)",
|
||||
"chat.title": "离线消息服务 (OAMS)",
|
||||
"chat.resume": "会话继续",
|
||||
"chat.ended": "会话结束",
|
||||
"chat.notAvail": "…此会话不再可用…",
|
||||
|
@ -597,7 +597,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ分区",
|
||||
"stats.tabs.ITUZones": "ITU分区",
|
||||
"stats.tabs.WASWAC": "洲大陆/美国州",
|
||||
"stats.tabs.WASWAC": "洲大陆/美国州/加拿大省",
|
||||
"stats.tabs.live": "实时",
|
||||
"stats.noDecodes": "还没有解码",
|
||||
"stats.viewing": "检视",
|
||||
|
@ -833,6 +833,7 @@
|
|||
"gt.ITUZoneBox.Worked": "通联过的 ITU分区",
|
||||
"gt.WASWACBox.WAC": "通联过的所有大洲",
|
||||
"gt.WASWACBox.WAS": "通联过的所有美国州",
|
||||
"gt.WASWACBox.WACP": "通联过的所有加拿大省",
|
||||
"gt.displayItemsList.Worked": "通联过的",
|
||||
"gt.displayItemsList.Confirmed": "已确认的",
|
||||
"gt.displayItemsList.Needed": "需要的",
|
||||
|
@ -844,7 +845,7 @@
|
|||
"gt.typeNames.Digital": "数字模式",
|
||||
"gt.typeNames.Phone": "SSB模式",
|
||||
"gt.typeNames.CW": "CW模式",
|
||||
"gt.typeNames.Other": "其他模式",
|
||||
"gt.typeNames.Other": "其他",
|
||||
"gt.awardNames.WRFA": "呼号",
|
||||
"gt.awardNames.Grid": "网格",
|
||||
"gt.awardNames.DXCC": "DXCCs",
|
||||
|
@ -904,7 +905,7 @@
|
|||
"gt.validate.Invalid": "无效的!",
|
||||
"gt.NewVersion.Release": "新版本",
|
||||
"gt.NewVersion.Beta": "新 <b><i>测试</i></b> 版本",
|
||||
"gt.newVersion.Text2": "可供下载<br/>现在去下载?",
|
||||
"gt.newVersion.Text2": "可供下载<br/>现在去下载?",
|
||||
"gt.GetVoices.title": "选择语音",
|
||||
"gt.GetAudioDev.title": "选择声卡",
|
||||
"gt.SpotMaxAge": "最大时效:",
|
||||
|
|
|
@ -594,8 +594,8 @@
|
|||
"stats.tabs.scores": "Ergebnisse",
|
||||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ-Zonen",
|
||||
"stats.tabs.ITUZones": "ITU-Zones",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.ITUZones": "ITU-Zonen",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "Noch keine Nachrichten",
|
||||
"stats.viewing": "Ansicht",
|
||||
|
@ -857,7 +857,8 @@
|
|||
"gt.CQZoneBox.Worked": "Gearbeitete CQ-Zonen",
|
||||
"gt.ITUZoneBox.Worked": "Gearbeitete ITU-Zonen",
|
||||
"gt.WASWACBox.WAC": "Worked All Continents",
|
||||
"gt.WASWACBox.WAS": "Worked All States",
|
||||
"gt.WASWACBox.WAS": "Worked All US States",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"gt.displayItemsList.Worked": "Gearbeitet",
|
||||
"gt.displayItemsList.Confirmed": "Bestätigt",
|
||||
"gt.displayItemsList.Needed": "Benötigt",
|
||||
|
|
|
@ -226,7 +226,7 @@
|
|||
"settings.lookup.Enabled.header": "Enabled",
|
||||
"settings.lookup.LastDwnld.header": "Last Download",
|
||||
"settings.lookup.Count.header": "Count",
|
||||
"settings.lookup.db.ULS": "United States ULS",
|
||||
"settings.lookup.db.ULS": "US Callsigns",
|
||||
"settings.lookup.db.LoTW": "Logbook of The World",
|
||||
"settings.lookup.db.eQSL": "eQSL",
|
||||
"settings.lookup.db.OQRS": "ClubLog OQRS",
|
||||
|
@ -596,7 +596,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ Zones",
|
||||
"stats.tabs.ITUZones": "ITU Zones",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "No decodes yet",
|
||||
"stats.viewing": "Viewing",
|
||||
|
@ -832,7 +832,8 @@
|
|||
"gt.CQZoneBox.Worked": "Worked CQ Zones",
|
||||
"gt.ITUZoneBox.Worked": "Worked ITU Zones",
|
||||
"gt.WASWACBox.WAC": "Worked All Continents",
|
||||
"gt.WASWACBox.WAS": "Worked All States",
|
||||
"gt.WASWACBox.WAS": "Worked All US States",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"gt.displayItemsList.Worked": "Worked",
|
||||
"gt.displayItemsList.Confirmed": "Confirmed",
|
||||
"gt.displayItemsList.Needed": "Needed",
|
||||
|
|
|
@ -595,7 +595,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "Zonas CQ",
|
||||
"stats.tabs.ITUZones": "Zonas ITU",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "En Vivo",
|
||||
"stats.noDecodes": "Sin decodificaciones",
|
||||
"stats.viewing": "Viendo",
|
||||
|
@ -828,6 +828,7 @@
|
|||
"gt.ITUZoneBox.Worked": "Zonas ITU Trabajadas",
|
||||
"gt.WASWACBox.WAC": "WAC - Continentes Trabajados",
|
||||
"gt.WASWACBox.WAS": "WAS - Estados Trabajados",
|
||||
"gt.WASWACBox.WACP": "WACP - Provincias canadienses",
|
||||
"gt.displayItemsList.Worked": "Trabajados",
|
||||
"gt.displayItemsList.Confirmed": "Confirmados",
|
||||
"gt.displayItemsList.Needed": "Necesarios",
|
||||
|
|
|
@ -596,7 +596,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ Zones",
|
||||
"stats.tabs.ITUZones": "ITU Zones",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "Aucun décodage pour l'instant",
|
||||
"stats.viewing": "Visualisation",
|
||||
|
@ -832,7 +832,8 @@
|
|||
"gt.CQZoneBox.Worked": "Zones CQ travaillées",
|
||||
"gt.ITUZoneBox.Worked": "Zones ITU travaillées",
|
||||
"gt.WASWACBox.WAC": "Continents",
|
||||
"gt.WASWACBox.WAS": "États",
|
||||
"gt.WASWACBox.WAS": "États américains",
|
||||
"gt.WASWACBox.WACP": "Provinces canadiennes",
|
||||
"gt.displayItemsList.Worked": "Travaillé",
|
||||
"gt.displayItemsList.Confirmed": "Confirmé",
|
||||
"gt.displayItemsList.Needed": "Nécessaire",
|
||||
|
|
|
@ -596,7 +596,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ Zone",
|
||||
"stats.tabs.ITUZones": "ITU Zone",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "Nessuna decodifica per il momento",
|
||||
"stats.viewing": "Visualizzazione",
|
||||
|
@ -832,7 +832,8 @@
|
|||
"gt.CQZoneBox.Worked": "Zona CQ lavorata",
|
||||
"gt.ITUZoneBox.Worked": "Zona ITU lavorata",
|
||||
"gt.WASWACBox.WAC": "Continenti",
|
||||
"gt.WASWACBox.WAS": "Stati",
|
||||
"gt.WASWACBox.WAS": "Stati Uniti",
|
||||
"gt.WASWACBox.WACP": "Province canadesi",
|
||||
"gt.displayItemsList.Worked": "Lavorato",
|
||||
"gt.displayItemsList.Confirmed": "Confermato",
|
||||
"gt.displayItemsList.Needed": "Necessario",
|
||||
|
|
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 5.1 KiB |
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,658 @@
|
|||
var GT = {};
|
||||
|
||||
importScripts("protos.js");
|
||||
importScripts("gtCommon.js");
|
||||
|
||||
GT.workerFunctions =
|
||||
{
|
||||
init: initGlobals,
|
||||
clear: clearQSO,
|
||||
parse: onAdiLoadComplete
|
||||
};
|
||||
|
||||
onmessage = (event) =>
|
||||
{
|
||||
if ("type" in event.data)
|
||||
{
|
||||
if (event.data.type in GT.workerFunctions)
|
||||
{
|
||||
GT.workerFunctions[event.data.type](event.data);
|
||||
}
|
||||
else console.log("adifWorker: unknown event type : " + event.data.type);
|
||||
}
|
||||
else console.log("adifWorker: no event type");
|
||||
};
|
||||
|
||||
function initGlobals(task)
|
||||
{
|
||||
GT.dxccInfo = task.dxccInfo; // null geo
|
||||
for (const key in GT.dxccInfo)
|
||||
{
|
||||
GT.dxccInfo[key].geo = null;
|
||||
}
|
||||
GT.dxccToCountryCode = task.dxccToCountryCode;
|
||||
GT.directCallToDXCC = task.directCallToDXCC;
|
||||
GT.directCallToITUzone = task.directCallToITUzone;
|
||||
GT.directCallToCQzone = task.directCallToCQzone;
|
||||
GT.prefixToITUzone = task.prefixToITUzone;
|
||||
GT.prefixToCQzone = task.prefixToCQzone;
|
||||
GT.prefixToMap = task.prefixToMap;
|
||||
GT.gridToState = task.gridToState;
|
||||
GT.callsignDatabaseDXCC = task.callsignDatabaseDXCC;
|
||||
GT.callsignDatabaseUS = task.callsignDatabaseUS;
|
||||
GT.callsignDatabaseUSplus = task.callsignDatabaseUSplus;
|
||||
GT.modes = task.modes;
|
||||
GT.modes_phone = task.modes_phone;
|
||||
GT.QSOhash = task.QSOhash;
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "loaded";
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function clearQSO(task)
|
||||
{
|
||||
GT.QSOhash = {};
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "cleared"
|
||||
returnTask.clearFiles = task.clearFiles;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
const myTextEncoder = new TextEncoder();
|
||||
const myTextDecoder = new TextDecoder();
|
||||
|
||||
function onAdiLoadComplete(task)
|
||||
{
|
||||
GT.appSettings = task.appSettings;
|
||||
GT.myQsoCalls = {};
|
||||
GT.myQsoGrids = {};
|
||||
|
||||
var liveLog = task.liveLog;
|
||||
var confirmed = false;
|
||||
var rows = 0;
|
||||
var lastHash = null;
|
||||
var validAdifFile = true;
|
||||
var eQSLfile = false;
|
||||
var clublogFile = false;
|
||||
var lotwTimestampUpdated = false;
|
||||
|
||||
if (task.rawAdiBuffer.indexOf("PSKReporter") > -1) validAdifFile = false;
|
||||
if (task.rawAdiBuffer.indexOf("Received eQSLs") > -1) eQSLfile = true;
|
||||
if (task.rawAdiBuffer.indexOf("clublog.adif") > -1 || task.rawAdiBuffer.indexOf("ADIF export from Club Log") > -1) clublogFile = true;
|
||||
|
||||
var eorRegEx = new RegExp("<EOR>", "i");
|
||||
|
||||
if (validAdifFile == true && task.rawAdiBuffer.length > 1)
|
||||
{
|
||||
var startPos = 0;
|
||||
var endPos = task.rawAdiBuffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
let eor = task.rawAdiBuffer.substring(startPos).search(eorRegEx);
|
||||
if (eor != -1)
|
||||
{
|
||||
let row = task.rawAdiBuffer.substring(startPos, startPos + eor);
|
||||
startPos += eor + 5; // skip <EOR>
|
||||
let object = parseADIFRecordStrict(row);
|
||||
let confSource = null;
|
||||
let lotwConfirmed = false;
|
||||
confirmed = false;
|
||||
if (object.APP_LOTW_RXQSO)
|
||||
{
|
||||
var dRXQSO = Date.parse(object.APP_LOTW_RXQSO);
|
||||
|
||||
if ((isNaN(dRXQSO) == false) && dRXQSO > 0 && dRXQSO > task.lotw_qso)
|
||||
{
|
||||
// add a second
|
||||
dRXQSO += 1000;
|
||||
task.lotw_qso = dRXQSO;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (object.APP_LOTW_RXQSL)
|
||||
{
|
||||
var dRXQSL = Date.parse(object.APP_LOTW_RXQSL);
|
||||
if ((isNaN(dRXQSL) == false) && dRXQSL > 0 && dRXQSL > task.lotw_qsl)
|
||||
{
|
||||
// add a second
|
||||
dRXQSL += 1000;
|
||||
task.lotw_qsl = dRXQSL;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
lotwConfirmed = true;
|
||||
}
|
||||
|
||||
var finalDEcall = "";
|
||||
if (object.STATION_CALLSIGN)
|
||||
{
|
||||
finalDEcall = object.STATION_CALLSIGN.replace("_", "/");
|
||||
}
|
||||
if (finalDEcall == "")
|
||||
{
|
||||
finalDEcall = GT.appSettings.myCall;
|
||||
}
|
||||
GT.myQsoCalls[finalDEcall] = true;
|
||||
|
||||
if (GT.appSettings.workingCallsignEnable && !(finalDEcall in GT.appSettings.workingCallsigns))
|
||||
{
|
||||
// not in the working callsigns, move to next
|
||||
continue;
|
||||
}
|
||||
|
||||
var finalTime = 0;
|
||||
|
||||
if (object.QSO_DATE && object.TIME_ON)
|
||||
{
|
||||
var dateTime = new Date(
|
||||
Date.UTC(
|
||||
object.QSO_DATE.substr(0, 4),
|
||||
parseInt(object.QSO_DATE.substr(4, 2)) - 1,
|
||||
object.QSO_DATE.substr(6, 2),
|
||||
object.TIME_ON.substr(0, 2),
|
||||
object.TIME_ON.substr(2, 2),
|
||||
object.TIME_ON.substr(4, 2)
|
||||
)
|
||||
);
|
||||
|
||||
finalTime = parseInt(dateTime.getTime() / 1000);
|
||||
}
|
||||
|
||||
if (GT.appSettings.workingDateEnable && finalTime < GT.appSettings.workingDate)
|
||||
{
|
||||
// Not after our working date
|
||||
continue;
|
||||
}
|
||||
|
||||
var myGrid = (object.MY_GRIDSQUARE || "").toUpperCase();
|
||||
if (myGrid.length > 3)
|
||||
{
|
||||
let finalMyGrid = myGrid.substr(0, 4);
|
||||
GT.myQsoGrids[finalMyGrid] = true;
|
||||
if (GT.appSettings.workingGridEnable && !(finalMyGrid in GT.appSettings.workingGrids))
|
||||
{
|
||||
// not in the working grids, move to next
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
var finalDXcall = (object.CALL || "").replace("_", "/");
|
||||
var finalGrid = (object.GRIDSQUARE || "").toUpperCase();
|
||||
var vuccGrids = (object.VUCC_GRIDS || "").toUpperCase();
|
||||
var finalVucc = [];
|
||||
var finalRSTsent = (object.RST_SENT || "");
|
||||
var finalRSTrecv = (object.RST_RCVD || "");
|
||||
var finalBand = (object.BAND || "").toLowerCase();
|
||||
if (finalBand == "" || finalBand == "oob")
|
||||
{
|
||||
finalBand = formatBand(Number(object.FREQ || 0));
|
||||
}
|
||||
|
||||
var finalPropMode = (object.PROP_MODE || "").toUpperCase();
|
||||
var finalSatName = (object.SAT_NAME || "").toUpperCase();
|
||||
var finalCont = (object.CONT || "").toUpperCase();
|
||||
if (finalCont.length == 0)
|
||||
{
|
||||
finalCont = null;
|
||||
}
|
||||
var finalCnty = (object.CNTY || "").toUpperCase();
|
||||
if (finalCnty.length == 0)
|
||||
{
|
||||
finalCnty = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// GT references internally with NO spaces, this is important
|
||||
finalCnty = replaceAll(finalCnty, " ", "");
|
||||
}
|
||||
var finalMode = (object.MODE || "").toUpperCase();
|
||||
var subMode = (object.SUBMODE || "").toUpperCase();
|
||||
if (subMode == "FT4" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "FT4"
|
||||
}
|
||||
if (subMode == "Q65" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "Q65"
|
||||
}
|
||||
if (subMode == "JS8" && finalMode == "MFSK")
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "JS8";
|
||||
}
|
||||
|
||||
var finalMsg = (object.COMMENT || "");
|
||||
var finalQslMsg = (object.QSLMSG || "");
|
||||
var finalQslMsgIntl = (object.QSLMSG_INTL || "");
|
||||
if (finalQslMsg.length > 1)
|
||||
{
|
||||
finalMsg = finalQslMsg;
|
||||
}
|
||||
if (finalQslMsgIntl.length > 1 && finalMsg == "")
|
||||
{
|
||||
finalMsg = finalQslMsgIntl;
|
||||
}
|
||||
|
||||
var finalDxcc = Number(object.DXCC || 0);
|
||||
if (finalDxcc == 0)
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
if (!(finalDxcc in GT.dxccInfo))
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
var finalState = (object.STATE || "").toUpperCase();
|
||||
if (finalState.length == 0) finalState = null;
|
||||
else if (finalDxcc > 0)
|
||||
{
|
||||
finalState = GT.dxccToCountryCode[finalDxcc] + "-" + finalState;
|
||||
}
|
||||
|
||||
var finalCqZone = (object.CQZ || "");
|
||||
if (finalCqZone.length == 1)
|
||||
{
|
||||
finalCqZone = "0" + finalCqZone;
|
||||
}
|
||||
|
||||
if (parseInt(finalCqZone) < 1 || parseInt(finalCqZone) > 40)
|
||||
{
|
||||
finalCqZone = "";
|
||||
}
|
||||
finalCqZone = String(finalCqZone);
|
||||
var finalItuZone = (object.ITUZ || "");
|
||||
if (finalItuZone.length == 1) finalItuZone = "0" + finalItuZone;
|
||||
|
||||
if (parseInt(finalItuZone) < 1 || parseInt(finalItuZone) > 90)
|
||||
{
|
||||
finalItuZone = "";
|
||||
}
|
||||
finalItuZone = String(finalItuZone);
|
||||
|
||||
var finalIOTA = (object.IOTA || "").toUpperCase();
|
||||
|
||||
var qrzConfirmed = (object.APP_QRZLOG_STATUS || "").toUpperCase();
|
||||
var lotwConfirmed1 = (object.QSL_RCVD || "").toUpperCase();
|
||||
var lotw_qsl_rcvd = (object.LOTW_QSL_RCVD || "").toUpperCase();
|
||||
var eqsl_qsl_rcvd = (object.EQSL_QSL_RCVD || "").toUpperCase();
|
||||
|
||||
if (qrzConfirmed == "C" || lotw_qsl_rcvd == "Y" || lotw_qsl_rcvd == "V" || lotwConfirmed1 == "Y" || eqsl_qsl_rcvd == "Y" || eqsl_qsl_rcvd == "V" || eQSLfile == true)
|
||||
{
|
||||
confirmed = true;
|
||||
if (qrzConfirmed == "C")
|
||||
{
|
||||
confSource = "Q";
|
||||
}
|
||||
else if (eQSLfile == true)
|
||||
{
|
||||
confSource = "e";
|
||||
}
|
||||
else if (lotwConfirmed == true)
|
||||
{
|
||||
confSource = "L";
|
||||
}
|
||||
else if (clublogFile == true)
|
||||
{
|
||||
confSource = "C";
|
||||
}
|
||||
else
|
||||
{
|
||||
confSource = "O";
|
||||
}
|
||||
}
|
||||
|
||||
finalGrid = finalGrid.substr(0, 6);
|
||||
if (!validateGridFromString(finalGrid)) finalGrid = "";
|
||||
if (finalGrid == "" && vuccGrids != "")
|
||||
{
|
||||
finalVucc = vuccGrids.split(",");
|
||||
finalGrid = finalVucc[0];
|
||||
finalVucc.shift();
|
||||
}
|
||||
var isDigital = false;
|
||||
var isPhone = false;
|
||||
if (finalMode in GT.modes)
|
||||
{
|
||||
isDigital = GT.modes[finalMode];
|
||||
}
|
||||
if (finalMode in GT.modes_phone)
|
||||
{
|
||||
isPhone = GT.modes_phone[finalMode];
|
||||
}
|
||||
|
||||
var finalPOTA = (object.POTA_REF || object.POTA || "").toUpperCase();
|
||||
if (finalPOTA.length == 0)
|
||||
{
|
||||
finalPOTA = null;
|
||||
}
|
||||
|
||||
if (finalDXcall != "")
|
||||
{
|
||||
lastHash = addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
finalMsg,
|
||||
finalMode,
|
||||
finalBand,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc,
|
||||
finalPropMode,
|
||||
isDigital,
|
||||
isPhone,
|
||||
finalIOTA,
|
||||
finalSatName,
|
||||
finalPOTA,
|
||||
confSource
|
||||
);
|
||||
}
|
||||
rows++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break; // we're done
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cam from a live event, we handly differently
|
||||
if (liveLog == true && rows == 1 && lastHash != null && confirmed == false)
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsedLive";
|
||||
returnTask.details = GT.QSOhash[lastHash];
|
||||
}
|
||||
else
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsed";
|
||||
returnTask.QSOhash = GT.QSOhash;
|
||||
returnTask.myQsoCalls = GT.myQsoCalls;
|
||||
returnTask.myQsoGrids = GT.myQsoGrids;
|
||||
returnTask.lotw_qso = task.lotw_qso;
|
||||
returnTask.lotw_qsl = task.lotw_qsl;
|
||||
returnTask.lotwTimestampUpdated = lotwTimestampUpdated;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
}
|
||||
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
ifinalMsg,
|
||||
mode,
|
||||
band,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc = [],
|
||||
finalPropMode = "",
|
||||
finalDigital = false,
|
||||
finalPhone = false,
|
||||
finalIOTA = "",
|
||||
finalSatName = "",
|
||||
finalPOTA = null,
|
||||
confSource = null
|
||||
)
|
||||
{
|
||||
let hash = "";
|
||||
let finalMsg = ifinalMsg.trim();
|
||||
if (finalMsg.length > 40) finalMsg = finalMsg.substring(0, 40) + "...";
|
||||
|
||||
let details = null;
|
||||
let timeMod = finalTime - ((finalTime % 60) + 30);
|
||||
hash = unique(finalDXcall + timeMod) + unique(mode + band);
|
||||
|
||||
if (hash in GT.QSOhash)
|
||||
{
|
||||
details = GT.QSOhash[hash];
|
||||
let canWrite = (details.confirmed == false || GT.appSettings.qslAuthority == "0" || GT.appSettings.qslAuthority == confSource || !(GT.appSettings.qslAuthority in details.confSrcs));
|
||||
if (GT.appSettings.qslAuthority == "1" && confirmed == true)
|
||||
{
|
||||
// Only unconfirmed can change the grid, state, county
|
||||
// This is for DO9KW
|
||||
canWrite = false;
|
||||
}
|
||||
if (finalGrid.length > 0 && finalGrid != details.grid)
|
||||
{
|
||||
// only touch the grid if it's larger than the last grid && the 4wide is the same
|
||||
if (details.grid.length < 6 && (details.grid.substr(0, 4) == finalGrid.substr(0, 4) || details.grid.length == 0))
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
}
|
||||
else if (details.grid.length != 0 && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (finalRSTsent.length > 0) details.RSTsent = finalRSTsent;
|
||||
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
|
||||
if (finalCqZone.length > 0) details.cqz = finalCqZone;
|
||||
if (finalItuZone.length > 0) details.ituz = finalItuZone;
|
||||
if (details.state != null && finalState != null && details.state != finalState && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
else if (details.state == null && finalState != null)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
if (confirmed == true && finalDxcc > 0) details.dxcc = finalDxcc;
|
||||
if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc;
|
||||
if (finalCont == null && details.cont) finalCont = details.cont;
|
||||
if (details.cnty != null && finalCnty != null && details.cnty != finalCnty && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
else if (details.cnty == null && finalCnty != null)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
if (finalPropMode.length > 0) details.propMode = finalPropMode;
|
||||
if (finalVucc.length > 0) details.vucc_grids = finalVucc;
|
||||
if (finalIOTA.length > 0) details.IOTA = finalIOTA;
|
||||
if (finalSatName.length > 0) details.satName = finalSatName;
|
||||
if (finalPOTA) details.pota = finalPOTA;
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confirmed = true;
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
details = {};
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
details.RSTsent = finalRSTsent;
|
||||
details.RSTrecv = finalRSTrecv;
|
||||
details.msg = "-";
|
||||
details.band = band;
|
||||
details.mode = mode;
|
||||
details.DEcall = finalDXcall;
|
||||
details.DXcall = finalDEcall;
|
||||
details.cqz = finalCqZone;
|
||||
details.ituz = finalItuZone;
|
||||
details.delta = -1;
|
||||
details.time = finalTime;
|
||||
details.state = finalState;
|
||||
details.zipcode = null;
|
||||
details.qso = true;
|
||||
details.px = null;
|
||||
details.zone = null;
|
||||
details.cont = null;
|
||||
details.cnty = finalCnty;
|
||||
details.vucc_grids = finalVucc;
|
||||
details.propMode = finalPropMode;
|
||||
details.digital = finalDigital;
|
||||
details.phone = finalPhone;
|
||||
details.IOTA = finalIOTA;
|
||||
details.satName = finalSatName;
|
||||
details.pota = finalPOTA;
|
||||
details.worked = true;
|
||||
details.confirmed = confirmed;
|
||||
details.confSrcs = {};
|
||||
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall);
|
||||
details.dxcc = finalDxcc;
|
||||
|
||||
if (details.dxcc > 0 && details.px == null)
|
||||
{
|
||||
details.px = getWpx(finalDXcall);
|
||||
if (details.px) { details.zone = Number(details.px.charAt(details.px.length - 1)); }
|
||||
}
|
||||
|
||||
var fourGrid = details.grid.substr(0, 4);
|
||||
|
||||
details.cont = finalCont;
|
||||
if (finalDxcc > 0)
|
||||
{
|
||||
details.cont = GT.dxccInfo[finalDxcc].continent;
|
||||
if (details.dxcc == 390 && details.zone == 1) details.cont = "EU";
|
||||
}
|
||||
|
||||
if (details.cnty && confirmed == true)
|
||||
{
|
||||
details.qual = true;
|
||||
}
|
||||
|
||||
if (details.state == null && fourGrid.length > 0 && isKnownCallsignDXCC(finalDxcc))
|
||||
{
|
||||
if (fourGrid in GT.gridToState && GT.gridToState[fourGrid].length == 1)
|
||||
{
|
||||
details.state = GT.gridToState[fourGrid][0];
|
||||
}
|
||||
}
|
||||
|
||||
if (!details.cqz || details.cqz.length == 0)
|
||||
{
|
||||
details.cqz = cqZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
if (!details.ituz || details.ituz.length == 0)
|
||||
{
|
||||
details.ituz = ituZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
|
||||
if (finalMsg.length > 0) details.msg = finalMsg;
|
||||
|
||||
details.hash = hash;
|
||||
|
||||
GT.QSOhash[hash] = details;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
GT.strictAdif = {
|
||||
APP_LOTW_RXQSO: false,
|
||||
APP_LOTW_RXQSL: false,
|
||||
STATION_CALLSIGN: false,
|
||||
QSO_DATE: false,
|
||||
TIME_ON: false,
|
||||
MY_GRIDSQUARE: false,
|
||||
CALL: false,
|
||||
GRIDSQUARE: false,
|
||||
VUCC_GRIDS: false,
|
||||
RST_SENT: false,
|
||||
RST_RCVD: false,
|
||||
BAND: false,
|
||||
FREQ: false,
|
||||
PROP_MODE: false,
|
||||
SAT_NAME: false,
|
||||
CONT: false,
|
||||
CNTY: false,
|
||||
MODE: false,
|
||||
SUBMODE: false,
|
||||
COMMENT: true,
|
||||
QSLMSG: true,
|
||||
QSLMSG_INTL: true,
|
||||
DXCC: false,
|
||||
STATE: false,
|
||||
CQZ: false,
|
||||
ITUZ: false,
|
||||
IOTA: false,
|
||||
APP_QRZLOG_STATUS: false,
|
||||
QSL_RCVD: false,
|
||||
LOTW_QSL_RCVD: false,
|
||||
EQSL_QSL_RCVD: false,
|
||||
POTA: false,
|
||||
POTA_REF: false,
|
||||
OPERATOR: false,
|
||||
APP_PSKREP_SNR: false
|
||||
};
|
||||
|
||||
function parseADIFRecordStrict(line)
|
||||
{
|
||||
var record = {};
|
||||
while (line.length > 0)
|
||||
{
|
||||
while (line.charAt(0) != "<" && line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
}
|
||||
if (line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
var where = line.indexOf(":");
|
||||
var nextChev = line.indexOf(">");
|
||||
if (where != -1 && nextChev > where)
|
||||
{
|
||||
var fieldName = line.substr(0, where).toUpperCase();
|
||||
line = line.substr(fieldName.length + 1);
|
||||
var fieldLength = parseInt(line);
|
||||
var end = line.indexOf(">");
|
||||
if (end > 0 && fieldName in GT.strictAdif)
|
||||
{
|
||||
line = line.substr(end + 1);
|
||||
var fieldValue;
|
||||
if (GT.strictAdif[fieldName] == true)
|
||||
{
|
||||
fieldValue = myTextDecoder.decode(myTextEncoder.encode(line.substr(0)).slice(0, fieldLength));
|
||||
}
|
||||
else
|
||||
{
|
||||
fieldValue = line.substr(0, fieldLength);
|
||||
}
|
||||
line = line.substr(fieldValue.length);
|
||||
record[fieldName] = fieldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return record;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -399,7 +399,7 @@ function addAlert(value, type, notify, repeat, filename, shortname)
|
|||
{
|
||||
var newKey = unique(value + type + notify + repeat + filename);
|
||||
|
||||
if (!GT.alerts.hasOwnProperty(newKey))
|
||||
if (!(newKey in GT.alerts))
|
||||
{
|
||||
var alertItem = Object();
|
||||
alertItem.value = value;
|
||||
|
@ -532,10 +532,7 @@ function checkAlerts(
|
|||
else if (grid && nalert.type == 2)
|
||||
{
|
||||
// gridsquare
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
grid.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && grid.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord, grid);
|
||||
hadAlert = true;
|
||||
|
@ -553,10 +550,7 @@ function checkAlerts(
|
|||
else if (nalert.type == 5)
|
||||
{
|
||||
// callsign partial
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
DEcallsign.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && DEcallsign.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord);
|
||||
hadAlert = true;
|
||||
|
@ -596,20 +590,15 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.lastMessage = lastMessage;
|
||||
nAlert.lastTime = timeNowSec();
|
||||
|
||||
if (callsignRecord != null)
|
||||
if (nAlert.notify == 3 && callsignRecord != null && grid.length == 4)
|
||||
{
|
||||
if (
|
||||
typeof callsignRecord.rect != "undefined" &&
|
||||
callsignRecord.rect != null &&
|
||||
nAlert.notify == 3
|
||||
)
|
||||
var LL = squareToCenter(grid);
|
||||
|
||||
if (!isNaN(LL.a))
|
||||
{
|
||||
// Fix me
|
||||
GT.map
|
||||
.getView()
|
||||
.setCenter(
|
||||
ol.extent.getCenter(callsignRecord.rect.getGeometry().getExtent())
|
||||
);
|
||||
.setCenter(ol.proj.transform([LL.o, LL.a], "EPSG:4326", "EPSG:3857"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -638,9 +627,9 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.fired++;
|
||||
}
|
||||
|
||||
function playAlertMediaFile(filename, overrideMute)
|
||||
function playAlertMediaFile(filename)
|
||||
{
|
||||
if (GT.appSettings.alertMute && !overrideMute) return;
|
||||
if (GT.appSettings.alertMute == 1) return;
|
||||
|
||||
// check if this is an alert stored with an older version of GT
|
||||
// which has a full file path given.
|
||||
|
|
|
@ -134,9 +134,9 @@ var GreatCircle = function (start, end, properties)
|
|||
{
|
||||
throw new Error(
|
||||
"it appears " +
|
||||
start.view() +
|
||||
this.start +
|
||||
" and " +
|
||||
end.view() +
|
||||
this.end +
|
||||
" are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite"
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -6,14 +6,21 @@ GT.lotwCallsigns = Object();
|
|||
GT.lotwFile = "";
|
||||
GT.lotwWhenDate = 0;
|
||||
GT.lotwLoadTimer = null;
|
||||
|
||||
GT.eqslCallsigns = Object();
|
||||
GT.eqslFile = "";
|
||||
GT.eqslWhenDate = 0;
|
||||
GT.eqslLoadTimer = null;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsCallsigns = Object();
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsFile = "";
|
||||
|
||||
GT.cacCallsigns = Object();
|
||||
GT.cacFile = "";
|
||||
GT.cacWhenDate = 0;
|
||||
GT.cacLoadTimer = null;
|
||||
|
||||
GT.oqrsCallsigns = Object();
|
||||
GT.oqrsFile = "";
|
||||
|
@ -54,6 +61,8 @@ function callsignServicesInit()
|
|||
GT.lotwFile = GT.NWappData + "lotw-ts-callsigns.json";
|
||||
GT.eqslFile = GT.NWappData + "eqsl-callsigns.json";
|
||||
GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json";
|
||||
GT.cacFile = GT.NWappData + "canada-callsigns.txt";
|
||||
GT.ulsFile = GT.NWappData + "uls-callsigns.txt";
|
||||
|
||||
if (GT.callsignLookups.lotwUseEnable)
|
||||
{
|
||||
|
@ -67,6 +76,10 @@ function callsignServicesInit()
|
|||
{
|
||||
ulsLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
cacLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.oqrsUseEnable)
|
||||
{
|
||||
oqrsLoadCallsigns();
|
||||
|
@ -75,6 +88,7 @@ function callsignServicesInit()
|
|||
lotwSettingsDisplay();
|
||||
eqslSettingsDisplay();
|
||||
ulsSettingsDisplay();
|
||||
cacSettingsDisplay();
|
||||
oqrsSettingsDisplay();
|
||||
}
|
||||
|
||||
|
@ -201,6 +215,7 @@ function processLotwCallsigns(result, flag)
|
|||
}
|
||||
|
||||
GT.callsignLookups.lotwLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer);
|
||||
|
@ -218,6 +233,116 @@ function processLotwCallsigns(result, flag)
|
|||
lotwSettingsDisplay();
|
||||
}
|
||||
|
||||
function cacLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.cacLastUpdate > 86400 * 7)
|
||||
{ GT.callsignLookups.cacLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
|
||||
GT.cacWhenDate = now + cacWhenTimer;
|
||||
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!fs.existsSync(GT.cacFile))
|
||||
{
|
||||
GT.callsignLookups.cacLastUpdate = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
parseCacCallsigns(fs.readFileSync(GT.cacFile, "UTF-8"));
|
||||
}
|
||||
if (GT.callsignLookups.cacLastUpdate == 0)
|
||||
{
|
||||
cacDownload();
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
GT.callsignLookups.cacLastUpdate = 0;
|
||||
cacDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function parseCacCallsigns(data)
|
||||
{
|
||||
let callsignRows = data.split("\n");
|
||||
for (let x = 0; x < callsignRows.length; x++)
|
||||
{
|
||||
if (callsignRows[x].length > 1)
|
||||
{
|
||||
GT.cacCallsigns[callsignRows[x].substr(8)] = callsignRows[x].substr(6, 2);
|
||||
}
|
||||
}
|
||||
fs.writeFileSync(GT.cacFile, data, "UTF-8");
|
||||
}
|
||||
|
||||
function processCacCallsigns(buffer, flag)
|
||||
{
|
||||
let data = (typeof buffer == "object") ? String(buffer) : buffer;
|
||||
parseCacCallsigns(data);
|
||||
|
||||
GT.callsignLookups.cacLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
|
||||
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
|
||||
GT.cacWhenDate = now + cacWhenTimer;
|
||||
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
|
||||
|
||||
cacSettingsDisplay();
|
||||
}
|
||||
|
||||
function cacDownload(fromSettings)
|
||||
{
|
||||
cacUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/canada.txt",
|
||||
processCacCallsigns,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function cacSettingsDisplay()
|
||||
{
|
||||
cacUseEnable.checked = GT.callsignLookups.cacUseEnable;
|
||||
|
||||
if (GT.callsignLookups.cacLastUpdate == 0)
|
||||
{
|
||||
cacUpdatedTd.innerHTML = "Never";
|
||||
}
|
||||
else
|
||||
{
|
||||
cacUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.cacLastUpdate * 1000);
|
||||
}
|
||||
|
||||
if (!GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
GT.cacLoadTimer = null;
|
||||
GT.cacCallsigns = Object();
|
||||
}
|
||||
cacCountTd.innerHTML = Object.keys(GT.cacCallsigns).length;
|
||||
}
|
||||
|
||||
function cacValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.cacUseEnable = cacUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (GT.callsignLookups.cacUseEnable == true)
|
||||
{
|
||||
cacLoadCallsigns();
|
||||
}
|
||||
cacSettingsDisplay();
|
||||
}
|
||||
|
||||
function oqrsLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
@ -309,6 +434,7 @@ function processoqrsCallsigns(buffer, flag)
|
|||
GT.oqrsCallsigns = JSON.parse(buffer);
|
||||
|
||||
GT.callsignLookups.oqrsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.oqrsLoadTimer != null) nodeTimers.clearTimeout(GT.oqrsLoadTimer);
|
||||
|
@ -419,6 +545,7 @@ function processeqslCallsigns(buffer, flag)
|
|||
GT.eqslCallsigns[lines[x].trim()] = true;
|
||||
}
|
||||
GT.callsignLookups.eqslLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.eqslLoadTimer != null) nodeTimers.clearTimeout(GT.eqslLoadTimer);
|
||||
|
@ -435,59 +562,71 @@ function processeqslCallsigns(buffer, flag)
|
|||
|
||||
function ulsLoadCallsigns()
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.ulsLastUpdate > 86400 * 7) ulsDownload();
|
||||
else
|
||||
{
|
||||
var ulsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsWhenDate = now + ulsWhenTimer;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
updateCallsignCount();
|
||||
if (!fs.existsSync(GT.ulsFile))
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
ulsDownload();
|
||||
}
|
||||
else
|
||||
{
|
||||
loadULSFile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateQSO()
|
||||
function stateCheck()
|
||||
{
|
||||
if (GT.ulsCallsignsCount > 0)
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
for (hash in GT.QSOhash)
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
var details = GT.QSOhash[hash];
|
||||
var lookupCall = false;
|
||||
|
||||
if ((details.cnty == null || details.state == null) && isKnownCallsignDXCC(details.dxcc))
|
||||
let details = GT.QSOhash[hash];
|
||||
if (isKnownCallsignUSplus(details.dxcc))
|
||||
{
|
||||
// Do County Lookup
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null && isKnownCallsignUSplus(details.dxcc))
|
||||
{
|
||||
if (!(details.cnty in GT.cntyToCounty))
|
||||
let lookupCall = false;
|
||||
if ((details.cnty == null || details.state == null))
|
||||
{
|
||||
if (details.cnty.indexOf(",") == -1)
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null)
|
||||
{
|
||||
if (!(details.cnty in GT.cntyToCounty))
|
||||
{
|
||||
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
|
||||
if (details.cnty.indexOf(",") == -1)
|
||||
{
|
||||
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
if (lookupCall == true)
|
||||
{
|
||||
lookupKnownCallsign(details);
|
||||
}
|
||||
}
|
||||
if (lookupCall)
|
||||
}
|
||||
}
|
||||
|
||||
if (GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
let details = GT.QSOhash[hash];
|
||||
if (details.dxcc == 1 && details.state == null)
|
||||
{
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
if (details.DEcall in GT.cacCallsigns)
|
||||
{
|
||||
lookupUsCallsign(details, true);
|
||||
details.state = "CA-" + GT.cacCallsigns[details.DEcall];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -496,23 +635,8 @@ function updateQSO()
|
|||
|
||||
function updateCallsignCount()
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("SELECT count(*) as cnt FROM calls", [],
|
||||
function (tx, results)
|
||||
{
|
||||
var len = results.rows.length, i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
|
||||
updateQSO();
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
GT.ulsCallsignsCount = Object.keys(GT.ulsCallsigns).length;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
||||
function ulsSettingsDisplay()
|
||||
|
@ -530,8 +654,6 @@ function ulsSettingsDisplay()
|
|||
|
||||
if (!GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null) nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
@ -540,7 +662,7 @@ function ulsSettingsDisplay()
|
|||
function ulsValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.ulsUseEnable = ulsUseEnable.checked;
|
||||
|
||||
|
||||
if (GT.callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
|
@ -548,11 +670,11 @@ function ulsValuesChanged()
|
|||
else
|
||||
{
|
||||
resetULSDatabase();
|
||||
ulsSettingsDisplay();
|
||||
ulsCountTd.innerHTML = 0;
|
||||
}
|
||||
saveCallsignSettings();
|
||||
|
||||
ulsSettingsDisplay();
|
||||
goProcessRoster();
|
||||
if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
@ -561,248 +683,106 @@ function ulsDownload()
|
|||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
ulsCountTd.innerHTML = 0;
|
||||
getChunkedBuffer(
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/callsigns/callsigns.txt",
|
||||
processulsCallsigns,
|
||||
ulsDownloadHandler,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function getChunkedBuffer(file_url, callback, flag, mode, port, cookie, errorHandler)
|
||||
{
|
||||
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,
|
||||
followAllRedirects: true,
|
||||
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,
|
||||
followAllRedirects: true,
|
||||
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 fread = 0;
|
||||
var cookies = null;
|
||||
if (typeof res.headers["set-cookie"] != "undefined")
|
||||
{
|
||||
cookies = res.headers["set-cookie"];
|
||||
}
|
||||
res
|
||||
.on("data", function (data)
|
||||
{
|
||||
var isEnd = false;
|
||||
fread += data.length;
|
||||
if (fread == fsize) isEnd = true;
|
||||
if (fileBuffer == null)
|
||||
{
|
||||
fileBuffer = callback(data, flag, cookies, true, isEnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd); // eslint-disable-line node/no-callback-literal
|
||||
}
|
||||
})
|
||||
.on("end", function () {})
|
||||
.on("error", function (e)
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Error downloading</i></b>";
|
||||
console.error("Got error: " + e.message);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
GT.ulsDatabase = openDatabase(
|
||||
"ulsDB",
|
||||
"1.0",
|
||||
"US Callsigns",
|
||||
50 * 1024 * 1024
|
||||
);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("CREATE TABLE IF NOT EXISTS calls (callsign TEXT PRIMARY KEY, zip, state)");
|
||||
});
|
||||
|
||||
function resetULSDatabase()
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
saveCallsignSettings();
|
||||
}
|
||||
|
||||
function processulsCallsigns(data, flag, cookies, starting, finished)
|
||||
function ulsDownloadHandler(data)
|
||||
{
|
||||
var buffer = String(data);
|
||||
var returnBuffer = "";
|
||||
fs.writeFileSync(GT.ulsFile, data);
|
||||
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
loadULSFile();
|
||||
}
|
||||
|
||||
function loadULSFile()
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
fs.readFile(GT.ulsFile, "utf-8", processulsCallsigns);
|
||||
}
|
||||
|
||||
function processulsCallsigns(error, buffer)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
console.log("File Read Error: " + error);
|
||||
}
|
||||
|
||||
if (buffer && buffer.length > 0)
|
||||
{
|
||||
var lines = null;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
if (buffer[buffer.length - 1] == "\n")
|
||||
var startPos = 0;
|
||||
var endPos = buffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
lines = buffer.split("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
var lastIndex = buffer.lastIndexOf("\n");
|
||||
returnBuffer = buffer.substring(lastIndex);
|
||||
lines = buffer.substring(0, lastIndex).split("\n");
|
||||
}
|
||||
|
||||
if (lines.length > 0)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
let eol = buffer.substring(startPos).indexOf("\n");
|
||||
if (eol > -1)
|
||||
{
|
||||
if (starting == true)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
tx.executeSql("delete from calls");
|
||||
}
|
||||
for (var x in lines)
|
||||
{
|
||||
if (lines[x].length)
|
||||
{
|
||||
++GT.ulsCallsignsCount;
|
||||
tx.executeSql("INSERT INTO calls (rowid, callsign, zip, state) VALUES (" + GT.ulsCallsignsCount + ",\"" + lines[x].substr(7) + "\",\"" + lines[x].substr(0, 5) + "\",\"" + lines[x].substr(5, 2) + "\")");
|
||||
if (GT.ulsCallsignsCount % 10000 == 0)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length;
|
||||
if (len == 1)
|
||||
{
|
||||
ulsCountTd.innerHTML = results.rows[0].cnt;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
lines = null;
|
||||
});
|
||||
let row = buffer.substring(startPos, startPos + eol);
|
||||
GT.ulsCallsigns[row.substring(7)] = row.substring(0, 7);
|
||||
startPos += eol + 1; // skip \n
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (finished == true)
|
||||
updateCallsignCount();
|
||||
ulsSettingsDisplay();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
|
||||
var ulsWhenTimer = 86400 * 7;
|
||||
GT.ulsWhenDate = ulsWhenTimer + now;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
ulsSettingsDisplay();
|
||||
updateQSO();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api
|
||||
var whenTimer = (86400 * 7) - (timeNowSec() - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, whenTimer * 1000);
|
||||
}
|
||||
|
||||
function lookupUsCallsign(object, writeState = false)
|
||||
function lookupKnownCallsign(object)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
if (object.DEcall in GT.ulsCallsigns)
|
||||
{
|
||||
let qry = "SELECT * FROM calls where callsign = \"" + object.DEcall + "\"";
|
||||
tx.executeSql(
|
||||
qry,
|
||||
[],
|
||||
function (tx, results)
|
||||
if (object.state == null)
|
||||
{
|
||||
object.state = "US-" + GT.ulsCallsigns[object.DEcall].substring(5);
|
||||
}
|
||||
object.zipcode = GT.ulsCallsigns[object.DEcall].substring(0, 5);
|
||||
|
||||
if (object.cnty == null && object.zipcode in GT.zipToCounty)
|
||||
{
|
||||
var counties = GT.zipToCounty[object.zipcode];
|
||||
if (counties.length > 1)
|
||||
{
|
||||
if (results.rows.length == 1)
|
||||
{
|
||||
if (object.state == null)
|
||||
{
|
||||
if (object.dxcc == 1)
|
||||
{
|
||||
object.state = "CA-" + results.rows[0].state;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.state = "US-" + results.rows[0].state;
|
||||
}
|
||||
if (writeState)
|
||||
{
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
object.zipcode = String(results.rows[0].zip);
|
||||
if (object.cnty == null && object.zipcode in GT.zipToCounty)
|
||||
{
|
||||
var counties = GT.zipToCounty[object.zipcode];
|
||||
if (counties.length > 1)
|
||||
{
|
||||
object.qual = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = true;
|
||||
}
|
||||
object.cnty = counties[0];
|
||||
save = true;
|
||||
|
||||
if (writeState)
|
||||
{
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
object.qual = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = true;
|
||||
}
|
||||
object.cnty = counties[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function downloadCtyDat()
|
||||
|
|
|
@ -98,6 +98,8 @@ var def_appSettings = {
|
|||
wsjtUdpPort: 0,
|
||||
workingCallsignEnable: false,
|
||||
workingCallsigns: {},
|
||||
workingGridEnable: false,
|
||||
workingGrids: {},
|
||||
workingDateEnable: false,
|
||||
workingDate: 0,
|
||||
qsoItemsPerPage: 100,
|
||||
|
@ -132,6 +134,9 @@ var def_mapSettings = {
|
|||
splitQSL: true,
|
||||
trafficDecode: true,
|
||||
usNexrad: false,
|
||||
timezonesEnable: 0,
|
||||
showAllGrids: false,
|
||||
trophyOverlay: 0,
|
||||
zoom: 4,
|
||||
mapTrans: 0.5
|
||||
};
|
||||
|
@ -141,12 +146,10 @@ var def_adifLogSettings = {
|
|||
buttonAdifCheckBox: false,
|
||||
buttonClubCheckBox: false,
|
||||
buttonLOTWCheckBox: false,
|
||||
buttonQRZCheckBox: false,
|
||||
buttonPsk24CheckBox: false
|
||||
buttonQRZCheckBox: false
|
||||
},
|
||||
startup: {
|
||||
loadAdifCheckBox: false,
|
||||
loadPsk24CheckBox: false,
|
||||
loadQRZCheckBox: false,
|
||||
loadLOTWCheckBox: false,
|
||||
loadClubCheckBox: false,
|
||||
|
@ -186,8 +189,8 @@ var def_adifLogSettings = {
|
|||
},
|
||||
downloads: {},
|
||||
lastFetch: {
|
||||
lotw_qso: "1970-01-01",
|
||||
lotw_qsl: "1970-01-01"
|
||||
lotw_qso: 0,
|
||||
lotw_qsl: 0
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -267,6 +270,9 @@ var def_callsignLookups = {
|
|||
ulsUseEnable: true,
|
||||
ulsWeeklyEnable: true,
|
||||
ulsLastUpdate: 0,
|
||||
cacUseEnable: true,
|
||||
cacWeeklyEnable: true,
|
||||
cacLastUpdate: 0,
|
||||
oqrsUseEnable: false,
|
||||
oqrsWeeklyEnable: false,
|
||||
oqrsLastUpdate: 0
|
||||
|
@ -316,7 +322,6 @@ var def_qso = {
|
|||
px: null,
|
||||
qso: true,
|
||||
qual: false,
|
||||
rect: null,
|
||||
RSTrecv: "",
|
||||
RSTsent: "",
|
||||
satName: "",
|
||||
|
@ -324,7 +329,7 @@ var def_qso = {
|
|||
time: 0,
|
||||
vucc_grids: [],
|
||||
worked: false,
|
||||
wspr: null,
|
||||
zipcode: null,
|
||||
zone: null
|
||||
zone: null,
|
||||
hash: null
|
||||
};
|
||||
|
|
2665
package.nw/lib/gt.js
2665
package.nw/lib/gt.js
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,584 @@
|
|||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
// gtCommon.js is common functions used by gt.js , adifWorker.js, trackerWorker.js and others
|
||||
// var GT must be initiliazed before loading this script.
|
||||
|
||||
function validateGridFromString(inputText)
|
||||
{
|
||||
var validGrid = false;
|
||||
if (inputText.length == 4 || inputText.length == 6)
|
||||
{
|
||||
var LETTERS = inputText.substr(0, 2);
|
||||
var NUMBERS = inputText.substr(2, 2);
|
||||
if (/^[A-R]+$/.test(LETTERS) && /^[0-9]+$/.test(NUMBERS))
|
||||
{
|
||||
validGrid = true;
|
||||
}
|
||||
if (validGrid && inputText.length == 6)
|
||||
{
|
||||
var LETTERS_SUB = inputText.substr(4, 2);
|
||||
if (!(/^[A-Xa-x]+$/.test(LETTERS_SUB)))
|
||||
{
|
||||
validGrid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return validGrid;
|
||||
}
|
||||
|
||||
function isKnownCallsignDXCC(dxcc)
|
||||
{
|
||||
return (dxcc in GT.callsignDatabaseDXCC);
|
||||
}
|
||||
|
||||
function isKnownCallsignUS(dxcc)
|
||||
{
|
||||
return (dxcc in GT.callsignDatabaseUS);
|
||||
}
|
||||
|
||||
function isKnownCallsignUSplus(dxcc)
|
||||
{
|
||||
return (dxcc in GT.callsignDatabaseUSplus);
|
||||
}
|
||||
|
||||
function cqZoneFromCallsign(insign, dxcc)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToCQzone) { return GT.directCallToCQzone[callsign]; }
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToCQzone)
|
||||
{
|
||||
return GT.prefixToCQzone[callsign.substr(0, x)];
|
||||
}
|
||||
}
|
||||
|
||||
if (dxcc > 0)
|
||||
{
|
||||
return GT.dxccInfo[dxcc].cqzone;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function ituZoneFromCallsign(insign, dxcc)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToITUzone) { return GT.directCallToITUzone[callsign]; }
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToITUzone)
|
||||
{
|
||||
return GT.prefixToITUzone[callsign.substr(0, x)];
|
||||
}
|
||||
}
|
||||
|
||||
if (dxcc > 0)
|
||||
{
|
||||
return GT.dxccInfo[dxcc].ituzone;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getWpx(callsign)
|
||||
{
|
||||
var prefix = null;
|
||||
|
||||
if (callsign.includes("/"))
|
||||
// Handle in the future?
|
||||
{ return null; }
|
||||
if (!/\d/.test(callsign))
|
||||
// Insert 0, never seen this
|
||||
{ return null; }
|
||||
|
||||
var end = callsign.length;
|
||||
var foundPrefix = false;
|
||||
var prefixEnd = 1;
|
||||
while (prefixEnd != end)
|
||||
{
|
||||
if (/\d/.test(callsign.charAt(prefixEnd)))
|
||||
{
|
||||
while (prefixEnd + 1 != end && /\d/.test(callsign.charAt(prefixEnd + 1))) { prefixEnd++; }
|
||||
foundPrefix = true;
|
||||
break;
|
||||
}
|
||||
prefixEnd++;
|
||||
}
|
||||
|
||||
if (foundPrefix) prefix = callsign.substr(0, prefixEnd + 1);
|
||||
|
||||
return String(prefix);
|
||||
}
|
||||
|
||||
GT.ancPrefixes = ["P", "M", "MM", "AM", "A", "NWS"];
|
||||
|
||||
function callsignToDxcc(insign)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToDXCC) { return Number(GT.directCallToDXCC[callsign]); }
|
||||
|
||||
if (callsign.includes("/"))
|
||||
{
|
||||
var parts = callsign.split("/");
|
||||
var end = parts.length - 1;
|
||||
if (GT.ancPrefixes.includes(parts[end]))
|
||||
{
|
||||
if (parts[end].toUpperCase() == "MM")
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
parts.pop();
|
||||
end = parts.length - 1;
|
||||
}
|
||||
if (end)
|
||||
{
|
||||
if (isNaN(parts[end]))
|
||||
{
|
||||
if (parts[1].length > parts[0].length)
|
||||
{
|
||||
callsign = parts[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (callsignToDxcc(parts[1]) != -1) callsign = parts[1];
|
||||
else callsign = parts[0];
|
||||
}
|
||||
}
|
||||
else callsign = parts[0];
|
||||
}
|
||||
else callsign = parts[0];
|
||||
|
||||
if (callsign in GT.directCallToDXCC) { return Number(GT.directCallToDXCC[callsign]); }
|
||||
}
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToMap)
|
||||
{
|
||||
return Number(GT.dxccInfo[GT.prefixToMap[callsign.substr(0, x)]].dxcc);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function initQSOdata()
|
||||
{
|
||||
GT.tracker = {};
|
||||
GT.tracker.worked = {};
|
||||
GT.tracker.confirmed = {};
|
||||
|
||||
GT.tracker.worked.call = {};
|
||||
GT.tracker.worked.grid = {};
|
||||
GT.tracker.worked.field = {};
|
||||
GT.tracker.worked.dxcc = {};
|
||||
GT.tracker.worked.cqz = {};
|
||||
GT.tracker.worked.ituz = {};
|
||||
GT.tracker.worked.state = {};
|
||||
GT.tracker.worked.px = {};
|
||||
GT.tracker.worked.cnty = {};
|
||||
GT.tracker.worked.cont = {};
|
||||
GT.tracker.worked.pota = {};
|
||||
|
||||
GT.tracker.confirmed.call = {};
|
||||
GT.tracker.confirmed.grid = {};
|
||||
GT.tracker.confirmed.field = {};
|
||||
GT.tracker.confirmed.dxcc = {};
|
||||
GT.tracker.confirmed.cqz = {};
|
||||
GT.tracker.confirmed.ituz = {};
|
||||
GT.tracker.confirmed.state = {};
|
||||
GT.tracker.confirmed.px = {};
|
||||
GT.tracker.confirmed.cnty = {};
|
||||
GT.tracker.confirmed.cont = {};
|
||||
GT.tracker.confirmed.pota = {};
|
||||
}
|
||||
|
||||
function trackQSO(details, currentYear)
|
||||
{
|
||||
let qsoDate = new Date(1970, 0, 1); qsoDate.setSeconds(details.time);
|
||||
let isCurrentYear = (qsoDate.getFullYear() == currentYear);
|
||||
let dayAsString = String(parseInt(details.time / 86400));
|
||||
let fourGrid = details.grid.substring(0, 4);
|
||||
let isDigi = details.digital;
|
||||
let isPhone = details.phone;
|
||||
|
||||
GT.tracker.worked.call[details.DEcall + details.band + details.mode] = true;
|
||||
GT.tracker.worked.call[details.DEcall] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.mode] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.band] = true;
|
||||
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.call[details.DEcall + "dg"] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.band + "dg"] = true;
|
||||
}
|
||||
|
||||
if (fourGrid != "")
|
||||
{
|
||||
GT.tracker.worked.grid[fourGrid] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.mode] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band + details.mode] = true;
|
||||
|
||||
let field = fourGrid.substring(0, 2);
|
||||
|
||||
GT.tracker.worked.field[field] = true;
|
||||
GT.tracker.worked.field[field + details.mode] = true;
|
||||
GT.tracker.worked.field[field + details.band] = true;
|
||||
GT.tracker.worked.field[field + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.grid[fourGrid + "dg"] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band + "dg"] = true;
|
||||
|
||||
GT.tracker.worked.field[field + "dg"] = true;
|
||||
GT.tracker.worked.field[field + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.ituz)
|
||||
{
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|"] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.mode] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.ituz[details.ituz + "|dg"] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cqz)
|
||||
{
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|"] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.mode] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.cqz[details.cqz + "|dg"] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isCurrentYear)
|
||||
{
|
||||
GT.tracker.worked.cqz[`${details.cqz}-${currentYear}`] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.dxcc > 0)
|
||||
{
|
||||
var sDXCC = String(details.dxcc);
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|"] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.mode] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.dxcc[sDXCC + "|dg"] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.worked.dxcc[sDXCC + "|ph"] = true;
|
||||
}
|
||||
if (isCurrentYear)
|
||||
{
|
||||
GT.tracker.worked.dxcc[`${sDXCC}-${currentYear}`] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.px)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.worked.px[details.px] = details.hash;
|
||||
GT.tracker.worked.px[details.px + details.mode] = true;
|
||||
GT.tracker.worked.px[details.px + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + "dg"] = true;
|
||||
GT.tracker.worked.px[details.px + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + "ph"] = true;
|
||||
GT.tracker.worked.px[details.px + details.band + "ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cont)
|
||||
{
|
||||
GT.tracker.worked.cont[details.cont + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.worked.cont[details.cont] = details.hash;
|
||||
GT.tracker.worked.cont[details.cont + details.mode] = true;
|
||||
GT.tracker.worked.cont[details.cont + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.cont[details.cont + "dg"] = true;
|
||||
GT.tracker.worked.cont[details.cont + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.state)
|
||||
{
|
||||
GT.tracker.worked.state[details.state] = true;
|
||||
GT.tracker.worked.state[details.state + details.mode] = true;
|
||||
GT.tracker.worked.state[details.state + details.band] = true;
|
||||
GT.tracker.worked.state[details.state + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.worked.state[details.state + "dg"] =
|
||||
GT.tracker.worked.state[details.state + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cnty)
|
||||
{
|
||||
GT.tracker.worked.cnty[details.cnty] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.mode] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.worked.cnty[details.cnty + "dg"] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.pota)
|
||||
{
|
||||
var potas = details.pota.split(",");
|
||||
for (let x in potas)
|
||||
{
|
||||
let pota = potas[x].trim();
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota + details.mode] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota + details.band] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota + details.band + details.mode] = true;
|
||||
|
||||
GT.tracker.worked.pota[dayAsString + pota + details.band + details.mode] = true;
|
||||
|
||||
GT.tracker.worked.pota[pota] = true;
|
||||
GT.tracker.worked.pota[pota + details.mode] = true;
|
||||
GT.tracker.worked.pota[pota + details.band] = true;
|
||||
GT.tracker.worked.pota[pota + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota + "dg"] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + pota + details.band + "dg"] = true;
|
||||
|
||||
GT.tracker.worked.pota[pota + "dg"] = true;
|
||||
GT.tracker.worked.pota[pota + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (details.confirmed == true)
|
||||
{
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.mode] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.call[details.DEcall + "dg"] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band + "dg"] = true;
|
||||
}
|
||||
|
||||
if (fourGrid != "")
|
||||
{
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.mode] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.grid[fourGrid + "dg"] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
if (details.ituz && details.ituz.length > 0)
|
||||
{
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|"] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|dg"] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
if (details.cqz && details.cqz.length > 0)
|
||||
{
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|"] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|dg"] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.dxcc > 0)
|
||||
{
|
||||
var sDXCC = String(details.dxcc);
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|"] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|dg"] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.state)
|
||||
{
|
||||
GT.tracker.confirmed.state[details.state] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.mode] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.confirmed.state[details.state + "dg"] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cnty)
|
||||
{
|
||||
GT.tracker.confirmed.cnty[details.cnty] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.mode] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.confirmed.cnty[details.cnty + "dg"] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.px)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.confirmed.px[details.px] = details.hash;
|
||||
GT.tracker.confirmed.px[details.px + details.mode] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + "dg"] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + "ph"] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band + "ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cont)
|
||||
{
|
||||
GT.tracker.confirmed.cont[details.cont + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.confirmed.cont[details.cont] = details.hash;
|
||||
GT.tracker.confirmed.cont[details.cont + details.mode] = true;
|
||||
GT.tracker.confirmed.cont[details.cont + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.cont[details.cont + "dg"] = true;
|
||||
GT.tracker.confirmed.cont[details.cont + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
function bitwise(str){
|
||||
var hash = 0;
|
||||
if (str.length == 0) return hash;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
var ch = str.charCodeAt(i);
|
||||
hash = ((hash<<5)-hash) + ch;
|
||||
hash = hash & hash; // Convert to 32bit integer
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
// convert 10 binary to customized binary, max is 62
|
||||
function binaryTransfer(integer, binary) {
|
||||
binary = binary || 62;
|
||||
var stack = [];
|
||||
var num;
|
||||
var result = '';
|
||||
var sign = integer < 0 ? 'Z' : '';
|
||||
|
||||
function table (num) {
|
||||
var t = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
return t[num];
|
||||
}
|
||||
|
||||
integer = Math.abs(integer);
|
||||
|
||||
while (integer >= binary) {
|
||||
num = integer % binary;
|
||||
integer = Math.floor(integer / binary);
|
||||
stack.push(table(num));
|
||||
}
|
||||
|
||||
if (integer > 0) {
|
||||
stack.push(table(integer));
|
||||
}
|
||||
|
||||
for (var i = stack.length - 1; i >= 0; i--) {
|
||||
result += stack[i];
|
||||
}
|
||||
|
||||
return sign + result;
|
||||
}
|
||||
/**
|
||||
* why choose 61 binary, because we need the last element char to replace the minus sign
|
||||
* eg: -aGtzd will be ZaGtzd
|
||||
*/
|
||||
function unique (text) {
|
||||
return binaryTransfer(bitwise(text), 62);
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -171,8 +171,8 @@ function gtClosedSocket()
|
|||
GT.gtState = ChatState.none;
|
||||
}
|
||||
|
||||
// Connect 15 seconds after startup
|
||||
GT.lastConnectAttempt = parseInt(Date.now() / 1000) - 15;
|
||||
// Connect 30 seconds after startup
|
||||
GT.lastConnectAttempt = parseInt(Date.now() / 1000) - 30;
|
||||
|
||||
function gtCanConnect()
|
||||
{
|
||||
|
|
|
@ -27,8 +27,7 @@ function changeLocale()
|
|||
{
|
||||
GT.appSettings.locale = languageLocale.value;
|
||||
renderI18n(GT.appSettings.locale);
|
||||
saveAppSettings();
|
||||
chrome.runtime.reload();
|
||||
saveAndCloseApp(true);
|
||||
}
|
||||
|
||||
function loadChildWindowI18n()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -54,6 +54,13 @@ GT.gtParkOnInstance = new ol.style.Text({
|
|||
justify: "center"
|
||||
});
|
||||
|
||||
GT.gtParkWorkedOnInstance = new ol.style.Text({
|
||||
text: "🌄",
|
||||
font: "20px Verdana",
|
||||
textAlign: "center",
|
||||
justify: "center"
|
||||
});
|
||||
|
||||
GT.gtParkOffInstance = new ol.style.Text({
|
||||
text: "🌲",
|
||||
font: "20px Verdana",
|
||||
|
@ -136,7 +143,7 @@ function redrawParks()
|
|||
{
|
||||
GT.layerSources.pota.clear();
|
||||
|
||||
if (GT.appSettings.potaEnabled == 1 && GT.appSettings.potaMapEnabled)
|
||||
if (GT.appSettings.potaEnabled == 1 && GT.appSettings.potaMapEnabled && GT.mapSettings.offlineMode == false)
|
||||
{
|
||||
GT.pota.mapParks = {};
|
||||
makeParkFeatures();
|
||||
|
@ -147,6 +154,10 @@ function makeParkFeatures()
|
|||
{
|
||||
try
|
||||
{
|
||||
let now = timeNowSec();
|
||||
let day = parseInt(now / 86400);
|
||||
let dayAsString = String(day);
|
||||
|
||||
for (const park in GT.pota.parkSpots)
|
||||
{
|
||||
if (park in GT.pota.parks)
|
||||
|
@ -163,7 +174,15 @@ function makeParkFeatures()
|
|||
{
|
||||
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
let hash = dayAsString + park + report.band + report.mode;
|
||||
if (hash in GT.tracker.worked.pota)
|
||||
{
|
||||
parkIcon = GT.gtParkWorkedOnInstance;
|
||||
}
|
||||
else
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
}
|
||||
zIndex = 2;
|
||||
break;
|
||||
}
|
||||
|
@ -278,7 +297,7 @@ function reportPotaQSO(record)
|
|||
activator: record.CALL,
|
||||
spotter: record.STATION_CALLSIGN,
|
||||
frequency: record.FREQ,
|
||||
reference: record.POTA,
|
||||
reference: record.POTA_REF,
|
||||
mode: record.MODE,
|
||||
source: "GT",
|
||||
comments: record.COMMENT ? record.COMMENT : "",
|
||||
|
@ -353,11 +372,24 @@ function addParkSpotFeature(park, report)
|
|||
{
|
||||
let parkIcon = GT.gtParkOffInstance;
|
||||
let zIndex = 1;
|
||||
|
||||
let now = timeNowSec();
|
||||
let day = parseInt(now / 86400);
|
||||
let dayAsString = String(day);
|
||||
|
||||
for (let instance in GT.instances)
|
||||
{
|
||||
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
let hash = dayAsString + park + report.band + report.mode;
|
||||
if (hash in GT.tracker.worked.pota)
|
||||
{
|
||||
parkIcon = GT.gtParkWorkedOnInstance;
|
||||
}
|
||||
else
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
}
|
||||
zIndex = 2;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
const g_proto_bands = [
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -15,8 +15,6 @@ CR.blockedGrid = {};
|
|||
CR.blockedCQz = {};
|
||||
CR.blockedITUz = {};
|
||||
CR.scriptReport = {};
|
||||
CR.worked = {};
|
||||
CR.confirmed = {};
|
||||
CR.modes = {};
|
||||
CR.modes_phone = {};
|
||||
CR.currentUSCallsigns = null;
|
||||
|
@ -338,20 +336,17 @@ function writeRosterSettings()
|
|||
|
||||
function isKnownCallsignDXCC(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseDXCC) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseDXCC);
|
||||
}
|
||||
|
||||
function isKnownCallsignUS(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseUS) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseUS);
|
||||
}
|
||||
|
||||
function isKnownCallsignUSplus(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseUSplus) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseUSplus);
|
||||
}
|
||||
|
||||
function timeNowSec()
|
||||
|
@ -1431,8 +1426,6 @@ CR.tracker = {};
|
|||
|
||||
function updateWorked()
|
||||
{
|
||||
CR.worked = window.opener.GT.tracker.worked;
|
||||
CR.confirmed = window.opener.GT.tracker.confirmed;
|
||||
CR.modes = window.opener.GT.modes;
|
||||
CR.modes_phone = window.opener.GT.modes_phone;
|
||||
CR.tracker = window.opener.GT.tracker;
|
||||
|
|
|
@ -31,20 +31,20 @@ function prepareRosterSettings()
|
|||
|
||||
if (CR.rosterSettings.huntNeed == "mixed")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.confirmed;
|
||||
rosterSettings.workedIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.confirmed;
|
||||
rosterSettings.workedIndex = CR.tracker.worked;
|
||||
rosterSettings.layeredMode = LAYERED_MODE_FOR[String(CR.rosterSettings.reference)];
|
||||
}
|
||||
else if (CR.rosterSettings.huntNeed == "worked")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.worked;
|
||||
rosterSettings.workedIndex = false;
|
||||
rosterSettings.layeredMode = false;
|
||||
}
|
||||
else if (CR.rosterSettings.huntNeed == "confirmed")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.confirmed;
|
||||
rosterSettings.workedIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.confirmed;
|
||||
rosterSettings.workedIndex = CR.tracker.worked;
|
||||
rosterSettings.layeredMode = false;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -42,6 +42,20 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (CR.rosterSettings.columns.Spot == true)
|
||||
{
|
||||
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band);
|
||||
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
|
||||
if (rosterSettings.now - callObj.age > CR.rosterSettings.rosterTime)
|
||||
{
|
||||
entry.tx = false;
|
||||
|
@ -146,24 +160,6 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (CR.rosterSettings.columns.Spot == true)
|
||||
{
|
||||
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band);
|
||||
if (callObj.spot == null)
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
|
||||
let usesOneOf = 0;
|
||||
let checkUses = 0;
|
||||
|
||||
|
@ -217,12 +213,12 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
}
|
||||
|
||||
let hash = hashMaker(call, callObj, CR.rosterSettings.reference);
|
||||
if (rosterSettings.callMode == "worked" && hash in CR.worked.call)
|
||||
if (rosterSettings.callMode == "worked" && hash in CR.tracker.worked.call)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (rosterSettings.callMode == "confirmed" && hash in CR.confirmed.call)
|
||||
if (rosterSettings.callMode == "confirmed" && hash in CR.tracker.confirmed.call)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
|
|
|
@ -14,7 +14,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
|
||||
const currentYear = new Date().getFullYear();
|
||||
const currentYearSuffix = `’${currentYear - 2000}`;
|
||||
const potaEnabled = (window.opener.GT.appSettings.potaEnabled == 1);
|
||||
const potaEnabled = (window.opener.GT.appSettings.potaEnabled == 1 && window.opener.GT.mapSettings.offlineMode == false);
|
||||
// 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?
|
||||
|
||||
|
@ -124,13 +124,13 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
let hash = callsign + workHashSuffix;
|
||||
|
||||
// Call worked in current logbook settings, regardless of hunting mode
|
||||
if (hash in CR.worked.call)
|
||||
if (hash in CR.tracker.worked.call)
|
||||
{
|
||||
callObj.callFlags.worked = true;
|
||||
didWork = true;
|
||||
callConf = `${unconf}${call}${inversionAlpha};`;
|
||||
|
||||
if (hash in CR.confirmed.call)
|
||||
if (hash in CR.tracker.confirmed.call)
|
||||
{
|
||||
callObj.callFlags.confirmed = true;
|
||||
callPointer = "text-decoration: line-through; ";
|
||||
|
@ -392,57 +392,53 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
|
||||
// Hunting for US States
|
||||
if ((huntState.checked || awardTrackerOverrides.states) && window.opener.GT.callsignLookups.ulsUseEnable == true)
|
||||
// Hunting for Known States
|
||||
if (huntState.checked || awardTrackerOverrides.states)
|
||||
{
|
||||
let stateSearch = callObj.state;
|
||||
let finalDxcc = callObj.dxcc;
|
||||
if (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6)
|
||||
if (stateSearch in window.opener.GT.StateData)
|
||||
{
|
||||
if (stateSearch in window.opener.GT.StateData)
|
||||
let hash = stateSearch + workHashSuffix;
|
||||
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
|
||||
|
||||
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
|
||||
{
|
||||
let hash = stateSearch + workHashSuffix;
|
||||
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("state");
|
||||
|
||||
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("state");
|
||||
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.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};`;
|
||||
}
|
||||
callObj.hunting.state = "worked-and-mixed";
|
||||
stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`;
|
||||
stateBg = `${state}${layeredInversionAlpha}`;
|
||||
state = bold;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed";
|
||||
stateBg = `${state}${layeredAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed-worked";
|
||||
stateConf = `${unconf}${state}${layeredAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.hunting.state = "hunted";
|
||||
stateBg = `${state}${inversionAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
callObj.hunting.state = "worked";
|
||||
stateConf = `${unconf}${state}${inversionAlpha};`;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed";
|
||||
stateBg = `${state}${layeredAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed-worked";
|
||||
stateConf = `${unconf}${state}${layeredAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.hunting.state = "hunted";
|
||||
stateBg = `${state}${inversionAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -504,16 +500,26 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
if (potaEnabled && huntPOTA.checked == true && callObj.pota)
|
||||
{
|
||||
let hash = CR.dayAsString + callsign + callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
|
||||
let parkHash = callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
// POTA is only in the worked list
|
||||
if (!(hash in CR.worked.pota))
|
||||
if (!(hash in CR.tracker.worked.pota))
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("pota");
|
||||
|
||||
callObj.hunting.pota = "hunted";
|
||||
potaBg = `${pota}${inversionAlpha};`;
|
||||
pota = bold;
|
||||
if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
potaBg = `${pota}${inversionAlpha};`;
|
||||
pota = bold;
|
||||
}
|
||||
}
|
||||
else if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ function renderRoster(callRoster, rosterSettings)
|
|||
columnOverrides.OAMS = false;
|
||||
}
|
||||
|
||||
if (window.opener.GT.appSettings.potaEnabled == 1)
|
||||
if (window.opener.GT.appSettings.potaEnabled == 1 && window.opener.GT.mapSettings.offlineMode == false)
|
||||
{
|
||||
huntingMatrixPotaDiv.style.display = "";
|
||||
}
|
||||
|
|
|
@ -148,7 +148,8 @@ const ROSTER_COLUMNS = {
|
|||
tableData: (callObj) => ({
|
||||
align: "center",
|
||||
rawAttrs: callObj.style.state,
|
||||
html: callObj.state ? callObj.state.substr(3) : " "
|
||||
html: callObj.state ? callObj.state.substr(3) : " ",
|
||||
title: (callObj.state in window.opener.GT.StateData) ? window.opener.GT.StateData[callObj.state].name : null
|
||||
})
|
||||
},
|
||||
|
||||
|
|
|
@ -20,8 +20,6 @@ function sendAlerts(callRoster, rosterSettings)
|
|||
CR.scriptReport[call].distance = (callObj.distance > 0) ? parseInt(callObj.distance * MyCircle.validateRadius(window.opener.distanceUnit.value)) : 0;
|
||||
|
||||
delete CR.scriptReport[call].DEcall;
|
||||
CR.scriptReport[call].rect = null;
|
||||
delete CR.scriptReport[call].rect;
|
||||
delete CR.scriptReport[call].style;
|
||||
delete CR.scriptReport[call].wspr;
|
||||
delete CR.scriptReport[call].qso;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -125,10 +125,16 @@ function validateCallByElement(elementString)
|
|||
|
||||
function init()
|
||||
{
|
||||
openInfoTab(event, "workedBoxDiv", "showWorkedBox");
|
||||
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
|
||||
loadChildWindowI18n();
|
||||
}
|
||||
|
||||
function searchWorked(dxcc, band, mode)
|
||||
{
|
||||
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
|
||||
window.opener.searchWorked(dxcc, band, mode);
|
||||
}
|
||||
|
||||
function addTextToClipboard(data)
|
||||
{
|
||||
navigator.clipboard.writeText(data);
|
||||
|
@ -189,6 +195,10 @@ function Resize()
|
|||
|
||||
function reloadInfo(bandOrMode)
|
||||
{
|
||||
if (workedBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWorkedBox();
|
||||
}
|
||||
if (statBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showStatBox(false);
|
||||
|
|
|
@ -157,6 +157,38 @@ html, body {
|
|||
font-size: larger;
|
||||
}
|
||||
|
||||
.absoluteCenterDiv {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: #000000;
|
||||
-webkit-border-radius: 6px;
|
||||
vertical-align: top;
|
||||
font-size: larger;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.busyDiv {
|
||||
border: 1px solid rgb(153, 153, 153);
|
||||
-webkit-border-radius: 4px;
|
||||
background: linear-gradient(90deg, #ff6600, blue);
|
||||
background-size: 200% 200%;
|
||||
animation: AnimationQsoQsl 1s ease infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationQsoQsl {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
.myFlagtipEnd {
|
||||
vertical-align: top;
|
||||
-webkit-border-radius: 6px;
|
||||
|
@ -271,25 +303,6 @@ html, body {
|
|||
outline: none;
|
||||
}
|
||||
|
||||
.QsoQslActive {
|
||||
background: linear-gradient(90deg, yellow, blue);
|
||||
background-size: 200% 200%;
|
||||
animation: AnimationQsoQsl 1s ease infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationQsoQsl {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.roundBorderDEInfo {
|
||||
border: 1px solid white;
|
||||
-webkit-border-radius: 6px;
|
||||
|
@ -677,7 +690,7 @@ a {
|
|||
font-weight: bold;
|
||||
border-top-right-radius: 6px;
|
||||
border-top-left-radius: 6px;
|
||||
margin-left: 5px;
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
color: #eee;
|
||||
background: black;
|
||||
|
|
|
@ -84,60 +84,6 @@ function latLonToGridSquare(param1,param2, width = 4){
|
|||
}
|
||||
}
|
||||
|
||||
function bitwise(str){
|
||||
var hash = 0;
|
||||
if (str.length == 0) return hash;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
var ch = str.charCodeAt(i);
|
||||
hash = ((hash<<5)-hash) + ch;
|
||||
hash = hash & hash; // Convert to 32bit integer
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
// convert 10 binary to customized binary, max is 62
|
||||
function binaryTransfer(integer, binary) {
|
||||
binary = binary || 62;
|
||||
var stack = [];
|
||||
var num;
|
||||
var result = '';
|
||||
var sign = integer < 0 ? '-' : '';
|
||||
|
||||
function table (num) {
|
||||
var t = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
return t[num];
|
||||
}
|
||||
|
||||
integer = Math.abs(integer);
|
||||
|
||||
while (integer >= binary) {
|
||||
num = integer % binary;
|
||||
integer = Math.floor(integer / binary);
|
||||
stack.push(table(num));
|
||||
}
|
||||
|
||||
if (integer > 0) {
|
||||
stack.push(table(integer));
|
||||
}
|
||||
|
||||
for (var i = stack.length - 1; i >= 0; i--) {
|
||||
result += stack[i];
|
||||
}
|
||||
|
||||
return sign + result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* why choose 61 binary, because we need the last element char to replace the minus sign
|
||||
* eg: -aGtzd will be ZaGtzd
|
||||
*/
|
||||
function unique (text) {
|
||||
var id = binaryTransfer(bitwise(text), 61);
|
||||
return id.replace('-', 'Z');
|
||||
}
|
||||
|
||||
|
||||
var MyCircle = {
|
||||
|
||||
validateRadius: function(unit) {
|
||||
|
@ -215,10 +161,12 @@ if (typeof module != 'undefined' && module.exports) {
|
|||
|
||||
function XML2jsobj(node) {
|
||||
|
||||
var data = {};
|
||||
var data = null;
|
||||
|
||||
// append a value
|
||||
function Add(name, value) {
|
||||
if (value == null) return;
|
||||
if (data == null) data = {};
|
||||
if (data[name]) {
|
||||
if (data[name].constructor != Array) {
|
||||
data[name] = [data[name]];
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
var GT = {};
|
||||
|
||||
importScripts("protos.js");
|
||||
importScripts("gtCommon.js");
|
||||
|
||||
GT.workerFunctions =
|
||||
{
|
||||
process: processQSOs
|
||||
};
|
||||
|
||||
onmessage = (event) =>
|
||||
{
|
||||
if ("type" in event.data)
|
||||
{
|
||||
if (event.data.type in GT.workerFunctions)
|
||||
{
|
||||
GT.workerFunctions[event.data.type](event.data);
|
||||
}
|
||||
else console.log("trackerWorker: unknown event type : " + event.data.type);
|
||||
}
|
||||
else console.log("trackerWorker: no event type");
|
||||
};
|
||||
|
||||
function processQSOs(task)
|
||||
{
|
||||
initQSOdata();
|
||||
var currentYear = new Date().getFullYear();
|
||||
for (let hash in task.QSOhash)
|
||||
{
|
||||
trackQSO(task.QSOhash[hash], currentYear);
|
||||
}
|
||||
var task = {};
|
||||
task.type = "processed";
|
||||
task.tracker = GT.tracker;
|
||||
postMessage(task);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "GridTracker",
|
||||
"product_string_do_not_use": "gridtracker",
|
||||
"version": "1.23.1217",
|
||||
"version": "1.24.0512",
|
||||
"betaVersion": "",
|
||||
"description": "GridTracker: An Amateur Radio Companion",
|
||||
"author": "GridTracker.org",
|
||||
|
@ -31,7 +31,7 @@
|
|||
],
|
||||
"mac": {
|
||||
"icon": "gridview.icns",
|
||||
"copyright": "Copyright (c) 2023 GridTracker.org",
|
||||
"copyright": "Copyright (c) 2024 GridTracker.org",
|
||||
"plistStrings": {
|
||||
"CFBundleIdentifier": "org.gridtracker.gridtracker",
|
||||
"CFBundleDocumentTypes": []
|
||||
|
@ -39,7 +39,7 @@
|
|||
},
|
||||
"win": {
|
||||
"icon": "gridview.ico",
|
||||
"copyright": "Copyright (c) 2023 GridTracker.org"
|
||||
"copyright": "Copyright (c) 2024 GridTracker.org"
|
||||
},
|
||||
"nsis": {
|
||||
"installDirectory": "$PROGRAMFILES\\${_APPNAME}",
|
||||
|
|
|
@ -65,7 +65,7 @@ VIAddVersionKey CompanyName "${COMPANY}"
|
|||
VIAddVersionKey CompanyWebsite "${URL}"
|
||||
VIAddVersionKey FileVersion "${VERSION}"
|
||||
VIAddVersionKey FileDescription "GridTracker"
|
||||
VIAddVersionKey LegalCopyright "2023 GridTracker.org"
|
||||
VIAddVersionKey LegalCopyright "2024 GridTracker.org"
|
||||
InstallDirRegKey HKLM "${REGKEY}" Path
|
||||
ShowUninstDetails nevershow
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue