kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Porównaj commity
34 Commity
v1.23.1226
...
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 |
|
@ -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,27 +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
|
||||
- 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
|
||||
|
@ -36,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
|
||||
|
@ -54,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
|
||||
|
@ -75,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
|
||||
|
@ -97,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
|
||||
|
@ -169,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.1226
|
||||
Version: 1.24.0512
|
||||
Release: 1%{?dist}
|
||||
BuildArch: noarch
|
||||
Source0: {{{ git_dir_pack }}}
|
||||
|
@ -40,6 +40,25 @@ 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
|
||||
|
|
|
@ -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>
|
||||
|
@ -1389,14 +1395,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td id="cacUpdatedTd">Never</td>
|
||||
<td id="cacCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Australia Callsigns</td>
|
||||
<td>
|
||||
<input type="checkbox" id="ausUseEnable" onclick="ausValuesChanged();" />
|
||||
</td>
|
||||
<td id="ausUpdatedTd">Never</td>
|
||||
<td id="ausCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.lookup.db.LoTW">Logbook of The World</td>
|
||||
<td>
|
||||
|
@ -1670,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>
|
||||
|
@ -2235,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>
|
||||
|
@ -3243,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
|
@ -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
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": "…此對話不再可用…",
|
||||
|
@ -833,7 +833,7 @@
|
|||
"gt.ITUZoneBox.Worked": "曾通聯的 ITU分區",
|
||||
"gt.WASWACBox.WAC": "曾通聯的所有大洲",
|
||||
"gt.WASWACBox.WAS": "曾通聯的所有美國州份",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"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": "洲大陆/美国州/WACP",
|
||||
"stats.tabs.WASWAC": "洲大陆/美国州/加拿大省",
|
||||
"stats.tabs.live": "实时",
|
||||
"stats.noDecodes": "还没有解码",
|
||||
"stats.viewing": "检视",
|
||||
|
@ -833,7 +833,7 @@
|
|||
"gt.ITUZoneBox.Worked": "通联过的 ITU分区",
|
||||
"gt.WASWACBox.WAC": "通联过的所有大洲",
|
||||
"gt.WASWACBox.WAS": "通联过的所有美国州",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"gt.WASWACBox.WACP": "通联过的所有加拿大省",
|
||||
"gt.displayItemsList.Worked": "通联过的",
|
||||
"gt.displayItemsList.Confirmed": "已确认的",
|
||||
"gt.displayItemsList.Needed": "需要的",
|
||||
|
@ -845,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",
|
||||
|
@ -905,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": "最大时效:",
|
||||
|
|
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.
|
||||
|
||||
|
@ -12,20 +12,16 @@ GT.eqslFile = "";
|
|||
GT.eqslWhenDate = 0;
|
||||
GT.eqslLoadTimer = null;
|
||||
|
||||
GT.ulsCallsigns = Object();
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsFile = "";
|
||||
|
||||
GT.cacCallsigns = Object();
|
||||
GT.cacFile = "";
|
||||
GT.cacWhenDate = 0;
|
||||
GT.cacLoadTimer = null;
|
||||
|
||||
GT.ausCallsigns = Object();
|
||||
GT.ausFile = "";
|
||||
GT.ausWhenDate = 0;
|
||||
GT.ausLoadTimer = null;
|
||||
|
||||
GT.oqrsCallsigns = Object();
|
||||
GT.oqrsFile = "";
|
||||
GT.oqrsWhenDate = 0;
|
||||
|
@ -66,7 +62,7 @@ function callsignServicesInit()
|
|||
GT.eqslFile = GT.NWappData + "eqsl-callsigns.json";
|
||||
GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json";
|
||||
GT.cacFile = GT.NWappData + "canada-callsigns.txt";
|
||||
GT.ausFile = GT.NWappData + "aus-callsigns.txt";
|
||||
GT.ulsFile = GT.NWappData + "uls-callsigns.txt";
|
||||
|
||||
if (GT.callsignLookups.lotwUseEnable)
|
||||
{
|
||||
|
@ -84,10 +80,6 @@ function callsignServicesInit()
|
|||
{
|
||||
cacLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.ausUseEnable)
|
||||
{
|
||||
ausLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.oqrsUseEnable)
|
||||
{
|
||||
oqrsLoadCallsigns();
|
||||
|
@ -97,7 +89,6 @@ function callsignServicesInit()
|
|||
eqslSettingsDisplay();
|
||||
ulsSettingsDisplay();
|
||||
cacSettingsDisplay();
|
||||
ausSettingsDisplay();
|
||||
oqrsSettingsDisplay();
|
||||
}
|
||||
|
||||
|
@ -224,6 +215,7 @@ function processLotwCallsigns(result, flag)
|
|||
}
|
||||
|
||||
GT.callsignLookups.lotwLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer);
|
||||
|
@ -286,7 +278,6 @@ function parseCacCallsigns(data)
|
|||
}
|
||||
}
|
||||
fs.writeFileSync(GT.cacFile, data, "UTF-8");
|
||||
updateQSO();
|
||||
}
|
||||
|
||||
function processCacCallsigns(buffer, flag)
|
||||
|
@ -295,6 +286,7 @@ function processCacCallsigns(buffer, flag)
|
|||
parseCacCallsigns(data);
|
||||
|
||||
GT.callsignLookups.cacLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
|
@ -351,117 +343,6 @@ function cacValuesChanged()
|
|||
cacSettingsDisplay();
|
||||
}
|
||||
|
||||
function ausLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.ausLastUpdate > 86400 * 7)
|
||||
{ GT.callsignLookups.ausLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate);
|
||||
GT.ausWhenDate = now + ausWhenTimer;
|
||||
GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!fs.existsSync(GT.ausFile))
|
||||
{
|
||||
GT.callsignLookups.ausLastUpdate = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
parseAusCallsigns(fs.readFileSync(GT.ausFile, "UTF-8"));
|
||||
}
|
||||
if (GT.callsignLookups.ausLastUpdate == 0)
|
||||
{
|
||||
ausDownload();
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
GT.callsignLookups.ausLastUpdate = 0;
|
||||
ausDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function parseAusCallsigns(data)
|
||||
{
|
||||
let callsignRows = data.split("\n");
|
||||
for (let x = 0; x < callsignRows.length; x++)
|
||||
{
|
||||
let parts = callsignRows[x].split(",");
|
||||
if (parts.length == 2)
|
||||
{
|
||||
GT.ausCallsigns[parts[1].trim()] = parts[0].trim();
|
||||
}
|
||||
}
|
||||
fs.writeFileSync(GT.ausFile, data, "UTF-8");
|
||||
updateQSO();
|
||||
}
|
||||
|
||||
function processAusCallsigns(buffer, flag)
|
||||
{
|
||||
let data = (typeof buffer == "object") ? String(buffer) : buffer;
|
||||
parseAusCallsigns(data);
|
||||
|
||||
GT.callsignLookups.ausLastUpdate = timeNowSec();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer);
|
||||
|
||||
var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate);
|
||||
GT.ausWhenDate = now + ausWhenTimer;
|
||||
GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000);
|
||||
|
||||
ausSettingsDisplay();
|
||||
}
|
||||
|
||||
function ausDownload(fromSettings)
|
||||
{
|
||||
ausUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/aus.txt",
|
||||
processAusCallsigns,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function ausSettingsDisplay()
|
||||
{
|
||||
ausUseEnable.checked = GT.callsignLookups.ausUseEnable;
|
||||
|
||||
if (GT.callsignLookups.ausLastUpdate == 0)
|
||||
{
|
||||
ausUpdatedTd.innerHTML = "Never";
|
||||
}
|
||||
else
|
||||
{
|
||||
ausUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.ausLastUpdate * 1000);
|
||||
}
|
||||
|
||||
if (!GT.callsignLookups.ausUseEnable)
|
||||
{
|
||||
if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer);
|
||||
GT.ausLoadTimer = null;
|
||||
GT.ausCallsigns = Object();
|
||||
}
|
||||
ausCountTd.innerHTML = Object.keys(GT.ausCallsigns).length;
|
||||
}
|
||||
|
||||
function ausValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.ausUseEnable = ausUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (GT.callsignLookups.ausUseEnable == true)
|
||||
{
|
||||
ausLoadCallsigns();
|
||||
}
|
||||
ausSettingsDisplay();
|
||||
}
|
||||
|
||||
function oqrsLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
@ -553,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);
|
||||
|
@ -663,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);
|
||||
|
@ -679,26 +562,25 @@ 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 && GT.callsignLookups.ulsUseEnable)
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
|
@ -708,7 +590,6 @@ function updateQSO()
|
|||
let lookupCall = false;
|
||||
if ((details.cnty == null || details.state == null))
|
||||
{
|
||||
// Do County Lookup
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null)
|
||||
|
@ -728,15 +609,15 @@ function updateQSO()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (lookupCall)
|
||||
if (lookupCall == true)
|
||||
{
|
||||
lookupKnownCallsign(details, true);
|
||||
lookupKnownCallsign(details);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (GT.callsignLookups.cacUseEnable || GT.callsignLookups.ausUseEnable)
|
||||
if (GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
|
@ -748,37 +629,14 @@ function updateQSO()
|
|||
details.state = "CA-" + GT.cacCallsigns[details.DEcall];
|
||||
}
|
||||
}
|
||||
else if (details.dxcc == 150 && details.state == null)
|
||||
{
|
||||
if (details.DEcall in GT.ausCallsigns)
|
||||
{
|
||||
details.state = "AU-" + GT.ausCallsigns[details.DEcall];
|
||||
}
|
||||
}
|
||||
}
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
|
@ -796,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;
|
||||
}
|
||||
|
@ -806,7 +662,7 @@ function ulsSettingsDisplay()
|
|||
function ulsValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.ulsUseEnable = ulsUseEnable.checked;
|
||||
|
||||
|
||||
if (GT.callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
|
@ -814,11 +670,11 @@ function ulsValuesChanged()
|
|||
else
|
||||
{
|
||||
resetULSDatabase();
|
||||
ulsSettingsDisplay();
|
||||
ulsCountTd.innerHTML = 0;
|
||||
}
|
||||
saveCallsignSettings();
|
||||
|
||||
ulsSettingsDisplay();
|
||||
goProcessRoster();
|
||||
if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
@ -827,241 +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 lookupKnownCallsign(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)
|
||||
{
|
||||
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()
|
||||
|
|
|
@ -134,6 +134,9 @@ var def_mapSettings = {
|
|||
splitQSL: true,
|
||||
trafficDecode: true,
|
||||
usNexrad: false,
|
||||
timezonesEnable: 0,
|
||||
showAllGrids: false,
|
||||
trophyOverlay: 0,
|
||||
zoom: 4,
|
||||
mapTrans: 0.5
|
||||
};
|
||||
|
@ -143,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,
|
||||
|
@ -188,8 +189,8 @@ var def_adifLogSettings = {
|
|||
},
|
||||
downloads: {},
|
||||
lastFetch: {
|
||||
lotw_qso: "1970-01-01",
|
||||
lotw_qsl: "1970-01-01"
|
||||
lotw_qso: 0,
|
||||
lotw_qsl: 0
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -272,9 +273,6 @@ var def_callsignLookups = {
|
|||
cacUseEnable: true,
|
||||
cacWeeklyEnable: true,
|
||||
cacLastUpdate: 0,
|
||||
ausUseEnable: true,
|
||||
ausWeeklyEnable: true,
|
||||
ausLastUpdate: 0,
|
||||
oqrsUseEnable: false,
|
||||
oqrsWeeklyEnable: false,
|
||||
oqrsLastUpdate: 0
|
||||
|
@ -324,7 +322,6 @@ var def_qso = {
|
|||
px: null,
|
||||
qso: true,
|
||||
qual: false,
|
||||
rect: null,
|
||||
RSTrecv: "",
|
||||
RSTsent: "",
|
||||
satName: "",
|
||||
|
@ -332,7 +329,7 @@ var def_qso = {
|
|||
time: 0,
|
||||
vucc_grids: [],
|
||||
worked: false,
|
||||
wspr: null,
|
||||
zipcode: null,
|
||||
zone: null
|
||||
zone: null,
|
||||
hash: null
|
||||
};
|
||||
|
|
1979
package.nw/lib/gt.js
1979
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.
|
||||
|
||||
|
@ -143,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();
|
||||
|
@ -297,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 : "",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -213,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; ";
|
||||
|
@ -502,12 +502,12 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
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";
|
||||
if (parkHash in CR.worked.pota)
|
||||
if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
|
@ -517,7 +517,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
pota = bold;
|
||||
}
|
||||
}
|
||||
else if (parkHash in CR.worked.pota)
|
||||
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 = "";
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
@ -195,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;
|
||||
|
|
|
@ -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.1226",
|
||||
"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