Porównaj commity

...

32 Commity

Autor SHA1 Wiadomość Data
T Loomis c66d2f2cf0 Merge branch 'mid-may-2' into 'master'
Hash compatiblity check

See merge request gridtracker.org/gridtracker!315

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-05-12 21:18:39 +00:00
Stephen Loomis 7742a4cd20 Hash compatiblity check 2024-05-12 14:14:19 -07:00
T Loomis 7e9f27d68d Merge branch 'mid-may' into 'master'
Fix for QSO unique hash

See merge request gridtracker.org/gridtracker!314

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-05-12 20:59:58 +00:00
Stephen Loomis 706458e88d Fix for QSO unique hash 2024-05-12 13:56:13 -07:00
T Loomis 1ea7c147e9 Merge branch 'may-24' into 'master'
Safety commit

See merge request gridtracker.org/gridtracker!313

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-05-09 22:52:25 +00:00
Stephen Loomis 96b70515f7 Updated notes 2024-05-09 15:50:22 -07:00
Stephen Loomis d34514e3b4 Don't ask for retry confirmation 2024-05-06 10:03:16 -07:00
Stephen Loomis 5405e76126 Use POTA_REF instea of POTA in local adif 2024-05-06 07:45:48 -07:00
Stephen Loomis d5798169a2 Updated changelog 2024-05-05 15:38:44 -07:00
Stephen Loomis 2ef8df9e3f Removed Aus call db 2024-05-05 15:16:17 -07:00
Stephen Loomis 17b070e976 Fixed pskFlights and pskHop layer name 2024-05-05 14:30:46 -07:00
Stephen Loomis ae594aeb48 Bug fix for all-grids in layer view 2024-05-05 14:19:49 -07:00
Stephen Loomis 1485b7c3ef Removed inactivity check on spot reporting 2024-05-05 13:06:35 -07:00
Stephen Loomis 8edb0c32bc Changelog 2024-05-05 12:01:06 -07:00
Stephen Loomis eac7cdfcec Version bump 2024-05-05 11:13:18 -07:00
Stephen Loomis 56cea00ae7 Typo in grid field 2024-05-04 08:59:49 -07:00
Stephen Loomis 5dc211127e bigcty update, grid-to-state fix 2024-05-04 08:54:08 -07:00
Tag Loomis dfb51a8e85 BIGCTY 0220 2024-02-25 13:23:04 -08:00
Tag Loomis 2d3302bb20 Award layer drop down and layout update
POTA now tracks offline mode as it should

timezone and all grids state saved

Move nexrad to after offline mode button

trophy layer saved/restored

some cleaning

Lint
2024-02-20 14:51:57 -08:00
Tag Loomis 02eac05181 remove unneeded rect response 2024-02-17 15:22:45 -08:00
Tag Loomis 90847ef94f Lint 2024-02-17 14:17:11 -08:00
Tag Loomis 8b9c7b1efc Track Grid Field
Remove dupe method initQSOdata

callObj with field
2024-02-17 14:12:30 -08:00
T Loomis 9014976472 Merge branch 'cq-waz' into 'late-feb-24'
added cq magazine awards: WAZ, USA-CA, WPX

See merge request gridtracker.org/gridtracker!312

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-02-17 04:43:47 +00:00
Christian Bayer a53d37ac3f
added cq magazine awards: WAZ, USA-CA, WPX 2024-02-16 21:30:06 -05:00
T Loomis 0e76e5aa58 Merge branch 'canadawards.2' into 'late-feb-24'
added WANA award

See merge request gridtracker.org/gridtracker!311

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-02-16 20:31:19 +00:00
Christian Bayer bdbf5e8c7b
added WANA award 2024-02-16 08:30:57 -05:00
T Loomis 9fef97efc8 Merge branch 'canadawards' into 'late-feb-24'
added WARAC and Canadaward

See merge request gridtracker.org/gridtracker!310

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-02-16 04:48:24 +00:00
Christian Bayer 0031837190
added WARAC and Canadaward 2024-02-15 22:23:03 -05:00
Tag Loomis e56be5bcbd BIGCTY 0202 2024-02-11 13:06:23 -08:00
Tag Loomis 5469779198 Safety commit
Better processing indicator

Async load local adif files

BIGCTY update 0105

Baby step

another step

Lint 1

Removed debug and dead code

DO9KW

DO9KW II

Lint free safety commit

big baby step

Remove uneeded timer

more speed opt

Massive speed improvements

Lint

Fixed WSPR grid colors and dimming

Auto-mute on single or no audio devices.

lint

Chinese Google Maps and OAMS spot/decode metering

Decodes are small and once a minute.

Properly save *all* settings on language change

Proper method name and code reduction

Moved trackQSO to gtCommon in prep for log event

30 minutes inactivity

WSJT-X log event not a heavy hit to stat parsing

BIGCTY 0125

version bump for testing

A bigger hit on uls lookups, but they won't get stuck as un resolved this way

Dumped ULS websql database

Save lookupssettings and fix changelog

lint fix

whitespace?

roll version, changelog fix

Fix really old bug, always set the liveCallsigns with stations info

Moved eslint disabled code to bottom of file

Removed last traces of .rect, cleaned up vector layer accessors

Removed dead code

Local ADIF loads now add to startup log list and auto load when added via dialogs
2024-02-11 13:05:44 -08:00
T Loomis 134310fcee Merge branch 'mid-jan-24' into 'master'
Fixed db creation on new install , version bump

See merge request gridtracker.org/gridtracker!309

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
2024-01-03 06:28:49 +00:00
Tag Loomis 29ea9804fc Fixed db creation on new install , version bump 2024-01-02 22:26:20 -08:00
32 zmienionych plików z 3161 dodań i 2853 usunięć

83
debian/changelog vendored
Wyświetl plik

@ -1,33 +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
- 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
@ -42,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
@ -60,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
@ -81,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
@ -103,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
@ -175,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

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion
Version: 1.24.0103
Version: 1.24.0512
Release: 1%{?dist}
BuildArch: noarch
Source0: {{{ git_dir_pack }}}
@ -40,6 +40,20 @@ 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

Wyświetl plik

@ -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&#10;(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&#10;(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>

Wyświetl plik

@ -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

Wyświetl plik

@ -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
}
}

File diff suppressed because one or more lines are too long

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik diff jest za duży Load Diff

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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.

Wyświetl plik

@ -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"
);
}

Wyświetl plik

@ -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()

Wyświetl plik

@ -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
};

Plik diff jest za duży Load Diff

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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()
{

Wyświetl plik

@ -27,8 +27,7 @@ function changeLocale()
{
GT.appSettings.locale = languageLocale.value;
renderI18n(GT.appSettings.locale);
saveAppSettings();
chrome.runtime.reload();
saveAndCloseApp(true);
}
function loadChildWindowI18n()

Wyświetl plik

@ -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 : "",

Wyświetl plik

@ -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;

Wyświetl plik

@ -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

Wyświetl plik

@ -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;

Wyświetl plik

@ -14,7 +14,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
const currentYear = new Date().getFullYear();
const currentYearSuffix = `&rsquo;${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};`;
}

Wyświetl plik

@ -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 = "";
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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) {

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "GridTracker",
"product_string_do_not_use": "gridtracker",
"version": "1.24.0103",
"version": "1.24.0512",
"betaVersion": "",
"description": "GridTracker: An Amateur Radio Companion",
"author": "GridTracker.org",