kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Porównaj commity
54 Commity
lin_flatpa
...
master
Autor | SHA1 | Data |
---|---|---|
T Loomis | c66d2f2cf0 | |
Stephen Loomis | 7742a4cd20 | |
T Loomis | 7e9f27d68d | |
Stephen Loomis | 706458e88d | |
T Loomis | 1ea7c147e9 | |
Stephen Loomis | 96b70515f7 | |
Stephen Loomis | d34514e3b4 | |
Stephen Loomis | 5405e76126 | |
Stephen Loomis | d5798169a2 | |
Stephen Loomis | 2ef8df9e3f | |
Stephen Loomis | 17b070e976 | |
Stephen Loomis | ae594aeb48 | |
Stephen Loomis | 1485b7c3ef | |
Stephen Loomis | 8edb0c32bc | |
Stephen Loomis | eac7cdfcec | |
Stephen Loomis | 56cea00ae7 | |
Stephen Loomis | 5dc211127e | |
Tag Loomis | dfb51a8e85 | |
Tag Loomis | 2d3302bb20 | |
Tag Loomis | 02eac05181 | |
Tag Loomis | 90847ef94f | |
Tag Loomis | 8b9c7b1efc | |
T Loomis | 9014976472 | |
Christian Bayer | a53d37ac3f | |
T Loomis | 0e76e5aa58 | |
Christian Bayer | bdbf5e8c7b | |
T Loomis | 9fef97efc8 | |
Christian Bayer | 0031837190 | |
Tag Loomis | e56be5bcbd | |
Tag Loomis | 5469779198 | |
T Loomis | 134310fcee | |
Tag Loomis | 29ea9804fc | |
T Loomis | dba0444215 | |
T Loomis | e5dace4b1b | |
T Loomis | e318242e7a | |
Tag Loomis | 3a38027331 | |
T Loomis | 15132c5243 | |
Tag Loomis | ad9b6fd08b | |
T Loomis | 365e187e58 | |
Tag Loomis | a7144712ac | |
T Loomis | 60852610c2 | |
Tag Loomis | 94929b6d20 | |
T Loomis | c956332fdd | |
T Loomis | c5efec8dc8 | |
T Loomis | 2acc0dacc1 | |
Tag Loomis | 74dc5b6ae2 | |
Matthew Chambers | 915c14f816 | |
Matthew Chambers | 9f46a57d7b | |
T Loomis | 2428eb7259 | |
T Loomis | bd3d63fe2f | |
T Loomis | f1dc31b192 | |
T Loomis | f890cf489b | |
T Loomis | 3911ba6b10 | |
Matthew Chambers | 0184b8e501 |
111
.gitlab-ci.yml
111
.gitlab-ci.yml
|
@ -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
|
||||
|
||||
|
@ -59,7 +59,7 @@ win:package:
|
|||
stage: package
|
||||
rules:
|
||||
# only do this with a manual tag starting with v or test_
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|win_).*/'
|
||||
artifacts:
|
||||
paths:
|
||||
- artifacts/
|
||||
|
@ -121,7 +121,7 @@ linux:package:
|
|||
stage: package
|
||||
rules:
|
||||
# only do this with a manual tag starting with v or test_
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|lin_).*/'
|
||||
artifacts:
|
||||
paths:
|
||||
- artifacts/
|
||||
|
@ -140,6 +140,14 @@ linux:package:
|
|||
mkdir -p artifacts
|
||||
echo -e "\e[0Ksection_start:`date +%s`:apt_get[collapsed=true]\r\e[0KGetting Build Dependencies"
|
||||
apt-get update && apt-get upgrade -y
|
||||
apt-get install gnupg -y
|
||||
curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
|
||||
export GPG_TTY=$(tty)
|
||||
gpg --pinentry-mode loopback --passphrase ${GPG_PASS} --import .secure_files/debiankey.asc
|
||||
echo ${GPG_TRUST} | gpg --import-ownertrust
|
||||
echo 'use-agent' >> ~/.gnupg/gpg.conf
|
||||
echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf
|
||||
echo 'allow-loopback-pinentry' >> ~/.gnupg/gpg-agent.conf
|
||||
echo -e "\e[0Ksection_end:`date +%s`:apt_get\r\e[0K"
|
||||
script:
|
||||
- |
|
||||
|
@ -157,6 +165,8 @@ linux:package:
|
|||
fi
|
||||
done
|
||||
(cd dist; mv *.tar.gz ../artifacts/)
|
||||
gpg --batch --no-tty --detach-sign --armor --passphrase ${GPG_PASS} artifacts/GridTracker*x86.tar.gz
|
||||
gpg --batch --no-tty --detach-sign --armor --passphrase ${GPG_PASS} artifacts/GridTracker*x64.tar.gz
|
||||
echo -e "\e[0Ksection_end:`date +%s`:native_build\e[0K"
|
||||
# This section does debian DEBs
|
||||
echo -e "\e[0Ksection_start:`date +%s`:debian_build\r\e[0KBuilding Debian packages"
|
||||
|
@ -170,7 +180,7 @@ mac:package:
|
|||
stage: package
|
||||
rules:
|
||||
# only do this with a manual tag starting with v or test_
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|mac_).*/'
|
||||
artifacts:
|
||||
paths:
|
||||
- artifacts/
|
||||
|
@ -210,7 +220,7 @@ arm:package:
|
|||
NWJS64_BUILD: "nw54-arm64_2021-07-10"
|
||||
rules:
|
||||
# only do this with a manual tag starting with v or test_
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|lin_).*/'
|
||||
artifacts:
|
||||
paths:
|
||||
- artifacts/
|
||||
|
@ -230,6 +240,14 @@ arm:package:
|
|||
#dpkg --add-architecture armhf
|
||||
echo -e "\e[0Ksection_start:`date +%s`:apt_get[collapsed=true]\r\e[0KGetting Build Dependencies"
|
||||
apt-get update && apt-get upgrade -y
|
||||
apt-get install gnupg -y
|
||||
curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
|
||||
export GPG_TTY=$(tty)
|
||||
gpg --pinentry-mode loopback --passphrase ${GPG_PASS} --import .secure_files/debiankey.asc
|
||||
echo ${GPG_TRUST} | gpg --import-ownertrust
|
||||
echo 'use-agent' >> ~/.gnupg/gpg.conf
|
||||
echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf
|
||||
echo 'allow-loopback-pinentry' >> ~/.gnupg/gpg-agent.conf
|
||||
apt-get build-dep .
|
||||
echo -e "\e[0Ksection_end:`date +%s`:apt_get\r\e[0K"
|
||||
script:
|
||||
|
@ -265,6 +283,8 @@ arm:package:
|
|||
cp LICENSE GridTracker-$version-linux-arm64/
|
||||
tar -czf GridTracker-$version-linux-arm64.tar.gz GridTracker-$version-linux-arm64
|
||||
mv GridTracker-$version-linux-arm64.tar.gz artifacts/
|
||||
gpg --batch --no-tty --detach-sign --armor --passphrase ${GPG_PASS} artifacts/GridTracker*arm32.tar.gz
|
||||
gpg --batch --no-tty --detach-sign --armor --passphrase ${GPG_PASS} artifacts/GridTracker*arm64.tar.gz
|
||||
echo "we made ARM packages!"
|
||||
ls -laR artifacts
|
||||
|
||||
|
@ -275,7 +295,7 @@ upload-Google:
|
|||
variables:
|
||||
GIT_STRATEGY: none
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|win_|mac_|lin_).*/'
|
||||
script:
|
||||
- |
|
||||
echo $GCP_SERVICE_KEY > gcloud-service-key.json
|
||||
|
@ -283,6 +303,49 @@ upload-Google:
|
|||
gcloud config set project $GCLOUD_PROJECT_ID
|
||||
gsutil -m cp -R artifacts/* $GCLOUD_DEPLOY_PATH/
|
||||
|
||||
update_deb_repo:
|
||||
stage: deploy
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|lin_).*/'
|
||||
before_script:
|
||||
- |
|
||||
apt-get update && apt-get upgrade -y
|
||||
apt-get install apt apt-utils apt-transport-https ca-certificates gnupg -y
|
||||
echo "deb [signed-by=/usr/share/keyrings/cloud.google.asc] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
|
||||
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | tee /usr/share/keyrings/cloud.google.asc
|
||||
apt-get update && apt-get install google-cloud-cli -y
|
||||
curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
|
||||
echo $GCP_SERVICE_KEY > gcloud-service-key.json
|
||||
export GPG_TTY=$(tty)
|
||||
gpg --pinentry-mode loopback --passphrase ${GPG_PASS} --import .secure_files/debiankey.asc
|
||||
echo ${GPG_TRUST} | gpg --import-ownertrust
|
||||
echo 'use-agent' >> ~/.gnupg/gpg.conf
|
||||
echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf
|
||||
echo 'allow-loopback-pinentry' >> ~/.gnupg/gpg-agent.conf
|
||||
gcloud auth activate-service-account --key-file gcloud-service-key.json
|
||||
gcloud config set project $GCLOUD_PROJECT_ID
|
||||
script:
|
||||
- |
|
||||
VER=`node version.js`
|
||||
mkdir debianrepo
|
||||
gsutil cp gs://debian.gridtracker.org/debian/* debianrepo/
|
||||
cp artifacts/gridtracker_${VER}_all.deb debianrepo/
|
||||
cd debianrepo
|
||||
rm InRelease
|
||||
rm Release.gpg
|
||||
apt-ftparchive packages . > Packages
|
||||
apt-ftparchive release . > Release
|
||||
gpg --batch --no-tty --passphrase ${GPG_PASS} --clearsign -o InRelease Release
|
||||
gpg --batch --no-tty --passphrase ${GPG_PASS} -abs -o Release.gpg Release
|
||||
if [[ ${CI_COMMIT_TAG} = test_* ]] || [[ ${CI_COMMIT_TAG} = lin_* ]]
|
||||
then
|
||||
gsutil cp ./* gs://debian.gridtracker.org/test/
|
||||
fi
|
||||
if [[ ${CI_COMMIT_TAG} = v* ]]
|
||||
then
|
||||
gsutil cp ./* gs://debian.gridtracker.org/debian/
|
||||
fi
|
||||
|
||||
update_arch_aur:
|
||||
stage: deploy
|
||||
image: archlinux:base-devel
|
||||
|
@ -375,7 +438,7 @@ sourcerelease:
|
|||
virustotal_push:
|
||||
stage: publish
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|win_).*/'
|
||||
script:
|
||||
- |
|
||||
echo "Pushing release URLs to VirusTotal"
|
||||
|
@ -386,22 +449,38 @@ virustotal_push:
|
|||
discord_notify:
|
||||
stage: publish
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_).*/'
|
||||
- if: '$CI_COMMIT_TAG =~ /^(v|test_|win_|mac_|lin_).*/'
|
||||
script:
|
||||
- |
|
||||
echo "Notifying Discord #developer-den that a release has built"
|
||||
BASEURL="http://downloads.gridtracker.org/${CI_COMMIT_TAG}/"
|
||||
VER=`node version.js`
|
||||
WIN_MD5=($(md5sum artifacts/GridTracker-Installer.${VER}.exe))
|
||||
MAC_MD5=($(md5sum artifacts/GridTracker-${VER}-mac-x64.zip))
|
||||
LINARM32_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-arm32.tar.gz))
|
||||
LINARM64_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-arm64.tar.gz))
|
||||
LINx86_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-x86.tar.gz))
|
||||
LINx64_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-x64.tar.gz))
|
||||
DEB_MD5=($(md5sum artifacts/gridtracker_${VER}_all.deb))
|
||||
if [[ ${CI_COMMIT_TAG} = v* ]] || [[ ${CI_COMMIT_TAG} = test_* ]] || [[ ${CI_COMMIT_TAG} = win_* ]]
|
||||
then
|
||||
WIN_MD5=($(md5sum artifacts/GridTracker-Installer.${VER}.exe))
|
||||
WIN_STRING="**GridTracker-Installer.${VER}.exe**\nmd5: ${WIN_MD5}\n${BASEURL}GridTracker-Installer.${VER}.exe\n\n"
|
||||
fi
|
||||
if [[ ${CI_COMMIT_TAG} = v* ]] || [[ ${CI_COMMIT_TAG} = test_* ]] || [[ ${CI_COMMIT_TAG} = mac_* ]]
|
||||
then
|
||||
MAC_MD5=($(md5sum artifacts/GridTracker-${VER}-mac-x64.zip))
|
||||
MAC_STRING="**GridTracker-${VER}-mac-x64.zip**\nMD5: ${MAC_MD5}\n${BASEURL}GridTracker-${VER}-mac-x64.zip\n\n"
|
||||
fi
|
||||
if [[ ${CI_COMMIT_TAG} = v* ]] || [[ ${CI_COMMIT_TAG} = test_* ]] || [[ ${CI_COMMIT_TAG} = lin_* ]]
|
||||
then
|
||||
LINARM32_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-arm32.tar.gz))
|
||||
LINARM32_STRING="**GridTracker-${VER}-linux-arm32.tar.gz**\nMD5: ${LINARM32_MD5}\n${BASEURL}GridTracker-${VER}-linux-arm32.tar.gz\n${BASEURL}GridTracker-${VER}-linux-arm32.tar.gz.asc\n\n"
|
||||
LINARM64_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-arm64.tar.gz))
|
||||
LINARM64_STRING="**GridTracker-${VER}-linux-arm64.tar.gz**\nMD5: ${LINARM64_MD5}\n${BASEURL}GridTracker-${VER}-linux-arm64.tar.gz\n${BASEURL}GridTracker-${VER}-linux-arm64.tar.gz.asc\n\n"
|
||||
LINx86_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-x86.tar.gz))
|
||||
LINx86_STRING="**GridTracker-${VER}-linux-x86.tar.gz**\nMD5: ${LINx86_MD5}\n${BASEURL}GridTracker-${VER}-linux-x86.tar.gz\n${BASEURL}GridTracker-${VER}-linux-x86.tar.gz.asc\n\n"
|
||||
LINx64_MD5=($(md5sum artifacts/GridTracker-${VER}-linux-x64.tar.gz))
|
||||
LINx64_STRING="**GridTracker-${VER}-linux-x64.tar.gz**\nMD5: ${LINx64_MD5}\n${BASEURL}GridTracker-${VER}-linux-x64.tar.gz\n${BASEURL}GridTracker-${VER}-linux-x86.tar.gz.asc\n\n"
|
||||
DEB_MD5=($(md5sum artifacts/gridtracker_${VER}_all.deb))
|
||||
DEB_STRING="**gridtracker_${VER}_all.deb**\nMD5: ${DEB_MD5} - ${BASEURL}gridtracker_${VER}_all.deb"
|
||||
fi
|
||||
curl -H "Content-Type: application/json" -X POST $DISCORD_WEBHOOK --data-binary @- << EOM
|
||||
{
|
||||
"content": "**GridTracker-Installer.${VER}.exe**\nmd5: ${WIN_MD5} - ${BASEURL}GridTracker-Installer.${VER}.exe\n\n**GridTracker-${VER}-mac-x64.zip**\nMD5: ${MAC_MD5} - ${BASEURL}GridTracker-${VER}-mac-x64.zip\n\n**GridTracker-${VER}-linux-arm32.tar.gz**\nMD5: ${LINARM32_MD5} - ${BASEURL}GridTracker-${VER}-linux-arm32.tar.gz\n\n**GridTracker-${VER}-linux-arm64.tar.gz**\nMD5: ${LINARM64_MD5} - ${BASEURL}GridTracker-${VER}-linux-arm64.tar.gz\n\n**GridTracker-${VER}-linux-x86.tar.gz**\nMD5: ${LINx86_MD5} - ${BASEURL}GridTracker-${VER}-linux-x86.tar.gz\n\n**GridTracker-${VER}-linux-x64.tar.gz**\nMD5: ${LINx64_MD5} - ${BASEURL}GridTracker-${VER}-linux-x64.tar.gz\n\n**gridtracker_${VER}_all.deb**\nMD5: ${DEB_MD5} - ${BASEURL}gridtracker_${VER}_all.deb",
|
||||
"content": "${CI_COMMIT_TAG_MESSAGE}\n\n${WIN_STRING}${MAC_STRING}${LINARM32_STRING}${LINARM64_STRING}${LINx86_STRING}${LINx64_STRING}${DEB_STRING}",
|
||||
"tts": false,
|
||||
"embeds": [],
|
||||
"components": {},
|
||||
|
|
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,11 +1,102 @@
|
|||
|
||||
gridtracker (1.24.0512) unstable; urgency=low
|
||||
- System: Fixed bug in QSO unique hash algorithm
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 May 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0504) unstable; urgency=low
|
||||
- System: BIGCTY Update from April 29th (3D2CCC etc)
|
||||
- Logging: Threaded log loading and parsing > 500,000 QSOs now supported in real-time
|
||||
- Logging: Manual log loads automatically added to startup
|
||||
- System: US database refactor
|
||||
- Call Roster: Only US states and Canadian provinces recognized
|
||||
- Award Tracker: Added RAC: Worked All North America
|
||||
- Award Tracker: Added CQ Magazine: WAZ, US-CA, WPX
|
||||
- Control Panel: Re-ordered buttons based on online/offline mode
|
||||
- Control Panel: Moved 'Award Layer' button to 'Map View Filters > Award' drop-down list
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 04 May 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0104) unstable; urgency=high
|
||||
- System - fixed database creation error on new installs
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 04 Jan 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0103) unstable; urgency=low
|
||||
- Windows - NSIS installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 03 Jan 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1226) unstable; urgency=low
|
||||
- System - Improved Primary Administrative Area (State) detection
|
||||
- System - Added Canadian and Australian callsign databases
|
||||
- Map - Added - Worked All Canadian Provinces - award layer (Key 9)
|
||||
- POTA - Map marker updated when park worked
|
||||
- Call Roster - Properly show POTA worked status
|
||||
- Logbook - Filter QSO by grid - Working Grid(s)
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 26 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1217) unstable; urgency=low
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
- System - QSL location authority selector added in Settings > Logbook
|
||||
- Logbook Viewer - QSL sources added
|
||||
- Call Roster - Added Grid to Watcher and Ignores
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
- Logging - DX Keeper grid bug workaround
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
|
||||
|
||||
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
|
||||
- System - Fixed initial install window sizes
|
||||
- Logbook Viewer - Added DXCC reset view button
|
||||
- Call Roster
|
||||
- New “Move Column Right” added to right-click Column header
|
||||
- Fixed handling of compound callsigns
|
||||
- Fixed saving of Ignored CQ zones and ITU zones
|
||||
- New Settings Button (Ctrl-S)
|
||||
- New Callsign / Message Watcher (Ctrl-W or Ctrl-O)
|
||||
- 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
|
||||
- Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR)
|
||||
- Language - Added Español (Special thanks to KI2D and HI8O)
|
||||
- DXCC - Renamed Macedonia to N. Macedonia
|
||||
- System - Fixed 1.25m displaying as 125cm in English
|
||||
- Award Tracker - Added ARRL VUCC
|
||||
- BIGCTY - Update from November 3rd
|
||||
- Map - Improved speed of mouse-over rendering and ordering
|
||||
- Map - Grid headers show source (Logbook or Live)
|
||||
- Call Roster - Fixed issue where Spot wasn't populating correctly
|
||||
- Rotor - All locations can now aim on ctrl-left-click when enabled
|
||||
- POTA - Left-click a park (tree) on same band/mode will generate messages in WSJT-X
|
||||
- Lookup - Added OAMS user to details
|
||||
- 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
|
||||
|
||||
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
|
||||
|
@ -17,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
|
||||
|
@ -39,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
|
||||
|
@ -111,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.1019
|
||||
Version: 1.24.0512
|
||||
Release: 1%{?dist}
|
||||
BuildArch: noarch
|
||||
Source0: {{{ git_dir_pack }}}
|
||||
|
@ -40,6 +40,76 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
|
|||
%license %{_docdir}/%{name}/
|
||||
|
||||
%changelog
|
||||
* Sun May 12 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0512-1
|
||||
- System: Fixed bug in QSO unique hash algorithm
|
||||
* Sat May 04 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0504-1
|
||||
- System: BIGCTY Update from April 29th (3D2CCC etc)
|
||||
- Logging: Threaded log loading and parsing > 500,000 QSOs now supported in real-time
|
||||
- Logging: Manual log loads automatically added to startup
|
||||
- System: US database refactor
|
||||
- Call Roster: Only US states and Canadian provinces recognized
|
||||
- Award Tracker: Added RAC: Worked All North America
|
||||
- Award Tracker: Added CQ Magazine: WAZ, US-CA, WPX
|
||||
- Control Panel: Re-ordered buttons based on online/offline mode
|
||||
- Control Panel: Moved 'Award Layer' button to 'Map View Filters > Award' drop-down list
|
||||
* Thu Jan 04 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0104-1
|
||||
- System - fixed database creation error on new installs
|
||||
* Wed Jan 03 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0103-1
|
||||
- Windows - NSIS Installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
* Tue Dec 26 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1226-1
|
||||
- System - Improved Primary Administrative Area (State) detection
|
||||
- System - Added Canadian and Australian callsign databases
|
||||
- Map - Added 'Worked All Canadian Provinces' award layer (Key 9)
|
||||
- POTA - Map marker updated when park worked
|
||||
- Call Roster - Properly show POTA worked status
|
||||
- Logbook - Filter QSO by grid “Working Grid(s)”
|
||||
* Sun Dec 17 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1217-1
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
- 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
|
||||
* Thu Dec 07 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1207-1
|
||||
- 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
|
||||
* Sat Dec 02 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1202-1
|
||||
- BIGCTY - Update from November 29th
|
||||
- System - Returned LoTW, eQSL and OQRS membership columns to log entries
|
||||
- System - Fixed initial install window sizes
|
||||
- Logbook Viewer - Added DXCC reset view button
|
||||
- Call Roster
|
||||
- New “Move Column Right” added to right-click Column header
|
||||
- Fixed handling of compound callsigns
|
||||
- Fixed saving of Ignored CQ zones and ITU zones
|
||||
- New Settings Button (Ctrl-S)
|
||||
- New Callsign / Message Watcher (Ctrl-W or Ctrl-O)
|
||||
- New Exceptions Settings (Ctrl-E)
|
||||
- New Ignores Editor / Viewer (Ctrl-I)
|
||||
- New Columns Editor (Ctrl-C)
|
||||
* Sun Nov 12 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1112-1
|
||||
- Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR)
|
||||
- Language - Added Español (Special thanks to KI2D and HI8O)
|
||||
- DXCC - Renamed Macedonia to N. Macedonia
|
||||
- System - Fixed 1.25m displaying as 125cm in English
|
||||
- Award Tracker - Added ARRL VUCC
|
||||
- BIGCTY - Update from November 3rd
|
||||
- Map - Improved speed of mouse-over rendering and ordering
|
||||
- Map - Grid headers show source (Logbook or Live)
|
||||
- Call Roster - Fixed issue where Spot wasn't populating correctly
|
||||
- Rotor - All locations can now aim on ctrl-left-click when enabled
|
||||
- POTA - Left-click a park (tree) on same band/mode will generate messages in WSJT-X
|
||||
- Lookup - Added OAMS user to details
|
||||
- Logging - Descriptive error if QRZ.com logging failure
|
||||
- Logbook Viewer - Regex enabled callsign searching
|
||||
- Settings - Logbook - New "Logbook Items Per Page" slider
|
||||
* Thu Oct 19 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1019-1
|
||||
- HTTP - Removed timeouts on transactions affecting log downloading and uploading
|
||||
* Sun Oct 15 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1015-1
|
||||
|
|
|
@ -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"
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations"
|
||||
align="center">
|
||||
<div id="qsoCount">0</div>
|
||||
|
@ -350,12 +351,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<div id="countryCount">0</div>
|
||||
</td>
|
||||
<td data-i18n="quickStats.QSL.label" style="cursor: pointer"
|
||||
onclick="resetSearch(); GT.filterQSL = 'true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
|
||||
onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
|
||||
title="Show Confirmed List" align="right">
|
||||
QSL
|
||||
</td>
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); GT.filterQSL = 'true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
|
||||
<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>
|
||||
</td>
|
||||
|
@ -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>
|
||||
|
@ -413,7 +413,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<option data-i18n="mapFilter.band.6m" value="6m">6m</option>
|
||||
<option data-i18n="mapFilter.band.4m" value="4m">4m</option>
|
||||
<option data-i18n="mapFilter.band.2m" value="2m">2m</option>
|
||||
<option data-i18n="mapFilter.band.125cm" value="1.25m">1.25m</option>
|
||||
<option data-i18n="mapFilter.band.1_25m" value="1.25m">1.25m</option>
|
||||
<option data-i18n="mapFilter.band.70cm" value="70cm">70cm</option>
|
||||
<option data-i18n="mapFilter.band.33cm" value="33cm">33cm</option>
|
||||
<option data-i18n="mapFilter.band.23cm" value="23cm">23cm</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>
|
||||
|
@ -625,7 +631,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
"></div>
|
||||
</div>
|
||||
<div id="myFlagtip" class="myFlagtipEnd"></div>
|
||||
<div id="myParktip" style="
|
||||
<div id="myTimezoneTip" class="myFlagtipEnd"></div>
|
||||
<div id="myParktip" style="
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
background-color: black;
|
||||
|
@ -714,7 +721,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<div id="printHotKeyDiv" style="border: 1px solid cyan; color: white; text-align: auto">
|
||||
<table align="center" class="darkTable">
|
||||
<tr>
|
||||
<th colspan="6">Hot Key List (v1.20.0825+)</th>
|
||||
<th colspan="6">Hot Key List (v1.23.1220+)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
|
@ -760,9 +767,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td>5</td>
|
||||
<td align="left">Show US States Award Layer</td>
|
||||
<td></td>
|
||||
<td>T</td>
|
||||
<td align="left">Add TTS Alert</td>
|
||||
<td>right-click<br />empty grid</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6</td>
|
||||
|
@ -776,9 +783,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td>7</td>
|
||||
<td align="left">Show US Counties Award Layer</td>
|
||||
<td></td>
|
||||
<td>V</td>
|
||||
<td align="left">Add PopUp Alert</td>
|
||||
<td>right-click<br />empty grid</td>
|
||||
<td></td>
|
||||
<td align="left"></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8</td>
|
||||
|
@ -790,7 +797,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</tr>
|
||||
<tr>
|
||||
<td>9</td>
|
||||
<td align="left">Toggle Timezone Overlay</td>
|
||||
<td align="left">Show CA Provinces Award Layer</td>
|
||||
<td></td>
|
||||
<td>X</td>
|
||||
<td align="left">Toggle Map Position Info</td>
|
||||
|
@ -869,8 +876,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td>Shift-Key</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td align="left"></td>
|
||||
<td>H</td>
|
||||
<td align="left">Toggle Timezone Overlay</td>
|
||||
<td></td>
|
||||
<td>F8</td>
|
||||
<td align="left">Recall Map Position 4</td>
|
||||
|
@ -909,9 +916,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>M</td>
|
||||
<td align="left">Add MapCenter Alert</td>
|
||||
<td>right-click<br />empty grid</td>
|
||||
<td></td>
|
||||
<td align="left"></td>
|
||||
<td></td>
|
||||
<td>F10</td>
|
||||
<td align="left">Store Map Position 6</td>
|
||||
<td>Shift-Key</td>
|
||||
|
@ -1200,6 +1207,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<option value="cn">简体中文</option>
|
||||
<option value="cnt">繁體中文</option>
|
||||
<option value="de">Deutsch</option>
|
||||
<option value="fr">Français</option>
|
||||
<option value="it">Italiano</option>
|
||||
<option value="es">Español</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -1370,13 +1380,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<th data-i18n="settings.lookup.Count.header">Count</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.lookup.db.ULS">United States ULS</td>
|
||||
<td data-i18n="settings.lookup.db.ULS">US Callsigns</td>
|
||||
<td>
|
||||
<input type="checkbox" id="ulsUseEnable" onclick="ulsValuesChanged();" />
|
||||
</td>
|
||||
<td id="ulsUpdatedTd">Never</td>
|
||||
<td id="ulsCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Canada Callsigns</td>
|
||||
<td>
|
||||
<input type="checkbox" id="cacUseEnable" onclick="cacValuesChanged();" />
|
||||
</td>
|
||||
<td id="cacUpdatedTd">Never</td>
|
||||
<td id="cacCountTd">0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.lookup.db.LoTW">Logbook of The World</td>
|
||||
<td>
|
||||
|
@ -1440,9 +1458,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td data-i18n="settings.audio.TextToSpeech.label" align="center">Text-to-speech Voice</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="1">
|
||||
<div id="voicesDiv"></div>
|
||||
</td>
|
||||
<td colspan="1" id="voicesDiv"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
@ -1550,7 +1566,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
title="Filter Logbook QSOs to include these Callsigns only (comma separated)">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td data-i18n="settings.logbook.callsigns.label"><b>Working Callsign(s)</b></td>
|
||||
<td data-i18n="settings.logbook.callsigns.label">Working Callsign(s)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -1567,8 +1583,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
oninput="if ( ValidateCallsigns(this) ) workingCallsignsChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="qsoCallsignsFound"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="padding: 5px" class="mapItem"
|
||||
title="Filter Logbook QSOs to include these Grids only (comma separated)">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>Working Grid(s)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="workingGridEnable">Enable?</label>
|
||||
<input title="Enable Filtering" type="checkbox" id="workingGridEnable"
|
||||
onclick="workingGridEnableChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="workingGridsTd">
|
||||
<label for="workingGridsValue">Grid(s)</label>
|
||||
<input id="workingGridsValue" type="text" class="inputTextValue" size="15"
|
||||
onkeypress="return validGridKeys(event.charCode);"
|
||||
oninput="if ( ValidateGrids(this) ) workingGridsChanged(this);" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="qsoGridsFound"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div style="padding: 5px" class="mapItem" title="Filter Logbook QSOs from before this Date">
|
||||
<table align="center">
|
||||
<tr>
|
||||
|
@ -1607,6 +1653,43 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
Apply Changes
|
||||
</div>
|
||||
</div>
|
||||
<br/>
|
||||
<div style="padding: 5px" class="mapItem">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td> QSL Location Authority</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="qslAuthority" onchange="qslAuthorityChanged();">
|
||||
<option value="L">LoTW</option>
|
||||
<option value="Q">QRZ.com</option>
|
||||
<option value="e">eQSL</option>
|
||||
<option value="C">Clublog</option>
|
||||
<option value="O">Other</option>
|
||||
<option value="0">Last Loaded</option>
|
||||
<option value="1">None</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem" style="padding: 5px">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td align="center">Logbook Items Per Page</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" id="qsoItemsPerPageTd">100</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="50" max="1000" value="100" step="50" class="slider" id="qsoItemsPerPageValue"
|
||||
oninput="changeLogbookPage()" onmouseup="updateLogbook()" onkeyup="updateLogbook()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="gridSettingsDiv" class="settingsTabcontent">
|
||||
<div class="mapItem" style="padding:10px;">
|
||||
|
@ -2151,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>
|
||||
|
@ -3159,13 +3225,13 @@ 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>
|
||||
<div id="updateSettingsDiv" class="settingsTabcontent">
|
||||
<div style="left: 0; display: inline-block; height: 510px; width: 740px" id="updateText">
|
||||
<embed src="./gt_update.pdf" style="width: 100%; height: 100%" frameborder="0" scrolling="yes" />
|
||||
<div style="left: 0; display: inline-block; height: 510px; width: 800px" id="updateText">
|
||||
<embed src="./gt_update.pdf#zoom=100&navpanes=0&page=1&toolbar=0" style="width: 100%; height: 100%" frameborder="0" scrolling="yes" />
|
||||
</div>
|
||||
</div>
|
||||
<div style="top: 0; right: 1px; position: absolute">
|
||||
|
|
|
@ -98,6 +98,441 @@
|
|||
"sponsor": "ARRL",
|
||||
"tooltip": "Fred Fish Memorial"
|
||||
},
|
||||
"VUCC50": {
|
||||
"name": "VUCC - VHF/UHF Century Club 6m",
|
||||
"rule": {
|
||||
"band": [
|
||||
"6m"
|
||||
],
|
||||
"count": [
|
||||
100,
|
||||
200,
|
||||
300,
|
||||
400,
|
||||
500,
|
||||
600,
|
||||
700,
|
||||
800,
|
||||
900,
|
||||
1000,
|
||||
1100,
|
||||
1200,
|
||||
1300,
|
||||
1400,
|
||||
1500,
|
||||
1600,
|
||||
1700,
|
||||
1800,
|
||||
1900,
|
||||
2000
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 50MHz"
|
||||
},
|
||||
"VUCC144": {
|
||||
"name": "VUCC - VHF/UHF Century Club 2m",
|
||||
"rule": {
|
||||
"band": [
|
||||
"2m"
|
||||
],
|
||||
"count": [
|
||||
100,
|
||||
200,
|
||||
300,
|
||||
400,
|
||||
500,
|
||||
600,
|
||||
700,
|
||||
800,
|
||||
900,
|
||||
1000,
|
||||
1100,
|
||||
1200,
|
||||
1300,
|
||||
1400,
|
||||
1500,
|
||||
1600,
|
||||
1700,
|
||||
1800,
|
||||
1900,
|
||||
2000
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 144MHz"
|
||||
},
|
||||
"VUCC222": {
|
||||
"name": "VUCC - VHF/UHF Century Club 1.25m",
|
||||
"rule": {
|
||||
"band": [
|
||||
"1.25m"
|
||||
],
|
||||
"count": [
|
||||
50,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
90,
|
||||
100,
|
||||
200,
|
||||
250
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 222MHz"
|
||||
},
|
||||
"VUCC432": {
|
||||
"name": "VUCC - VHF/UHF Century Club 70cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"70cm"
|
||||
],
|
||||
"count": [
|
||||
50,
|
||||
100,
|
||||
150,
|
||||
200,
|
||||
250,
|
||||
300
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 430MHz"
|
||||
},
|
||||
"VUCC902": {
|
||||
"name": "VUCC - VHF/UHF Century Club 33cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"33cm"
|
||||
],
|
||||
"count": [
|
||||
25,
|
||||
30,
|
||||
35,
|
||||
40,
|
||||
45,
|
||||
50,
|
||||
55,
|
||||
60,
|
||||
65,
|
||||
70,
|
||||
75,
|
||||
80,
|
||||
85,
|
||||
90,
|
||||
95,
|
||||
100
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 902MHz"
|
||||
},
|
||||
"VUCC1296": {
|
||||
"name": "VUCC - VHF/UHF Century Club 23cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"23cm"
|
||||
],
|
||||
"count": [
|
||||
25,
|
||||
50,
|
||||
100,
|
||||
150,
|
||||
200,
|
||||
250,
|
||||
300,
|
||||
350,
|
||||
400
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 1296MHz"
|
||||
},
|
||||
"VUCC2-3G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 13cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"13cm"
|
||||
],
|
||||
"count": [
|
||||
10,
|
||||
25,
|
||||
50,
|
||||
100,
|
||||
150,
|
||||
200,
|
||||
250,
|
||||
300
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 2.3GHz"
|
||||
},
|
||||
"VUCC3-3G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 9cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"9cm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
20,
|
||||
30,
|
||||
40,
|
||||
50,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
90,
|
||||
100
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 3.3GHz"
|
||||
},
|
||||
"VUCC5-7G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 5cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"5cm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
20,
|
||||
30,
|
||||
40,
|
||||
50,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
90,
|
||||
100
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 5.7G"
|
||||
},
|
||||
"VUCC10G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 3cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"3cm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
20,
|
||||
30,
|
||||
40,
|
||||
50,
|
||||
60,
|
||||
70,
|
||||
80,
|
||||
90,
|
||||
100,
|
||||
110,
|
||||
120,
|
||||
130,
|
||||
140,
|
||||
150,
|
||||
160,
|
||||
170,
|
||||
180,
|
||||
190,
|
||||
200
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 10GHz"
|
||||
},
|
||||
"VUCC24G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 1.2cm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"1.2cm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
15,
|
||||
20,
|
||||
25,
|
||||
30,
|
||||
35,
|
||||
40,
|
||||
45,
|
||||
50
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 24GHz"
|
||||
},
|
||||
"VUCC47G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 6mm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"6mm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
15,
|
||||
20,
|
||||
25,
|
||||
30,
|
||||
35,
|
||||
40,
|
||||
45,
|
||||
50
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 47GHz"
|
||||
},
|
||||
"VUCC75G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 4mm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"4mm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
15,
|
||||
20,
|
||||
25,
|
||||
30
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 75GHz"
|
||||
},
|
||||
"VUCC122G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 2.5mm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"2.5mm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10,
|
||||
15,
|
||||
20
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 122GHz"
|
||||
},
|
||||
"VUCC134G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 2mm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"2mm"
|
||||
],
|
||||
"count": [
|
||||
5,
|
||||
10
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 134GHz"
|
||||
},
|
||||
"VUCC241G": {
|
||||
"name": "VUCC - VHF/UHF Century Club 1mm",
|
||||
"rule": {
|
||||
"band": [
|
||||
"1mm"
|
||||
],
|
||||
"count": [
|
||||
5
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "grids"
|
||||
},
|
||||
"sponsor": "ARRL",
|
||||
"tooltip": "VUCC 241GHz"
|
||||
},
|
||||
"WAC": {
|
||||
"name": "WAC - Worked All Continents",
|
||||
"rule": {
|
||||
|
@ -9938,5 +10373,277 @@
|
|||
"qsl_req": "confirmed",
|
||||
"sponsor": "QRZ.com",
|
||||
"website": "https://www.qrz.com/"
|
||||
},
|
||||
"RAC": {
|
||||
"awards": {
|
||||
"Canadaward": {
|
||||
"name": "Canadaward - Worked all Canadian Provinces/Territories",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
13
|
||||
],
|
||||
"dxcc": [
|
||||
1
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Mixed",
|
||||
"Digital",
|
||||
"Phone"
|
||||
],
|
||||
"type": "states"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Canadaward"
|
||||
},
|
||||
"WARAC": {
|
||||
"name": "WARAC - Worked All RAC",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"call": [
|
||||
"VA1RAC",
|
||||
"VA2RAC",
|
||||
"VA3RAC",
|
||||
"VA4RAC",
|
||||
"VA5RAC",
|
||||
"VA6RAC",
|
||||
"VA7RAC",
|
||||
"VE1RAC",
|
||||
"VE3RAC",
|
||||
"VE4RAC",
|
||||
"VE5RAC",
|
||||
"VE6RAC",
|
||||
"VE7RAC",
|
||||
"VE8RAC",
|
||||
"VE9RAC",
|
||||
"VO1RAC",
|
||||
"VO2RAC",
|
||||
"VY0RAC",
|
||||
"VY1RAC",
|
||||
"VY2RAC",
|
||||
"VA3RHQ",
|
||||
"VE3RHQ"
|
||||
],
|
||||
"count": [
|
||||
10
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "call"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Worked All RAC Award"
|
||||
},
|
||||
"WANA": {
|
||||
"name": "WANA - Worked All North America",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"cont": "NA",
|
||||
"count": [
|
||||
30,
|
||||
40,
|
||||
50
|
||||
],
|
||||
"endorse": [
|
||||
"2m",
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"60m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "dxcc"
|
||||
},
|
||||
"sponsor": "RAC",
|
||||
"tooltip": "Worked All North America Award"
|
||||
}
|
||||
},
|
||||
"compiledBy": "WA4YA",
|
||||
"mixed": [
|
||||
"160m",
|
||||
"80m",
|
||||
"40m",
|
||||
"30m",
|
||||
"20m",
|
||||
"17m",
|
||||
"15m",
|
||||
"12m",
|
||||
"10m",
|
||||
"6m",
|
||||
"2m",
|
||||
"1.25m",
|
||||
"70cm",
|
||||
"23cm"
|
||||
],
|
||||
"qsl_req": "confirmed",
|
||||
"sponsor": "Radio Amateurs of/du Canada",
|
||||
"website": "https://www.rac.ca/"
|
||||
},
|
||||
"CQ": {
|
||||
"awards": {
|
||||
"WAZ": {
|
||||
"name": "WAZ - Worked All CQ Zones",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
40
|
||||
],
|
||||
"endorse": [
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"Digital",
|
||||
"Phone",
|
||||
"Mixed"
|
||||
],
|
||||
"type": "cqz"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "Worked All CQ Zones"
|
||||
},
|
||||
"USACA": {
|
||||
"name": "USA-CA - United States Counties Award",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
500,
|
||||
1000,
|
||||
2000,
|
||||
3181
|
||||
],
|
||||
"dxcc": [
|
||||
6,
|
||||
110,
|
||||
291
|
||||
],
|
||||
"endorse": [],
|
||||
"mode": [
|
||||
"Mixed"
|
||||
],
|
||||
"type": "cnty"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "USA-CA"
|
||||
},
|
||||
"WPX": {
|
||||
"name": "WPX - Worked Prefixes",
|
||||
"rule": {
|
||||
"band": [
|
||||
"Mixed"
|
||||
],
|
||||
"count": [
|
||||
500,
|
||||
1000,
|
||||
1500,
|
||||
2000,
|
||||
3500,
|
||||
3000,
|
||||
3500,
|
||||
4000,
|
||||
4500,
|
||||
5000
|
||||
],
|
||||
"endorse": [
|
||||
"6m",
|
||||
"10m",
|
||||
"12m",
|
||||
"15m",
|
||||
"17m",
|
||||
"20m",
|
||||
"30m",
|
||||
"40m",
|
||||
"80m",
|
||||
"160m"
|
||||
],
|
||||
"mode": [
|
||||
"FT8"
|
||||
],
|
||||
"type": "px"
|
||||
},
|
||||
"sponsor": "CQ Magazine",
|
||||
"tooltip": "Worked Prefixes"
|
||||
}
|
||||
},
|
||||
"compiledBy": "WA4YA",
|
||||
"mixed": [
|
||||
"160m",
|
||||
"80m",
|
||||
"40m",
|
||||
"30m",
|
||||
"20m",
|
||||
"17m",
|
||||
"15m",
|
||||
"12m",
|
||||
"10m",
|
||||
"6m",
|
||||
"2m",
|
||||
"1.25m",
|
||||
"70cm",
|
||||
"23cm"
|
||||
],
|
||||
"qsl_req": "confirmed",
|
||||
"sponsor": "CQ Magazine",
|
||||
"website": "https://cq-amateur-radio.com"
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -374,7 +374,7 @@
|
|||
"497": ["Croatia", "HR", "hr.png"],
|
||||
"499": ["Slovenia", "SI", "si.png"],
|
||||
"501": ["Bosnia and Herzegovina", "BA", "ba.png"],
|
||||
"502": ["Macedonia", "MK", "mk.png"],
|
||||
"502": ["N. Macedonia", "MK", "mk.png"],
|
||||
"503": ["Czech Republic", "CZ", "cz.png"],
|
||||
"504": ["Slovak Republic", "SK", "sk.png"],
|
||||
"505": ["Pratas Island", "TW", "tw.png"],
|
||||
|
|
|
@ -144,5 +144,17 @@
|
|||
"minZoom": 0,
|
||||
"maxZoom": 4,
|
||||
"offline": true
|
||||
},
|
||||
"GoogleMap by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
},
|
||||
"GoogleMap Satellite by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=s,m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
}
|
||||
}
|
||||
|
|
Plik diff jest za duży
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -76,14 +76,25 @@
|
|||
wrapperDiv.style.display = "block";
|
||||
}
|
||||
|
||||
document.addEventListener("keydown", handleEnter, false);
|
||||
document.addEventListener("keyup", handleKey, false);
|
||||
|
||||
function handleEnter(event)
|
||||
{
|
||||
if (event.key == "Enter")
|
||||
{
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function handleKey(event)
|
||||
{
|
||||
if (event.key == "Enter")
|
||||
{
|
||||
// Do work
|
||||
var msg = messageInput.value.replace(/[\n\r]/g, '');
|
||||
var msg = messageInput.value.trim();
|
||||
if (msg.length > 0 && g_currentId != 0 && g_currentId in window.opener.GT.gtFlagPins && window.opener.GT.gtFlagPins[g_currentId].canmsg == true)
|
||||
{
|
||||
var worker = "";
|
||||
|
@ -673,7 +684,7 @@
|
|||
</div>
|
||||
<div id="messageTextDiv" class="boxDisplay" style="overflow: auto; white-space: pre-wrap;user-select: text"></div>
|
||||
<div id="messageInputDiv" style="position: fixed; bottom: 3px">
|
||||
<textarea disabled="true" id="messageInput" maxlength="256" rows="2" value="" class="roundBorder"></textarea>
|
||||
<textarea disabled="true" id="messageInput" maxlength="500" rows="2" value="" class="roundBorder"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
|
|
@ -80,6 +80,7 @@
|
|||
}
|
||||
|
||||
function init() {
|
||||
window.opener.GT.conditionsWindowInitialized = true;
|
||||
lockNewWindows();
|
||||
showConditionsBox();
|
||||
|
||||
|
@ -105,7 +106,7 @@
|
|||
vertical-align: middle;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
|
||||
"
|
||||
>
|
||||
<div id="conditionsDataDiv">
|
||||
|
|
|
@ -44,17 +44,413 @@
|
|||
<script src="./lib/roster/sendAlerts.js" type="text/javascript"></script>
|
||||
</head>
|
||||
<body id="rosterBody" onload="init()" onresize="resize()" style="display:none;" class="roster" oncontextmenu="return handleContextMenu(event);">
|
||||
<div id="settingsDiv">
|
||||
<div style="top: 1px; right: 1px; position: absolute">
|
||||
<button class="Xbutton" onclick="closeSettings()">X</button>
|
||||
</div>
|
||||
<div class="infotab">
|
||||
<button data-i18n="settings.General.label" id="generalbox" class="infoTablinks active" onclick="openInfoTab(event, 'generalSettingsDiv')">
|
||||
General
|
||||
</button>
|
||||
<button data-i18n="roster.watcher.label" id="watcherbox" class="infoTablinks" onclick="openInfoTab(event, 'watcherBoxDiv', openWathcherTab);">
|
||||
Watcher
|
||||
</button>
|
||||
<button data-i18n="roster.exceptions.label" id="exceptionsbox" class="infoTablinks" onclick="openInfoTab(event, 'exceptionsBoxDiv')">
|
||||
Exceptions
|
||||
</button>
|
||||
<button data-i18n="roster.ignores.label" id="ingoresbox" class="infoTablinks" onclick="openInfoTab(event, 'ignoresBoxDiv', renderIgnoresTab)">
|
||||
Ignores
|
||||
</button>
|
||||
<button data-i18n="settings.Columns.label" id="columnsbox" class="infoTablinks" onclick="openInfoTab(event, 'columnsBoxDiv', renderColumnsTab)">
|
||||
Columns
|
||||
</button>
|
||||
</div>
|
||||
<div id="generalSettingsDiv" class="infoTabcontent">
|
||||
<div class="mapItem" align="center">
|
||||
<table >
|
||||
<tr align="center" >
|
||||
<td>Animate 'CQ GT'</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td>
|
||||
<input type="checkbox" id="animateCQGT" onchange="changeAnimateCQGT(this)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem" align="center">
|
||||
<table >
|
||||
<tr align="center" >
|
||||
<td data-i18n="settings.callroster.AlwaysOnTop.label" >Window Always On Top</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td>
|
||||
<input type="checkbox" id="rosterAlwaysOnTop" onchange="changeRosterTop(this)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem" align="center">
|
||||
<table>
|
||||
<tr align="center">
|
||||
<td data-i18n="settings.callroster.MaxAge.label">Roster Max Age</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td id="rosterTimeTd">2m 0s</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="5" max="300" value="120" step="5" class="slider" id="rosterTime"
|
||||
oninput="changeRosterTime()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br/>
|
||||
<div class="mapItem" align="center">
|
||||
<table>
|
||||
<tr align="center">
|
||||
<td>Clear Roster on Band change</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="1">
|
||||
<input type="checkbox" id="clearRosterOnBandChange" onchange="clearRosterOnBandChangeValueChanged(this)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem" align="center">
|
||||
<table>
|
||||
<tr align="center">
|
||||
<td>Decode Delay On Focus</td>
|
||||
</tr>
|
||||
<td align="center" colspan="1">
|
||||
<input type="checkbox" id="rosterDelayOnFocus" onchange="rosterDelayOnFocusValueChanged(this)" />
|
||||
</td>
|
||||
<tr align="center">
|
||||
<td style="display:none;" id="rosterDelayTimeTd">1500ms</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td >
|
||||
<input type="range" min="50" max="5000" value="1500" step="10" class="slider" id="rosterDelayTime"
|
||||
oninput="changeRosterDelayTime()" style="display:none;" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<div class="button" style="margin: 5px; font:larger; padding:5px;" id="compactModeDiv" onclick="compactModeChanged()">Compact Mode</div>
|
||||
</div>
|
||||
<div class="mapItem" id="compactEnityDiv">
|
||||
<label>Compact Mode Entity<label><br />
|
||||
<select id="compactEntitySelect" onchange="compactEntityChanged()"></select>
|
||||
</div>
|
||||
<br />
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Window Filters</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center">
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Brightness</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterbrightnessTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="10" max="100" value="100" step="1" class="slider"
|
||||
id="filterbrightnessSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Contrast</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtercontrastTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="10" max="100" value="100" step="1" class="slider" id="filtercontrastSlider"
|
||||
oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Saturate</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtersaturateTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="200" value="100" step="1" class="slider" id="filtersaturateSlider"
|
||||
oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Invert</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterinvertTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filterinvertSlider"
|
||||
oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Sepia</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtersepiaTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filtersepiaSlider"
|
||||
oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Hue Rotate</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterhuerotateTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="359" value="0" step="1" class="slider" id="filterhuerotateSlider"
|
||||
oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="mapItem">
|
||||
<div class="button" style="margin: 10px;padding:3px;" onclick="resetFilters()" title="Reset Filters">Reset Filters
|
||||
(Ctrl-R)</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="watcherBoxDiv" class="infoTabcontent">
|
||||
<div class="rowBuilder">
|
||||
<table>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th>Regex</th>
|
||||
<th id="watcherTextTh">Input</th>
|
||||
<th>Start<br/>Date</th>
|
||||
<th id="watcherStartDateTh">UTC</th>
|
||||
<th>End<br/>Date</th>
|
||||
<th id="watcherEndDateTh">UTC</th>
|
||||
<th id="watcherAutoDeleteTh"></thid>Auto<br/>Delete</th>
|
||||
<th>Clear</th>
|
||||
<th>Save</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input id="watcherName" type="text" class="inputTextValue" oninput="watcherOnName()" size="7"/>
|
||||
</td>
|
||||
<td>
|
||||
<select id="watcherType" onchange="watcherTypeChanged(this.value)">
|
||||
<option value="Callsign" data-i18n="roster.controls.hunting.callsign">Callsign</option>
|
||||
<option value="Calling" data-i18n="alerts.QRZ.speech">Calling</option>
|
||||
<option value="Grid" data-i18n="roster.controls.hunting.grid">Grid</option>
|
||||
<option value="Message" data-i18n="gt.WSJTMessage.Message">Message</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" id="watcherRegexCheckbox" onchange="watcherRegexChanged(this.checked)" />
|
||||
</td>
|
||||
<td>
|
||||
<input id="watcherText" type="text" class="inputTextValue" value="" oninput="watcherOnText()" size="10"/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" id="watcherStartDateCheckbox" onchange="watcherStartDateEnable(this.checked)" />
|
||||
</td>
|
||||
<td id="watcherStartDateTd">
|
||||
<input type="datetime-local" required id="watcherStartDate" style="background-color: green; color: yellow;" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" id="watcherEndDateCheckbox" onchange="watcherEndDateEnable(this.checked)" />
|
||||
</td>
|
||||
<td id="watcherEndDateTd">
|
||||
<input type="datetime-local" required id="watcherEndDate" style="background-color: green; color: yellow;" />
|
||||
</td>
|
||||
<td id="watcherAutoDeleteTd">
|
||||
<input type="checkbox" id="watcherAutoDeleteCheckbox" />
|
||||
</td>
|
||||
<td style="font:xx-large;cursor:pointer;" onclick="clearWatcher()">🛑</td>
|
||||
<td style="font:xx-large;cursor:pointer;" onclick="saveWatcher()">✅</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="watcherEditView"></div>
|
||||
</div>
|
||||
<div id="exceptionsBoxDiv" class="infoTabcontent">
|
||||
<div class="exceptionTab">
|
||||
<div>
|
||||
<input type="checkbox" id="wantMinDB" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.minDB" for="wantMinDB">Min dB</label>
|
||||
<span id="minDbView" class="roundBorderValue">-24</span>
|
||||
<p>
|
||||
<input
|
||||
type="range"
|
||||
min="-25"
|
||||
max="0"
|
||||
step="1"
|
||||
class="slider"
|
||||
id="minDb"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="wantMaxDT" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.maxDT" for="wantMaxDT">Max DT</label>
|
||||
<span id="maxDTView" class="roundBorderValue">.5</span>
|
||||
<p>
|
||||
<input
|
||||
type="range"
|
||||
min="0.1"
|
||||
max="2"
|
||||
step="0.1"
|
||||
class="slider"
|
||||
id="maxDT"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="wantMinFreq" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.minFreq" for="wantMinFreq">Min freq</label>
|
||||
<span id="minFreqView" class="roundBorderValue">400</span>
|
||||
<p>
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="2500"
|
||||
step="10"
|
||||
class="slider"
|
||||
id="minFreq"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="wantMaxFreq" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.maxFreq" for="wantMaxFreq">Max freq</label>
|
||||
<span id="maxFreqView" class="roundBorderValue">3500</span>
|
||||
<p>
|
||||
<input
|
||||
type="range"
|
||||
min="500"
|
||||
max="3500"
|
||||
step="10"
|
||||
class="slider"
|
||||
id="maxFreq"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
</div>
|
||||
<div id="usesLoTWDiv">
|
||||
<input type="checkbox" id="usesLoTW" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.usesLoTW" for="usesLoTW">Uses LoTW</label>
|
||||
<span id="maxLoTWView" class="roundBorderValue" style="width: 35px;">3</span>
|
||||
<p>
|
||||
<input
|
||||
title="Max time since their last upload"
|
||||
type="range"
|
||||
min="3"
|
||||
max="27"
|
||||
step="3"
|
||||
class="slider"
|
||||
id="maxLoTW"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ituzoneBoxDiv" class="infoTabcontent">
|
||||
</div>
|
||||
<div id="ignoresBoxDiv" class="infoTabcontent">
|
||||
<div class="rowBuilder" >
|
||||
Entity
|
||||
<select id="ignoreTypeSelect" onchange="ignoreTypeChanged(this.value);">
|
||||
<option value="Callsign" selected="true">Callsign</option>
|
||||
<option value="CQ">CQ</option>
|
||||
<option value="DXCC">DXCC</option>
|
||||
<option value="Grid">Grid</option>
|
||||
<option value="CQz">CQ Zone</option>
|
||||
<option value="ITUz">ITU Zone</option>
|
||||
</select>
|
||||
<input id="ignoreCallsignValue" type="text" class="inputTextValue" oninput="this.value = this.value.toUpperCase()" size="10"/>
|
||||
<input id="ignoreGridValue" type="text" class="inputTextValue" oninput="gridInputValidate(this)" size="10"/>
|
||||
<div id ="ignoreCqDiv">
|
||||
CQ "<input id="ignoreCqCallsignValue" type="text" class="inputTextValue" oninput="this.value = this.value.toUpperCase()" size="4" value=""/>"
|
||||
From
|
||||
<select id="ignoreCqDxccSelect"><option value=-1 selected="true">All</option></select>
|
||||
</div>
|
||||
<select id="ignoreDxccSelect" >
|
||||
<option value=-1 selected="true" data-i18n="mapFilter.prop.Unknown">Unknown</option>
|
||||
</select>
|
||||
<select id="ignoreCqzSelect"></select>
|
||||
<select id="ignoreItuzSelect"></select>
|
||||
<button onclick="addNewIgnore()" class="flexButton" style="background-color: #000000;font-weight:bold;font-size:larger;color:lightgreen;">+</button>
|
||||
<labal id="ingnoreAddResultLabel"></label>
|
||||
</div>
|
||||
<div id="ignoresEditView"></div>
|
||||
</div>
|
||||
<div id="columnsBoxDiv" class="infoTabcontent">
|
||||
<div id="columnsEditView">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="MainCallRoster" style="display:block;";>
|
||||
<header id="RosterControls">
|
||||
<div id="TransmitControls">
|
||||
<div id="txrxdec" style=" background-color: Green; border-style: outset; border-color: yellow; border-width: 3px; margin: 2px;" class="roundBorder">
|
||||
<div id="txrxdec" style="background-color: Green; border-style: outset; border-color: yellow; border-width: 3px; margin: 2px;" class="roundBorder">
|
||||
Waiting…
|
||||
</div>
|
||||
<div class="button" style="margin: 3px" onclick="window.opener.haltAllTx(true);">Halt Tx</div>
|
||||
<div class="button" style="margin: 3px;" onclick="window.opener.haltAllTx(true);" data-i18n="roster.haltTX">Halt Tx</div>
|
||||
<div class="button" style="margin: 3px;color:cyan;" onclick="openSettings();" data-i18n="roster.menu.Settings"></div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="MoreLessControls">
|
||||
<div id="MoreControls">
|
||||
<div data-i18n="roster.controls.more" class="link" onclick="toggleMoreControls()" id="ShowMoreControlsLink">More Controls</div>
|
||||
</div>
|
||||
|
||||
<div id="LessControls">
|
||||
<div data-i18n="roster.controls.less" class="link" onclick="toggleMoreControls()" id="ShowFewerControlsLink">Fewer Controls</div>
|
||||
</div>
|
||||
|
||||
|
@ -106,7 +502,7 @@
|
|||
<option data-i18n="roster.controls.huntState.label"value="" selected="true">Select Territory</option>
|
||||
</select>
|
||||
|
||||
<select id="DXCCsSelect" onchange="valuesChanged();" id="HuntDXCCsControls">
|
||||
<select id="DxccSingleSelect" onchange="valuesChanged();"">
|
||||
<option data-i18n="roster.controls.huntDXCC.label" value="-1" selected="true">Select DXCC</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -150,8 +546,7 @@
|
|||
<div id="SecondaryRosterControls">
|
||||
<div id="huntingMatrixDiv" class="secondaryControlGroup">
|
||||
<h3 data-i18n="roster.secondary.wanted.label">Wanted</h3>
|
||||
|
||||
<div class='columns'>
|
||||
<div class="columns">
|
||||
<div>
|
||||
<input type="checkbox" id="huntCallsign" onchange="wantedChanged(this);" />
|
||||
<label data-i18n="roster.secondary.wanted.callsign" for="huntCallsign">Callsign</label>
|
||||
|
@ -180,8 +575,6 @@
|
|||
<input type="checkbox" id="huntOAMS" onchange="wantedChanged(this);" />
|
||||
<label data-i18n="roster.secondary.wanted.OAMS" for="huntOAMS" title="Off-Air Message Service Users">OAMS</label>
|
||||
</div>
|
||||
<div>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="huntCQz" onchange="wantedChanged(this);" />
|
||||
<label data-i18n="roster.secondary.wanted.cqzone" for="huntCQz" title="CQ Zones">CQz</label>
|
||||
|
@ -207,207 +600,56 @@
|
|||
<label data-i18n="roster.secondary.wanted.cont" for="huntCont" title="Continent">Continent</label>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="huntRegex" onchange="wantedChanged(this);" />
|
||||
<label data-i18n="roster.secondary.wanted.regex" title="Callsign Regular Expression">Regex</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="inputTextValue"
|
||||
size="12"
|
||||
id="huntRegexValue"
|
||||
onfocus="CR.typingInRoster=true;"
|
||||
onblur="CR.typingInRoster=false;"
|
||||
oninput="valuesChanged();"
|
||||
onkeydown="blurOnEnter(this);"
|
||||
/>
|
||||
<input type="checkbox" id="huntWatcher" onchange="wantedChanged(this);" />
|
||||
<label data-i18n="roster.watcher.label" class="flexButton" onclick="openWatcher();">Watcher</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="exceptionDiv" class="secondaryControlGroup">
|
||||
<h3>Exceptions</h3>
|
||||
<div class='columns'>
|
||||
<div id="exceptionDiv" class="secondaryControlGroup" >
|
||||
<h3 data-i18n="roster.exceptions.label">Exceptions</h3>
|
||||
<div class="columns">
|
||||
<div>
|
||||
<input type="checkbox" id="cqOnly" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.cqOnly" for="cqOnly">CQ Only</label>
|
||||
<label data-i18n="roster.secondary.exceptions.cqOnly" for="cqOnly">CQ Only</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantGrid" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.hasGrid" for="wantGrid">Has Grid</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantMinDB" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.minDB" for="wantMinDB">Min dB</label>
|
||||
<input
|
||||
type="range"
|
||||
min="-25"
|
||||
max="0"
|
||||
step="1"
|
||||
class="slider"
|
||||
id="minDb"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
<span id="minDbView" class="roundBorderValue">-24</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantMaxDT" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.maxDT" for="wantMaxDT">Max DT</label>
|
||||
<input
|
||||
type="range"
|
||||
min="0.1"
|
||||
max="2"
|
||||
step="0.1"
|
||||
class="slider"
|
||||
id="maxDT"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
<span id="maxDTView" class="roundBorderValue">.5</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantMinFreq" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.minFreq" for="wantMinFreq">Min freq</label>
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="2500"
|
||||
step="10"
|
||||
class="slider"
|
||||
id="minFreq"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
<span id="minFreqView" class="roundBorderValue">400</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantMaxFreq" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.maxFreq" for="wantMaxFreq">Max freq</label>
|
||||
<input
|
||||
type="range"
|
||||
min="500"
|
||||
max="3500"
|
||||
step="10"
|
||||
class="slider"
|
||||
id="maxFreq"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
|
||||
<span id="maxFreqView" class="roundBorderValue">3500</span>
|
||||
</div>
|
||||
|
||||
<div id="usesLoTWDiv">
|
||||
<input type="checkbox" id="usesLoTW" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.usesLoTW" for="usesLoTW">Uses LoTW</label>
|
||||
|
||||
<input
|
||||
title="Max time since their last upload"
|
||||
type="range"
|
||||
min="3"
|
||||
max="27"
|
||||
step="3"
|
||||
class="slider"
|
||||
id="maxLoTW"
|
||||
oninput="valuesChanged();"
|
||||
/>
|
||||
<span id="maxLoTWView" class="roundBorderValue" style="width: 35px;">3</span>
|
||||
</div>
|
||||
|
||||
<div id="onlySpotDiv">
|
||||
<input type="checkbox" id="onlySpot" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.spottedMe" for="onlySpot">Spotted Me</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="noMyDxcc" onchange="onlyMyDxcc.checked=false; valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.noMyDXCC" for="noMyDxcc">Not My DXCC</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="onlyMyDxcc" onchange="noMyDxcc.checked=false; valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.onlyMyDXCC" for="onlyMyDxcc">Only My DXCC</label>
|
||||
</div>
|
||||
|
||||
<div id="useseQSLDiv">
|
||||
<input type="checkbox" id="useseQSL" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.useseQSL" for="useseQSL">Uses eQSL</label>
|
||||
</div>
|
||||
|
||||
<div id="usesOQRSDiv">
|
||||
<input type="checkbox" id="usesOQRS" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.usesOQRS" for="usesOQRS">Uses OQRS</label>
|
||||
</div>
|
||||
|
||||
<div id="allOnlyNewDiv">
|
||||
<input type="checkbox" id="allOnlyNew" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.allOnlyNew" for="allOnlyNew">Only New Calls</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="wantRRCQ" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.wantRRCQ" for="wantRRCQ">RR73 as CQ</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="noUnknownDXCC" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.noUnknownDXCC" >No Unknown DXCC</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label title="No Decodes Containing...">
|
||||
<input type="checkbox" id="noMsg" onchange="valuesChanged();" />
|
||||
No
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="inputTextValue"
|
||||
size="8"
|
||||
id="noMsgValue"
|
||||
onfocus="CR.typingInRoster=true;"
|
||||
onblur="CR.typingInRoster=false;"
|
||||
oninput="valuesChanged();"
|
||||
onkeydown="blurOnEnter(this);"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label title="Only Decodes Containing...">
|
||||
<input type="checkbox" id="onlyMsg" onchange="valuesChanged();" />
|
||||
Only
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
class="inputTextValue"
|
||||
size="8"
|
||||
id="onlyMsgValue"
|
||||
onfocus="CR.typingInRoster=true;"
|
||||
onblur="CR.typingInRoster=false;"
|
||||
oninput="valuesChanged();"
|
||||
onkeydown="blurOnEnter(this);"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label title="Callsign Regular Expression">
|
||||
<input type="checkbox" id="useRegex" onchange="valuesChanged();" />
|
||||
Regex
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="inputTextValue"
|
||||
size="12"
|
||||
id="callsignRegex"
|
||||
onfocus="CR.typingInRoster=true;"
|
||||
onblur="CR.typingInRoster=false;"
|
||||
oninput="valuesChanged();"
|
||||
onkeydown="blurOnEnter(this);"
|
||||
/>
|
||||
</div>
|
||||
<input type="checkbox" id="wantGrid" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.hasGrid" for="wantGrid">Has Grid</label>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="noMyDxcc" onchange="onlyMyDxcc.checked=false; valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.noMyDXCC" for="noMyDxcc">Not My DXCC</label>
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="onlyMyDxcc" onchange="noMyDxcc.checked=false; valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.onlyMyDXCC" for="onlyMyDxcc">Only My DXCC</label>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="allOnlyNewDiv">
|
||||
<input type="checkbox" id="allOnlyNew" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.allOnlyNew" for="allOnlyNew">New Calls</label>
|
||||
</div>
|
||||
<div id="onlySpotDiv">
|
||||
<input type="checkbox" id="onlySpot" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.spottedMe" for="onlySpot">Spotted Me</label>
|
||||
</div>
|
||||
<div id="useseQSLDiv">
|
||||
<input type="checkbox" id="useseQSL" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.useseQSL" for="useseQSL">Uses eQSL</label>
|
||||
</div>
|
||||
<div id="usesOQRSDiv">
|
||||
<input type="checkbox" id="usesOQRS" onchange="valuesChanged();" />
|
||||
<label data-i18n="roster.secondary.exceptions.usesOQRS" for="usesOQRS">Uses OQRS</label>
|
||||
</div>
|
||||
<div class="flexButton" style="margin-left: 18px;font-weight: bolder;" onclick="openExceptions()"> . . . </div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</header>
|
||||
|
@ -419,221 +661,8 @@
|
|||
<main id="RosterTable"></main>
|
||||
</div>
|
||||
|
||||
<div id="rosterDelayDiv" class="roundBorder" style="display:none; margin: 0px; margin-top: -1px; position:fixed; top:0px; left:0px;">⌛</div>
|
||||
<div id="rosterDelayDiv" class="roundBorder" style="display:none; margin: 0px; margin-top: -1px; position:fixed; top:3px; left:3px;font-size:larger;">⌛</div>
|
||||
|
||||
<div
|
||||
id="editView"
|
||||
class="roundBorder"
|
||||
style="height: 100%; width:95%; top:0px; left:0px; border: 3px solid #066; padding: 10px; margin: 10px; display: none; position: absolute;"
|
||||
>
|
||||
<div style="display: block; font-size: larger">Callsign, CQ and DXCC Ignores</div>
|
||||
<br />
|
||||
<div id="editTables"></div>
|
||||
<div style="top: 1px; right: 1px; position: absolute">
|
||||
<button class="Xbutton" onclick="closeEditIgnores()">X</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="settingsDiv" class="roundBorder" style="overflow: hidden;
|
||||
margin: 0;
|
||||
top: 10px;
|
||||
left: 15%;
|
||||
width: 70%;
|
||||
display: none;
|
||||
background-color: #000000;
|
||||
padding: 0px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
position: absolute;
|
||||
z-index: 600;
|
||||
border: 3px solid rgb(0, 50, 189);" >
|
||||
<div class="mapItem" >
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td data-i18n="settings.callroster.AlwaysOnTop.label" align="center">Window Always On Top</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="checkbox" id="rosterAlwaysOnTop" onchange="changeRosterTop(this)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem" >
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td data-i18n="settings.callroster.MaxAge.label" align="center">Call Roster Max Age</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="rosterTimeTd">2m 0s</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="5" max="300" value="120" step="5" class="slider" id="rosterTime"
|
||||
oninput="changeRosterTime()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Clear Call Roster on Band change</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="checkbox" id="clearRosterOnBandChange"
|
||||
onchange="clearRosterOnBandChangeValueChanged(this)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div class="mapItem">
|
||||
<label>Compact Mode Entity<label><br />
|
||||
<select id="compactEntitySelect" onchange="compactEntityChanged()"></select>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Call Roster Decode Delay On Focus</td>
|
||||
</tr>
|
||||
<td colspan="2">
|
||||
<input type="checkbox" id="rosterDelayOnFocus" onchange="rosterDelayOnFocusValueChanged(this)" />
|
||||
</td>
|
||||
<tr align="center">
|
||||
<td align="center" style="display:none;" id="rosterDelayTimeTd">1500ms</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2" >
|
||||
<input
|
||||
type="range"
|
||||
min="50"
|
||||
max="5000"
|
||||
value="1500"
|
||||
step="10"
|
||||
class="slider"
|
||||
id="rosterDelayTime"
|
||||
oninput="changeRosterDelayTime()"
|
||||
style="display:none;"
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Window Filters</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center">
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Brightness</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterbrightnessTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="10" max="100" value="100" step="1" class="slider" id="filterbrightnessSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Contrast</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtercontrastTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="10" max="100" value="100" step="1" class="slider" id="filtercontrastSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Saturate</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtersaturateTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="200" value="100" step="1" class="slider" id="filtersaturateSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br/>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Invert</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterinvertTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filterinvertSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Sepia</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filtersepiaTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filtersepiaSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mapItem">
|
||||
<table align="center">
|
||||
<tr align="center">
|
||||
<td align="center">Hue Rotate</td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td align="center" id="filterhuerotateTd"></td>
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td colspan="2">
|
||||
<input type="range" min="0" max="359" value="0" step="1" class="slider" id="filterhuerotateSlider" oninput="filtersChanged()" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="mapItem">
|
||||
<div class="button" style="margin: 10px" onclick="resetFilters()" title="Reset Filters">Reset Filters (Ctrl-R)</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="top: 1px; right: 1px; position: absolute">
|
||||
<button class="Xbutton" onclick="closeSettings()">X</button>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<script src="./lib/stats.js"></script>
|
||||
</head>
|
||||
|
||||
<body id="mainBody" onresize="Resize();" onload="init();">
|
||||
<body id="mainBody" onresize="Resize();" onload="init();window.opener.GT.statsWindowInitialized = true">
|
||||
<div
|
||||
id="rootInfoDiv"
|
||||
style="
|
||||
|
@ -72,12 +72,8 @@
|
|||
<button id="itubox" class="infoTablinks" onclick="openInfoTab(event, 'ituzoneBoxDiv', 'showITUzoneBox')">
|
||||
ITU Zones
|
||||
</button>
|
||||
<button
|
||||
id="waswacbox"
|
||||
class="infoTablinks"
|
||||
onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')"
|
||||
>
|
||||
WAC / WAS
|
||||
<button id="waswacbox" class="infoTablinks" onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')">
|
||||
WAC / WAS / WACP
|
||||
</button>
|
||||
<button id="wpxbox" class="infoTablinks" onclick="openInfoTab(event, 'wpxBoxDiv', 'showWPXBox')">WPX</button>
|
||||
<button id="calbox" class="infoTablinks" onclick="openInfoTab(event, 'callsignBoxDiv', 'showCallsignBox')">
|
||||
|
|
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
|
@ -250,7 +250,7 @@
|
|||
"312": "柬埔寨",
|
||||
"315": "斯里兰卡",
|
||||
"318": "中国",
|
||||
"321": "国香港",
|
||||
"321": "香港",
|
||||
"324": "印度",
|
||||
"327": "印度尼西亚",
|
||||
"330": "伊朗",
|
||||
|
@ -328,8 +328,8 @@
|
|||
"502": "北马其顿",
|
||||
"503": "捷克",
|
||||
"504": "斯洛伐克",
|
||||
"505": "国东沙群岛",
|
||||
"506": "国黄岩岛",
|
||||
"505": "东沙群岛",
|
||||
"506": "黄岩岛",
|
||||
"507": "泰莫图省",
|
||||
"508": "南方群岛",
|
||||
"509": "马克萨斯岛",
|
||||
|
|
|
@ -4,24 +4,24 @@
|
|||
"The GridTracker Team",
|
||||
"VR2UPU"
|
||||
],
|
||||
"last-updated": "2022-09-11",
|
||||
"last-updated": "2023-12-07",
|
||||
"locale": "hk",
|
||||
"message-documentation": "Traditional Chinese: VR2UPU"
|
||||
},
|
||||
"COMMENT_GridTracker.html": "",
|
||||
"appname-title": "GridTracker",
|
||||
"appname-title": "單擊隱藏菜單",
|
||||
"appname-sub-title": "GridTracker網格追蹤助手",
|
||||
"sidebarNoMessages": "waiting for message",
|
||||
"sidebarNoDataYet": "...no data yet...",
|
||||
"sidebarNoMessages": "等待信息",
|
||||
"sidebarNoDataYet": "...仍沒有資料...",
|
||||
"statupStatusDiv": "初始化啟動",
|
||||
"documents.Div1": "您的存檔目錄<div id='searchedDocFolder'></div> 未找到。",
|
||||
"documents.Div2": "沒有存檔目錄, GridTracker將無法繼續。",
|
||||
"documents.Div3": "請選擇一個目錄, 以便GridTracker可以存儲重要檔案。",
|
||||
"legend.title": "圖例",
|
||||
"legend.QSO.hover": "您曾經通過的電臺網格",
|
||||
"legend.QSO.label": "QSO",
|
||||
"legend.QSO.label": "通聯",
|
||||
"legend.QSL.hover": "您曾經通過並確認的電臺網格",
|
||||
"legend.QSL.label": "QSL",
|
||||
"legend.QSL.label": "確認",
|
||||
"legend.QSX.hover": "其他正在通聯帶網格的電臺",
|
||||
"legend.QSX.label": "QSX",
|
||||
"legend.CQ.hover": "網格內的電臺正在呼叫CQ",
|
||||
|
@ -49,16 +49,16 @@
|
|||
"quickStats.CallRX.hover": "聽到的呼號",
|
||||
"quickStats.CallRX.label": "接收的呼叫",
|
||||
"quickStats.QSO.hover": "通聯的電臺",
|
||||
"quickStats.QSO.label": "QSO",
|
||||
"quickStats.QSO.label": "通聯",
|
||||
"quickStats.DXCCRx.hover": "聽到的DXCC",
|
||||
"quickStats.DXCCRx.label": "接收的DXCC",
|
||||
"quickStats.QSL.hover": "顯示確認清單",
|
||||
"quickStats.QSL.label": "QSL",
|
||||
"quickStats.QSL.label": "確認",
|
||||
"quickLoad.clearLive.hover": "清除GridTracker接收的實時數據",
|
||||
"quickLoad.clearLive.label": "清除實時數據",
|
||||
"quickLoad.clearLog.hover": "清除或重新加載日志數據(不刪除日志檔案)",
|
||||
"quickLoad.clearLog.label": "清除日志",
|
||||
"quickLoad.loadLog.label": "加載日志",
|
||||
"quickLoad.clearLog.hover": "清除或重新加載日誌數據(不刪除日誌檔案)",
|
||||
"quickLoad.clearLog.label": "清除日誌",
|
||||
"quickLoad.loadLog.label": "加載日誌",
|
||||
"mapFilter.title.hover": "地圖視圖控制面板",
|
||||
"mapFilter.title.label": "地圖視圖過濾器",
|
||||
"mapFilter.band.hover": "選擇波段(自動跟蹤WSJT-X)",
|
||||
|
@ -83,8 +83,9 @@
|
|||
"mapFilter.band.6m": "6m",
|
||||
"mapFilter.band.4m": "4m",
|
||||
"mapFilter.band.2m": "2m",
|
||||
"mapFilter.band.125cm": "125cm",
|
||||
"mapFilter.band.1_25m": "1.25m",
|
||||
"mapFilter.band.70cm": "70cm",
|
||||
"mapFilter.band.33cm": "33cm",
|
||||
"mapFilter.band.23cm": "23cm",
|
||||
"mapFilter.band.13cm": "13cm",
|
||||
"mapFilter.band.9cm": "9cm",
|
||||
|
@ -125,8 +126,8 @@
|
|||
"mapFilter.prop.TransEquatorial": "跨赤道",
|
||||
"mapFilter.prop.TropoDuct": "對流層管道",
|
||||
"mapFilter.data.label": "數據",
|
||||
"mapFilter.data.LogLive": "日志+實時",
|
||||
"mapFilter.data.Logbook": "日志數據",
|
||||
"mapFilter.data.LogLive": "日誌 & 實時",
|
||||
"mapFilter.data.Logbook": "日誌數據",
|
||||
"mapFilter.data.Live": "實時信號",
|
||||
"controlPanel.CallRoster.hover": "打開呼叫清單",
|
||||
"controlPanel.PushPin.hover": "切換圖釘模式(P)",
|
||||
|
@ -137,20 +138,19 @@
|
|||
"controlPanel.MapLegend.hover": "切換地圖圖例",
|
||||
"controlPanel.Share.hover": "讓其他GridTracker用戶看到您的在線狀態",
|
||||
"controlPanel.Help.hover": "打開熱鍵清單(F1)",
|
||||
"controlPanel.Trophy.hover": "循環顯示獎狀圖層(=)",
|
||||
|
||||
"controlPanel.Trophy.hover": "循環顯示獎狀圖層(=)",
|
||||
"controlPanel.Moon.hover": "顯示月球位置(D)",
|
||||
"controlPanel.MaidenheadWidth.hover": "切換梅登黑德網格位數(W)",
|
||||
"controlPanel.Settings.hover": "設定(S)",
|
||||
"controlPanel.LoadADIF.hover": "載入本地ADIF日志(L)",
|
||||
"controlPanel.LoadADIF.hover": "載入本地ADIF日誌(L)",
|
||||
"controlPanel.CurrentCNDX.hover": "查看當前空間數據(C)",
|
||||
"controlPanel.DonateMoney.hover": "使用PayPal捐款",
|
||||
"controlPanel.AudioMute.hover": "切換靜音狀態(M)",
|
||||
"controlPanel.Spots.hover": "顯示Spot信息報告(O)",
|
||||
"controlPanel.PSK24.hover": "您24小時的PSK報告",
|
||||
"controlPanel.QRZ.hover": "從QRZ.com下載日志",
|
||||
"controlPanel.LOTW.hover": "從LOTW下載日志",
|
||||
"controlPanel.ClubLog.hover": "從ClubLog下載日志",
|
||||
"controlPanel.QRZ.hover": "從QRZ.com下載日誌",
|
||||
"controlPanel.LOTW.hover": "從LOTW下載日誌",
|
||||
"controlPanel.ClubLog.hover": "從ClubLog下載日誌",
|
||||
"controlPanel.LocalAIDF.hover": "重新載入本地ADIF檔案",
|
||||
"controlPanel.Timezone.hover": "顯示時區圖層",
|
||||
"controlPanel.Radar.hover": "顯示美國地區氣象雷達圖層(數字0)",
|
||||
|
@ -162,34 +162,35 @@
|
|||
"settings.Audio.label": "音頻",
|
||||
"settings.Map.label": "地圖",
|
||||
"settings.Grids.label": "網格",
|
||||
"settings.Logging.label": "日志記錄",
|
||||
"settings.Logging.label": "日誌記錄",
|
||||
"settings.Alerts.label": "警報",
|
||||
"settings.CallRoster.label": "呼叫清單",
|
||||
"settings.Columns.label": "表格列",
|
||||
"settings.OAMS.label": "OAMS",
|
||||
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
|
||||
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
|
||||
"settings.OAMS.simplepush.test": "Test",
|
||||
"settings.OAMS.pushover.enable.label": "Pushover.net Message Forwarding",
|
||||
"settings.OAMS.pushover.credentials.label": "Pushover Credentials",
|
||||
"settings.OAMS.pushover.userkey.label": "User Key",
|
||||
"settings.OAMS.pushover.token.label": "API Token",
|
||||
"settings.OAMS.pushover.test": "Test",
|
||||
"settings.OAMS.forward.chat": "Forward Chat Messages",
|
||||
"settings.OAMS.forward.roster": "Forward Roster Alerts",
|
||||
"settings.Logbook.label": "日志",
|
||||
"settings.OAMS.simplepush.enable.label": "簡單推送 .io消息 轉發",
|
||||
"settings.OAMS.simplepush.apikey.label": "簡單推送 API密鑰",
|
||||
"settings.OAMS.simplepush.test": "測試",
|
||||
"settings.OAMS.pushover.enable.label": "推送 .Net消息 轉發",
|
||||
"settings.OAMS.pushover.credentials.label": "推送憑據",
|
||||
"settings.OAMS.pushover.userkey.label": "用戶密鑰",
|
||||
"settings.OAMS.pushover.token.label": "API 密鑰",
|
||||
"settings.OAMS.pushover.test": "測試",
|
||||
"settings.OAMS.forward.chat": "轉發聊天消息",
|
||||
"settings.OAMS.forward.roster": "轉發名單警報",
|
||||
"settings.Logbook.label": "日誌",
|
||||
"settings.Update.label": "更新",
|
||||
"settings.About.label": "關於",
|
||||
"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.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": "公里",
|
||||
|
@ -198,7 +199,7 @@
|
|||
"settings.general.Distance.dg": "度",
|
||||
"settings.general.DecodeWaterfall.label": "右下角信息欄",
|
||||
"settings.general.CheckNewVersion.label": "檢查新版本",
|
||||
"settings.general.Language.label": "語言",
|
||||
"settings.general.Language.label": "語言(重新啟動)",
|
||||
"settings.general.ClearAllSettings.label": "清除所有設定!",
|
||||
"settings.general.ClearSettingSure.label": "是的,我肯定!",
|
||||
"settings.general.ExportSettings.label": "匯出設定",
|
||||
|
@ -211,19 +212,19 @@
|
|||
"settings.lookup.Username.label": "用戶名",
|
||||
"settings.lookup.Password.label": "密碼",
|
||||
"settings.lookup.QRZTest": "測試",
|
||||
"settings.lookup.AddData.label": "將尋找得到的資料增加至QSO日志紀錄中",
|
||||
"settings.lookup.AddData.hover": "當完成一個QSO時... 增加來自尋找得到的額外數據",
|
||||
"settings.lookup.AddGrid.label": "如果缺少QSO網格則增加尋找到的網格數據",
|
||||
"settings.lookup.AddGrid.hover": "如果缺少QSO網格則增加尋找到的網格數據",
|
||||
"settings.lookup.AddData.label": "將尋找得到的資料增加至通聯日誌紀錄中",
|
||||
"settings.lookup.AddData.hover": "當完成一個通聯時... 增加來自尋找得到的額外數據",
|
||||
"settings.lookup.AddGrid.label": "如果缺少通聯網格則增加尋找到的網格數據",
|
||||
"settings.lookup.AddGrid.hover": "如果缺少通聯網格則增加尋找到的網格數據",
|
||||
"settings.lookup.OpenOnTx.label": "在傳輸時打開尋找",
|
||||
"settings.lookup.OpenOnTx.hover": "發送時打開尋找視窗",
|
||||
"settings.lookup.CloseOnLog.label": "記錄日志後關閉尋找",
|
||||
"settings.lookup.CloseOnLog.hover": "記錄日志後關閉尋找",
|
||||
"settings.lookup.CloseOnLog.label": "記錄日誌後關閉尋找",
|
||||
"settings.lookup.CloseOnLog.hover": "記錄日誌後關閉尋找",
|
||||
"settings.lookup.CallookFirst.label": "在使用其他服務之前優先使用Callook平台",
|
||||
"settings.lookup.CallookFirst.hover": "在使用其他服務之前使用Callook平台,因為免費Callook比免費QRZ.com可以獲取更多數據。",
|
||||
"settings.lookup.Databases.label": "全球呼號數據庫",
|
||||
"settings.lookup.Databases.header": "數據庫平台 (如果啟用代表您支持此平台的QSL)",
|
||||
"settings.lookup.Enabled.header": "已啟用",
|
||||
"settings.lookup.Databases.header": "數據庫平台",
|
||||
"settings.lookup.Enabled.header": "啟用",
|
||||
"settings.lookup.LastDwnld.header": "最後下載",
|
||||
"settings.lookup.Count.header": "數量",
|
||||
"settings.lookup.db.ULS": "美國ULS",
|
||||
|
@ -238,17 +239,17 @@
|
|||
"settings.audio.Speech.Phonetics.hover": "以語音方式播出呼號和網格",
|
||||
"settings.audio.Device.label": "音頻播放設備",
|
||||
"settings.audio.File.Volume.label": "音頻檔案音量",
|
||||
"settings.audio.QSOLogEventFile.label": "QSO日志記錄通知音頻",
|
||||
"settings.logbook.callsigns.hover": "QSO日志以僅包含這些呼號的數據(逗號分隔)",
|
||||
"settings.audio.QSOLogEventFile.label": "通聯日誌記錄通知音頻",
|
||||
"settings.logbook.callsigns.hover": "通聯日誌以僅包含這些呼號的數據(逗號分隔)",
|
||||
"settings.logbook.callsigns.label": "過濾通聯呼號",
|
||||
"settings.logbook.callsigns.enable": "啟用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼號(可多選)",
|
||||
"settings.logbook.date.hover": "在此日期之前過濾日志QSO",
|
||||
"settings.logbook.callsigns.enable": "啟用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼號",
|
||||
"settings.logbook.date.hover": "在此日期之前過濾通聯日誌",
|
||||
"settings.logbook.date.label": "通聯日期",
|
||||
"settings.logbook.date.enable": "啟用?",
|
||||
"settings.logbook.date.date": "Date",
|
||||
"settings.logbook.date.time": "Time",
|
||||
"settings.logbook.apply.hover": "套用更改並重新匯入日志",
|
||||
"settings.logbook.date.enable": "啟用?",
|
||||
"settings.logbook.date.date": "日期",
|
||||
"settings.logbook.date.time": "時間",
|
||||
"settings.logbook.apply.hover": "套用更改並重新匯入日誌",
|
||||
"settings.logbook.apply.label": "套用更改",
|
||||
"settings.grids.reset.title": "網格顏色",
|
||||
"settings.grids.reset.hover": "將網格顏色重置為預設值",
|
||||
|
@ -256,14 +257,14 @@
|
|||
"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/您的網格",
|
||||
"settings.grids.spotsOverGrids.label": "RX-Spots在網格之上",
|
||||
"settings.grids.spotsoverGrids.hover": "在網格層上放置接收點",
|
||||
"settings.grids.opacity.label": "網格不透明度",
|
||||
"settings.grids.splitQSL.label": "分解QSL網格",
|
||||
"settings.grids.splitQSL.label": "分開QSL網格",
|
||||
"settings.grids.splitQSL.hover": "使用活動網格切換分解QSL網格",
|
||||
"settings.grids.AutoMouseOver.label": "自動鼠標懸停在網格上",
|
||||
"settings.grids.AutoMouseOver.hover": "在網格表上切換自動鼠標",
|
||||
|
@ -285,35 +286,35 @@
|
|||
"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.source": "日誌平台/同步",
|
||||
"settings.logging.tableheader.menu": "選單?",
|
||||
"settings.logging.tableheader.startup": "啟動?",
|
||||
"settings.logging.tableheader.log": "記錄?",
|
||||
"settings.logging.tableheader.details": "詳細參數",
|
||||
"settings.logging.tableheader.test": "測試",
|
||||
"settings.logging.tableheader.result": "結果",
|
||||
"settings.logging.gridtracker.source": "GridTracker",
|
||||
"settings.logging.gridtracker.details": "GridTracker QSO日志檔案",
|
||||
"settings.logging.gridtracker.details": "GridTracker 通聯日誌檔案",
|
||||
"settings.logging.LocalFiles.source": "本地檔案(s)",
|
||||
"settings.logging.LocalFiles.details.add": "添加日志檔案",
|
||||
"settings.logging.LocalFiles.details.noFiles": "未選擇日志檔案",
|
||||
"settings.logging.LocalFiles.details.add": "添加日誌檔案",
|
||||
"settings.logging.LocalFiles.details.noFiles": "未選擇日誌檔案",
|
||||
"settings.logging.PSKReporter.source": "PSK-Reporter",
|
||||
"settings.logging.PSKReporter.details": "上傳24小時Spot歷史數據",
|
||||
"settings.logging.QRZcom.source": "QRZ.com",
|
||||
|
@ -375,7 +376,7 @@
|
|||
"settings.callroster.AlwaysOnTop.label": "視窗始終在最上層",
|
||||
"settings.callroster.AlwaysOnTop.hover": "將呼叫清單置於其他視窗之上",
|
||||
"settings.callroster.MaxAge.label": "呼叫清單最大時效",
|
||||
"settings.callroster.MultiRig.label": "在QSO回覆時",
|
||||
"settings.callroster.MultiRig.label": "在通聯回覆時",
|
||||
"settings.callroster.MultiRig.HaltTx.label": "在所有其他實例上停止發送",
|
||||
"settings.callroster.MultiRig.SwitchView.label": "將視圖切換到傳輸實例",
|
||||
"settings.callroster.AudioAlert.label": "開啟聲音警報",
|
||||
|
@ -425,7 +426,7 @@
|
|||
"settings.alerts.CustomAlerts.new.repeat.label": "重覆",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.exact": "呼號(準確)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.partial": "呼號(局部)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.regex": "呼號(正則表達式)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.regex": "呼號匹配",
|
||||
"settings.alerts.CustomAlerts.new.type.gridsquare": "網格",
|
||||
"settings.alerts.CustomAlerts.new.type.QRZ": "QRZ",
|
||||
"settings.alerts.CustomAlerts.new.notify.textToSpeech": "文字朗讀",
|
||||
|
@ -435,16 +436,16 @@
|
|||
"settings.alerts.CustomAlerts.new.repeat.deleted": "直到刪除",
|
||||
"settings.alerts.CustomAlerts.new.repeat.exit": "直到退出",
|
||||
"settings.alerts.CustomAlerts.new.repeat.once": "一次",
|
||||
"settings.alerts.CustomAlerts.new.repeat.never": "從不",
|
||||
"settings.alerts.CustomAlerts.new.repeat.never": "永不重複",
|
||||
"settings.alerts.CustomAlerts.new.addButton": "增加",
|
||||
"settings.OAMS.message.enable.label": "啟用消息傳遞",
|
||||
"settings.OAMS.message.enable.hover": "啟用消息傳遞",
|
||||
"settings.OAMS.spotting.enable.label": "啟用定位",
|
||||
"settings.OAMS.spotting.enable.hover": "通過OAMS網絡發送和接收現場報告",
|
||||
"settings.OAMS.BandActivity.enable.label": "Band Activity",
|
||||
"settings.OAMS.BandActivity.enable.hover": "Receive Band Activity Reports through the OAMS network",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.label": "Neighboring Grids",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.hover": "Include your 8 neighboring grids in report",
|
||||
"settings.OAMS.BandActivity.enable.label": "波段活動",
|
||||
"settings.OAMS.BandActivity.enable.hover": "通過OAMS網絡接收波段活動報告",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.label": "相鄰網格",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.hover": "在報告中包括您的8個相鄰網格",
|
||||
"settings.OAMS.message.newAlert.label": "新消息警報",
|
||||
"settings.OAMS.message.newAlert.hover": "收到新消息時發出警報。",
|
||||
"settings.OAMS.message.newAlert.none": "None",
|
||||
|
@ -465,16 +466,16 @@
|
|||
"settings.OAMS.message.awayMode": "離開模式",
|
||||
"settings.OAMS.message.NotAway": "不離開",
|
||||
"settings.OAMS.message.AmAway": "離開",
|
||||
"settings.OAMS.message.awayText": "拿走文字",
|
||||
"settings.OAMS.message.awayText": "離開文本",
|
||||
"settings.about.AppVersion": "GridTracker",
|
||||
"settings.about.Brief": "GridTracker是一個以易於使用的界面呈現的業餘無線電信息倉庫",
|
||||
"settings.about.FeatureList1": "來自實時通聯數據解碼",
|
||||
"settings.about.FeatureList2": "日志",
|
||||
"settings.about.FeatureList2": "日誌",
|
||||
"settings.about.FeatureList3": "實時通聯報告",
|
||||
"settings.about.FeatureList4": "天氣",
|
||||
"settings.about.FeatureList5": "當前的太陽和空間條件和更多!",
|
||||
"settings.about.HomepageLink": "了解更多關於",
|
||||
"settings.about.Copyright": "版權所有;2023 GridTracker.org",
|
||||
"settings.about.Copyright": "版權所有 © 2023 GridTracker.org",
|
||||
"alertPopup.title": "新警報!!!",
|
||||
"alertPopup.dismiss": "解除",
|
||||
"updatePopup.newUpdate": "GridTracker已有新的版本!",
|
||||
|
@ -487,18 +488,18 @@
|
|||
"bandactivity.title": "正在等待數據傳入",
|
||||
"bandactivity.noData": "… 還沒有數據 …",
|
||||
"COMMENT_gt_chat.html": "",
|
||||
"chat.title": "離線信息服務(OAMS)",
|
||||
"chat.title": "離線信息服務 (OAMS)",
|
||||
"chat.resume": "對話繼續",
|
||||
"chat.ended": "對話結束",
|
||||
"chat.notAvail": "…此對話不再可用…",
|
||||
"chat.noHistory": "無信息歷史記錄",
|
||||
"chat.notice.para1": "通知",
|
||||
"chat.notice.para2": "<b>永遠不要</b>提供密碼、信用卡號、安全組合或任何你不想讓壞人知道的個人信息,因為那里有一些非常壞的人。",
|
||||
"chat.notice.para3": "但不是我們。雖然GridTracker是免費的,但與其他一些免費應用程序不同,我們不會存儲、保存、出售、窺視或以其他方式對聊天進行任何違反您信任的操作。我們不保存日志。我們不存儲元數據。我們只是不這樣做。",
|
||||
"chat.notice.para3": "但不是我們。雖然GridTracker是免費的,但與其他一些免費應用程序不同,我們不會存儲、保存、出售、窺視或以其他方式對聊天進行任何違反您信任的操作。我們不保存日誌。我們不存儲元數據。我們只是不這樣做。",
|
||||
"chat.notice.para4": "關閉GridTracker,丟失文字。所以寫下你想保存的任何東西。因為當它消失時,它就永遠消失了。",
|
||||
"chat.notice.agree": "單擊此處確認上述內容並啟用信息傳遞",
|
||||
"chat.filter.band": "波段",
|
||||
"chat.filter.mode": "模式",
|
||||
"chat.filter.band": "波段: ",
|
||||
"chat.filter.mode": "模式: ",
|
||||
"chat.stationCount": "電臺計算",
|
||||
"COMMENT_gt_conditions.html": "",
|
||||
"conditions.title": "當前條件",
|
||||
|
@ -506,7 +507,7 @@
|
|||
"lookup.title": "呼號信息查詢",
|
||||
"lookup.callsign.label": "呼號:",
|
||||
"lookup.callsign.button": "尋找",
|
||||
"lookup.noinfo": "沒有要顯示的呼號信息<br/>請嘗試其他呼號尋找!",
|
||||
"lookup.noinfo": "沒有要顯示的呼號信息, 請嘗試其他呼號尋找!",
|
||||
"COMMENT_gt_popup.html": "",
|
||||
"popup.title": "數據突破",
|
||||
"COMMENT_gt_roster.html": "",
|
||||
|
@ -514,7 +515,7 @@
|
|||
"roster.haltTX": "停止發送",
|
||||
"roster.controls.more": "打開控件欄",
|
||||
"roster.controls.less": "關閉控件欄",
|
||||
"roster.controls.logbook.label": "日志",
|
||||
"roster.controls.logbook.label": "日誌",
|
||||
"roster.controls.logbook.awardTracker": "獎勵追蹤",
|
||||
"roster.controls.logbook.liveBandMode": "實時波段和模式",
|
||||
"roster.controls.logbook.liveBandMixMode": "實時波段, 混合模式",
|
||||
|
@ -551,17 +552,18 @@
|
|||
"roster.secondary.wanted.callsign": "呼號",
|
||||
"roster.secondary.wanted.grid": "網格",
|
||||
"roster.secondary.wanted.dxcc": "DXCC",
|
||||
"roster.secodnary.wanted.qrz": "QRZ",
|
||||
"roster.secondary.wanted.qrz": "QRZ",
|
||||
"roster.secondary.wanted.wpx": "WPX",
|
||||
"roster.secondary.wanted.pota": "POTA",
|
||||
"roster.secondary.wanted.OAMS": "OAMS",
|
||||
"roster.secondary.wanted.cqzone": "CQz",
|
||||
"roster.secondary.wanted.ituzone": "ITUz",
|
||||
"roster.secondary.wanted.state": "狀態",
|
||||
"roster.secondary.wanted.marathon": "Marathon",
|
||||
"roster.secondary.wanted.county": "縣",
|
||||
"roster.secondary.wanted cont": "續",
|
||||
"roster.secondary.exceptions.label": "例外情況",
|
||||
"roster.secondary.wanted.cqzone": "CQ分區",
|
||||
"roster.secondary.wanted.ituzone": "ITU分區",
|
||||
"roster.secondary.wanted.regex": "呼號匹配",
|
||||
"roster.secondary.wanted.state": "美國州",
|
||||
"roster.secondary.wanted.marathon": "馬拉松",
|
||||
"roster.secondary.wanted.county": "美國縣",
|
||||
"roster.secondary.wanted.cont": "洲大陸",
|
||||
"roster.exceptions.label": "例外情況",
|
||||
"roster.secondary.exceptions.cqOnly": "僅限CQ",
|
||||
"roster.secondary.exceptions.hasGrid": "有網格",
|
||||
"roster.secondary.exceptions.minDB": "最小dB",
|
||||
|
@ -570,33 +572,35 @@
|
|||
"roster.secondary.exceptions.maxFreq": "最高頻率",
|
||||
"roster.secondary.exceptions.usesLoTW": "LoTW用戶",
|
||||
"roster.secondary.exceptions.spottedMe": "發報自己",
|
||||
"roster.secondary.execptions.noMyDXCC": "我不需要的DXCC",
|
||||
"roster.secondary.execptions.onlyMyDXCC": "我需要的DXCC",
|
||||
"roster.secondary.exceptions.noMyDXCC": "我不需要的DXCC",
|
||||
"roster.secondary.exceptions.onlyMyDXCC": "我需要的DXCC",
|
||||
"roster.secondary.exceptions.useseQSL": "eQSL用戶",
|
||||
"roster.secondary.exceptions.usesOQRS": "OQRS用戶",
|
||||
"roster.secondary.exceptions.allOnlyNew": "僅限新呼號",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73 as CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "No Unknown DXCC",
|
||||
"roster.secondary.exceptions.allOnlyNew": "新呼號",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73當作CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "禁止不明DXCC",
|
||||
"roster.secondary.exceptions.noMsg.label": "不包含",
|
||||
"roster.secondary.exceptions.noMsg.hover": "不包含解碼...",
|
||||
"roster.secondary.exceptions.onlyMsg.label": "只包含",
|
||||
"roster.secondary.exceptions.onlyMsg.label": "僅包含",
|
||||
"roster.secondary.exceptions.onlyMsg.hover": "僅包含解碼...",
|
||||
"roster.secondary.excpetions.regex.label": "正則表達式",
|
||||
"roster.secondary.exceptions.regex.hover": "調用符號正則表達式",
|
||||
"roster.secondary.exceptions.regex.label": "呼號匹配",
|
||||
"roster.secondary.exceptions.regex.hover": "調用呼號匹配",
|
||||
"roster.secondary.instances.label": "實例",
|
||||
"roster.ignoresTable.title": "呼號, 忽略CQ和DXCC",
|
||||
"roster.ignoresTable.close": "關閉",
|
||||
"roster.ignores.label": "忽略呼號",
|
||||
"roster.close": "關閉",
|
||||
"roster.watcher.label": "監察",
|
||||
"roster.add.watcher.label": "添加監察",
|
||||
"COMMENT_gt_stats.html": "",
|
||||
"stats.title": "日志數據統計",
|
||||
"stats.tabs.logbook": "日志",
|
||||
"stats.title": "日誌數據統計",
|
||||
"stats.tabs.logbook": "日誌",
|
||||
"stats.tabs.scores": "分數",
|
||||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ 分區",
|
||||
"stats.tabs.ITUZones": "ITU 分區",
|
||||
"stats.tabs.WASWAC": "WAC/WAS",
|
||||
"stats.tabs.CQZones": "CQ分區",
|
||||
"stats.tabs.ITUZones": "ITU分區",
|
||||
"stats.tabs.WASWAC": "洲大陸/美國州/加拿大省",
|
||||
"stats.tabs.live": "在線",
|
||||
"stats.noDecodes": "還沒有解碼",
|
||||
"stats.viewing": "Viewing",
|
||||
"stats.viewing": "檢視",
|
||||
"COMMENT_adif.js": "",
|
||||
"adif.TestResult.invalid": "測試無效",
|
||||
"adif.TestResult.error": "未知錯誤",
|
||||
|
@ -620,7 +624,7 @@
|
|||
"adif.LoggedHRDLogbook": "已記錄到 HRD Logbook",
|
||||
"adif.ExceptionHRDLogbook": "HRD 日誌異常",
|
||||
"adif.ExceptionLoTW": "LoTW 日誌異常",
|
||||
"adif.ExceptionAlertLog": "Alert 日誌異常",
|
||||
"adif.ExceptionAlertLog": "警報日誌異常",
|
||||
"adif.ExceptionHideLookup": "隱藏查找異常",
|
||||
"adif.BadPassUser": "錯誤<br/>密碼<br/>或<br/>暱稱",
|
||||
"adif.UnknownCall": "不明<br/>呼號",
|
||||
|
@ -630,7 +634,7 @@
|
|||
"adif.FaileQSLNick": "登錄 eQSL.cc (暱稱)失敗",
|
||||
"adif.FaileQSLDupe": "登錄 eQSL.cc (日誌重複)失敗",
|
||||
"adif.LoggedeQSL": "已記錄到 eQSL.cc",
|
||||
"adif.FailedeQSL": "記錄到 eQSL.cc (?)失敗",
|
||||
"adif.FailedeQSL": "記錄到 eQSL.cc 失敗(?)",
|
||||
"adif.Offline": "目前<br/>離線",
|
||||
"adif.TestUpload": "測試上傳",
|
||||
"adif.ErrorEncountered": "遇到錯誤",
|
||||
|
@ -638,18 +642,18 @@
|
|||
"adif.MissingTQSL": "沒有安裝 TrustedQSL",
|
||||
"adif.TQSLPassword": "TQSL 失去密碼",
|
||||
"adif.TQSLStation": "選擇電臺",
|
||||
"adif.TQSLFailed": "記錄到 TQSL 時失敗",
|
||||
"adif.TQSLFailed": "記錄到 TQSL 失敗",
|
||||
"adif.TQSLLogged": "已記錄到 TQSL",
|
||||
"adif.CloudLogAPIKey": "API 密鑰無效",
|
||||
"adif.CloudLogLogged": "已記錄到 Cloudlog",
|
||||
"adif.CloudLogFailed": "記錄到 Cloudlog 時失敗",
|
||||
"adif.QRZFailedAlert": "將 QSO 上傳到 QRZ.com 時失敗",
|
||||
"adif.QRZFailed": "登錄到 QRZ.com 時失敗",
|
||||
"adif.CloudLogFailed": "記錄到 Cloudlog 失敗",
|
||||
"adif.QRZFailedAlert": "將通聯上傳到 QRZ.com 失敗",
|
||||
"adif.QRZFailed": "登錄到 QRZ.com 失敗",
|
||||
"adif.QRZLogged": "已登錄到 QRZ.com",
|
||||
"adif.QRZNoResponse": "將 QSO 上傳到 QRZ.com 時出錯(無回應)",
|
||||
"adif.QRZNoResponse": "上傳到 QRZ.com 失敗(無回應)",
|
||||
"adif.ClubLogLogged": "已登錄到 ClubLog.org",
|
||||
"adif.HRDLogNetLogged": "已登錄到 HRDLOG.net",
|
||||
"adif.HRDLogNetFailed": "登錄到 HRDLOG.net 時失敗",
|
||||
"adif.HRDLogNetFailed": "登錄到 HRDLOG.net 失敗",
|
||||
"COMMENT_alerts.js": "",
|
||||
"alerts.addNew.Added": "增加",
|
||||
"alerts.addNew.SelectFile": "選擇檔案!",
|
||||
|
@ -657,8 +661,8 @@
|
|||
"alerts.addnew.Duplicate": "重複!",
|
||||
"alerts.callsign.speech": "呼號",
|
||||
"alerts.callsign.popup": "尋找",
|
||||
"alerts.gridsquare.speech": "格網方格",
|
||||
"alerts.gridsquare.popup": "格網方格",
|
||||
"alerts.gridsquare.speech": "網格",
|
||||
"alerts.gridsquare.popup": "網格",
|
||||
"alerts.QRZ.speech": "呼叫中",
|
||||
"alerts.QRZ.popup": "QRZ",
|
||||
"alerts.AlertPop.Type": "類型",
|
||||
|
@ -675,8 +679,8 @@
|
|||
"alerts.TypesArray.CallExact": "呼叫 (精確)",
|
||||
"alerts.TypesArray.Grid": "網格",
|
||||
"alerts.TypesArray.QRZ": "QRZ",
|
||||
"alerts.TypesArray.CallPartial": "呼叫 (局部)",
|
||||
"alerts.TypesArray.CallRegex": "呼叫 (匹配)",
|
||||
"alerts.TypesArray.CallPartial": "呼號 (局部)",
|
||||
"alerts.TypesArray.CallRegex": "呼號 (匹配)",
|
||||
"alerts.ValueArray.AudioFile": "音頻檔案",
|
||||
"alerts.ValueArray.TextToSpeech": "朗讀",
|
||||
"alerts.ValueArray.PopUp": "彈出",
|
||||
|
@ -698,8 +702,8 @@
|
|||
"alerts.ClassicWords.callsign": "呼叫",
|
||||
"alerts.ClassicWords.grid": "網格",
|
||||
"alerts.ClassicWords.DXCC": "DXCC",
|
||||
"alerts.ClassicWords.CQz": "C-Q 分區",
|
||||
"alerts.ClassicWords.ITUz": "I-T-U 分區",
|
||||
"alerts.ClassicWords.CQz": "C-Q分區",
|
||||
"alerts.ClassicWords.ITUz": "I-T-U分區",
|
||||
"alerts.ClassicWords.State": "國家地區",
|
||||
"COMMENT_callsigns.js": "",
|
||||
"callsigns.Downloading": "下載中...",
|
||||
|
@ -710,28 +714,28 @@
|
|||
"gt.gridView.logbook": "日誌",
|
||||
"gt.gridView.logLive": "日誌 & 實時",
|
||||
"gt.viewInfo.qsoGrids": "網格",
|
||||
"gt.viewInfo.cqZones": "CQ 分區",
|
||||
"gt.viewInfo.ituZones": "ITU 分區",
|
||||
"gt.viewInfo.cqZones": "CQ分區",
|
||||
"gt.viewInfo.ituZones": "ITU分區",
|
||||
"gt.viewInfo.wacZones": "各大洲",
|
||||
"gt.viewInfo.wasZones": "美國各州",
|
||||
"gt.viewInfo.worldGeoData": "DXCCs",
|
||||
"gt.viewInfo.countyData": "美國各縣",
|
||||
"gt.viewInfo.us48Data": "美國大陸網格",
|
||||
"gt.viewInfo.us48Data": "美國大陸48網格",
|
||||
"gt.ignoreMessages.receive": "接收",
|
||||
"gt.ignoremessages.ignore": "忽略",
|
||||
"gt.timeoutSetUdpPort": "等待信息...",
|
||||
"gt.setUdpPort": "...setting...",
|
||||
"gt.setUdpPort": "...設置中...",
|
||||
"gt.changeGridDecay": "無衰減",
|
||||
"gt.spotTable.RXSpot": "RX Spot",
|
||||
"gt.spotTable.Age": "距今",
|
||||
"gt.spotTable.db": "分貝",
|
||||
"gt.spotTable.Call": "呼叫",
|
||||
"gt.spotTable.Call": "被呼叫",
|
||||
"gt.spottable.Dxcc": "DXCC",
|
||||
"gt.spotTable.Grid": "網格",
|
||||
"gt.spotTable.Freq": "頻率",
|
||||
"gt.spotTable.Band": "波段",
|
||||
"gt.spotTable.Mode": "模式",
|
||||
"gt.newCallList.Call": "呼號",
|
||||
"gt.newCallList.Call": "主叫",
|
||||
"gt.newCallList.Freq": "頻率",
|
||||
"gt.newCallList.Sent": "發出",
|
||||
"gt.newCallList.Rcvd": "接收",
|
||||
|
@ -745,7 +749,7 @@
|
|||
"gt.newCallList.LoTW": "LoTW",
|
||||
"gt.newCallList.eQSL": "eQSL",
|
||||
"gt.newCallList.OQRS": "OQRS",
|
||||
"gt.TitleInfo.GridTracker": "GridTracker",
|
||||
"gt.TitleInfo.GridTracker": "GridTracker網格追蹤助手",
|
||||
"gt.TitleInfo.Band": "波段:",
|
||||
"gt.TitleInfo.Mode": "模式:",
|
||||
"gt.TitleInfo.Worked": "曾通聯",
|
||||
|
@ -754,8 +758,8 @@
|
|||
"gt.moonOver.Moon": "月球",
|
||||
"gt.moonOver.Azimuth": "角度",
|
||||
"gt.moonOver.Elevation": "仰角",
|
||||
"gt.Trophy.CQZone": "CQ 分區",
|
||||
"gt.Trohpy.ITUZone": "ITU 分區",
|
||||
"gt.Trophy.CQZone": "CQ分區",
|
||||
"gt.Trohpy.ITUZone": "ITU分區",
|
||||
"gt.Trophy.WAC": "各大洲",
|
||||
"gt.Trohpy.WAS": "美國各州",
|
||||
"gt.Trophy.DXCC": "DXCC",
|
||||
|
@ -797,8 +801,8 @@
|
|||
"gt.callsignBox.CQ": "CQ",
|
||||
"gt.callsignBox.ITU": "ITU",
|
||||
"gt.callsignBox.Flag": "旗幟",
|
||||
"gt.callsignBox.QSO": "QSO",
|
||||
"gt.callsignBox.QSL": "確認卡",
|
||||
"gt.callsignBox.QSO": "通聯",
|
||||
"gt.callsignBox.QSL": "確認",
|
||||
"gt.callsignBox.When": "當",
|
||||
"gt.callsignBox.LoTW": "LoTW",
|
||||
"gt.callsignBox.eQSL": "eQSL",
|
||||
|
@ -810,10 +814,10 @@
|
|||
"gt.qsoPage.Grid": "網格",
|
||||
"gt.qsoPage.Band": "波段",
|
||||
"gt.qsoPage.Mode": "模式",
|
||||
"gt.qsoPage.QSL": "確認卡",
|
||||
"gt.qsoPage.Sent": "Sent",
|
||||
"gt.qsoPage.Rcvd": "Rcvd",
|
||||
"gt.qsoPage.QSL": "確認",
|
||||
"gt.qsoPage.DXCC": "DXCC",
|
||||
"gt.qsoPage.Sent": "我收對方",
|
||||
"gt.qsoPage.Rcvd": "對方收我",
|
||||
"gt.qsoPage.Flag": "旗幟",
|
||||
"gt.qsoPage.When": "當",
|
||||
"gt.qsoPage.LoTW": "LoTW",
|
||||
|
@ -825,17 +829,18 @@
|
|||
"gt.dxccBox.DXCC": "DXCC",
|
||||
"gt.dxccBox.Confirmed": "已確認",
|
||||
"gt.dxccBox.Needed": "需要的",
|
||||
"gt.CQZoneBox.Worked": "曾通聯的 CQ 分區",
|
||||
"gt.ITUZoneBox.Worked": "曾通聯的 ITU 分區",
|
||||
"gt.CQZoneBox.Worked": "曾通聯的 CQ分區",
|
||||
"gt.ITUZoneBox.Worked": "曾通聯的 ITU分區",
|
||||
"gt.WASWACBox.WAC": "曾通聯的所有大洲",
|
||||
"gt.WASWACBox.WAS": "曾通聯的所有州份",
|
||||
"gt.WASWACBox.WAS": "曾通聯的所有美國州份",
|
||||
"gt.WASWACBox.WACP": "曾通聯的所有加拿大省份",
|
||||
"gt.displayItemsList.Worked": "曾通聯",
|
||||
"gt.displayItemsList.Confirmed": "已確認",
|
||||
"gt.displayItemsList.Needed": "需要的",
|
||||
"gt.WPXBox.worked": "曾通聯的前綴",
|
||||
"gt.WPXBox.confirmed": "已確認的前綴",
|
||||
"gt.statBox.Parsing": "...解析日誌項...",
|
||||
"gt.statBox.NoEntries": "沒有可用的日誌條目, 請加載一個或多個ADIF日誌",
|
||||
"gt.statBox.Parsing": "...分析日誌資料...",
|
||||
"gt.statBox.NoEntries": "沒有可用的日誌資料, 請加載一個或多個ADIF日誌",
|
||||
"gt.typeNames.Mixed": "混合",
|
||||
"gt.typeNames.Digital": "數據",
|
||||
"gt.typeNames.Phone": "語音",
|
||||
|
@ -846,12 +851,12 @@
|
|||
"gt.awardNames.DXCC": "DXCCs",
|
||||
"gt.awardNames.CQ": "CQ 分區",
|
||||
"gt.awardNames.ITU": "ITU 分區",
|
||||
"gt.awardNames.WAC": "大洲",
|
||||
"gt.awardNames.WAC": "各大洲",
|
||||
"gt.awardNames.WAS": "美國各州",
|
||||
"gt.awardNames.USC": "美國各縣",
|
||||
"gt.awardNames.WPX": "前綴",
|
||||
"gt.logbook.title": "日志",
|
||||
"gt.logbook.scoreCard": "Score Card",
|
||||
"gt.logbook.title": "日誌",
|
||||
"gt.logbook.scoreCard": "單項統計表",
|
||||
"gt.logbook.callsign": "呼號",
|
||||
"gt.logbook.firstContact": "首次通聯",
|
||||
"gt.logbook.lastContact": "最後通聯",
|
||||
|
@ -875,7 +880,7 @@
|
|||
"gt.stationsTable.Rcvd": "接收",
|
||||
"gt.stationsTable.Mode": "模式",
|
||||
"gt.stationsTable.Band": "波段",
|
||||
"gt.stationsTable.QSL": "確認卡",
|
||||
"gt.stationsTable.QSL": "已確認",
|
||||
"gt.stationsTable.Comments": "注釋",
|
||||
"gt.stationsTable.DXCC": "DXCC",
|
||||
"gt.stationsTable.Time": "時間",
|
||||
|
@ -891,8 +896,8 @@
|
|||
"gt.statTable.Types": "類型",
|
||||
"gt.bandActivity.Score": "分數:",
|
||||
"gt.bandActivity.Sptos": "Spots:",
|
||||
"gt.bandActivity.Tx": "Tx:",
|
||||
"gt.bandActivity.Rx": "Rx:",
|
||||
"gt.bandActivity.Tx": "發射:",
|
||||
"gt.bandActivity.Rx": "接收:",
|
||||
"gt.bandActivity.NoData": "..還沒有數據..",
|
||||
"gt.N1MMAlert": "N1MM Logger+ 啟用相同設定, 停止 GridTracker N1MM logger",
|
||||
"gt.NoLocationAlert": "網格位置不可用!\n要么啟動 WSJT-X/JTDX 或在設定中輸入網格位置",
|
||||
|
@ -906,7 +911,7 @@
|
|||
"gt.SpotMaxAge": "最大時效:",
|
||||
"gt.tqslPermissionError": "由於操作系統許可權限, 無法訪問 LoTW TrustedQSL (TQSL) \n已禁用登入到 LoTW\n或以管理員身分運行, 若果問題仍然存在時允許檔案訪問 GridTracker",
|
||||
"gt.startupTable.versionCheck": "版本檢查已完成",
|
||||
"gt.startupTable.loadi18n": "加載語言",
|
||||
"gt.startupTable.loadi18n": "加載語言完成",
|
||||
"gt.startupTable.qsoBackup": "通聯備份已初始化",
|
||||
"gt.startupTable.callsigns": "呼號服務已初始化",
|
||||
"gt.startupTable.mapSettings": "地圖設定已初始化",
|
||||
|
@ -918,7 +923,7 @@
|
|||
"gt.startupTable.newWindows": "載入新窗口",
|
||||
"gt.startupTable.maidenheadData": "載入 Maidenhead 數据集",
|
||||
"gt.startupTable.renderGrids": "渲染所有 Maidenhead 網格",
|
||||
"gt.startupTable.updateProcesses": "已更新正在運行的進程",
|
||||
"gt.startupTable.updateProcesses": "更新正在運行的進程",
|
||||
"gt.startupTable.updateINI": "更新自 WSJT-X/JTDX",
|
||||
"gt.startupTable.loadADIF": "載入 ADIF 設定",
|
||||
"gt.startupTable.initButtons": "按鈕和輸入已初始化",
|
||||
|
@ -929,7 +934,7 @@
|
|||
"gt.startupTable.eventTimers": "設定事件和計時器",
|
||||
"gt.startupTable.regHotkeys": "注册熱鍵",
|
||||
"gt.startupTable.initOams": "對話系統已初始化",
|
||||
"gt.startupTable.loadPOTA": "載入 POTA Database",
|
||||
"gt.startupTable.loadPOTA": "載入 POTA 資料庫",
|
||||
"gt.startupTable.potaSpots": "啟動 POTA Spots 加速器",
|
||||
"gt.startupTable.getAcks": "貢獻者致谢已載入",
|
||||
"gt.startupTable.postInit": "系統已完成",
|
||||
|
@ -939,12 +944,12 @@
|
|||
"gt.lookup.lookingUp1": "正在查詢 ",
|
||||
"gt.lookup.lookingUp2": "請等候...",
|
||||
"gt.callookDX1": "C A L L O O K",
|
||||
"gt.callookDX2": "毫無意義的業餘無線電美國呼號査詢",
|
||||
"gt.callookDX3":"僅限於美國和美國領土",
|
||||
"gt.callookDX4": "這呼號",
|
||||
"gt.callookDX5": "請求來自",
|
||||
"gt.callookDX6": "您可能需要考慮使用 QRZ.com, 他們擁有免費會員資料, 提供大多數呼號有限數據",
|
||||
"gt.callookDX7": "他們亦有付費會員的詳細資訊",
|
||||
"gt.callookDX2": "嚴肅的業餘無線電美國呼號査詢",
|
||||
"gt.callookDX3": "請求來自",
|
||||
"gt.callookDX4": "僅限於美國和美國領土",
|
||||
"gt.callookDX5": "呼號",
|
||||
"gt.callookDX6": "您可能需要考慮使用 QRZ.com付費會員的詳細資訊",
|
||||
"gt.callookDX7": "他們亦有免費資料, 提供大多數呼號有限數據",
|
||||
"gt.QRZhamQTH.valid": "有效",
|
||||
"gt.QRZhamQTH.invalid": "無效回應",
|
||||
"gt.QRZhamQTH.error": "未知錯誤",
|
||||
|
@ -952,7 +957,7 @@
|
|||
"gt.dbInit.error1": "資料庫錯誤:",
|
||||
"gt.dbInit.error2": ": GridTracker 會有問題",
|
||||
"gt.addLookup.Error": "查找寫入問題",
|
||||
"gt.lookup.getAddress": "按一下以將地址複製到剪貼板",
|
||||
"gt.lookup.getAddress": "按一下複製到剪貼板",
|
||||
"gt.lookup.details": "詳情",
|
||||
"gt.lookup.website": "網站",
|
||||
"gt.lookup.biography": "簡介",
|
||||
|
@ -989,7 +994,7 @@
|
|||
"roster.award.Select": "選擇獎項",
|
||||
"roster.award.name": "名稱",
|
||||
"roster.award.Award": "獎項",
|
||||
"roster.": "獲獎軌跡",
|
||||
"roster.award.Track": "獲獎軌跡",
|
||||
"roster.award.ToggleTracking": "切換跟蹤",
|
||||
"roster.award.Remove": "移除跟蹤器",
|
||||
"roster.award.addName": "選擇獎項",
|
||||
|
@ -999,9 +1004,9 @@
|
|||
"roster.ignore.none": "沒有",
|
||||
"roster.ignore.CQ": "CQ",
|
||||
"roster.ignore.DXCCs": "DXCCs",
|
||||
"roster.ignore.CQZones": "CQ 分區",
|
||||
"roster.ignore.ITUZones": "ITU 分區",
|
||||
"roster.menu.Settings": "Settings",
|
||||
"roster.ignore.CQZones": "CQ分區",
|
||||
"roster.ignore.ITUZones": "ITU分區",
|
||||
"roster.menu.Settings": "設定",
|
||||
"roster.menu.HideControls": "隱藏控件",
|
||||
"roster.menu.ShowControls": "顯示控件",
|
||||
"roster.menu.CompactMode": "緊密模式",
|
||||
|
@ -1012,16 +1017,17 @@
|
|||
"roster.menu.IgnoreCall": "忽視呼號",
|
||||
"roster.menu.Realtime": "實時",
|
||||
"roster.menu.MoveLeft": "列向左移動",
|
||||
"roster.menu.MoveRight": "列向右移動",
|
||||
"roster.menu.ClearCallIgnore": "清除忽視呼號",
|
||||
"roster.menu.ClearIgnore": "清除忽視",
|
||||
"roster.menu.ClearCQFromDXCC": "清除來自 DXCC 的 CQ",
|
||||
"roster.menu.ClearCQFromAll": "清除所有的 CQ",
|
||||
"roster.menu.ClearCQIgnore": "清除忽視的 CQ",
|
||||
"roster.menu.EditIgnores": "編輯忽視",
|
||||
"roster.menu.IgnoreCQZone": "忽視的 CQ 分區",
|
||||
"roster.menu.ClearCQZoneIgnore": "清除忽視的 CQ 分區",
|
||||
"roster.menu.IgnoreCQZone": "忽視的 CQ分區",
|
||||
"roster.menu.ClearCQZoneIgnore": "清除忽視的 CQ分區",
|
||||
"roster.menu.IgnoreITUZone": "忽視的 ITU 分區",
|
||||
"roster.menu.ClearITUZoneIgnore": "清除忽視的 ITU 分區",
|
||||
"roster.menu.ClearITUZoneIgnore": "清除忽視的 ITU分區",
|
||||
"roster.menu.IgnoreDXCC": "忽視的 DXCC",
|
||||
"roster.menu.ClearDXCCIgnore": "清除忽視的 DXCC",
|
||||
"roster.AwardTypes.IOTA": "島嶼電臺已在電波上",
|
||||
|
@ -1032,7 +1038,7 @@
|
|||
"roster.AwardTypes.cont": "大洲",
|
||||
"roster.AwardTypes.cont5": "五大洲",
|
||||
"roster.AwardTypes.cont52band": "五大洲每個波段",
|
||||
"roster.AwardTypes.cqz": "CQ 分區",
|
||||
"roster.AwardTypes.cqz": "CQ分區",
|
||||
"roster.AwardTypes.dxcc": "DXCC",
|
||||
"roster.AwardTypes.grids": "網格",
|
||||
"roster.AwradTypes.numsfx": "本身呼叫地區 + 後綴",
|
||||
|
@ -1040,11 +1046,11 @@
|
|||
"roster.AwardTypes.pxa": "前綴",
|
||||
"roster.AwardTypes.pxplus": "特別呼號",
|
||||
"roster.AwardTypes.sfx": "後綴",
|
||||
"roster.AwardTypes.states": "各州",
|
||||
"roster.AwardTypes.states": "美國各州",
|
||||
"roster.AwardTypes.cont2band": "每個波段的大洲",
|
||||
"roster.AwardTypes.calls2band": "每個波段的電臺",
|
||||
"roster.AwardTypes.dxcc2band": "每個波段的 DXCC",
|
||||
"roster.AwardTypes.states2band": "每個波段的州",
|
||||
"roster.AwardTypes.states2band": "每個波段的美國州",
|
||||
"COMMENT_stats.js": "",
|
||||
"stats.Validate.Valid": "有效!",
|
||||
"stats.Validate.Invalid": "無效!",
|
||||
|
@ -1056,15 +1062,16 @@
|
|||
"rosterColumns.LoTW.LastUpdate": "最後上傳 ",
|
||||
"rosterColumns.OAMS.user": "離線信息用戶",
|
||||
"rosterColumns.Wanted.cont": "大洲",
|
||||
"rosterColumns.Wanted.cqz": "CQ 分區",
|
||||
"rosterColumns.Wanted.ituz": "ITU 分區",
|
||||
"rosterColumns.Wanted.cqz": "CQ分區",
|
||||
"rosterColumns.Wanted.ituz": "ITU分區",
|
||||
"rosterColumns.Wanted.dxcc": "DXCC",
|
||||
"rosterColumns.Wanted.dxccMarathon": "馬拉松 DXCC",
|
||||
"rosterColumns.Wanted.cqzMarathon": "馬拉松 CQ 分區",
|
||||
"rosterColumns.Wanted.state": "各州",
|
||||
"rosterColumns.Wanted.cqzMarathon": "馬拉松 CQ分區",
|
||||
"rosterColumns.Wanted.state": "美國各州",
|
||||
"rosterColumns.Wanted.grid": "網格",
|
||||
"rosterColumns.Wanted.cnty": "縣",
|
||||
"rosterColumns.Wanted.cnty": "美國縣",
|
||||
"rosterColumns.Wanted.wpx": "WPX",
|
||||
"rosterColumns.Wanted.regex": "呼號匹配",
|
||||
"rosterColumns.Wanted.call": "呼號",
|
||||
"rosterColumns.Wanted.oams": "OAMS",
|
||||
"rosterColumns.Wanted.pota": "POTA",
|
||||
|
|
|
@ -4,24 +4,24 @@
|
|||
"The GridTracker Team",
|
||||
"BD3OOX"
|
||||
],
|
||||
"last-updated": "2022-09-11",
|
||||
"last-updated": "2023-12-07",
|
||||
"locale": "cn",
|
||||
"message-documentation": "Simplified Chinese: BD3OOX"
|
||||
},
|
||||
"COMMENT_GridTracker.html": "",
|
||||
"appname-title": "GridTracker",
|
||||
"sidebarNoMessages": "waiting for message",
|
||||
"sidebarNoDataYet": "...no data yet...",
|
||||
"appname-sub-title": "Grid网格追踪助手",
|
||||
"appname-title": "单击隐藏菜单",
|
||||
"sidebarNoMessages": "等待信息",
|
||||
"sidebarNoDataYet": "...还没有数据...",
|
||||
"appname-sub-title": "GridTracker网格追踪助手",
|
||||
"statupStatusDiv": "初始化启动",
|
||||
"documents.Div1": "您的存档目录<div id='searchedDocFolder'></div> 未找到。",
|
||||
"documents.Div2": "没有存档目录,GridTracker将无法继续。",
|
||||
"documents.Div3": "请选择一个目录,以便GridTracker可以存储重要文件。",
|
||||
"documents.Div1": "您的存档目录<div id='searchedDocFolder'></div> 未找到.",
|
||||
"documents.Div2": "没有存档目录, GridTracker将无法继续.",
|
||||
"documents.Div3": "请选择一个目录, 以便GridTracker可以存储重要文件.",
|
||||
"legend.title": "图例",
|
||||
"legend.QSO.hover": "您曾经通过的电台网格",
|
||||
"legend.QSO.label": "QSO",
|
||||
"legend.QSO.hover": "您曾经通联的电台网格",
|
||||
"legend.QSO.label": "通联",
|
||||
"legend.QSL.hover": "您曾经通过并确认的电台网格",
|
||||
"legend.QSL.label": "QSL",
|
||||
"legend.QSL.label": "确认",
|
||||
"legend.QSX.hover": "其他正在通联带网格的电台",
|
||||
"legend.QSX.label": "QSX",
|
||||
"legend.CQ.hover": "网格内的电台正在呼叫CQ",
|
||||
|
@ -38,7 +38,7 @@
|
|||
"info.WsjtMode.hover": "模式",
|
||||
"info.CurrentTime.hover": "切换本地/UTC时间",
|
||||
"info.DXcall.hover": "您正在呼叫或上次呼叫的人",
|
||||
"info.DXGrid.hover": "他们的Grid网格",
|
||||
"info.DXGrid.hover": "他们的网格",
|
||||
"info.DXReport.hover": "最后已知的SNR",
|
||||
"info.DXCountry.hover": "DXCC",
|
||||
"info.DXDistance.hover": "距离",
|
||||
|
@ -49,11 +49,11 @@
|
|||
"quickStats.CallRX.hover": "听到的呼号",
|
||||
"quickStats.CallRX.label": "接收的呼叫",
|
||||
"quickStats.QSO.hover": "工作的电台",
|
||||
"quickStats.QSO.label": "QSO",
|
||||
"quickStats.QSO.label": "通联",
|
||||
"quickStats.DXCCRx.hover": "听到的DXCC",
|
||||
"quickStats.DXCCRx.label": "接收的DXCC",
|
||||
"quickStats.QSL.hover": "显示确认列表",
|
||||
"quickStats.QSL.label": "QSL",
|
||||
"quickStats.QSL.label": "确认",
|
||||
"quickLoad.clearLive.hover": "清除GridTracker接收的实时数据",
|
||||
"quickLoad.clearLive.label": "清除实时数据",
|
||||
"quickLoad.clearLog.hover": "清除或重新加载日志数据(不删除日志文件)",
|
||||
|
@ -83,7 +83,7 @@
|
|||
"mapFilter.band.6m": "6m",
|
||||
"mapFilter.band.4m": "4m",
|
||||
"mapFilter.band.2m": "2m",
|
||||
"mapFilter.band.125cm": "125cm",
|
||||
"mapFilter.band.1_25m": "1.25m",
|
||||
"mapFilter.band.70cm": "70cm",
|
||||
"mapFilter.band.33cm": "33cm",
|
||||
"mapFilter.band.23cm": "23cm",
|
||||
|
@ -156,7 +156,7 @@
|
|||
"controlPanel.Radar.hover": "显示美国地区气象雷达图层(数字0)",
|
||||
"controlPanel.AllGrids.hover": "显示网格图层(B)",
|
||||
"controlPanel.GTFlags.hover": "切换查看GridTracker用户",
|
||||
"controlPanel.Chat.hover": "切换查看GridTracker在线用户(G)",
|
||||
"controlPanel.Chat.hover": "查看离线信息(G)",
|
||||
"settings.General.label": "常规",
|
||||
"settings.Lookups.label": "查找",
|
||||
"settings.Audio.label": "音频",
|
||||
|
@ -165,31 +165,32 @@
|
|||
"settings.Logging.label": "日志记录",
|
||||
"settings.Alerts.label": "警报",
|
||||
"settings.CallRoster.label": "呼叫列表",
|
||||
"settings.Columns.label": "表格列",
|
||||
"settings.OAMS.label": "OAMS",
|
||||
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
|
||||
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
|
||||
"settings.OAMS.simplepush.test": "Test",
|
||||
"settings.OAMS.pushover.enable.label": "Pushover.net Message Forwarding",
|
||||
"settings.OAMS.pushover.credentials.label": "Pushover Credentials",
|
||||
"settings.OAMS.pushover.userkey.label": "User Key",
|
||||
"settings.OAMS.pushover.token.label": "API Token",
|
||||
"settings.OAMS.pushover.test": "Test",
|
||||
"settings.OAMS.forward.chat": "Forward Chat Messages",
|
||||
"settings.OAMS.forward.roster": "Forward Roster Alerts",
|
||||
"settings.OAMS.simplepush.enable.label": "简单推送 .io消息 转发",
|
||||
"settings.OAMS.simplepush.apikey.label": "简单推送 API 钥匙",
|
||||
"settings.OAMS.simplepush.test": "测试",
|
||||
"settings.OAMS.pushover.enable.label": "推送 .net 消息转发",
|
||||
"settings.OAMS.pushover.credentials.label": "推送凭证",
|
||||
"settings.OAMS.pushover.userkey.label": "User 钥匙",
|
||||
"settings.OAMS.pushover.token.label": "API 钥匙",
|
||||
"settings.OAMS.pushover.test": "测试",
|
||||
"settings.OAMS.forward.chat": "转发聊天消息",
|
||||
"settings.OAMS.forward.roster": "转发名单提醒",
|
||||
"settings.Logbook.label": "日志",
|
||||
"settings.Update.label": "更新",
|
||||
"settings.About.label": "关于",
|
||||
"settings.general.AppStatus.label": "应用软件状态",
|
||||
"settings.general.AppStatus.status": "WSJT-X或JTDX均未运行",
|
||||
"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": "公里",
|
||||
|
@ -198,7 +199,7 @@
|
|||
"settings.general.Distance.dg": "度",
|
||||
"settings.general.DecodeWaterfall.label": "右下角信息栏",
|
||||
"settings.general.CheckNewVersion.label": "检查新版本",
|
||||
"settings.general.Language.label": "语言",
|
||||
"settings.general.Language.label": "语言(重新启动)",
|
||||
"settings.general.ClearAllSettings.label": "清除所有设置!",
|
||||
"settings.general.ClearSettingSure.label": "是的,我肯定!",
|
||||
"settings.general.ExportSettings.label": "导出设置",
|
||||
|
@ -211,10 +212,10 @@
|
|||
"settings.lookup.Username.label": "用户名",
|
||||
"settings.lookup.Password.label": "密码",
|
||||
"settings.lookup.QRZTest": "测试",
|
||||
"settings.lookup.AddData.label": "将寻找得到的资料增加至QSO日志纪录中",
|
||||
"settings.lookup.AddData.hover": "当完成一个QSO时... 增加来自查找得到的额外数据",
|
||||
"settings.lookup.AddGrid.label": "如果缺少QSO网格则增加查找到的网格数据",
|
||||
"settings.lookup.AddGrid.hover": "如果缺少QSO网格则增加查找到的网格数据",
|
||||
"settings.lookup.AddData.label": "将寻找得到的资料增加至通联日志纪录中",
|
||||
"settings.lookup.AddData.hover": "当完成一个通联时... 增加来自查找得到的额外数据",
|
||||
"settings.lookup.AddGrid.label": "如果缺少通联网格则增加查找到的网格数据",
|
||||
"settings.lookup.AddGrid.hover": "如果缺少通联网格则增加查找到的网格数据",
|
||||
"settings.lookup.OpenOnTx.label": "在传输时打开查找",
|
||||
"settings.lookup.OpenOnTx.hover": "发送时打开查找窗口",
|
||||
"settings.lookup.CloseOnLog.label": "记录日志后关闭查找",
|
||||
|
@ -222,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": "数量",
|
||||
|
@ -238,25 +239,25 @@
|
|||
"settings.audio.Speech.Phonetics.hover": "以语音方式播出呼号和网格",
|
||||
"settings.audio.Device.label": "音频播放设备",
|
||||
"settings.audio.File.Volume.label": "音频文件音量",
|
||||
"settings.audio.QSOLogEventFile.label": "QSO日志记录通知音频",
|
||||
"settings.logbook.callsigns.hover": "QSO日志以仅包含这些呼号的数据(逗号分隔)",
|
||||
"settings.audio.QSOLogEventFile.label": "通联日志记录通知音频",
|
||||
"settings.logbook.callsigns.hover": "通联日志以仅包含这些呼号的数据(逗号分隔)",
|
||||
"settings.logbook.callsigns.label": "过滤通联呼号",
|
||||
"settings.logbook.callsigns.enable": "启用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼号(可多选)",
|
||||
"settings.logbook.date.hover": "在此日期之前过滤日志QSO",
|
||||
"settings.logbook.callsigns.enable": "启用?",
|
||||
"settings.logbook.callsigns.callsigns": "呼号",
|
||||
"settings.logbook.date.hover": "在此日期之前过滤通联日志",
|
||||
"settings.logbook.date.label": "通联日期",
|
||||
"settings.logbook.date.enable": "启用?",
|
||||
"settings.logbook.date.date": "Date",
|
||||
"settings.logbook.date.time": "Time",
|
||||
"settings.logbook.date.enable": "启用?",
|
||||
"settings.logbook.date.date": "日期",
|
||||
"settings.logbook.date.time": "时间",
|
||||
"settings.logbook.apply.hover": "应用更改并重新导入日志",
|
||||
"settings.logbook.apply.label": "应用更改",
|
||||
"settings.grids.reset.title": "网格颜色",
|
||||
"settings.grids.reset.hover": "将Grid网格颜色重置为默认值",
|
||||
"settings.grids.reset.hover": "将网格颜色重置为默认值",
|
||||
"settings.grids.reset.label": "重置颜色",
|
||||
"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/您的网格",
|
||||
|
@ -285,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": "地图夜间模式自动切换",
|
||||
|
@ -299,18 +300,18 @@
|
|||
"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": "结果",
|
||||
"settings.logging.gridtracker.source": "GridTracker",
|
||||
"settings.logging.gridtracker.details": "GridTracker QSO日志文件",
|
||||
"settings.logging.gridtracker.details": "GridTracker 通联日志文件",
|
||||
"settings.logging.LocalFiles.source": "本地文件(s)",
|
||||
"settings.logging.LocalFiles.details.add": "添加日志文件",
|
||||
"settings.logging.LocalFiles.details.noFiles": "未选择日志文件",
|
||||
|
@ -375,7 +376,7 @@
|
|||
"settings.callroster.AlwaysOnTop.label": "窗口始终在最上层",
|
||||
"settings.callroster.AlwaysOnTop.hover": "将呼叫列表置于其他窗口之上",
|
||||
"settings.callroster.MaxAge.label": "呼叫列表最大时效",
|
||||
"settings.callroster.MultiRig.label": "在QSO回复时",
|
||||
"settings.callroster.MultiRig.label": "在通联回复时",
|
||||
"settings.callroster.MultiRig.HaltTx.label": "在所有其他实例上停止发送",
|
||||
"settings.callroster.MultiRig.SwitchView.label": "将视图切换到传输实例",
|
||||
"settings.callroster.AudioAlert.label": "开启声音警报",
|
||||
|
@ -408,8 +409,8 @@
|
|||
"settings.alerts.AudioAlert.Exceptions.label": "例外情况",
|
||||
"settings.alerts.AudioAlert.Exceptions.CQOnly": "仅限CQ",
|
||||
"settings.alerts.AudioAlert.Exceptions.ReqGrid": "需要网格",
|
||||
"settings.alerts.AudioAlert.Exceptions.MinDB": "最小dB",
|
||||
"settings.alerts.AudioAlert.Exceptions.MaxDT": "最大DT",
|
||||
"settings.alerts.AudioAlert.Exceptions.MinDB": "最小分贝",
|
||||
"settings.alerts.AudioAlert.Exceptions.MaxDT": "最大时差",
|
||||
"settings.alerts.AudioAlert.Exceptions.MinFreq": "最低频率",
|
||||
"settings.alerts.AudioAlert.Exceptions.MaxFreq": "最高频率",
|
||||
"settings.alerts.AudioAlert.Exceptions.NotMyDXCC": "不是我的DXCC",
|
||||
|
@ -425,7 +426,7 @@
|
|||
"settings.alerts.CustomAlerts.new.repeat.label": "重复",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.exact": "呼号(准确)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.partial": "呼号(局部)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.regex": "呼号(正则表达式)",
|
||||
"settings.alerts.CustomAlerts.new.type.callsign.regex": "呼号(匹配)",
|
||||
"settings.alerts.CustomAlerts.new.type.gridsquare": "网格",
|
||||
"settings.alerts.CustomAlerts.new.type.QRZ": "QRZ",
|
||||
"settings.alerts.CustomAlerts.new.notify.textToSpeech": "文本朗读",
|
||||
|
@ -441,10 +442,10 @@
|
|||
"settings.OAMS.message.enable.hover": "启用消息传递",
|
||||
"settings.OAMS.spotting.enable.label": "启用定位",
|
||||
"settings.OAMS.spotting.enable.hover": "通过OAMS网络发送和接收现场报告",
|
||||
"settings.OAMS.BandActivity.enable.label": "Band Activity",
|
||||
"settings.OAMS.BandActivity.enable.hover": "Receive Band Activity Reports through the OAMS network",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.label": "Neighboring Grids",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.hover": "Include your 8 neighboring grids in report",
|
||||
"settings.OAMS.BandActivity.enable.label": "波段活动",
|
||||
"settings.OAMS.BandActivity.enable.hover": "通过OAMS网络接收波段活动报告",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.label": "相邻网格",
|
||||
"settings.OAMS.BandActivity.neighbor.enable.hover": "在报告中包括您的8个相邻网格",
|
||||
"settings.OAMS.message.newAlert.label": "新消息警报",
|
||||
"settings.OAMS.message.newAlert.hover": "收到新消息时发出警报。",
|
||||
"settings.OAMS.message.newAlert.none": "None",
|
||||
|
@ -465,7 +466,7 @@
|
|||
"settings.OAMS.message.awayMode": "离开模式",
|
||||
"settings.OAMS.message.NotAway": "不离开",
|
||||
"settings.OAMS.message.AmAway": "离开",
|
||||
"settings.OAMS.message.awayText": "Away Text",
|
||||
"settings.OAMS.message.awayText": "离开文本",
|
||||
"settings.about.AppVersion": "GridTracker",
|
||||
"settings.about.Brief": "GridTracker是一个以易于使用的界面呈现的业余无线电信息仓库",
|
||||
"settings.about.FeatureList1": "来自实时通联数据解码",
|
||||
|
@ -474,7 +475,7 @@
|
|||
"settings.about.FeatureList4": "天气",
|
||||
"settings.about.FeatureList5": "当前的太阳和空间条件和更多!",
|
||||
"settings.about.HomepageLink": "了解更多关于",
|
||||
"settings.about.Copyright": "版权所有;2023 GridTracker.org",
|
||||
"settings.about.Copyright": "版权所有 © 2023 GridTracker.org",
|
||||
"alertPopup.title": "新警报!!!",
|
||||
"alertPopup.dismiss": "解除",
|
||||
"updatePopup.newUpdate": "GridTracker已有新的版本!",
|
||||
|
@ -487,7 +488,7 @@
|
|||
"bandactivity.title": "正在等待数据传入",
|
||||
"bandactivity.noData": "… 还没有数据 …",
|
||||
"COMMENT_gt_chat.html": "",
|
||||
"chat.title": "离线消息服务(OAMS)",
|
||||
"chat.title": "离线消息服务 (OAMS)",
|
||||
"chat.resume": "会话继续",
|
||||
"chat.ended": "会话结束",
|
||||
"chat.notAvail": "…此会话不再可用…",
|
||||
|
@ -506,7 +507,7 @@
|
|||
"lookup.title": "呼号信息查询",
|
||||
"lookup.callsign.label": "呼号:",
|
||||
"lookup.callsign.button": "查找",
|
||||
"lookup.noinfo": "没有要显示的呼号信息<br/>请尝试其他呼号查找!",
|
||||
"lookup.noinfo": "没有要显示的呼号信息, 请尝试其他呼号查找!",
|
||||
"COMMENT_gt_popup.html": "",
|
||||
"popup.title": "数据突破",
|
||||
"COMMENT_gt_roster.html": "",
|
||||
|
@ -551,41 +552,44 @@
|
|||
"roster.secondary.wanted.callsign": "呼号",
|
||||
"roster.secondary.wanted.grid": "网格",
|
||||
"roster.secondary.wanted.dxcc": "DXCC",
|
||||
"roster.secodnary.wanted.qrz": "QRZ",
|
||||
"roster.secondary.wanted.qrz": "QRZ",
|
||||
"roster.secondary.wanted.wpx": "WPX",
|
||||
"roster.secondary.wanted.pota": "POTA",
|
||||
"roster.secondary.wanted.OAMS": "OAMS",
|
||||
"roster.secondary.wanted.cqzone": "CQz",
|
||||
"roster.secondary.wanted.ituzone": "ITUz",
|
||||
"roster.secondary.wanted.state": "状态",
|
||||
"roster.secondary.wanted.cqzone": "CQ分区",
|
||||
"roster.secondary.wanted.ituzone": "ITU分区",
|
||||
"roster.secondary.wanted.regex": "呼号匹配",
|
||||
"roster.secondary.wanted.state": "美国州",
|
||||
"roster.secondary.wanted.marathon": "马拉松",
|
||||
"roster.secondary.wanted.county": "县",
|
||||
"roster.secondary.wanted cont": "续",
|
||||
"roster.secondary.exceptions.label": "例外情况",
|
||||
"roster.secondary.wanted.county": "美国县",
|
||||
"roster.secondary.wanted.cont": "洲大陆",
|
||||
"roster.exceptions.label": "例外情况",
|
||||
"roster.secondary.exceptions.cqOnly": "仅限CQ",
|
||||
"roster.secondary.exceptions.hasGrid": "有网格",
|
||||
"roster.secondary.exceptions.minDB": "最小dB",
|
||||
"roster.secondary.exceptions.maxDT": "最大DT",
|
||||
"roster.secondary.exceptions.minDB": "最小分贝",
|
||||
"roster.secondary.exceptions.maxDT": "最大时差",
|
||||
"roster.secondary.exceptions.minFreq": "最低频率",
|
||||
"roster.secondary.exceptions.maxFreq": "最高频率",
|
||||
"roster.secondary.exceptions.usesLoTW": "在用LoTW",
|
||||
"roster.secondary.exceptions.spottedMe": "发报自己",
|
||||
"roster.secondary.execptions.noMyDXCC": "我不需要的DXCC",
|
||||
"roster.secondary.execptions.onlyMyDXCC": "我需要的DXCC",
|
||||
"roster.secondary.exceptions.noMyDXCC": "我不需要的DXCC",
|
||||
"roster.secondary.exceptions.onlyMyDXCC": "我需要的DXCC",
|
||||
"roster.secondary.exceptions.useseQSL": "在用eQSL",
|
||||
"roster.secondary.exceptions.usesOQRS": "在用OQRS",
|
||||
"roster.secondary.exceptions.allOnlyNew": "仅限新呼号",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73 as CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "No Unknown DXCC",
|
||||
"roster.secondary.exceptions.allOnlyNew": "新呼号",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73当作CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "禁止不明DXCC",
|
||||
"roster.secondary.exceptions.noMsg.label": "不包含",
|
||||
"roster.secondary.exceptions.noMsg.hover": "不包含解码...",
|
||||
"roster.secondary.exceptions.onlyMsg.label": "只包含",
|
||||
"roster.secondary.exceptions.onlyMsg.hover": "仅包含解码...",
|
||||
"roster.secondary.excpetions.regex.label": "正则表达式",
|
||||
"roster.secondary.exceptions.regex.hover": "调用符号正则表达式",
|
||||
"roster.secondary.exceptions.noMsg.hover": "不包含的解码...",
|
||||
"roster.secondary.exceptions.onlyMsg.label": "仅限",
|
||||
"roster.secondary.exceptions.onlyMsg.hover": "仅限包含的解码...",
|
||||
"roster.secondary.exceptions.regex.label": "呼号匹配",
|
||||
"roster.secondary.exceptions.regex.hover": "调用呼号匹配",
|
||||
"roster.secondary.instances.label": "实例",
|
||||
"roster.ignoresTable.title": "呼号, 忽略CQ和DXCC",
|
||||
"roster.ignoresTable.close": "关闭",
|
||||
"roster.ignores.label": "忽略呼号",
|
||||
"roster.close": "关闭",
|
||||
"roster.watcher.label": "监察",
|
||||
"roster.add.watcher.label": "添加监察",
|
||||
"COMMENT_gt_stats.html": "",
|
||||
"stats.title": "日志数据统计",
|
||||
"stats.tabs.logbook": "日志",
|
||||
|
@ -593,10 +597,10 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ分区",
|
||||
"stats.tabs.ITUZones": "ITU分区",
|
||||
"stats.tabs.WASWAC": "WAC/WAS",
|
||||
"stats.tabs.WASWAC": "洲大陆/美国州/加拿大省",
|
||||
"stats.tabs.live": "实时",
|
||||
"stats.noDecodes": "还没有解码",
|
||||
"stats.viewing": "Viewing",
|
||||
"stats.viewing": "检视",
|
||||
"COMMENT_adif.js": "",
|
||||
"adif.TestResult.invalid": "测试失败",
|
||||
"adif.TestResult.error": "未知错误",
|
||||
|
@ -620,15 +624,15 @@
|
|||
"adif.LoggedHRDLogbook": "已保存到 HRD Logbook",
|
||||
"adif.ExceptionHRDLogbook": "HRD 日志异常",
|
||||
"adif.ExceptionLoTW": "LoTW 日志异常",
|
||||
"adif.ExceptionAlertLog": "Alert 日志异常",
|
||||
"adif.ExceptionHideLookup": "Hide Lookup 异常",
|
||||
"adif.ExceptionAlertLog": "警报日志异常",
|
||||
"adif.ExceptionHideLookup": "隐藏查找异常",
|
||||
"adif.BadPassUser": "错误<br/>密码<br/>或<br/>昵称",
|
||||
"adif.UnknownCall": "未知<br/>呼号",
|
||||
"adif.QTHNickname": "需要<br/>QTH昵称",
|
||||
"adif.UnknownError": "未知<br/>错误",
|
||||
"adif.FaileQSLCreds": "保存失败 eQSL.cc (credentials)",
|
||||
"adif.FaileQSLNick": "保存失败 eQSL.cc (nickname)",
|
||||
"adif.FaileQSLDupe": "保存失败 eQSL.cc (dupe)",
|
||||
"adif.FaileQSLCreds": "保存失败 eQSL.cc (认证)",
|
||||
"adif.FaileQSLNick": "保存失败 eQSL.cc (昵称)",
|
||||
"adif.FaileQSLDupe": "保存失败 eQSL.cc (重复)",
|
||||
"adif.LoggedeQSL": "已保存到 eQSL.cc",
|
||||
"adif.FailedeQSL": "保存失败 eQSL.cc (?)",
|
||||
"adif.Offline": "当前<br/>离线",
|
||||
|
@ -643,10 +647,10 @@
|
|||
"adif.CloudLogAPIKey": "API 密匙无效",
|
||||
"adif.CloudLogLogged": "已保存到 Cloudlog",
|
||||
"adif.CloudLogFailed": "保存失败 Cloudlog",
|
||||
"adif.QRZFailedAlert": "将QSO上传到QRZ.com时出错",
|
||||
"adif.QRZFailedAlert": "将通联上传到QRZ.com时出错",
|
||||
"adif.QRZFailed": "保存失败 QRZ.com",
|
||||
"adif.QRZLogged": "已保存到 QRZ.com",
|
||||
"adif.QRZNoResponse": "将QSO上传到QRZ.com时出错(无响应)",
|
||||
"adif.QRZNoResponse": "将通联上传到QRZ.com时出错(无响应)",
|
||||
"adif.ClubLogLogged": "已保存到 ClubLog.org",
|
||||
"adif.HRDLogNetLogged": "已保存到 HRDLOG.net",
|
||||
"adif.HRDLogNetFailed": "保存失败 HRDLOG.net",
|
||||
|
@ -654,11 +658,11 @@
|
|||
"alerts.addNew.Added": "增加",
|
||||
"alerts.addNew.SelectFile": "选择文件!",
|
||||
"alerts.addNew.InvalidCall": "无效的呼号",
|
||||
"alerts.addnew.Duplicate": "Duplicate!",
|
||||
"alerts.addnew.Duplicate": "重复!",
|
||||
"alerts.callsign.speech": "呼号",
|
||||
"alerts.callsign.popup": "寻找中",
|
||||
"alerts.gridsquare.speech": "Grid 网格",
|
||||
"alerts.gridsquare.popup": "Grid 网格",
|
||||
"alerts.gridsquare.speech": "网格",
|
||||
"alerts.gridsquare.popup": "网格",
|
||||
"alerts.QRZ.speech": "呼叫中",
|
||||
"alerts.QRZ.popup": "QRZ",
|
||||
"alerts.AlertPop.Type": "类型",
|
||||
|
@ -668,18 +672,18 @@
|
|||
"alerts.AlertPop.Filename": "文件名",
|
||||
"alerts.AlertPop.Alerted": "已提醒",
|
||||
"alerts.AlertPop.LastMessage": "最后一条消息",
|
||||
"alerts.AlertPop.When": "When",
|
||||
"alerts.AlertPop.When": "当",
|
||||
"alerts.AlertPop.Yes": "是",
|
||||
"alerts.AlertPop.No": "否",
|
||||
"alerts.AlertPop.Gathering": "收集警报",
|
||||
"alerts.TypesArray.CallExact": "呼号 (标准)",
|
||||
"alerts.TypesArray.Grid": "Grid",
|
||||
"alerts.TypesArray.Grid": "网格",
|
||||
"alerts.TypesArray.QRZ": "QRZ",
|
||||
"alerts.TypesArray.CallPartial": "呼号 (局部)",
|
||||
"alerts.TypesArray.CallRegex": "呼号 (正则表达式)",
|
||||
"alerts.TypesArray.CallRegex": "呼号 (匹配)",
|
||||
"alerts.ValueArray.AudioFile": "音频文件",
|
||||
"alerts.ValueArray.TextToSpeech": "TTS",
|
||||
"alerts.ValueArray.PopUp": "PopUp",
|
||||
"alerts.ValueArray.TextToSpeech": "朗读",
|
||||
"alerts.ValueArray.PopUp": "弹出",
|
||||
"alerts.ValueArray.MapCenter": "地图中心",
|
||||
"alerts.RepeatArray.No": "否",
|
||||
"alerts.RepeatArray.Once": "一次",
|
||||
|
@ -692,7 +696,7 @@
|
|||
"alerts.Display.Filename": "文件名",
|
||||
"alerts.Display.Alerted": "已提醒",
|
||||
"alerts.Display.LastMessage": "最后一条消息",
|
||||
"alerts.Display.When": "When",
|
||||
"alerts.Display.When": "当",
|
||||
"alerts.Display.Reset": "重置",
|
||||
"alerts.Display.Delete": "删除",
|
||||
"alerts.ClassicWords.callsign": "呼号",
|
||||
|
@ -703,7 +707,7 @@
|
|||
"alerts.ClassicWords.State": "美国",
|
||||
"COMMENT_callsigns.js": "",
|
||||
"callsigns.Downloading": "下载中...",
|
||||
"callsigns.never": "Never",
|
||||
"callsigns.never": "从不",
|
||||
"callsigns.processing": "处理中...",
|
||||
"COMMENT_gt.js": "",
|
||||
"gt.gridView.live": "实时数据",
|
||||
|
@ -722,30 +726,30 @@
|
|||
"gt.timeoutSetUdpPort": "正在等待消息...",
|
||||
"gt.setUdpPort": "...设置中...",
|
||||
"gt.changeGridDecay": "没有衰减",
|
||||
"gt.spotTable.RXSpot": "RX Spot",
|
||||
"gt.spotTable.RXSpot": "接收 Spot",
|
||||
"gt.spotTable.Age": "距今",
|
||||
"gt.spotTable.db": "dB",
|
||||
"gt.spotTable.Call": "被呼叫",
|
||||
"gt.spotTable.db": "分贝",
|
||||
"gt.spotTable.Call": "呼号",
|
||||
"gt.spottable.Dxcc": "DXCC",
|
||||
"gt.spotTable.Grid": "Grid",
|
||||
"gt.spotTable.Grid": "网格",
|
||||
"gt.spotTable.Freq": "频率",
|
||||
"gt.spotTable.Band": "波段",
|
||||
"gt.spotTable.Mode": "模式",
|
||||
"gt.newCallList.Call": "被呼叫",
|
||||
"gt.newCallList.Call": "呼号",
|
||||
"gt.newCallList.Freq": "频率",
|
||||
"gt.newCallList.Sent": "发射",
|
||||
"gt.newCallList.Rcvd": "接收",
|
||||
"gt.newCallList.Station": "主叫",
|
||||
"gt.newCallList.Mode": "模式",
|
||||
"gt.newCallList.Band": "波段",
|
||||
"gt.newCallList.QSL": "QSL",
|
||||
"gt.newCallList.QSL": "确认",
|
||||
"gt.newCallList.LastMsg": "备注信息",
|
||||
"gt.newCallList.DXCC": "DXCC",
|
||||
"gt.newCallList.Time": "时间",
|
||||
"gt.newCallList.LoTW": "LoTW",
|
||||
"gt.newCallList.eQSL": "eQSL",
|
||||
"gt.newCallList.OQRS": "OQRS",
|
||||
"gt.TitleInfo.GridTracker": "Grid网格追踪助手",
|
||||
"gt.TitleInfo.GridTracker": "GridTracker网格追踪助手",
|
||||
"gt.TitleInfo.Band": "波段:",
|
||||
"gt.TitleInfo.Mode": "模式:",
|
||||
"gt.TitleInfo.Worked": "已通联",
|
||||
|
@ -780,8 +784,8 @@
|
|||
"gt.WSJTMessage.Decode": "解码",
|
||||
"gt.WSJTMessage.DecodedMsg": "解码信息",
|
||||
"gt.WSJTMessage.Time": "时间",
|
||||
"gt.WSJTMessage.dB": "dB",
|
||||
"gt.WSJTMessage.DT": "DT",
|
||||
"gt.WSJTMessage.dB": "分贝",
|
||||
"gt.WSJTMessage.DT": "时差",
|
||||
"gt.WSJTMessage.Freq": "频率",
|
||||
"gt.WSJTMessage.Mode": "模式",
|
||||
"gt.WSJTMessage.Message": "信息",
|
||||
|
@ -792,34 +796,34 @@
|
|||
"gt.importSettings.Mismatch": "设置版本不匹配!",
|
||||
"gt.callsignBox.title": "呼号和DXCC字头",
|
||||
"gt.callsignBox.callsign": "呼号",
|
||||
"gt.callsignBox.Grid": "Grid",
|
||||
"gt.callsignBox.Grid": "网格",
|
||||
"gt.callsignBox.DXCC": "DXCC",
|
||||
"gt.callsignBox.CQ": "CQ",
|
||||
"gt.callsignBox.ITU": "ITU",
|
||||
"gt.callsignBox.Flag": "国旗",
|
||||
"gt.callsignBox.QSO": "QSO",
|
||||
"gt.callsignBox.QSL": "QSL",
|
||||
"gt.callsignBox.When": "When",
|
||||
"gt.callsignBox.QSO": "通联",
|
||||
"gt.callsignBox.QSL": "确认",
|
||||
"gt.callsignBox.When": "当",
|
||||
"gt.callsignBox.LoTW": "LoTW",
|
||||
"gt.callsignBox.eQSL": "eQSL",
|
||||
"gt.callsignBox.OQRS": "OQRS",
|
||||
"gt.callsignBox.Name": "Name",
|
||||
"gt.callsignBox.Calls": "Calls",
|
||||
"gt.callsignBox.Name": "名称",
|
||||
"gt.callsignBox.Calls": "呼号",
|
||||
"gt.qsoPage.head": "日志记录数量",
|
||||
"gt.qsoPage.Station": "站台",
|
||||
"gt.qsoPage.Grid": "网格",
|
||||
"gt.qsoPage.Band": "波段",
|
||||
"gt.qsoPage.Mode": "模式",
|
||||
"gt.qsoPage.QSL": "QSL",
|
||||
"gt.qsoPage.QSL": "确认",
|
||||
"gt.qsoPage.Sent": "我收对方",
|
||||
"gt.qsoPage.Rcvd": "对方收我",
|
||||
"gt.qsoPage.DXCC": "DXCC",
|
||||
"gt.qsoPage.Sent": "Sent",
|
||||
"gt.qsoPage.Rcvd": "Rcvd",
|
||||
"gt.qsoPage.Flag": "国旗",
|
||||
"gt.qsoPage.When": "When",
|
||||
"gt.qsoPage.When": "当",
|
||||
"gt.qsoPage.LoTW": "LoTW",
|
||||
"gt.qsoPage.eQSL": "eQSL",
|
||||
"gt.qsoPage.OQRS": "OQRS",
|
||||
"gt.dxccBox.Worked": "通联过的",
|
||||
"gt.dxccBox.Worked": "已通联",
|
||||
"gt.dxccBox.Name": "名称",
|
||||
"gt.dxccBox.Flag": "国旗",
|
||||
"gt.dxccBox.DXCC": "DXCC",
|
||||
|
@ -828,7 +832,8 @@
|
|||
"gt.CQZoneBox.Worked": "通联过的 CQ分区",
|
||||
"gt.ITUZoneBox.Worked": "通联过的 ITU分区",
|
||||
"gt.WASWACBox.WAC": "通联过的所有大洲",
|
||||
"gt.WASWACBox.WAS": "通联过的所有州",
|
||||
"gt.WASWACBox.WAS": "通联过的所有美国州",
|
||||
"gt.WASWACBox.WACP": "通联过的所有加拿大省",
|
||||
"gt.displayItemsList.Worked": "通联过的",
|
||||
"gt.displayItemsList.Confirmed": "已确认的",
|
||||
"gt.displayItemsList.Needed": "需要的",
|
||||
|
@ -840,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",
|
||||
|
@ -850,12 +855,11 @@
|
|||
"gt.awardNames.WAS": "美国各州",
|
||||
"gt.awardNames.USC": "美国各县",
|
||||
"gt.awardNames.WPX": "前缀",
|
||||
"gt.logbook.title": "Logbook",
|
||||
"gt.logbook.scoreCard": "Score Card",
|
||||
"gt.logbook.title": "日志",
|
||||
"gt.logbook.scoreCard": "单项统计表",
|
||||
"gt.logbook.callsign": "呼号",
|
||||
"gt.logbook.firstContact": "第一歌通联的",
|
||||
"gt.logbook.firstContact": "第一歌通联的2",
|
||||
"gt.logbook.lastContact": "最后一个通联的",
|
||||
"gt.logbook.firstContact": "第一个通联",
|
||||
"gt.logbook.lastContact": "最后一个通联",
|
||||
"gt.logbook.topScore": "最高得分",
|
||||
"gt.logbook.worked": "通联过的",
|
||||
"gt.logbook.confirmed": "已确认的",
|
||||
|
@ -870,13 +874,13 @@
|
|||
"gt.GTUsers": "GT用户",
|
||||
"gt.GTUsersOnline": "已运行的GridTracker工作站<br/>立即联机",
|
||||
"gt.scorecardError": "生成统计信息时出错<br/>请截屏并发送至team@gridtracker.org",
|
||||
"gt.stationsTable.Call": "被呼叫",
|
||||
"gt.stationsTable.Grid": "Grid",
|
||||
"gt.stationsTable.Call": "呼号",
|
||||
"gt.stationsTable.Grid": "网格",
|
||||
"gt.stationsTable.Sent": "发射",
|
||||
"gt.stationsTable.Rcvd": "接收",
|
||||
"gt.stationsTable.Mode": "模式",
|
||||
"gt.stationsTable.Band": "波段",
|
||||
"gt.stationsTable.QSL": "QSL",
|
||||
"gt.stationsTable.QSL": "确认",
|
||||
"gt.stationsTable.Comments": "备注",
|
||||
"gt.stationsTable.DXCC": "DXCC",
|
||||
"gt.stationsTable.Time": "时间",
|
||||
|
@ -896,19 +900,19 @@
|
|||
"gt.bandActivity.Rx": "接收:",
|
||||
"gt.bandActivity.NoData": "..还没有数据传入..",
|
||||
"gt.N1MMAlert": "使用相同的设置启用了N1MM Logger+,禁用了GridTracker N1MM记录器",
|
||||
"gt.NoLocationAlert": "位置不可用!启动WSJT-X/JTDX或在设置中输入Grid网格",
|
||||
"gt.NoLocationAlert": "位置不可用!启动WSJT-X/JTDX或在设置中输入网格",
|
||||
"gt.validate.Valid": "有效的!",
|
||||
"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": "最大寿命:",
|
||||
"gt.SpotMaxAge": "最大时效:",
|
||||
"gt.tqslPermissionError": "由于操作系统权限,无法访问LoTW TrustedQSL(TQSL)\n此会话已禁用登录到LoTW \n如果问题仍然存在,请以管理员身份运行或允许对GridTracker进行文件访问",
|
||||
"gt.startupTable.versionCheck": "已完成版本检查",
|
||||
"gt.startupTable.loadi18n": "载入区域信息",
|
||||
"gt.startupTable.qsoBackup": "QSO备份已初始化",
|
||||
"gt.startupTable.qsoBackup": "通联备份已初始化",
|
||||
"gt.startupTable.callsigns": "呼号服务已初始化",
|
||||
"gt.startupTable.mapSettings": "地图设置已初始化",
|
||||
"gt.startupTable.loadMap": "载入地图",
|
||||
|
@ -940,12 +944,12 @@
|
|||
"gt.lookup.lookingUp1": "先前查找 ",
|
||||
"gt.lookup.lookingUp2": "请稍等...",
|
||||
"gt.callookDX1": "C A L L O O K",
|
||||
"gt.callookDX2": "NO-NONSENSE AMATEUR RADIO U.S.A. CALLSIGN LOOKUPS",
|
||||
"gt.callookDX3": "are limited to United States and United States Territories Only",
|
||||
"gt.callookDX4": "呼号",
|
||||
"gt.callookDX5": "请求来自",
|
||||
"gt.callookDX6": "您可能想考虑使用QRZ。com,他有免费服务,为大多数呼号提供有限的数据查询功能",
|
||||
"gt.callookDX7": "付费会员的详细信息",
|
||||
"gt.callookDX2": "严肃的美国业余无线电呼号查询",
|
||||
"gt.callookDX3": "请求来自",
|
||||
"gt.callookDX4": "仅限于美国和美国领土",
|
||||
"gt.callookDX5": "呼号",
|
||||
"gt.callookDX6": "您可能想考虑使用QRZ.com付费会员的详细信息",
|
||||
"gt.callookDX7": "他有免费服务, 为大多数呼号提供有限的数据查询功能",
|
||||
"gt.QRZhamQTH.valid": "有效的",
|
||||
"gt.QRZhamQTH.invalid": "无效响应",
|
||||
"gt.QRZhamQTH.error": "未知错误",
|
||||
|
@ -963,9 +967,9 @@
|
|||
"gt.lookup.azmuth": "方位角",
|
||||
"gt.lookup.cachedRecord": "缓存的记录",
|
||||
"gt.lookup.genMessages": "生成消息(JTDX无效)",
|
||||
"gt.makeYesNo.yes": "Yes",
|
||||
"gt.makeYesNo.no": "No",
|
||||
"gt.lookup.acks": "GridTracker would like to acknowledge",
|
||||
"gt.makeYesNo.yes": "确定",
|
||||
"gt.makeYesNo.no": "否",
|
||||
"gt.lookup.acks": "GridTracker 想要感谢",
|
||||
"gt.lookup.worked": "已通联",
|
||||
"gt.lookup.confirmed": "已确认",
|
||||
"gt.lookup.lastQSO": "最后通联",
|
||||
|
@ -973,7 +977,7 @@
|
|||
"gt.documents.error2": "文件夹\r\n权限受限,GT无法继续",
|
||||
"gt.spots.refreshing": "...刷新中...",
|
||||
"gt.spots.noTX": "最近没有发射",
|
||||
"gt.spots.refresh": "剩余刷新:",
|
||||
"gt.spots.refresh": "刷新:",
|
||||
"gt.spots.count": "Spots:",
|
||||
"gt.spots.maxAge": "最大时效:",
|
||||
"gt.crScript.enabled": "呼叫列表启动",
|
||||
|
@ -984,7 +988,7 @@
|
|||
"gtws.corrupt": "接收的信息已损坏",
|
||||
"gtws.awaySent": "离线消息",
|
||||
"COMMENT_roster.js": "",
|
||||
"roster.process.Decode": "解码众",
|
||||
"roster.process.Decode": "解码中",
|
||||
"roster.process.Receive": "接收中",
|
||||
"roster.process.Transmit": "发射中",
|
||||
"roster.award.Select": "选择奖状",
|
||||
|
@ -1002,16 +1006,18 @@
|
|||
"roster.ignore.DXCCs": "DXCCs",
|
||||
"roster.ignore.CQZones": "CQ分区",
|
||||
"roster.ignore.ITUZones": "ITU分区",
|
||||
"roster.menu.Settings": "Settings",
|
||||
"roster.menu.Settings": "设置",
|
||||
"roster.menu.HideControls": "隐藏控件栏",
|
||||
"roster.menu.ShowControls": "显示控件栏",
|
||||
"roster.menu.CompactMode": "紧凑模式",
|
||||
"roster.menu.RosterMode": "列表模式",
|
||||
"roster.menu.Lookup": "查找",
|
||||
"roster.menu.GenMesg": "生成信息",
|
||||
"roster.menu.AimRotator": "瞄准名单",
|
||||
"roster.menu.IgnoreCall": "忽略呼叫",
|
||||
"roster.menu.Realtime": "实时",
|
||||
"roster.menu.MoveLeft": "向左移动列",
|
||||
"roster.menu.MoveLeft": "列向左移动",
|
||||
"roster.menu.MoveRight": "列向右移动",
|
||||
"roster.menu.ClearCallIgnore": "清除已忽略的呼叫",
|
||||
"roster.menu.ClearIgnore": "清除忽略",
|
||||
"roster.menu.ClearCQFromDXCC": "从DXCC中清除CQ",
|
||||
|
@ -1034,7 +1040,7 @@
|
|||
"roster.AwardTypes.cont52band": "每个波段5个大陆",
|
||||
"roster.AwardTypes.cqz": "CQ分区",
|
||||
"roster.AwardTypes.dxcc": "DXCC",
|
||||
"roster.AwardTypes.grids": "Grids",
|
||||
"roster.AwardTypes.grids": "网格",
|
||||
"roster.AwradTypes.numsfx": "呼叫区域+后缀",
|
||||
"roster.AwardTypes.px": "前缀",
|
||||
"roster.AwardTypes.pxa": "前缀",
|
||||
|
@ -1052,7 +1058,7 @@
|
|||
"rosterFilter.POTA.Unknown": "未知的公园",
|
||||
"COMMENT_rosterColumns.js": "",
|
||||
"rosterColumns.County.title": "匹配到哪多个县,单击以进行完整查找",
|
||||
"rosterColumns.LoTW.NoUpdate": "尚未更新中的QSO",
|
||||
"rosterColumns.LoTW.NoUpdate": "尚未更新的通联",
|
||||
"rosterColumns.LoTW.LastUpdate": "最后上传 ",
|
||||
"rosterColumns.OAMS.user": "非广播消息用户",
|
||||
"rosterColumns.Wanted.cont": "大洲",
|
||||
|
@ -1060,11 +1066,12 @@
|
|||
"rosterColumns.Wanted.ituz": "ITU分区",
|
||||
"rosterColumns.Wanted.dxcc": "DXCC",
|
||||
"rosterColumns.Wanted.dxccMarathon": "马拉松DXCC",
|
||||
"rosterColumns.Wanted.cqzMarathon": "马拉松CQ分区",
|
||||
"rosterColumns.Wanted.cqzMarathon": "马拉松 CQ分区",
|
||||
"rosterColumns.Wanted.state": "美国州",
|
||||
"rosterColumns.Wanted.grid": "Grid",
|
||||
"rosterColumns.Wanted.grid": "网格",
|
||||
"rosterColumns.Wanted.cnty": "美国县",
|
||||
"rosterColumns.Wanted.wpx": "WPX",
|
||||
"rosterColumns.Wanted.regex": "呼号匹配",
|
||||
"rosterColumns.Wanted.call": "呼号",
|
||||
"rosterColumns.Wanted.oams": "OAMS",
|
||||
"rosterColumns.Wanted.pota": "POTA",
|
||||
|
|
|
@ -250,7 +250,7 @@
|
|||
"312": "柬埔寨",
|
||||
"315": "斯里蘭卡",
|
||||
"318": "中國",
|
||||
"321": "國香港",
|
||||
"321": "香港",
|
||||
"324": "印度",
|
||||
"327": "印度尼西亞",
|
||||
"330": "伊朗",
|
||||
|
@ -328,8 +328,8 @@
|
|||
"502": "北馬其頓",
|
||||
"503": "捷克",
|
||||
"504": "斯洛伐克",
|
||||
"505": "國東沙群島",
|
||||
"506": "國黃岩島",
|
||||
"505": "東沙群島",
|
||||
"506": "黃岩島",
|
||||
"507": "泰莫圖省",
|
||||
"508": "南方群島",
|
||||
"509": "馬克薩斯島",
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
"bandActivity.hover": "PSK-Reporter Band-Aktivität",
|
||||
"quickStats.hover": "Statistik",
|
||||
"quickStats.CallRX.hover": "Gehörte Rufzeichen",
|
||||
"quickStats.CallRX.label": "Rx Rufzeichen",
|
||||
"quickStats.CallRX.label": "Rx Calls",
|
||||
"quickStats.QSO.hover": "Gearbeitete Stationen",
|
||||
"quickStats.QSO.label": "QSO",
|
||||
"quickStats.DXCCRx.hover": "Gehörte DXCCs",
|
||||
|
@ -54,9 +54,9 @@
|
|||
"quickStats.QSL.hover": "QSL Liste",
|
||||
"quickStats.QSL.label": "QSL",
|
||||
"quickLoad.clearLive.hover": "GridTracker's Live-Daten zurücksetzen",
|
||||
"quickLoad.clearLive.label": "Live zurücksetzen",
|
||||
"quickLoad.clearLive.label": "Live löschen",
|
||||
"quickLoad.clearLog.hover": "Log-Daten zurücksetzen (löscht keine Dateien)",
|
||||
"quickLoad.clearLog.label": "Log zurücksetzen",
|
||||
"quickLoad.clearLog.label": "Log löschen",
|
||||
"quickLoad.loadLog.label": "Log laden",
|
||||
"mapFilter.title.hover": "Kartenansicht-Einstellungen",
|
||||
"mapFilter.title.label": "Kartenansicht-Filter",
|
||||
|
@ -82,7 +82,7 @@
|
|||
"mapFilter.band.6m": "6m",
|
||||
"mapFilter.band.4m": "4m",
|
||||
"mapFilter.band.2m": "2m",
|
||||
"mapFilter.band.125cm": "1.25m",
|
||||
"mapFilter.band.1_25m": "125cm",
|
||||
"mapFilter.band.70cm": "70cm",
|
||||
"mapFilter.band.33cm": "33cm",
|
||||
"mapFilter.band.23cm": "23cm",
|
||||
|
@ -165,6 +165,7 @@
|
|||
"settings.Logging.label": "Logging",
|
||||
"settings.Alerts.label": "Alarme",
|
||||
"settings.CallRoster.label": "Rufzeichenliste",
|
||||
"settings.Columns.label": "Spalten",
|
||||
"settings.OAMS.label": "OAMS",
|
||||
"settings.OAMS.simplepush.enable.label": "Simplepush Nachrichtenweiterleitung",
|
||||
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
|
||||
|
@ -560,7 +561,7 @@
|
|||
"roster.secondary.wanted.marathon": "Marathon",
|
||||
"roster.secondary.wanted.county": "Kreis",
|
||||
"roster.secondary.wanted.cont": "Kont",
|
||||
"roster.secondary.exceptions.label": "Filter",
|
||||
"roster.exceptions.label": "Filter",
|
||||
"roster.secondary.exceptions.cqOnly": "Nur CQ",
|
||||
"roster.secondary.exceptions.hasGrid": "Nur mit Locator",
|
||||
"roster.secondary.exceptions.minDB": "Min dB",
|
||||
|
@ -573,7 +574,7 @@
|
|||
"roster.secondary.exceptions.onlyMyDXCC": "Nur mein DXCC",
|
||||
"roster.secondary.exceptions.useseQSL":" Benutzt eQSL",
|
||||
"roster.secondary.exceptions.usesOQRS": "Benutzt OQRS",
|
||||
"roster.secondary.exceptions.allOnlyNew": "Nur neue Rufzeichen",
|
||||
"roster.secondary.exceptions.allOnlyNew": "Nur neue Calls",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73 als CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "Keine unbekannten DXCC",
|
||||
"roster.secondary.exceptions.noMsg.label": "Keine",
|
||||
|
@ -583,16 +584,18 @@
|
|||
"roster.secondary.exceptions.regex.label": "Regex",
|
||||
"roster.secondary.exceptions.regex.hover": "Rufzeichen RegEx",
|
||||
"roster.secondary.instances.label": "Instanzen",
|
||||
"roster.ignoresTable.title": "Rufzeichen, CQ and DXCC Ausnahmen",
|
||||
"roster.ignoresTable.close": "Schliessen",
|
||||
"roster.ignores.label": "Ignoriert",
|
||||
"roster.close": "Schliessen",
|
||||
"roster.watcher.label": "Beobachten",
|
||||
"roster.add.watcher.label": "Beobachter hinzufügen",
|
||||
"COMMENT_gt_stats.html": "",
|
||||
"stats.title": "Statistiken",
|
||||
"stats.tabs.logbook": "Logbücher",
|
||||
"stats.tabs.scores": "Ergebnisse",
|
||||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ-Zonen",
|
||||
"stats.tabs.ITUZones": "ITU-Zones",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.ITUZones": "ITU-Zonen",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "Noch keine Nachrichten",
|
||||
"stats.viewing": "Ansicht",
|
||||
|
@ -854,7 +857,8 @@
|
|||
"gt.CQZoneBox.Worked": "Gearbeitete CQ-Zonen",
|
||||
"gt.ITUZoneBox.Worked": "Gearbeitete ITU-Zonen",
|
||||
"gt.WASWACBox.WAC": "Worked All Continents",
|
||||
"gt.WASWACBox.WAS": "Worked All States",
|
||||
"gt.WASWACBox.WAS": "Worked All US States",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"gt.displayItemsList.Worked": "Gearbeitet",
|
||||
"gt.displayItemsList.Confirmed": "Bestätigt",
|
||||
"gt.displayItemsList.Needed": "Benötigt",
|
||||
|
@ -1027,15 +1031,18 @@
|
|||
"roster.ignore.DXCCs": "DXCCs",
|
||||
"roster.ignore.CQZones": "CQ-Zonen",
|
||||
"roster.ignore.ITUZones": "ITU-Zonen",
|
||||
"roster.menu.Settings": "Einstellungen",
|
||||
"roster.menu.HideControls": "Einstellungen ausblenden",
|
||||
"roster.menu.ShowControls": "Einstellungen anzeigen",
|
||||
"roster.menu.CompactMode": "Kompaktmodus",
|
||||
"roster.menu.RosterMode": "Rostermodus",
|
||||
"roster.menu.Lookup": "Nachschlagen",
|
||||
"roster.menu.GenMesg": "WSJT-X befüllen",
|
||||
"roster.menu.AimRotator": "Rotor ausrichten",
|
||||
"roster.menu.IgnoreCall": "Rufzeichen ignorieren",
|
||||
"roster.menu.Realtime": "Echtzeit",
|
||||
"roster.menu.MoveLeft": "Spalte nach links verschieben",
|
||||
"roster.menu.MoveRight": "Spalte nach rechts verschieben",
|
||||
"roster.menu.ClearCallIgnore": "Ignorierte Rufzeichen aufheben",
|
||||
"roster.menu.ClearIgnore": "Ignorierte aufheben",
|
||||
"roster.menu.ClearCQFromDXCC": "CQ von DXCC aufheben",
|
||||
|
|
|
@ -325,7 +325,7 @@
|
|||
"497": "Croatia",
|
||||
"499": "Slovenia",
|
||||
"501": "Bosnia-Herzegovina",
|
||||
"502": "Macedonia",
|
||||
"502": "N. Macedonia",
|
||||
"503": "Czech Republic",
|
||||
"504": "Slovak Republic",
|
||||
"505": "Pratas I.",
|
||||
|
|
|
@ -82,7 +82,7 @@
|
|||
"mapFilter.band.6m": "6m",
|
||||
"mapFilter.band.4m": "4m",
|
||||
"mapFilter.band.2m": "2m",
|
||||
"mapFilter.band.125cm": "125cm",
|
||||
"mapFilter.band.1_25m": "1.25m",
|
||||
"mapFilter.band.70cm": "70cm",
|
||||
"mapFilter.band.33cm": "33cm",
|
||||
"mapFilter.band.23cm": "23cm",
|
||||
|
@ -164,6 +164,7 @@
|
|||
"settings.Logging.label": "Logging",
|
||||
"settings.Alerts.label": "Alerts",
|
||||
"settings.CallRoster.label": "Call Roster",
|
||||
"settings.Columns.label": "Columns",
|
||||
"settings.OAMS.label": "OAMS",
|
||||
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
|
||||
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
|
||||
|
@ -225,7 +226,7 @@
|
|||
"settings.lookup.Enabled.header": "Enabled",
|
||||
"settings.lookup.LastDwnld.header": "Last Download",
|
||||
"settings.lookup.Count.header": "Count",
|
||||
"settings.lookup.db.ULS": "United States ULS",
|
||||
"settings.lookup.db.ULS": "US Callsigns",
|
||||
"settings.lookup.db.LoTW": "Logbook of The World",
|
||||
"settings.lookup.db.eQSL": "eQSL",
|
||||
"settings.lookup.db.OQRS": "ClubLog OQRS",
|
||||
|
@ -373,7 +374,7 @@
|
|||
"settings.logging.pstrotator.details.Port": "UDP Port",
|
||||
"settings.callroster.AlwaysOnTop.label": "Window Always On Top",
|
||||
"settings.callroster.AlwaysOnTop.hover": "Keep Call Roster Above Other Windows",
|
||||
"settings.callroster.MaxAge.label": "Call Roster Max Age",
|
||||
"settings.callroster.MaxAge.label": "Roster Max Age",
|
||||
"settings.callroster.MultiRig.label": "On QSO Reply",
|
||||
"settings.callroster.MultiRig.HaltTx.label": "Halt Tx On All Other Instances",
|
||||
"settings.callroster.MultiRig.SwitchView.label": "Switch View to Transmitting Instance",
|
||||
|
@ -505,7 +506,7 @@
|
|||
"lookup.title": "Callsign Lookup",
|
||||
"lookup.callsign.label": "Callsign",
|
||||
"lookup.callsign.button": "Lookup",
|
||||
"lookup.noinfo": "No Callsign information to display<br />try a lookup!",
|
||||
"lookup.noinfo": "No Callsign information to display, try a lookup!",
|
||||
"COMMENT_gt_popup.html": "",
|
||||
"popup.title": "Data Breakout",
|
||||
"COMMENT_gt_roster.html": "",
|
||||
|
@ -561,7 +562,7 @@
|
|||
"roster.secondary.wanted.marathon": "Marathon",
|
||||
"roster.secondary.wanted.county": "County",
|
||||
"roster.secondary.wanted.cont": "Continent",
|
||||
"roster.secondary.exceptions.label": "Exceptions",
|
||||
"roster.exceptions.label": "Exceptions",
|
||||
"roster.secondary.exceptions.cqOnly": "CQ Only",
|
||||
"roster.secondary.exceptions.hasGrid": "Has Grid",
|
||||
"roster.secondary.exceptions.minDB": "Min dB",
|
||||
|
@ -574,7 +575,7 @@
|
|||
"roster.secondary.exceptions.onlyMyDXCC": "Only My DXCC",
|
||||
"roster.secondary.exceptions.useseQSL":" Uses eQSL",
|
||||
"roster.secondary.exceptions.usesOQRS": "Uses OQRS",
|
||||
"roster.secondary.exceptions.allOnlyNew": "Only New Calls",
|
||||
"roster.secondary.exceptions.allOnlyNew": "New Calls",
|
||||
"roster.secondary.exceptions.wantRRCQ": "RR73 as CQ",
|
||||
"roster.secondary.exceptions.noUnknownDXCC": "No Unknown DXCC",
|
||||
"roster.secondary.exceptions.noMsg.label": "No",
|
||||
|
@ -584,8 +585,10 @@
|
|||
"roster.secondary.exceptions.regex.label": "Regex",
|
||||
"roster.secondary.exceptions.regex.hover": "Callsign Regular Expression",
|
||||
"roster.secondary.instances.label": "Instances",
|
||||
"roster.ignoresTable.title": "Callsign, CQ and DXCC Ignores",
|
||||
"roster.ignoresTable.close": "Close",
|
||||
"roster.ignores.label": "Ignores",
|
||||
"roster.close": "Close",
|
||||
"roster.watcher.label": "Watcher",
|
||||
"roster.add.watcher.label": "Add Watcher",
|
||||
"COMMENT_gt_stats.html": "",
|
||||
"stats.title": "Statistics",
|
||||
"stats.tabs.logbook": "Logbook",
|
||||
|
@ -593,7 +596,7 @@
|
|||
"stats.tabs.DXCCs": "DXCCs",
|
||||
"stats.tabs.CQZones": "CQ Zones",
|
||||
"stats.tabs.ITUZones": "ITU Zones",
|
||||
"stats.tabs.WASWAC": "WAC / WAS",
|
||||
"stats.tabs.WASWAC": "WAC / WAS / WACP",
|
||||
"stats.tabs.live": "Live",
|
||||
"stats.noDecodes": "No decodes yet",
|
||||
"stats.viewing": "Viewing",
|
||||
|
@ -829,7 +832,8 @@
|
|||
"gt.CQZoneBox.Worked": "Worked CQ Zones",
|
||||
"gt.ITUZoneBox.Worked": "Worked ITU Zones",
|
||||
"gt.WASWACBox.WAC": "Worked All Continents",
|
||||
"gt.WASWACBox.WAS": "Worked All States",
|
||||
"gt.WASWACBox.WAS": "Worked All US States",
|
||||
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
|
||||
"gt.displayItemsList.Worked": "Worked",
|
||||
"gt.displayItemsList.Confirmed": "Confirmed",
|
||||
"gt.displayItemsList.Needed": "Needed",
|
||||
|
@ -1013,6 +1017,7 @@
|
|||
"roster.menu.IgnoreCall": "Ignore Call",
|
||||
"roster.menu.Realtime": "Realtime",
|
||||
"roster.menu.MoveLeft": "Move Column Left",
|
||||
"roster.menu.MoveRight": "Move Column Right",
|
||||
"roster.menu.ClearCallIgnore": "Clear Call Ignore",
|
||||
"roster.menu.ClearIgnore": "Clear Ignore",
|
||||
"roster.menu.ClearCQFromDXCC": "Clear CQ from DXCC",
|
||||
|
@ -1073,4 +1078,4 @@
|
|||
"COMMENT_sendAlerts.js": "",
|
||||
"sendAlerts.scriptEnabled": "Script Enabled",
|
||||
"sendAlerts.scriptDisabled": "Script Disabled"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,350 @@
|
|||
{
|
||||
"0": "Ninguno",
|
||||
"1": "Canada",
|
||||
"2": "Is. Abu Ali",
|
||||
"3": "Afganistán",
|
||||
"4": "Agalega y St. Brandon",
|
||||
"5": "Is. Aland",
|
||||
"6": "Alaska",
|
||||
"7": "Albania",
|
||||
"9": "Samoa Americana",
|
||||
"10": "Is. Amsterdam y St. Paul",
|
||||
"11": "Is. Andaman y Nicobar",
|
||||
"12": "Anguilla",
|
||||
"13": "Antarctica",
|
||||
"14": "Armenia",
|
||||
"15": "Rusia Asiática",
|
||||
"16": "Is. Campbell",
|
||||
"17": "I. Aves",
|
||||
"18": "Azerbaijan",
|
||||
"19": "Bajo Neuvo",
|
||||
"20": "Is. Baker y Howland",
|
||||
"21": "Is. Baleares",
|
||||
"22": "Palau",
|
||||
"24": "Bouvet",
|
||||
"27": "Belarusia",
|
||||
"29": "Is. Canarias",
|
||||
"31": "Kiribati Central",
|
||||
"32": "Ceuta y Melilla",
|
||||
"33": "Is. Chagos",
|
||||
"34": "Is. Chatham",
|
||||
"35": "I. Christmas",
|
||||
"36": "I. Clipperton",
|
||||
"37": "I. Cocos",
|
||||
"38": "Is. Cocos (Keeling)",
|
||||
"40": "Creta",
|
||||
"41": "I. Crozet",
|
||||
"43": "I. Desecheo",
|
||||
"45": "Dodecanese",
|
||||
"46": "Malaysia del Este",
|
||||
"47": "I. de Pascua",
|
||||
"48": "Kiribati del Este",
|
||||
"49": "Guinea Ecuatorial",
|
||||
"50": "México",
|
||||
"51": "Eritrea",
|
||||
"52": "Estonia",
|
||||
"53": "Etiopía",
|
||||
"54": "Rusia Europea",
|
||||
"56": "Fernando de Noronha",
|
||||
"60": "Bahamas",
|
||||
"61": "Franz Josef Land",
|
||||
"62": "Barbados",
|
||||
"63": "Guyana Francesa",
|
||||
"64": "Bermuda",
|
||||
"65": "Is. Virgenes Británicas",
|
||||
"66": "Belize",
|
||||
"69": "Is. Caimán",
|
||||
"70": "Cuba",
|
||||
"71": "Is. Galapagos",
|
||||
"72": "República Dominicana",
|
||||
"74": "El Salvador",
|
||||
"75": "Georgia",
|
||||
"76": "Guatemala",
|
||||
"77": "Grenada",
|
||||
"78": "Haiti",
|
||||
"79": "Guadaloupe",
|
||||
"80": "Honduras",
|
||||
"82": "Jamaica",
|
||||
"84": "Martinica",
|
||||
"85": "Antillas Holandesas",
|
||||
"86": "Nicaragua",
|
||||
"88": "Panama",
|
||||
"89": "Is. Turks y Caicos",
|
||||
"90": "Trinidad y Tobago",
|
||||
"91": "Aruba",
|
||||
"94": "Antigua y Barbuda",
|
||||
"95": "Dominica",
|
||||
"96": "Montserrat",
|
||||
"97": "Sta. Lucia",
|
||||
"98": "St. Vincent",
|
||||
"99": "Is. Glorioso",
|
||||
"100": "Argentina",
|
||||
"103": "Guam",
|
||||
"104": "Bolivia",
|
||||
"105": "Guantanamo",
|
||||
"106": "Guernsey",
|
||||
"107": "Guinea",
|
||||
"108": "Brasil",
|
||||
"109": "Guinea-Bissau",
|
||||
"110": "Hawaii",
|
||||
"111": "I. Heard",
|
||||
"112": "Chile",
|
||||
"114": "Isle of Man",
|
||||
"116": "Colombia",
|
||||
"117": "ITU HQ Ginebra",
|
||||
"118": "Jan Mayen",
|
||||
"120": "Ecuador",
|
||||
"122": "Jersey",
|
||||
"123": "I. Johnston",
|
||||
"124": "I. Juan de Nova",
|
||||
"125": "Is. Juan Fernandez",
|
||||
"126": "Kaliningrado",
|
||||
"129": "Guyana",
|
||||
"130": "Kazakhstán",
|
||||
"131": "Is. Kerguelen",
|
||||
"132": "Paraguay",
|
||||
"133": "Is. Kermadec",
|
||||
"134": "Arrecife Kingman",
|
||||
"135": "Kyrgyzstán",
|
||||
"136": "Peru",
|
||||
"137": "South Korea",
|
||||
"138": "Atolón Kure",
|
||||
"140": "Surinam",
|
||||
"141": "Is. Falkland (Malvinas)",
|
||||
"142": "Is. Lakshadweep",
|
||||
"143": "Laos",
|
||||
"144": "Uruguay",
|
||||
"145": "Latvia",
|
||||
"146": "Lithuania",
|
||||
"147": "I. Lord Howe",
|
||||
"148": "Venezuela",
|
||||
"149": "Azores",
|
||||
"150": "Australia",
|
||||
"151": "I. Malyj Vysotskij",
|
||||
"152": "Macao",
|
||||
"153": "I. Macquarie",
|
||||
"157": "Nauru",
|
||||
"158": "Vanuatu",
|
||||
"159": "Maldivas",
|
||||
"160": "Tonga",
|
||||
"161": "I. Malpelo",
|
||||
"162": "Nueva Caledonia",
|
||||
"163": "Papua Nueva Guinea",
|
||||
"165": "Mauritius",
|
||||
"166": "Is. Mariana",
|
||||
"167": "Arrecife Market",
|
||||
"168": "Is. Marshall",
|
||||
"169": "Mayotte",
|
||||
"170": "New Zealand",
|
||||
"171": "Arrecife Mellish",
|
||||
"172": "I. Pitcairn",
|
||||
"173": "Micronesia",
|
||||
"174": "I. Midway",
|
||||
"175": "Polinesia Francesa",
|
||||
"176": "Fiji",
|
||||
"177": "Minami Torishima",
|
||||
"179": "Moldova",
|
||||
"180": "Monte Athos",
|
||||
"181": "Mozambique",
|
||||
"182": "I. Navassa",
|
||||
"185": "Is. Solomon",
|
||||
"187": "Niger",
|
||||
"188": "Niue",
|
||||
"189": "I. Norfolk",
|
||||
"190": "Samoa",
|
||||
"191": "Is. Cook del Norte",
|
||||
"192": "Ogasawara",
|
||||
"193": "Okinawa (Ryukyu Is.)",
|
||||
"195": "I. Annobon",
|
||||
"197": "Is. Palmyra y Jarvis",
|
||||
"199": "I. Peter 1",
|
||||
"201": "I. Prince Edward y Marion",
|
||||
"202": "Puerto Rico",
|
||||
"203": "Andorra",
|
||||
"204": "Revillagigedo",
|
||||
"205": "I. Ascension",
|
||||
"206": "Austria",
|
||||
"207": "I. Rodriguez",
|
||||
"209": "Belgica",
|
||||
"211": "I. Sable",
|
||||
"212": "Bulgaria",
|
||||
"213": "Saint Martin",
|
||||
"214": "Corsega",
|
||||
"215": "Chipre",
|
||||
"216": "San Andres y Providencia",
|
||||
"217": "San Felix",
|
||||
"219": "Sao Tome y Principe",
|
||||
"221": "Dinamarca",
|
||||
"222": "Is. Faroe",
|
||||
"223": "Inglaterra",
|
||||
"224": "Finlandia",
|
||||
"225": "Sardinia",
|
||||
"227": "Francia",
|
||||
"230": "Alemania",
|
||||
"232": "Somalia",
|
||||
"233": "Gibraltar",
|
||||
"234": "Is. Cook del Sur",
|
||||
"235": "I. Georgia del Sur",
|
||||
"236": "Grecia",
|
||||
"237": "Groenlandia",
|
||||
"238": "Is. Orkney del Sur",
|
||||
"239": "Hungía",
|
||||
"240": "Is. Sandwich del Sur",
|
||||
"241": "Is. Shetland del Sur",
|
||||
"242": "Islandia",
|
||||
"245": "Irlandia",
|
||||
"246": "SMO Malta",
|
||||
"247": "Is. Spratly",
|
||||
"248": "Italia",
|
||||
"249": "St. Kitts y Nevis",
|
||||
"250": "St. Helena",
|
||||
"251": "Liechtenstein",
|
||||
"252": "I. St Paul",
|
||||
"253": "St Peter y St Paul Rocks",
|
||||
"254": "Luxemburgo",
|
||||
"256": "Is. Madeira",
|
||||
"257": "Malta",
|
||||
"259": "Svalbard",
|
||||
"260": "Monaco",
|
||||
"262": "Tajikistán",
|
||||
"263": "Holanda",
|
||||
"265": "Irlanda del Norte",
|
||||
"266": "Noruega",
|
||||
"269": "Polonia",
|
||||
"270": "Is. Tokelau",
|
||||
"272": "Portugal",
|
||||
"273": "Is. Trindade y Martim Vaz",
|
||||
"274": "I. Tristán da Cunha y Gough",
|
||||
"275": "Rumania",
|
||||
"276": "I. Tromelin",
|
||||
"277": "St Pierre y Miquelon",
|
||||
"278": "San Marino",
|
||||
"279": "Escocia",
|
||||
"280": "Turkmenistán",
|
||||
"281": "España",
|
||||
"282": "Tuvalu",
|
||||
"283": "SBA Chipre",
|
||||
"284": "Suecia",
|
||||
"285": "Is. Virgenes US",
|
||||
"286": "Uganda",
|
||||
"287": "Suiza",
|
||||
"288": "Ucraine",
|
||||
"289": "Naciones Unidas",
|
||||
"291": "Estados Unidos",
|
||||
"292": "Uzbekistán",
|
||||
"293": "Viet Nam",
|
||||
"294": "Gales",
|
||||
"295": "Vaticano",
|
||||
"296": "Serbia",
|
||||
"297": "I. Wake",
|
||||
"298": "Is. Wallis y Futuna",
|
||||
"299": "West Malaysia",
|
||||
"301": "Kiribati",
|
||||
"302": "Sahara Occidental",
|
||||
"303": "Is. Willis",
|
||||
"304": "Bahrain",
|
||||
"305": "Bangladesh",
|
||||
"306": "Bhutan",
|
||||
"308": "Costa Rica",
|
||||
"309": "Burma",
|
||||
"312": "Camboya",
|
||||
"315": "Sri Lanka",
|
||||
"318": "China",
|
||||
"321": "Hong Kong",
|
||||
"324": "India",
|
||||
"327": "Indonesia",
|
||||
"330": "Irán",
|
||||
"333": "Iraq",
|
||||
"336": "Israel",
|
||||
"339": "Japón",
|
||||
"342": "Jordania",
|
||||
"344": "Corea del Norte",
|
||||
"345": "Brunei",
|
||||
"348": "Kuwait",
|
||||
"354": "Líbano",
|
||||
"363": "Mongolia",
|
||||
"369": "Nepal",
|
||||
"370": "Oman",
|
||||
"372": "Pakistán",
|
||||
"375": "Filipinas",
|
||||
"376": "Qatar",
|
||||
"378": "Arabia Saudita",
|
||||
"379": "Seychelles",
|
||||
"381": "Singapur",
|
||||
"382": "Djibouti",
|
||||
"384": "Siria",
|
||||
"386": "Taiwan",
|
||||
"387": "Tailandia",
|
||||
"390": "Turquía",
|
||||
"391": "Emiratos Árabes Unidos",
|
||||
"400": "Algeria",
|
||||
"401": "Angola",
|
||||
"402": "Botswana",
|
||||
"404": "Burundi",
|
||||
"406": "Camerún",
|
||||
"408": "República Central Africana",
|
||||
"409": "Cabo Verde",
|
||||
"410": "Chad",
|
||||
"411": "Comoros",
|
||||
"412": "Congo",
|
||||
"414": "DRC",
|
||||
"416": "Benín",
|
||||
"420": "Gabon",
|
||||
"422": "Gambia",
|
||||
"424": "Ghana",
|
||||
"428": "Costa de Marfil",
|
||||
"430": "Kenya",
|
||||
"432": "Lesotho",
|
||||
"434": "Liberia",
|
||||
"436": "Libía",
|
||||
"438": "Madagascar",
|
||||
"440": "Malawi",
|
||||
"442": "Mali",
|
||||
"444": "Mauritania",
|
||||
"446": "Marruecos",
|
||||
"450": "Nigeria",
|
||||
"452": "Zimbabwe",
|
||||
"453": "Is. Reunión",
|
||||
"454": "Rwanda",
|
||||
"456": "Senegal",
|
||||
"458": "Sierra Leone",
|
||||
"460": "Rotuma",
|
||||
"462": "Sudáfrica",
|
||||
"464": "Namibia",
|
||||
"466": "Sudán",
|
||||
"468": "Eswatini",
|
||||
"470": "Tanzania",
|
||||
"474": "Tunisia",
|
||||
"478": "Egipto",
|
||||
"480": "Burkina Faso",
|
||||
"482": "Zambia",
|
||||
"483": "Togo",
|
||||
"489": "Arrecife Conway",
|
||||
"490": "Is. Banaba",
|
||||
"492": "Yemen",
|
||||
"497": "Croacia",
|
||||
"499": "Eslovenia",
|
||||
"501": "Bosnia-Herzegovina",
|
||||
"502": "Macedonia",
|
||||
"503": "República Checa",
|
||||
"504": "República Eslovaca",
|
||||
"505": "I. Pratas",
|
||||
"506": "Arrecife Scarborough",
|
||||
"507": "Temotu",
|
||||
"508": "Is. Australes y Tubuai",
|
||||
"509": "Is. Marquesas",
|
||||
"510": "Palestine",
|
||||
"511": "Timor-Leste",
|
||||
"512": "Is. Chesterfield",
|
||||
"513": "I. Ducie",
|
||||
"514": "Montenegro",
|
||||
"515": "I. Swains",
|
||||
"516": "San Barthélemy",
|
||||
"517": "Curazao",
|
||||
"518": "San Maarten",
|
||||
"519": "Saba y San Eustatius",
|
||||
"520": "Bonaire",
|
||||
"521": "Sudan del Sur",
|
||||
"522": "Kosovo",
|
||||
"-1": "Unknown"
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
{
|
||||
"AU-ACT": "Territorio Capital Australiano",
|
||||
"AU-NSW": "New South Wales",
|
||||
"AU-NT": "Territorio Norte",
|
||||
"AU-QLD": "Queensland",
|
||||
"AU-SA": "Australia Sur",
|
||||
"AU-TAS": "Tasmania",
|
||||
"AU-VIC": "Victoria",
|
||||
"AU-WA": "Australia Oeste",
|
||||
"CA-AB": "Alberta",
|
||||
"CA-BC": "Columbia Británica",
|
||||
"CA-MB": "Manitoba",
|
||||
"CA-NB": "Nuevo Brunswick",
|
||||
"CA-NL": "Newfoundland y Labrador",
|
||||
"CA-NS": "Nova Scotia",
|
||||
"CA-NT": "Territorios del Noreste",
|
||||
"CA-NU": "Nunavut",
|
||||
"CA-ON": "Ontario",
|
||||
"CA-PE": "Isla de Prince Edward",
|
||||
"CA-QC": "Québec",
|
||||
"CA-SK": "Saskatchewan",
|
||||
"CA-YT": "Yukon",
|
||||
"DE-BB": "Brandenburg",
|
||||
"DE-BE": "Berlin",
|
||||
"DE-BW": "Baden-Württemberg",
|
||||
"DE-BY": "Bayern",
|
||||
"DE-HB": "Bremen",
|
||||
"DE-HE": "Hessen",
|
||||
"DE-HH": "Hamburg",
|
||||
"DE-MV": "Mecklenburg-Vorpommern",
|
||||
"DE-NI": "Niedersachsen",
|
||||
"DE-NW": "Nordrhein-Westfalen",
|
||||
"DE-RP": "Rheinland-Pfalz",
|
||||
"DE-SH": "Schleswig-Holstein",
|
||||
"DE-SL": "Saarland",
|
||||
"DE-SN": "Sachsen",
|
||||
"DE-ST": "Sachsen-Anhalt",
|
||||
"DE-TH": "Thüringen",
|
||||
"FR-A": "Alsacia",
|
||||
"FR-B": "Aquitaina",
|
||||
"FR-C": "Auvergne",
|
||||
"FR-D": "Bourgoña",
|
||||
"FR-E": "Bretaña",
|
||||
"FR-F": "Centro",
|
||||
"FR-G": "Champagne-Ardenne",
|
||||
"FR-H": "Corsega",
|
||||
"FR-I": "Franche-Comté",
|
||||
"FR-J": "Île-de-France",
|
||||
"FR-K": "Languedoc-Roussillon",
|
||||
"FR-L": "Limousin",
|
||||
"FR-M": "Lorraine",
|
||||
"FR-N": "Midi-Pyrineos",
|
||||
"FR-O": "Nord-Pas-de-Calais",
|
||||
"FR-P": "Basse-Normandie",
|
||||
"FR-Q": "Haute-Normandie",
|
||||
"FR-R": "Pays de la Loire",
|
||||
"FR-S": "Picardie",
|
||||
"FR-T": "Poitou-Charentes",
|
||||
"FR-U": "Provence-Alpes-Côte d'Azur",
|
||||
"FR-V": "Rhône-Alpes",
|
||||
"MX-AGU": "Aguascalientes",
|
||||
"MX-BCN": "Baja California",
|
||||
"MX-BCS": "Baja California Sur",
|
||||
"MX-CAM": "Campeche",
|
||||
"MX-CHH": "Chihuahua",
|
||||
"MX-CHP": "Chiapas",
|
||||
"MX-COA": "Coahuila",
|
||||
"MX-COL": "Colima",
|
||||
"MX-DIF": "Distrito Federal",
|
||||
"MX-DUR": "Durango",
|
||||
"MX-GRO": "Guerrero",
|
||||
"MX-GUA": "Guanajuato",
|
||||
"MX-HID": "Hidalgo",
|
||||
"MX-JAL": "Jalisco",
|
||||
"MX-MEX": "México",
|
||||
"MX-MIC": "Michoacán",
|
||||
"MX-MOR": "Morelos",
|
||||
"MX-NAY": "Nayarit",
|
||||
"MX-NLE": "Nuevo León",
|
||||
"MX-OAX": "Oaxaca",
|
||||
"MX-PUE": "Puebla",
|
||||
"MX-QUE": "Querétaro",
|
||||
"MX-ROO": "Quintana Roo",
|
||||
"MX-SIN": "Sinaloa",
|
||||
"MX-SLP": "San Luis Potosí",
|
||||
"MX-SON": "Sonora",
|
||||
"MX-TAB": "Tabasco",
|
||||
"MX-TAM": "Tamaulipas",
|
||||
"MX-TLA": "Tlaxcala",
|
||||
"MX-VER": "Veracruz",
|
||||
"MX-YUC": "Yucatán",
|
||||
"MX-ZAC": "Zacatecas",
|
||||
"US-AK": "Alaska",
|
||||
"US-AL": "Alabama",
|
||||
"US-AR": "Arkansas",
|
||||
"US-AZ": "Arizona",
|
||||
"US-CA": "California",
|
||||
"US-CO": "Colorado",
|
||||
"US-CT": "Connecticut",
|
||||
"US-DC": "District Of Columbia",
|
||||
"US-DE": "Delaware",
|
||||
"US-FL": "Florida",
|
||||
"US-GA": "Georgia",
|
||||
"US-GU": "Guam",
|
||||
"US-HI": "Hawaii",
|
||||
"US-IA": "Iowa",
|
||||
"US-ID": "Idaho",
|
||||
"US-IL": "Illinois",
|
||||
"US-IN": "Indiana",
|
||||
"US-KS": "Kansas",
|
||||
"US-KY": "Kentucky",
|
||||
"US-LA": "Louisiana",
|
||||
"US-MA": "Massachusetts",
|
||||
"US-MD": "Maryland",
|
||||
"US-ME": "Maine",
|
||||
"US-MH": "Islas Marshall",
|
||||
"US-MI": "Michigan",
|
||||
"US-MN": "Minnesota",
|
||||
"US-MO": "Missouri",
|
||||
"US-MP": "Islas Marianas del Norte",
|
||||
"US-MS": "Mississippi",
|
||||
"US-MT": "Montana",
|
||||
"US-NC": "North Carolina",
|
||||
"US-ND": "North Dakota",
|
||||
"US-NE": "Nebraska",
|
||||
"US-NH": "New Hampshire",
|
||||
"US-NJ": "New Jersey",
|
||||
"US-NM": "New Mexico",
|
||||
"US-NV": "Nevada",
|
||||
"US-NY": "New York",
|
||||
"US-OH": "Ohio",
|
||||
"US-OK": "Oklahoma",
|
||||
"US-OR": "Oregon",
|
||||
"US-PA": "Pennsylvania",
|
||||
"US-PR": "Puerto Rico",
|
||||
"US-RI": "Rhode Island",
|
||||
"US-SC": "South Carolina",
|
||||
"US-SD": "South Dakota",
|
||||
"US-TN": "Tennessee",
|
||||
"US-TX": "Texas",
|
||||
"US-UT": "Utah",
|
||||
"US-VA": "Virginia",
|
||||
"US-VI": "Islas Virgenes",
|
||||
"US-VT": "Vermont",
|
||||
"US-WA": "Washington",
|
||||
"US-WI": "Wisconsin",
|
||||
"US-WV": "West Virginia",
|
||||
"US-WY": "Wyoming"
|
||||
}
|
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
Plik binarny nie jest wyświetlany.
Przed Szerokość: | Wysokość: | Rozmiar: 552 B |
Plik binarny nie jest wyświetlany.
Przed Szerokość: | Wysokość: | Rozmiar: 2.1 KiB |
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 5.1 KiB |
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,658 @@
|
|||
var GT = {};
|
||||
|
||||
importScripts("protos.js");
|
||||
importScripts("gtCommon.js");
|
||||
|
||||
GT.workerFunctions =
|
||||
{
|
||||
init: initGlobals,
|
||||
clear: clearQSO,
|
||||
parse: onAdiLoadComplete
|
||||
};
|
||||
|
||||
onmessage = (event) =>
|
||||
{
|
||||
if ("type" in event.data)
|
||||
{
|
||||
if (event.data.type in GT.workerFunctions)
|
||||
{
|
||||
GT.workerFunctions[event.data.type](event.data);
|
||||
}
|
||||
else console.log("adifWorker: unknown event type : " + event.data.type);
|
||||
}
|
||||
else console.log("adifWorker: no event type");
|
||||
};
|
||||
|
||||
function initGlobals(task)
|
||||
{
|
||||
GT.dxccInfo = task.dxccInfo; // null geo
|
||||
for (const key in GT.dxccInfo)
|
||||
{
|
||||
GT.dxccInfo[key].geo = null;
|
||||
}
|
||||
GT.dxccToCountryCode = task.dxccToCountryCode;
|
||||
GT.directCallToDXCC = task.directCallToDXCC;
|
||||
GT.directCallToITUzone = task.directCallToITUzone;
|
||||
GT.directCallToCQzone = task.directCallToCQzone;
|
||||
GT.prefixToITUzone = task.prefixToITUzone;
|
||||
GT.prefixToCQzone = task.prefixToCQzone;
|
||||
GT.prefixToMap = task.prefixToMap;
|
||||
GT.gridToState = task.gridToState;
|
||||
GT.callsignDatabaseDXCC = task.callsignDatabaseDXCC;
|
||||
GT.callsignDatabaseUS = task.callsignDatabaseUS;
|
||||
GT.callsignDatabaseUSplus = task.callsignDatabaseUSplus;
|
||||
GT.modes = task.modes;
|
||||
GT.modes_phone = task.modes_phone;
|
||||
GT.QSOhash = task.QSOhash;
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "loaded";
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function clearQSO(task)
|
||||
{
|
||||
GT.QSOhash = {};
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "cleared"
|
||||
returnTask.clearFiles = task.clearFiles;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
const myTextEncoder = new TextEncoder();
|
||||
const myTextDecoder = new TextDecoder();
|
||||
|
||||
function onAdiLoadComplete(task)
|
||||
{
|
||||
GT.appSettings = task.appSettings;
|
||||
GT.myQsoCalls = {};
|
||||
GT.myQsoGrids = {};
|
||||
|
||||
var liveLog = task.liveLog;
|
||||
var confirmed = false;
|
||||
var rows = 0;
|
||||
var lastHash = null;
|
||||
var validAdifFile = true;
|
||||
var eQSLfile = false;
|
||||
var clublogFile = false;
|
||||
var lotwTimestampUpdated = false;
|
||||
|
||||
if (task.rawAdiBuffer.indexOf("PSKReporter") > -1) validAdifFile = false;
|
||||
if (task.rawAdiBuffer.indexOf("Received eQSLs") > -1) eQSLfile = true;
|
||||
if (task.rawAdiBuffer.indexOf("clublog.adif") > -1 || task.rawAdiBuffer.indexOf("ADIF export from Club Log") > -1) clublogFile = true;
|
||||
|
||||
var eorRegEx = new RegExp("<EOR>", "i");
|
||||
|
||||
if (validAdifFile == true && task.rawAdiBuffer.length > 1)
|
||||
{
|
||||
var startPos = 0;
|
||||
var endPos = task.rawAdiBuffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
let eor = task.rawAdiBuffer.substring(startPos).search(eorRegEx);
|
||||
if (eor != -1)
|
||||
{
|
||||
let row = task.rawAdiBuffer.substring(startPos, startPos + eor);
|
||||
startPos += eor + 5; // skip <EOR>
|
||||
let object = parseADIFRecordStrict(row);
|
||||
let confSource = null;
|
||||
let lotwConfirmed = false;
|
||||
confirmed = false;
|
||||
if (object.APP_LOTW_RXQSO)
|
||||
{
|
||||
var dRXQSO = Date.parse(object.APP_LOTW_RXQSO);
|
||||
|
||||
if ((isNaN(dRXQSO) == false) && dRXQSO > 0 && dRXQSO > task.lotw_qso)
|
||||
{
|
||||
// add a second
|
||||
dRXQSO += 1000;
|
||||
task.lotw_qso = dRXQSO;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (object.APP_LOTW_RXQSL)
|
||||
{
|
||||
var dRXQSL = Date.parse(object.APP_LOTW_RXQSL);
|
||||
if ((isNaN(dRXQSL) == false) && dRXQSL > 0 && dRXQSL > task.lotw_qsl)
|
||||
{
|
||||
// add a second
|
||||
dRXQSL += 1000;
|
||||
task.lotw_qsl = dRXQSL;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
lotwConfirmed = true;
|
||||
}
|
||||
|
||||
var finalDEcall = "";
|
||||
if (object.STATION_CALLSIGN)
|
||||
{
|
||||
finalDEcall = object.STATION_CALLSIGN.replace("_", "/");
|
||||
}
|
||||
if (finalDEcall == "")
|
||||
{
|
||||
finalDEcall = GT.appSettings.myCall;
|
||||
}
|
||||
GT.myQsoCalls[finalDEcall] = true;
|
||||
|
||||
if (GT.appSettings.workingCallsignEnable && !(finalDEcall in GT.appSettings.workingCallsigns))
|
||||
{
|
||||
// not in the working callsigns, move to next
|
||||
continue;
|
||||
}
|
||||
|
||||
var finalTime = 0;
|
||||
|
||||
if (object.QSO_DATE && object.TIME_ON)
|
||||
{
|
||||
var dateTime = new Date(
|
||||
Date.UTC(
|
||||
object.QSO_DATE.substr(0, 4),
|
||||
parseInt(object.QSO_DATE.substr(4, 2)) - 1,
|
||||
object.QSO_DATE.substr(6, 2),
|
||||
object.TIME_ON.substr(0, 2),
|
||||
object.TIME_ON.substr(2, 2),
|
||||
object.TIME_ON.substr(4, 2)
|
||||
)
|
||||
);
|
||||
|
||||
finalTime = parseInt(dateTime.getTime() / 1000);
|
||||
}
|
||||
|
||||
if (GT.appSettings.workingDateEnable && finalTime < GT.appSettings.workingDate)
|
||||
{
|
||||
// Not after our working date
|
||||
continue;
|
||||
}
|
||||
|
||||
var myGrid = (object.MY_GRIDSQUARE || "").toUpperCase();
|
||||
if (myGrid.length > 3)
|
||||
{
|
||||
let finalMyGrid = myGrid.substr(0, 4);
|
||||
GT.myQsoGrids[finalMyGrid] = true;
|
||||
if (GT.appSettings.workingGridEnable && !(finalMyGrid in GT.appSettings.workingGrids))
|
||||
{
|
||||
// not in the working grids, move to next
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
var finalDXcall = (object.CALL || "").replace("_", "/");
|
||||
var finalGrid = (object.GRIDSQUARE || "").toUpperCase();
|
||||
var vuccGrids = (object.VUCC_GRIDS || "").toUpperCase();
|
||||
var finalVucc = [];
|
||||
var finalRSTsent = (object.RST_SENT || "");
|
||||
var finalRSTrecv = (object.RST_RCVD || "");
|
||||
var finalBand = (object.BAND || "").toLowerCase();
|
||||
if (finalBand == "" || finalBand == "oob")
|
||||
{
|
||||
finalBand = formatBand(Number(object.FREQ || 0));
|
||||
}
|
||||
|
||||
var finalPropMode = (object.PROP_MODE || "").toUpperCase();
|
||||
var finalSatName = (object.SAT_NAME || "").toUpperCase();
|
||||
var finalCont = (object.CONT || "").toUpperCase();
|
||||
if (finalCont.length == 0)
|
||||
{
|
||||
finalCont = null;
|
||||
}
|
||||
var finalCnty = (object.CNTY || "").toUpperCase();
|
||||
if (finalCnty.length == 0)
|
||||
{
|
||||
finalCnty = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// GT references internally with NO spaces, this is important
|
||||
finalCnty = replaceAll(finalCnty, " ", "");
|
||||
}
|
||||
var finalMode = (object.MODE || "").toUpperCase();
|
||||
var subMode = (object.SUBMODE || "").toUpperCase();
|
||||
if (subMode == "FT4" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "FT4"
|
||||
}
|
||||
if (subMode == "Q65" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "Q65"
|
||||
}
|
||||
if (subMode == "JS8" && finalMode == "MFSK")
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "JS8";
|
||||
}
|
||||
|
||||
var finalMsg = (object.COMMENT || "");
|
||||
var finalQslMsg = (object.QSLMSG || "");
|
||||
var finalQslMsgIntl = (object.QSLMSG_INTL || "");
|
||||
if (finalQslMsg.length > 1)
|
||||
{
|
||||
finalMsg = finalQslMsg;
|
||||
}
|
||||
if (finalQslMsgIntl.length > 1 && finalMsg == "")
|
||||
{
|
||||
finalMsg = finalQslMsgIntl;
|
||||
}
|
||||
|
||||
var finalDxcc = Number(object.DXCC || 0);
|
||||
if (finalDxcc == 0)
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
if (!(finalDxcc in GT.dxccInfo))
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
var finalState = (object.STATE || "").toUpperCase();
|
||||
if (finalState.length == 0) finalState = null;
|
||||
else if (finalDxcc > 0)
|
||||
{
|
||||
finalState = GT.dxccToCountryCode[finalDxcc] + "-" + finalState;
|
||||
}
|
||||
|
||||
var finalCqZone = (object.CQZ || "");
|
||||
if (finalCqZone.length == 1)
|
||||
{
|
||||
finalCqZone = "0" + finalCqZone;
|
||||
}
|
||||
|
||||
if (parseInt(finalCqZone) < 1 || parseInt(finalCqZone) > 40)
|
||||
{
|
||||
finalCqZone = "";
|
||||
}
|
||||
finalCqZone = String(finalCqZone);
|
||||
var finalItuZone = (object.ITUZ || "");
|
||||
if (finalItuZone.length == 1) finalItuZone = "0" + finalItuZone;
|
||||
|
||||
if (parseInt(finalItuZone) < 1 || parseInt(finalItuZone) > 90)
|
||||
{
|
||||
finalItuZone = "";
|
||||
}
|
||||
finalItuZone = String(finalItuZone);
|
||||
|
||||
var finalIOTA = (object.IOTA || "").toUpperCase();
|
||||
|
||||
var qrzConfirmed = (object.APP_QRZLOG_STATUS || "").toUpperCase();
|
||||
var lotwConfirmed1 = (object.QSL_RCVD || "").toUpperCase();
|
||||
var lotw_qsl_rcvd = (object.LOTW_QSL_RCVD || "").toUpperCase();
|
||||
var eqsl_qsl_rcvd = (object.EQSL_QSL_RCVD || "").toUpperCase();
|
||||
|
||||
if (qrzConfirmed == "C" || lotw_qsl_rcvd == "Y" || lotw_qsl_rcvd == "V" || lotwConfirmed1 == "Y" || eqsl_qsl_rcvd == "Y" || eqsl_qsl_rcvd == "V" || eQSLfile == true)
|
||||
{
|
||||
confirmed = true;
|
||||
if (qrzConfirmed == "C")
|
||||
{
|
||||
confSource = "Q";
|
||||
}
|
||||
else if (eQSLfile == true)
|
||||
{
|
||||
confSource = "e";
|
||||
}
|
||||
else if (lotwConfirmed == true)
|
||||
{
|
||||
confSource = "L";
|
||||
}
|
||||
else if (clublogFile == true)
|
||||
{
|
||||
confSource = "C";
|
||||
}
|
||||
else
|
||||
{
|
||||
confSource = "O";
|
||||
}
|
||||
}
|
||||
|
||||
finalGrid = finalGrid.substr(0, 6);
|
||||
if (!validateGridFromString(finalGrid)) finalGrid = "";
|
||||
if (finalGrid == "" && vuccGrids != "")
|
||||
{
|
||||
finalVucc = vuccGrids.split(",");
|
||||
finalGrid = finalVucc[0];
|
||||
finalVucc.shift();
|
||||
}
|
||||
var isDigital = false;
|
||||
var isPhone = false;
|
||||
if (finalMode in GT.modes)
|
||||
{
|
||||
isDigital = GT.modes[finalMode];
|
||||
}
|
||||
if (finalMode in GT.modes_phone)
|
||||
{
|
||||
isPhone = GT.modes_phone[finalMode];
|
||||
}
|
||||
|
||||
var finalPOTA = (object.POTA_REF || object.POTA || "").toUpperCase();
|
||||
if (finalPOTA.length == 0)
|
||||
{
|
||||
finalPOTA = null;
|
||||
}
|
||||
|
||||
if (finalDXcall != "")
|
||||
{
|
||||
lastHash = addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
finalMsg,
|
||||
finalMode,
|
||||
finalBand,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc,
|
||||
finalPropMode,
|
||||
isDigital,
|
||||
isPhone,
|
||||
finalIOTA,
|
||||
finalSatName,
|
||||
finalPOTA,
|
||||
confSource
|
||||
);
|
||||
}
|
||||
rows++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break; // we're done
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cam from a live event, we handly differently
|
||||
if (liveLog == true && rows == 1 && lastHash != null && confirmed == false)
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsedLive";
|
||||
returnTask.details = GT.QSOhash[lastHash];
|
||||
}
|
||||
else
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsed";
|
||||
returnTask.QSOhash = GT.QSOhash;
|
||||
returnTask.myQsoCalls = GT.myQsoCalls;
|
||||
returnTask.myQsoGrids = GT.myQsoGrids;
|
||||
returnTask.lotw_qso = task.lotw_qso;
|
||||
returnTask.lotw_qsl = task.lotw_qsl;
|
||||
returnTask.lotwTimestampUpdated = lotwTimestampUpdated;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
}
|
||||
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
ifinalMsg,
|
||||
mode,
|
||||
band,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc = [],
|
||||
finalPropMode = "",
|
||||
finalDigital = false,
|
||||
finalPhone = false,
|
||||
finalIOTA = "",
|
||||
finalSatName = "",
|
||||
finalPOTA = null,
|
||||
confSource = null
|
||||
)
|
||||
{
|
||||
let hash = "";
|
||||
let finalMsg = ifinalMsg.trim();
|
||||
if (finalMsg.length > 40) finalMsg = finalMsg.substring(0, 40) + "...";
|
||||
|
||||
let details = null;
|
||||
let timeMod = finalTime - ((finalTime % 60) + 30);
|
||||
hash = unique(finalDXcall + timeMod) + unique(mode + band);
|
||||
|
||||
if (hash in GT.QSOhash)
|
||||
{
|
||||
details = GT.QSOhash[hash];
|
||||
let canWrite = (details.confirmed == false || GT.appSettings.qslAuthority == "0" || GT.appSettings.qslAuthority == confSource || !(GT.appSettings.qslAuthority in details.confSrcs));
|
||||
if (GT.appSettings.qslAuthority == "1" && confirmed == true)
|
||||
{
|
||||
// Only unconfirmed can change the grid, state, county
|
||||
// This is for DO9KW
|
||||
canWrite = false;
|
||||
}
|
||||
if (finalGrid.length > 0 && finalGrid != details.grid)
|
||||
{
|
||||
// only touch the grid if it's larger than the last grid && the 4wide is the same
|
||||
if (details.grid.length < 6 && (details.grid.substr(0, 4) == finalGrid.substr(0, 4) || details.grid.length == 0))
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
}
|
||||
else if (details.grid.length != 0 && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (finalRSTsent.length > 0) details.RSTsent = finalRSTsent;
|
||||
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
|
||||
if (finalCqZone.length > 0) details.cqz = finalCqZone;
|
||||
if (finalItuZone.length > 0) details.ituz = finalItuZone;
|
||||
if (details.state != null && finalState != null && details.state != finalState && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
else if (details.state == null && finalState != null)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
if (confirmed == true && finalDxcc > 0) details.dxcc = finalDxcc;
|
||||
if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc;
|
||||
if (finalCont == null && details.cont) finalCont = details.cont;
|
||||
if (details.cnty != null && finalCnty != null && details.cnty != finalCnty && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
else if (details.cnty == null && finalCnty != null)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
if (finalPropMode.length > 0) details.propMode = finalPropMode;
|
||||
if (finalVucc.length > 0) details.vucc_grids = finalVucc;
|
||||
if (finalIOTA.length > 0) details.IOTA = finalIOTA;
|
||||
if (finalSatName.length > 0) details.satName = finalSatName;
|
||||
if (finalPOTA) details.pota = finalPOTA;
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confirmed = true;
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
details = {};
|
||||
details.grid = finalGrid;
|
||||
details.field = finalGrid.substring(0, 2);
|
||||
details.RSTsent = finalRSTsent;
|
||||
details.RSTrecv = finalRSTrecv;
|
||||
details.msg = "-";
|
||||
details.band = band;
|
||||
details.mode = mode;
|
||||
details.DEcall = finalDXcall;
|
||||
details.DXcall = finalDEcall;
|
||||
details.cqz = finalCqZone;
|
||||
details.ituz = finalItuZone;
|
||||
details.delta = -1;
|
||||
details.time = finalTime;
|
||||
details.state = finalState;
|
||||
details.zipcode = null;
|
||||
details.qso = true;
|
||||
details.px = null;
|
||||
details.zone = null;
|
||||
details.cont = null;
|
||||
details.cnty = finalCnty;
|
||||
details.vucc_grids = finalVucc;
|
||||
details.propMode = finalPropMode;
|
||||
details.digital = finalDigital;
|
||||
details.phone = finalPhone;
|
||||
details.IOTA = finalIOTA;
|
||||
details.satName = finalSatName;
|
||||
details.pota = finalPOTA;
|
||||
details.worked = true;
|
||||
details.confirmed = confirmed;
|
||||
details.confSrcs = {};
|
||||
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall);
|
||||
details.dxcc = finalDxcc;
|
||||
|
||||
if (details.dxcc > 0 && details.px == null)
|
||||
{
|
||||
details.px = getWpx(finalDXcall);
|
||||
if (details.px) { details.zone = Number(details.px.charAt(details.px.length - 1)); }
|
||||
}
|
||||
|
||||
var fourGrid = details.grid.substr(0, 4);
|
||||
|
||||
details.cont = finalCont;
|
||||
if (finalDxcc > 0)
|
||||
{
|
||||
details.cont = GT.dxccInfo[finalDxcc].continent;
|
||||
if (details.dxcc == 390 && details.zone == 1) details.cont = "EU";
|
||||
}
|
||||
|
||||
if (details.cnty && confirmed == true)
|
||||
{
|
||||
details.qual = true;
|
||||
}
|
||||
|
||||
if (details.state == null && fourGrid.length > 0 && isKnownCallsignDXCC(finalDxcc))
|
||||
{
|
||||
if (fourGrid in GT.gridToState && GT.gridToState[fourGrid].length == 1)
|
||||
{
|
||||
details.state = GT.gridToState[fourGrid][0];
|
||||
}
|
||||
}
|
||||
|
||||
if (!details.cqz || details.cqz.length == 0)
|
||||
{
|
||||
details.cqz = cqZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
if (!details.ituz || details.ituz.length == 0)
|
||||
{
|
||||
details.ituz = ituZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
|
||||
if (finalMsg.length > 0) details.msg = finalMsg;
|
||||
|
||||
details.hash = hash;
|
||||
|
||||
GT.QSOhash[hash] = details;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
GT.strictAdif = {
|
||||
APP_LOTW_RXQSO: false,
|
||||
APP_LOTW_RXQSL: false,
|
||||
STATION_CALLSIGN: false,
|
||||
QSO_DATE: false,
|
||||
TIME_ON: false,
|
||||
MY_GRIDSQUARE: false,
|
||||
CALL: false,
|
||||
GRIDSQUARE: false,
|
||||
VUCC_GRIDS: false,
|
||||
RST_SENT: false,
|
||||
RST_RCVD: false,
|
||||
BAND: false,
|
||||
FREQ: false,
|
||||
PROP_MODE: false,
|
||||
SAT_NAME: false,
|
||||
CONT: false,
|
||||
CNTY: false,
|
||||
MODE: false,
|
||||
SUBMODE: false,
|
||||
COMMENT: true,
|
||||
QSLMSG: true,
|
||||
QSLMSG_INTL: true,
|
||||
DXCC: false,
|
||||
STATE: false,
|
||||
CQZ: false,
|
||||
ITUZ: false,
|
||||
IOTA: false,
|
||||
APP_QRZLOG_STATUS: false,
|
||||
QSL_RCVD: false,
|
||||
LOTW_QSL_RCVD: false,
|
||||
EQSL_QSL_RCVD: false,
|
||||
POTA: false,
|
||||
POTA_REF: false,
|
||||
OPERATOR: false,
|
||||
APP_PSKREP_SNR: false
|
||||
};
|
||||
|
||||
function parseADIFRecordStrict(line)
|
||||
{
|
||||
var record = {};
|
||||
while (line.length > 0)
|
||||
{
|
||||
while (line.charAt(0) != "<" && line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
}
|
||||
if (line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
var where = line.indexOf(":");
|
||||
var nextChev = line.indexOf(">");
|
||||
if (where != -1 && nextChev > where)
|
||||
{
|
||||
var fieldName = line.substr(0, where).toUpperCase();
|
||||
line = line.substr(fieldName.length + 1);
|
||||
var fieldLength = parseInt(line);
|
||||
var end = line.indexOf(">");
|
||||
if (end > 0 && fieldName in GT.strictAdif)
|
||||
{
|
||||
line = line.substr(end + 1);
|
||||
var fieldValue;
|
||||
if (GT.strictAdif[fieldName] == true)
|
||||
{
|
||||
fieldValue = myTextDecoder.decode(myTextEncoder.encode(line.substr(0)).slice(0, fieldLength));
|
||||
}
|
||||
else
|
||||
{
|
||||
fieldValue = line.substr(0, fieldLength);
|
||||
}
|
||||
line = line.substr(fieldValue.length);
|
||||
record[fieldName] = fieldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return record;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -399,7 +399,7 @@ function addAlert(value, type, notify, repeat, filename, shortname)
|
|||
{
|
||||
var newKey = unique(value + type + notify + repeat + filename);
|
||||
|
||||
if (!GT.alerts.hasOwnProperty(newKey))
|
||||
if (!(newKey in GT.alerts))
|
||||
{
|
||||
var alertItem = Object();
|
||||
alertItem.value = value;
|
||||
|
@ -532,10 +532,7 @@ function checkAlerts(
|
|||
else if (grid && nalert.type == 2)
|
||||
{
|
||||
// gridsquare
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
grid.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && grid.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord, grid);
|
||||
hadAlert = true;
|
||||
|
@ -553,10 +550,7 @@ function checkAlerts(
|
|||
else if (nalert.type == 5)
|
||||
{
|
||||
// callsign partial
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
DEcallsign.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && DEcallsign.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord);
|
||||
hadAlert = true;
|
||||
|
@ -596,20 +590,15 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.lastMessage = lastMessage;
|
||||
nAlert.lastTime = timeNowSec();
|
||||
|
||||
if (callsignRecord != null)
|
||||
if (nAlert.notify == 3 && callsignRecord != null && grid.length == 4)
|
||||
{
|
||||
if (
|
||||
typeof callsignRecord.rect != "undefined" &&
|
||||
callsignRecord.rect != null &&
|
||||
nAlert.notify == 3
|
||||
)
|
||||
var LL = squareToCenter(grid);
|
||||
|
||||
if (!isNaN(LL.a))
|
||||
{
|
||||
// Fix me
|
||||
GT.map
|
||||
.getView()
|
||||
.setCenter(
|
||||
ol.extent.getCenter(callsignRecord.rect.getGeometry().getExtent())
|
||||
);
|
||||
.setCenter(ol.proj.transform([LL.o, LL.a], "EPSG:4326", "EPSG:3857"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -638,9 +627,9 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.fired++;
|
||||
}
|
||||
|
||||
function playAlertMediaFile(filename, overrideMute)
|
||||
function playAlertMediaFile(filename)
|
||||
{
|
||||
if (GT.appSettings.alertMute && !overrideMute) return;
|
||||
if (GT.appSettings.alertMute == 1) return;
|
||||
|
||||
// check if this is an alert stored with an older version of GT
|
||||
// which has a full file path given.
|
||||
|
|
|
@ -134,9 +134,9 @@ var GreatCircle = function (start, end, properties)
|
|||
{
|
||||
throw new Error(
|
||||
"it appears " +
|
||||
start.view() +
|
||||
this.start +
|
||||
" and " +
|
||||
end.view() +
|
||||
this.end +
|
||||
" are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite"
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -6,14 +6,21 @@ GT.lotwCallsigns = Object();
|
|||
GT.lotwFile = "";
|
||||
GT.lotwWhenDate = 0;
|
||||
GT.lotwLoadTimer = null;
|
||||
|
||||
GT.eqslCallsigns = Object();
|
||||
GT.eqslFile = "";
|
||||
GT.eqslWhenDate = 0;
|
||||
GT.eqslLoadTimer = null;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsCallsigns = Object();
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsFile = "";
|
||||
|
||||
GT.cacCallsigns = Object();
|
||||
GT.cacFile = "";
|
||||
GT.cacWhenDate = 0;
|
||||
GT.cacLoadTimer = null;
|
||||
|
||||
GT.oqrsCallsigns = Object();
|
||||
GT.oqrsFile = "";
|
||||
|
@ -54,6 +61,8 @@ function callsignServicesInit()
|
|||
GT.lotwFile = GT.NWappData + "lotw-ts-callsigns.json";
|
||||
GT.eqslFile = GT.NWappData + "eqsl-callsigns.json";
|
||||
GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json";
|
||||
GT.cacFile = GT.NWappData + "canada-callsigns.txt";
|
||||
GT.ulsFile = GT.NWappData + "uls-callsigns.txt";
|
||||
|
||||
if (GT.callsignLookups.lotwUseEnable)
|
||||
{
|
||||
|
@ -67,6 +76,10 @@ function callsignServicesInit()
|
|||
{
|
||||
ulsLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
cacLoadCallsigns();
|
||||
}
|
||||
if (GT.callsignLookups.oqrsUseEnable)
|
||||
{
|
||||
oqrsLoadCallsigns();
|
||||
|
@ -75,6 +88,7 @@ function callsignServicesInit()
|
|||
lotwSettingsDisplay();
|
||||
eqslSettingsDisplay();
|
||||
ulsSettingsDisplay();
|
||||
cacSettingsDisplay();
|
||||
oqrsSettingsDisplay();
|
||||
}
|
||||
|
||||
|
@ -201,6 +215,7 @@ function processLotwCallsigns(result, flag)
|
|||
}
|
||||
|
||||
GT.callsignLookups.lotwLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer);
|
||||
|
@ -218,6 +233,116 @@ function processLotwCallsigns(result, flag)
|
|||
lotwSettingsDisplay();
|
||||
}
|
||||
|
||||
function cacLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.cacLastUpdate > 86400 * 7)
|
||||
{ GT.callsignLookups.cacLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
|
||||
GT.cacWhenDate = now + cacWhenTimer;
|
||||
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!fs.existsSync(GT.cacFile))
|
||||
{
|
||||
GT.callsignLookups.cacLastUpdate = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
parseCacCallsigns(fs.readFileSync(GT.cacFile, "UTF-8"));
|
||||
}
|
||||
if (GT.callsignLookups.cacLastUpdate == 0)
|
||||
{
|
||||
cacDownload();
|
||||
}
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
GT.callsignLookups.cacLastUpdate = 0;
|
||||
cacDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function parseCacCallsigns(data)
|
||||
{
|
||||
let callsignRows = data.split("\n");
|
||||
for (let x = 0; x < callsignRows.length; x++)
|
||||
{
|
||||
if (callsignRows[x].length > 1)
|
||||
{
|
||||
GT.cacCallsigns[callsignRows[x].substr(8)] = callsignRows[x].substr(6, 2);
|
||||
}
|
||||
}
|
||||
fs.writeFileSync(GT.cacFile, data, "UTF-8");
|
||||
}
|
||||
|
||||
function processCacCallsigns(buffer, flag)
|
||||
{
|
||||
let data = (typeof buffer == "object") ? String(buffer) : buffer;
|
||||
parseCacCallsigns(data);
|
||||
|
||||
GT.callsignLookups.cacLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
|
||||
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
|
||||
GT.cacWhenDate = now + cacWhenTimer;
|
||||
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
|
||||
|
||||
cacSettingsDisplay();
|
||||
}
|
||||
|
||||
function cacDownload(fromSettings)
|
||||
{
|
||||
cacUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/canada.txt",
|
||||
processCacCallsigns,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function cacSettingsDisplay()
|
||||
{
|
||||
cacUseEnable.checked = GT.callsignLookups.cacUseEnable;
|
||||
|
||||
if (GT.callsignLookups.cacLastUpdate == 0)
|
||||
{
|
||||
cacUpdatedTd.innerHTML = "Never";
|
||||
}
|
||||
else
|
||||
{
|
||||
cacUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.cacLastUpdate * 1000);
|
||||
}
|
||||
|
||||
if (!GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
GT.cacLoadTimer = null;
|
||||
GT.cacCallsigns = Object();
|
||||
}
|
||||
cacCountTd.innerHTML = Object.keys(GT.cacCallsigns).length;
|
||||
}
|
||||
|
||||
function cacValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.cacUseEnable = cacUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (GT.callsignLookups.cacUseEnable == true)
|
||||
{
|
||||
cacLoadCallsigns();
|
||||
}
|
||||
cacSettingsDisplay();
|
||||
}
|
||||
|
||||
function oqrsLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
@ -309,6 +434,7 @@ function processoqrsCallsigns(buffer, flag)
|
|||
GT.oqrsCallsigns = JSON.parse(buffer);
|
||||
|
||||
GT.callsignLookups.oqrsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.oqrsLoadTimer != null) nodeTimers.clearTimeout(GT.oqrsLoadTimer);
|
||||
|
@ -419,6 +545,7 @@ function processeqslCallsigns(buffer, flag)
|
|||
GT.eqslCallsigns[lines[x].trim()] = true;
|
||||
}
|
||||
GT.callsignLookups.eqslLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.eqslLoadTimer != null) nodeTimers.clearTimeout(GT.eqslLoadTimer);
|
||||
|
@ -435,59 +562,71 @@ function processeqslCallsigns(buffer, flag)
|
|||
|
||||
function ulsLoadCallsigns()
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.ulsLastUpdate > 86400 * 7) ulsDownload();
|
||||
else
|
||||
{
|
||||
var ulsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsWhenDate = now + ulsWhenTimer;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
updateCallsignCount();
|
||||
if (!fs.existsSync(GT.ulsFile))
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
ulsDownload();
|
||||
}
|
||||
else
|
||||
{
|
||||
loadULSFile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateQSO()
|
||||
function stateCheck()
|
||||
{
|
||||
if (GT.ulsCallsignsCount > 0)
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
for (hash in GT.QSOhash)
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
var details = GT.QSOhash[hash];
|
||||
var lookupCall = false;
|
||||
|
||||
if ((details.cnty == null || details.state == null) && isKnownCallsignDXCC(details.dxcc))
|
||||
let details = GT.QSOhash[hash];
|
||||
if (isKnownCallsignUSplus(details.dxcc))
|
||||
{
|
||||
// Do County Lookup
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null && isKnownCallsignUSplus(details.dxcc))
|
||||
{
|
||||
if (!(details.cnty in GT.cntyToCounty))
|
||||
let lookupCall = false;
|
||||
if ((details.cnty == null || details.state == null))
|
||||
{
|
||||
if (details.cnty.indexOf(",") == -1)
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null)
|
||||
{
|
||||
if (!(details.cnty in GT.cntyToCounty))
|
||||
{
|
||||
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
|
||||
if (details.cnty.indexOf(",") == -1)
|
||||
{
|
||||
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lookupCall = true;
|
||||
}
|
||||
}
|
||||
if (lookupCall == true)
|
||||
{
|
||||
lookupKnownCallsign(details);
|
||||
}
|
||||
}
|
||||
if (lookupCall)
|
||||
}
|
||||
}
|
||||
|
||||
if (GT.callsignLookups.cacUseEnable)
|
||||
{
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
let details = GT.QSOhash[hash];
|
||||
if (details.dxcc == 1 && details.state == null)
|
||||
{
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
if (details.DEcall in GT.cacCallsigns)
|
||||
{
|
||||
lookupUsCallsign(details, true);
|
||||
details.state = "CA-" + GT.cacCallsigns[details.DEcall];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -496,23 +635,8 @@ function updateQSO()
|
|||
|
||||
function updateCallsignCount()
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("SELECT count(*) as cnt FROM calls", [],
|
||||
function (tx, results)
|
||||
{
|
||||
var len = results.rows.length, i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
|
||||
updateQSO();
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
GT.ulsCallsignsCount = Object.keys(GT.ulsCallsigns).length;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
||||
function ulsSettingsDisplay()
|
||||
|
@ -530,8 +654,6 @@ function ulsSettingsDisplay()
|
|||
|
||||
if (!GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null) nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
@ -540,7 +662,7 @@ function ulsSettingsDisplay()
|
|||
function ulsValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.ulsUseEnable = ulsUseEnable.checked;
|
||||
|
||||
|
||||
if (GT.callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
|
@ -548,11 +670,11 @@ function ulsValuesChanged()
|
|||
else
|
||||
{
|
||||
resetULSDatabase();
|
||||
ulsSettingsDisplay();
|
||||
ulsCountTd.innerHTML = 0;
|
||||
}
|
||||
saveCallsignSettings();
|
||||
|
||||
ulsSettingsDisplay();
|
||||
goProcessRoster();
|
||||
if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
@ -561,279 +683,106 @@ function ulsDownload()
|
|||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
ulsCountTd.innerHTML = 0;
|
||||
getChunkedBuffer(
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/callsigns/callsigns.txt",
|
||||
processulsCallsigns,
|
||||
ulsDownloadHandler,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function getChunkedBuffer(file_url, callback, flag, mode, port, cookie, errorHandler)
|
||||
{
|
||||
var url = require("url");
|
||||
var http = require(mode);
|
||||
var fileBuffer = null;
|
||||
var options = null;
|
||||
if (cookie != null)
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
||||
headers: {
|
||||
Cookie: cookie
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path // eslint-disable-line node/no-deprecated-api
|
||||
};
|
||||
}
|
||||
http.get(options, function (res)
|
||||
{
|
||||
var fsize = res.headers["content-length"];
|
||||
var fread = 0;
|
||||
var cookies = null;
|
||||
if (typeof res.headers["set-cookie"] != "undefined")
|
||||
{
|
||||
cookies = res.headers["set-cookie"];
|
||||
}
|
||||
res
|
||||
.on("data", function (data)
|
||||
{
|
||||
var isEnd = false;
|
||||
fread += data.length;
|
||||
if (fread == fsize) isEnd = true;
|
||||
if (fileBuffer == null)
|
||||
{
|
||||
fileBuffer = callback(data, flag, cookies, true, isEnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd); // eslint-disable-line node/no-callback-literal
|
||||
}
|
||||
})
|
||||
.on("end", function () {})
|
||||
.on("error", function (e)
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Error downloading</i></b>";
|
||||
console.error("Got error: " + e.message);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
GT.ulsDatabase = openDatabase(
|
||||
"ulsDB",
|
||||
"1.0",
|
||||
"US Callsigns",
|
||||
50 * 1024 * 1024
|
||||
);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("CREATE TABLE IF NOT EXISTS calls (callsign TEXT PRIMARY KEY, zip, state)");
|
||||
});
|
||||
|
||||
function resetULSDatabase()
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
saveCallsignSettings();
|
||||
}
|
||||
|
||||
function processulsCallsigns(data, flag, cookies, starting, finished)
|
||||
function ulsDownloadHandler(data)
|
||||
{
|
||||
var buffer = String(data);
|
||||
var returnBuffer = "";
|
||||
fs.writeFileSync(GT.ulsFile, data);
|
||||
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
loadULSFile();
|
||||
}
|
||||
|
||||
function loadULSFile()
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
fs.readFile(GT.ulsFile, "utf-8", processulsCallsigns);
|
||||
}
|
||||
|
||||
function processulsCallsigns(error, buffer)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
console.log("File Read Error: " + error);
|
||||
}
|
||||
|
||||
if (buffer && buffer.length > 0)
|
||||
{
|
||||
var lines = null;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
if (buffer[buffer.length - 1] == "\n")
|
||||
var startPos = 0;
|
||||
var endPos = buffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
lines = buffer.split("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
var lastIndex = buffer.lastIndexOf("\n");
|
||||
returnBuffer = buffer.substring(lastIndex);
|
||||
lines = buffer.substring(0, lastIndex).split("\n");
|
||||
}
|
||||
|
||||
if (lines.length > 0)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
let eol = buffer.substring(startPos).indexOf("\n");
|
||||
if (eol > -1)
|
||||
{
|
||||
if (starting == true)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
tx.executeSql("delete from calls");
|
||||
}
|
||||
for (var x in lines)
|
||||
{
|
||||
if (lines[x].length)
|
||||
{
|
||||
++GT.ulsCallsignsCount;
|
||||
tx.executeSql("INSERT INTO calls (rowid, callsign, zip, state) VALUES (" + GT.ulsCallsignsCount + ",\"" + lines[x].substr(7) + "\",\"" + lines[x].substr(0, 5) + "\",\"" + lines[x].substr(5, 2) + "\")");
|
||||
if (GT.ulsCallsignsCount % 10000 == 0)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length;
|
||||
if (len == 1)
|
||||
{
|
||||
ulsCountTd.innerHTML = results.rows[0].cnt;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
lines = null;
|
||||
});
|
||||
let row = buffer.substring(startPos, startPos + eol);
|
||||
GT.ulsCallsigns[row.substring(7)] = row.substring(0, 7);
|
||||
startPos += eol + 1; // skip \n
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (finished == true)
|
||||
updateCallsignCount();
|
||||
ulsSettingsDisplay();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
|
||||
var ulsWhenTimer = 86400 * 7;
|
||||
GT.ulsWhenDate = ulsWhenTimer + now;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
ulsSettingsDisplay();
|
||||
updateQSO();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api
|
||||
var whenTimer = (86400 * 7) - (timeNowSec() - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, whenTimer * 1000);
|
||||
}
|
||||
|
||||
function lookupUsCallsign(object, writeState = false)
|
||||
function lookupKnownCallsign(object)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
if (object.DEcall in GT.ulsCallsigns)
|
||||
{
|
||||
let qry = "SELECT * FROM calls where callsign = \"" + object.DEcall + "\"";
|
||||
tx.executeSql(
|
||||
qry,
|
||||
[],
|
||||
function (tx, results)
|
||||
if (object.state == null)
|
||||
{
|
||||
object.state = "US-" + GT.ulsCallsigns[object.DEcall].substring(5);
|
||||
}
|
||||
object.zipcode = GT.ulsCallsigns[object.DEcall].substring(0, 5);
|
||||
|
||||
if (object.cnty == null && object.zipcode in GT.zipToCounty)
|
||||
{
|
||||
var counties = GT.zipToCounty[object.zipcode];
|
||||
if (counties.length > 1)
|
||||
{
|
||||
if (results.rows.length == 1)
|
||||
{
|
||||
if (object.state == null)
|
||||
{
|
||||
if (object.dxcc == 1)
|
||||
{
|
||||
object.state = "CA-" + results.rows[0].state;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.state = "US-" + results.rows[0].state;
|
||||
}
|
||||
|
||||
if (writeState)
|
||||
{
|
||||
setState(object);
|
||||
}
|
||||
}
|
||||
object.zipcode = String(results.rows[0].zip);
|
||||
if (object.cnty == null)
|
||||
{
|
||||
let request = GT.Idb.transaction(["lookups"], "readwrite").objectStore("lookups").get(object.DEcall);
|
||||
|
||||
request.onsuccess = function (event)
|
||||
{
|
||||
if (request.result)
|
||||
{
|
||||
object.cnty = request.result.cnty;
|
||||
object.qual = true;
|
||||
}
|
||||
|
||||
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];
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = false;
|
||||
}
|
||||
|
||||
if (writeState)
|
||||
{
|
||||
setState(object);
|
||||
}
|
||||
};
|
||||
|
||||
request.onerror = function (event)
|
||||
{
|
||||
object.qual = false;
|
||||
if (writeState)
|
||||
{
|
||||
setState(object);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (writeState)
|
||||
{
|
||||
setState(object);
|
||||
}
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
object.qual = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = true;
|
||||
}
|
||||
object.cnty = counties[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function downloadCtyDat()
|
||||
|
|
|
@ -9,8 +9,11 @@ var validSettings = [
|
|||
"awardTracker",
|
||||
"bandActivity",
|
||||
"blockedCQ",
|
||||
"ignoredCQ",
|
||||
"blockedCalls",
|
||||
"blockedDxcc",
|
||||
"blockedCQz",
|
||||
"blockedITUz",
|
||||
"callsignLookups",
|
||||
"classicAlerts",
|
||||
"classicAlertsVersion",
|
||||
|
@ -95,8 +98,12 @@ var def_appSettings = {
|
|||
wsjtUdpPort: 0,
|
||||
workingCallsignEnable: false,
|
||||
workingCallsigns: {},
|
||||
workingGridEnable: false,
|
||||
workingGrids: {},
|
||||
workingDateEnable: false,
|
||||
workingDate: 0
|
||||
workingDate: 0,
|
||||
qsoItemsPerPage: 100,
|
||||
qslAuthority: "L"
|
||||
};
|
||||
|
||||
var def_mapSettings = {
|
||||
|
@ -127,6 +134,9 @@ var def_mapSettings = {
|
|||
splitQSL: true,
|
||||
trafficDecode: true,
|
||||
usNexrad: false,
|
||||
timezonesEnable: 0,
|
||||
showAllGrids: false,
|
||||
trophyOverlay: 0,
|
||||
zoom: 4,
|
||||
mapTrans: 0.5
|
||||
};
|
||||
|
@ -136,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,
|
||||
|
@ -181,8 +189,8 @@ var def_adifLogSettings = {
|
|||
},
|
||||
downloads: {},
|
||||
lastFetch: {
|
||||
lotw_qso: "1970-01-01",
|
||||
lotw_qsl: "1970-01-01"
|
||||
lotw_qso: 0,
|
||||
lotw_qsl: 0
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -262,6 +270,9 @@ var def_callsignLookups = {
|
|||
ulsUseEnable: true,
|
||||
ulsWeeklyEnable: true,
|
||||
ulsLastUpdate: 0,
|
||||
cacUseEnable: true,
|
||||
cacWeeklyEnable: true,
|
||||
cacLastUpdate: 0,
|
||||
oqrsUseEnable: false,
|
||||
oqrsWeeklyEnable: false,
|
||||
oqrsLastUpdate: 0
|
||||
|
@ -292,6 +303,7 @@ var def_qso = {
|
|||
band: "",
|
||||
cnty: null,
|
||||
confirmed: false,
|
||||
confSrcs: {},
|
||||
cont: null,
|
||||
cqz: "",
|
||||
DEcall: "",
|
||||
|
@ -310,7 +322,6 @@ var def_qso = {
|
|||
px: null,
|
||||
qso: true,
|
||||
qual: false,
|
||||
rect: null,
|
||||
RSTrecv: "",
|
||||
RSTsent: "",
|
||||
satName: "",
|
||||
|
@ -318,7 +329,7 @@ var def_qso = {
|
|||
time: 0,
|
||||
vucc_grids: [],
|
||||
worked: false,
|
||||
wspr: null,
|
||||
zipcode: null,
|
||||
zone: null
|
||||
zone: null,
|
||||
hash: null
|
||||
};
|
||||
|
|
4202
package.nw/lib/gt.js
4202
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()
|
||||
{
|
||||
|
@ -472,7 +472,7 @@ function makeGtPin(obj)
|
|||
}
|
||||
|
||||
var LL = squareToCenter(obj.grid);
|
||||
obj.pin = iconFeature(ol.proj.fromLonLat([LL.o, LL.a]), GT.gtFlagIcon, 100);
|
||||
obj.pin = iconFeature(ol.proj.fromLonLat([LL.o, LL.a]), GT.gtFlagIcon, 100, "gtFlag");
|
||||
obj.pin.key = obj.cid;
|
||||
obj.pin.isGtFlag = true;
|
||||
obj.pin.size = 1;
|
||||
|
|
|
@ -2,7 +2,10 @@ let languages = {
|
|||
en: "i18n/en.json",
|
||||
cn: "i18n/cn.json",
|
||||
cnt: "i18n/cn-t.json",
|
||||
de: "i18n/de.json"
|
||||
de: "i18n/de.json",
|
||||
fr: "i18n/fr.json",
|
||||
it: "i18n/it.json",
|
||||
es: "i18n/es.json"
|
||||
};
|
||||
|
||||
function loadI18n()
|
||||
|
@ -10,6 +13,7 @@ function loadI18n()
|
|||
$.i18n().load(languages).done(function ()
|
||||
{
|
||||
$.i18n().locale = GT.appSettings.locale;
|
||||
refreshI18NStrings();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -23,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.
|
||||
|
||||
|
@ -47,20 +47,45 @@ GT.potaUnknownPark = {
|
|||
grid: ""
|
||||
};
|
||||
|
||||
GT.gtParkIconActive = new ol.style.Icon({
|
||||
src: "./img/pota_icon_active.png",
|
||||
anchorYUnits: "pixels",
|
||||
anchorXUnits: "pixels",
|
||||
anchor: [10, 19]
|
||||
GT.gtParkOnInstance = new ol.style.Text({
|
||||
text: "🏕️",
|
||||
font: "20px Verdana",
|
||||
textAlign: "center",
|
||||
justify: "center"
|
||||
});
|
||||
|
||||
GT.gtParkIconInactive = new ol.style.Icon({
|
||||
src: "./img/pota_icon_inactive.png",
|
||||
anchorYUnits: "pixels",
|
||||
anchorXUnits: "pixels",
|
||||
anchor: [10, 19]
|
||||
GT.gtParkWorkedOnInstance = new ol.style.Text({
|
||||
text: "🌄",
|
||||
font: "20px Verdana",
|
||||
textAlign: "center",
|
||||
justify: "center"
|
||||
});
|
||||
|
||||
GT.gtParkOffInstance = new ol.style.Text({
|
||||
text: "🌲",
|
||||
font: "20px Verdana",
|
||||
textAlign: "center",
|
||||
justify: "center"
|
||||
});
|
||||
|
||||
function iconText(center, iconObj, zIndex, propName)
|
||||
{
|
||||
var feature = new ol.Feature({
|
||||
geometry: new ol.geom.Point(center),
|
||||
textAlign: "center",
|
||||
justify: "center",
|
||||
prop: propName
|
||||
});
|
||||
|
||||
var iconStyle = new ol.style.Style({
|
||||
zIndex: zIndex,
|
||||
text: iconObj
|
||||
});
|
||||
|
||||
feature.setStyle(iconStyle);
|
||||
return feature;
|
||||
}
|
||||
|
||||
function initPota()
|
||||
{
|
||||
potaEnabled.checked = (GT.appSettings.potaEnabled == 1);
|
||||
|
@ -118,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();
|
||||
|
@ -129,6 +154,10 @@ function makeParkFeatures()
|
|||
{
|
||||
try
|
||||
{
|
||||
let now = timeNowSec();
|
||||
let day = parseInt(now / 86400);
|
||||
let dayAsString = String(day);
|
||||
|
||||
for (const park in GT.pota.parkSpots)
|
||||
{
|
||||
if (park in GT.pota.parks)
|
||||
|
@ -139,7 +168,26 @@ function makeParkFeatures()
|
|||
var report = GT.pota.parkSpots[park][call];
|
||||
if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode) && Date.now() < report.expire)
|
||||
{
|
||||
parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1);
|
||||
let parkIcon = GT.gtParkOffInstance;
|
||||
let zIndex = 1;
|
||||
for (let instance in GT.instances)
|
||||
{
|
||||
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
|
||||
{
|
||||
let hash = dayAsString + park + report.band + report.mode;
|
||||
if (hash in GT.tracker.worked.pota)
|
||||
{
|
||||
parkIcon = GT.gtParkWorkedOnInstance;
|
||||
}
|
||||
else
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
}
|
||||
zIndex = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag");
|
||||
parkObj.feature.key = park;
|
||||
parkObj.feature.size = 22;
|
||||
|
||||
|
@ -179,7 +227,6 @@ function potaSpotFromDecode(callObj)
|
|||
if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash])
|
||||
{
|
||||
GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency;
|
||||
// reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
}
|
||||
else if (callObj.DEcall in GT.pota.callSchedule)
|
||||
|
@ -205,7 +252,6 @@ function potaSpotFromDecode(callObj)
|
|||
if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash])
|
||||
{
|
||||
GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency;
|
||||
// reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -222,38 +268,28 @@ function potaSpotFromDecode(callObj)
|
|||
}
|
||||
}
|
||||
|
||||
/* function reportPotaRBN(callSpot)
|
||||
function leftClickPota(parkId)
|
||||
{
|
||||
if (Date.now() < callSpot.expire)
|
||||
if (parkId in GT.pota.parkSpots)
|
||||
{
|
||||
var report = {
|
||||
activator: callSpot.activator,
|
||||
spotter: GT.appSettings.myCall + "-#",
|
||||
frequency: String(parseInt(callSpot.frequency * 1000)),
|
||||
reference: callSpot.reference,
|
||||
mode: callSpot.mode,
|
||||
source: "RBN",
|
||||
comments: callSpot.comments,
|
||||
activatorGrid: callSpot.activatorGrid,
|
||||
spotterGrid: callSpot.spotterGrid
|
||||
};
|
||||
|
||||
if (Number(report.frequency) > 0)
|
||||
for (parkCaller in GT.pota.parkSpots[parkId])
|
||||
{
|
||||
getPostJSONBuffer(
|
||||
"https://api.pota.app/spot",
|
||||
rbnReportResult,
|
||||
null,
|
||||
"https",
|
||||
443,
|
||||
report,
|
||||
10000,
|
||||
null,
|
||||
null
|
||||
);
|
||||
let obj = GT.pota.parkSpots[parkId][parkCaller];
|
||||
let call = obj.activator;
|
||||
let grid = obj.activatorGrid;
|
||||
let band = obj.band;
|
||||
let mode = obj.mode;
|
||||
for (let instance in GT.instances)
|
||||
{
|
||||
if (GT.instances[instance].valid && GT.instances[instance].status.Band == band && GT.instances[instance].status.MO == mode)
|
||||
{
|
||||
setCallAndGrid(call, grid, instance);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
function reportPotaQSO(record)
|
||||
{
|
||||
|
@ -261,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 : "",
|
||||
|
@ -334,7 +370,31 @@ function addParkSpotFeature(park, report)
|
|||
|
||||
if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode))
|
||||
{
|
||||
parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1);
|
||||
let parkIcon = GT.gtParkOffInstance;
|
||||
let zIndex = 1;
|
||||
|
||||
let now = timeNowSec();
|
||||
let day = parseInt(now / 86400);
|
||||
let dayAsString = String(day);
|
||||
|
||||
for (let instance in GT.instances)
|
||||
{
|
||||
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
|
||||
{
|
||||
let hash = dayAsString + park + report.band + report.mode;
|
||||
if (hash in GT.tracker.worked.pota)
|
||||
{
|
||||
parkIcon = GT.gtParkWorkedOnInstance;
|
||||
}
|
||||
else
|
||||
{
|
||||
parkIcon = GT.gtParkOnInstance;
|
||||
}
|
||||
zIndex = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag");
|
||||
parkObj.feature.key = park;
|
||||
parkObj.feature.size = 22;
|
||||
GT.layerSources.pota.addFeature(parkObj.feature);
|
||||
|
@ -572,31 +632,18 @@ function getPotaSchedule()
|
|||
GT.pota.scheduleTimeout = nodeTimers.setTimeout(getPotaSchedule, 900000);
|
||||
}
|
||||
|
||||
GT.lastPark = null;
|
||||
function mouseOverPark(feature)
|
||||
{
|
||||
if (GT.lastPark && GT.lastPark == feature)
|
||||
{
|
||||
mouseParkMove();
|
||||
return;
|
||||
}
|
||||
GT.lastPark = feature;
|
||||
|
||||
if (GT.currentOverlay != 0) return false;
|
||||
createParkTipTable(feature);
|
||||
|
||||
mouseParkMove();
|
||||
mouseParkMove(feature);
|
||||
|
||||
myParktip.style.zIndex = 499;
|
||||
myParktip.style.display = "block";
|
||||
return true;
|
||||
}
|
||||
|
||||
function mouseOutPark(mouseEvent)
|
||||
{
|
||||
GT.lastPark = null;
|
||||
myParktip.style.zIndex = -1;
|
||||
}
|
||||
|
||||
function mouseParkMove()
|
||||
function mouseParkMove(feature)
|
||||
{
|
||||
var positionInfo = myParktip.getBoundingClientRect();
|
||||
var windowWidth = window.innerWidth;
|
||||
|
@ -613,6 +660,11 @@ function mouseParkMove()
|
|||
myParktip.style.top = getMouseY() - positionInfo.height - 12 + "px";
|
||||
}
|
||||
|
||||
function mouseOutPark(feature)
|
||||
{
|
||||
myParktip.style.zIndex = -1;
|
||||
}
|
||||
|
||||
function createParkTipTable(toolElement)
|
||||
{
|
||||
var worker = "";
|
||||
|
|
|
@ -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 = [
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -29,47 +29,22 @@ function prepareRosterSettings()
|
|||
window.opener.GT.appSettings.gtShareEnable == true &&
|
||||
window.opener.GT.appSettings.gtMsgEnable == true;
|
||||
|
||||
// The following 3 sections deal with QSLing, do we break them out
|
||||
// individually or lump them into a qslUser function that sets
|
||||
// all three at the same time?
|
||||
// this section is for LoTW users, can be a function
|
||||
if (window.opener.GT.callsignLookups.lotwUseEnable == true)
|
||||
{
|
||||
usesLoTWDiv.style.display = "";
|
||||
if (CR.rosterSettings.usesLoTW == true)
|
||||
{
|
||||
maxLoTW.style.display = "";
|
||||
maxLoTWView.style.display = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
maxLoTW.style.display = "none";
|
||||
maxLoTWView.style.display = "none";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
usesLoTWDiv.style.display = "none";
|
||||
maxLoTW.style.display = "none";
|
||||
maxLoTWView.style.display = "none";
|
||||
}
|
||||
|
||||
if (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
|
||||
|
|
|
@ -18,6 +18,8 @@ const CALLSIGN_REGEXP =
|
|||
for a optional list of postindicators separated by `\/` from the rest of the call
|
||||
*/
|
||||
|
||||
const GRID_REGEXP = /^[A-Z]{2}[0-9]{2}$/
|
||||
|
||||
function processRosterFiltering(callRoster, rosterSettings)
|
||||
{
|
||||
// First loop, exclude calls, mostly based on "Exceptions" settings
|
||||
|
@ -40,6 +42,20 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (CR.rosterSettings.columns.Spot == true)
|
||||
{
|
||||
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band);
|
||||
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
|
||||
if (rosterSettings.now - callObj.age > CR.rosterSettings.rosterTime)
|
||||
{
|
||||
entry.tx = false;
|
||||
|
@ -53,11 +69,6 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (CR.rosterSettings.noUnknownDXCC && callObj.dxcc == -1)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (window.opener.GT.instances[callObj.instance].crEnable == false)
|
||||
{
|
||||
entry.tx = false;
|
||||
|
@ -68,7 +79,7 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (entry.DXcall + " from All" in CR.blockedCQ || entry.DXcall + " from " + window.opener.GT.dxccToAltName[callObj.dxcc] in CR.blockedCQ)
|
||||
if (entry.DXcall in CR.ignoredCQ || entry.DXcall + ":" + callObj.dxcc in CR.ignoredCQ)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
|
@ -88,6 +99,11 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (callObj.grid in CR.blockedGrid)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (CR.rosterSettings.cqOnly == true)
|
||||
{
|
||||
if (CR.rosterSettings.wantRRCQ == true)
|
||||
|
@ -104,19 +120,6 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if (CR.rosterSettings.useRegex && CR.rosterSettings.callsignRegex.length > 0)
|
||||
{
|
||||
var regexObj = regexObj || new RegExp(CR.rosterSettings.callsignRegex, "i")
|
||||
try
|
||||
{
|
||||
if (!call.match(regexObj))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
if (CR.rosterSettings.requireGrid == true && callObj.grid.length != 4)
|
||||
{
|
||||
entry.tx = false;
|
||||
|
@ -143,31 +146,6 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (CR.rosterSettings.noMsg == true)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (callObj.msg.match(CR.rosterSettings.noMsgValue))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
if (CR.rosterSettings.onlyMsg == true)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!callObj.msg.match(CR.rosterSettings.onlyMsgValue))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
|
||||
if (callObj.dxcc == window.opener.GT.myDXCC)
|
||||
{
|
||||
if (CR.rosterSettings.noMyDxcc == true)
|
||||
|
@ -182,24 +160,6 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (CR.rosterSettings.columns.Spot == true)
|
||||
{
|
||||
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band + callObj.grid);
|
||||
if (callObj.spot == null)
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.spot = { when: 0, snr: 0 };
|
||||
}
|
||||
|
||||
let usesOneOf = 0;
|
||||
let checkUses = 0;
|
||||
|
||||
|
@ -253,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;
|
||||
|
|
|
@ -3,7 +3,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
// these lets, do they rely on anything between the top and here?
|
||||
// if not could they be put in the let list at the beginning?
|
||||
let hasGtPin = false;
|
||||
|
||||
let inversionAlpha = "DD";
|
||||
let row = "#000000";
|
||||
let bold = "#000000;font-weight: bold;";
|
||||
|
@ -15,9 +14,32 @@ 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?
|
||||
|
||||
// award tracker overrides
|
||||
let awardTrackerOverrides = {
|
||||
call: false,
|
||||
grids: false,
|
||||
dxcc: false,
|
||||
states: false,
|
||||
cnty: false,
|
||||
cqz: false,
|
||||
px: false,
|
||||
cont: false
|
||||
};
|
||||
|
||||
if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER)
|
||||
{
|
||||
for (let key in awardTracker)
|
||||
{
|
||||
if (awardTracker[key].enable)
|
||||
{
|
||||
awardTrackerOverrides[awardTracker[key].rule.type] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Second loop, hunting and highlighting
|
||||
for (const callHash in callRoster)
|
||||
|
@ -35,7 +57,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
// If they are not ignored or we're in a QSO with them, let it through
|
||||
|
||||
// TODO: This is here because it's after the filtering stage
|
||||
if ((!(entry.DEcall in CR.blockedCalls) && !(callObj.dxcc in CR.blockedDxcc)) ||
|
||||
if ((!(entry.DEcall in CR.blockedCalls) && !(callObj.dxcc in CR.blockedDxcc) && !(callObj.grid in CR.blockedGrid)) ||
|
||||
window.opener.GT.instances[callObj.instance].status.DXcall == entry.DEcall)
|
||||
{
|
||||
entry.tx = true;
|
||||
|
@ -63,10 +85,13 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
|
||||
let callsign = entry.DEcall;
|
||||
|
||||
callObj.hunting = {}
|
||||
callObj.callFlags = {}
|
||||
callObj.style = callObj.style || {}
|
||||
callObj.DEcallHTML = callObj.DEcall
|
||||
callObj.hunting = {};
|
||||
callObj.callFlags = {};
|
||||
callObj.style = callObj.style || {};
|
||||
callObj.DEcallHTML = null;
|
||||
callObj.DXcallHTML = null;
|
||||
callObj.msgHTML = null;
|
||||
callObj.gridHTML = null;
|
||||
|
||||
let colorObject = Object();
|
||||
|
||||
|
@ -95,20 +120,17 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
"";
|
||||
|
||||
let cntyPointer = (callObj.cnty && callObj.qual == false) ? "cursor: pointer;" : "";
|
||||
|
||||
let didWork = false;
|
||||
|
||||
let hash = callsign + workHashSuffix;
|
||||
let layeredHash = layeredHashSuffix && (callsign + layeredHashSuffix)
|
||||
|
||||
// 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; ";
|
||||
|
@ -170,28 +192,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
|
||||
// award tracker overrides
|
||||
let awardTrackerOverrides = {
|
||||
call: false,
|
||||
grids: false,
|
||||
dxcc: false,
|
||||
states: false,
|
||||
cnty: false,
|
||||
cqz: false,
|
||||
px: false,
|
||||
cont: false
|
||||
};
|
||||
if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER)
|
||||
{
|
||||
for (let key in awardTracker)
|
||||
{
|
||||
if (awardTracker[key].enable)
|
||||
{
|
||||
awardTrackerOverrides[awardTracker[key].rule.type] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hunting for callsigns
|
||||
if (huntCallsign.checked || awardTrackerOverrides.call)
|
||||
{
|
||||
|
@ -200,7 +200,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
|
||||
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.call))
|
||||
{
|
||||
shouldAlert = true;
|
||||
shouldAlert |= true;
|
||||
callObj.reason.push("call");
|
||||
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.call)
|
||||
|
@ -251,25 +251,9 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
|
||||
if (huntRegex.checked == true && CR.rosterSettings.huntRegexValue.length > 0)
|
||||
if (huntWatcher.checked)
|
||||
{
|
||||
var huntRegexObj = huntRegexObj || new RegExp(CR.rosterSettings.huntRegexValue, "gi")
|
||||
try
|
||||
{
|
||||
if (callsign.match(huntRegexObj))
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("regex");
|
||||
callObj.hunting.regex = "hunted";
|
||||
callObj.DEcallHTML = callsign.replace(huntRegexObj, (x, y) => `<span class='regexMatch'>${x}</span>`)
|
||||
if (!callObj.hunting.call && !callObj.callFlags.worked)
|
||||
{
|
||||
callBg = `${call}${inversionAlpha};`;
|
||||
call = bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
shouldAlert |= processWatchers(callObj);
|
||||
}
|
||||
|
||||
// Hunting for "stations calling you"
|
||||
|
@ -339,7 +323,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
|
||||
// Hunting for DXCC
|
||||
if (huntDXCC.checked || awardTrackerOverrides.dxcc)
|
||||
if (huntDXCC.checked || awardTrackerOverrides.dxcc || awardTrackerOverrides.dxcc2band)
|
||||
{
|
||||
let hash = String(callObj.dxcc) + "|" + workHashSuffix;
|
||||
let layeredHash = rosterSettings.layeredMode && (String(callObj.dxcc) + "|" + layeredHashSuffix)
|
||||
|
@ -408,57 +392,53 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
|
||||
// Hunting for US States
|
||||
if ((huntState.checked || awardTrackerOverrides.states) && window.opener.GT.callsignLookups.ulsUseEnable == true)
|
||||
// Hunting for Known States
|
||||
if (huntState.checked || awardTrackerOverrides.states)
|
||||
{
|
||||
let stateSearch = callObj.state;
|
||||
let finalDxcc = callObj.dxcc;
|
||||
if (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6)
|
||||
if (stateSearch in window.opener.GT.StateData)
|
||||
{
|
||||
if (stateSearch in window.opener.GT.StateData)
|
||||
let hash = stateSearch + workHashSuffix;
|
||||
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
|
||||
|
||||
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
|
||||
{
|
||||
let hash = stateSearch + workHashSuffix;
|
||||
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("state");
|
||||
|
||||
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("state");
|
||||
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "worked-and-mixed";
|
||||
stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`;
|
||||
stateBg = `${state}${layeredInversionAlpha}`;
|
||||
state = bold;
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.hunting.state = "worked";
|
||||
stateConf = `${unconf}${state}${inversionAlpha};`;
|
||||
}
|
||||
callObj.hunting.state = "worked-and-mixed";
|
||||
stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`;
|
||||
stateBg = `${state}${layeredInversionAlpha}`;
|
||||
state = bold;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed";
|
||||
stateBg = `${state}${layeredAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed-worked";
|
||||
stateConf = `${unconf}${state}${layeredAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.hunting.state = "hunted";
|
||||
stateBg = `${state}${inversionAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
callObj.hunting.state = "worked";
|
||||
stateConf = `${unconf}${state}${inversionAlpha};`;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed";
|
||||
stateBg = `${state}${layeredAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
|
||||
{
|
||||
callObj.hunting.state = "mixed-worked";
|
||||
stateConf = `${unconf}${state}${layeredAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
callObj.hunting.state = "hunted";
|
||||
stateBg = `${state}${inversionAlpha};`;
|
||||
state = bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -469,11 +449,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
if ((huntCounty.checked || awardTrackerOverrides.cnty) && window.opener.GT.callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
let finalDxcc = callObj.dxcc;
|
||||
if (
|
||||
callObj.cnty &&
|
||||
(finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) &&
|
||||
callObj.cnty.length > 0
|
||||
)
|
||||
if (callObj.cnty && (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) && callObj.cnty.length > 0)
|
||||
{
|
||||
let hash = callObj.cnty + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
|
||||
|
@ -524,16 +500,26 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
if (potaEnabled && huntPOTA.checked == true && callObj.pota)
|
||||
{
|
||||
let hash = CR.dayAsString + callsign + callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
|
||||
let parkHash = callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
// POTA is only in the worked list
|
||||
if (!(hash in CR.worked.pota))
|
||||
if (!(hash in CR.tracker.worked.pota))
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("pota");
|
||||
|
||||
callObj.hunting.pota = "hunted";
|
||||
potaBg = `${pota}${inversionAlpha};`;
|
||||
pota = bold;
|
||||
if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
else
|
||||
{
|
||||
potaBg = `${pota}${inversionAlpha};`;
|
||||
pota = bold;
|
||||
}
|
||||
}
|
||||
else if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -790,11 +776,25 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
|
||||
let huzzah = "";
|
||||
// Uncomment to test
|
||||
// callObj.DXcall = "CQ GT";
|
||||
if (CR.rosterSettings.animateCQGT == true && callObj.CQ == true && (callObj.DXcall == "CQ GT" || callObj.DXcall == "GridTracker"))
|
||||
{
|
||||
huzzah = "class='huzzah' ";
|
||||
callObj.DXcall = "GridTracker";
|
||||
calling = "white";
|
||||
}
|
||||
else if (CR.rosterSettings.animateCQGT == false && callObj.DXcall == "GridTracker")
|
||||
{
|
||||
callObj.DXcall = "CQ GT";
|
||||
}
|
||||
|
||||
// Assemble all styles
|
||||
colorObject.call = "style='" + callConf + "background-color:" + callBg + ";color:" +
|
||||
call + ";" + callPointer + "'";
|
||||
colorObject.grid = "style='" + gridConf + "background-color:" + gridBg + ";color:" + grid + ";cursor:pointer'";
|
||||
colorObject.calling = "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'";
|
||||
colorObject.calling = huzzah + "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'";
|
||||
colorObject.dxcc = "style='" + dxccConf + "background-color:" + dxccBg + ";color:" + dxcc + "'";
|
||||
colorObject.state = "style='" + stateConf + "background-color:" + stateBg + ";color:" + state + "'";
|
||||
colorObject.cnty = "style='" + cntyConf + "background-color:" + cntyBg + ";color:" + cnty + ";" + cntyPointer + "'";
|
||||
|
@ -818,3 +818,81 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
function buildWatcher(watcher)
|
||||
{
|
||||
if (watcher.regex)
|
||||
{
|
||||
watcher.test = new RegExp(watcher.text, "gi");
|
||||
}
|
||||
else
|
||||
{
|
||||
watcher.test = new RegExp("^" + watcher.text + "$", "gi");
|
||||
}
|
||||
|
||||
if (watcher.type == "Callsign")
|
||||
{
|
||||
watcher.source = "DEcall";
|
||||
watcher.html = "DEcallHTML";
|
||||
}
|
||||
else if (watcher.type == "Calling")
|
||||
{
|
||||
watcher.source = "DXcall";
|
||||
watcher.html = "DXcallHTML";
|
||||
}
|
||||
else if (watcher.type == "Grid")
|
||||
{
|
||||
watcher.source = "grid";
|
||||
watcher.html = "gridHTML";
|
||||
}
|
||||
else
|
||||
{
|
||||
watcher.source = "msg";
|
||||
watcher.html = "msgHTML";
|
||||
}
|
||||
return watcher.test;
|
||||
}
|
||||
|
||||
function processWatchers(callObj)
|
||||
{
|
||||
let now = Date.now();
|
||||
for (let key in CR.watchers)
|
||||
{
|
||||
let watcher = CR.watchers[key];
|
||||
if (watcher.watch)
|
||||
{
|
||||
if (watcher.start && now < watcher.startTime) continue;
|
||||
if (watcher.end && now > watcher.endTime)
|
||||
{
|
||||
if (watcher.autoDelete)
|
||||
{
|
||||
// Don't call deleteWatcher() as it calls the roster renderer
|
||||
delete CR.watchers[key];
|
||||
writeRosterSettings();
|
||||
wantRenderWatchersTab();
|
||||
}
|
||||
else
|
||||
{
|
||||
watcher.watch = false;
|
||||
wantRenderWatchersTab();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
watcher.test = watcher.test || buildWatcher(watcher);
|
||||
try
|
||||
{
|
||||
if (callObj[watcher.source].match(watcher.test))
|
||||
{
|
||||
callObj.reason.push("watcher");
|
||||
callObj.hunting.watcher = "hunted";
|
||||
callObj.watcherKey = key;
|
||||
let htmlPrevent = htmlEntities(callObj[watcher.source]);
|
||||
callObj[watcher.html] = htmlPrevent.replace(watcher.test, (x, y) => `<span class='regexMatch'>${x}</span>`);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ function renderCompactRosterRow(callObj, showBand)
|
|||
let wholeClick = (CR.isCompactCounty ? "" : onClick);
|
||||
let callsignClick = (CR.isCompactCounty ? onClick : "");
|
||||
let worker = "<div class='compact' " + wholeClick + " >";
|
||||
worker += "<div class='compactCallsign' " + callsignClick + " name='Callsign' " + callObj.style.call + " >" + formatCallsign(callObj.DEcall) + bandView + "</div>";
|
||||
worker += "<div class='compactCallsign' " + callsignClick + " name='Callsign' " + callObj.style.call + " >" + formatCallsign(callObj.DEcallHTML || callObj.DEcall) + bandView + "</div>";
|
||||
worker += "<div class='compactData'>";
|
||||
worker += renderEntryForColumn(CR.rosterSettings.compactEntity, callObj, "div");
|
||||
worker += "</div></div>";
|
||||
|
|
|
@ -26,11 +26,12 @@ function renderRoster(callRoster, rosterSettings)
|
|||
|
||||
if (window.opener.GT.callsignLookups.lotwUseEnable == true)
|
||||
{
|
||||
// Do nothing
|
||||
usesLoTWDiv.style.display = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
columnOverrides.LoTW = false;
|
||||
usesLoTWDiv.style.display = "none";
|
||||
}
|
||||
|
||||
if (rosterSettings.canMsg == true)
|
||||
|
@ -43,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 = "";
|
||||
}
|
||||
|
@ -53,10 +54,6 @@ function renderRoster(callRoster, rosterSettings)
|
|||
columnOverrides.POTA = false;
|
||||
}
|
||||
|
||||
if (rosterSettings.isAwardTracker)
|
||||
{
|
||||
columnOverrides.Wanted = true;
|
||||
}
|
||||
// dealing with spots
|
||||
if (CR.rosterSettings.columns.Spot == true) onlySpotDiv.style.display = "";
|
||||
else onlySpotDiv.style.display = "none";
|
||||
|
|
|
@ -131,7 +131,7 @@ function changeRosterColumnOrder(columns)
|
|||
|
||||
function moveColumnLeft(column)
|
||||
{
|
||||
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true, Grid: true });
|
||||
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true });
|
||||
const pos = columns.indexOf(column);
|
||||
if (pos > 1)
|
||||
{
|
||||
|
@ -140,3 +140,29 @@ function moveColumnLeft(column)
|
|||
}
|
||||
changeRosterColumnOrder(columns);
|
||||
}
|
||||
|
||||
function moveColumnRight(column)
|
||||
{
|
||||
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true });
|
||||
const pos = columns.indexOf(column);
|
||||
if (pos > 0 && pos + 1 < Object.keys(columns).length)
|
||||
{
|
||||
columns[pos] = columns[pos + 1];
|
||||
columns[pos + 1] = column;
|
||||
}
|
||||
changeRosterColumnOrder(columns);
|
||||
}
|
||||
|
||||
function toggleColumn(target, column = null)
|
||||
{
|
||||
let label = column || target.label;
|
||||
CR.rosterSettings.columns[label] = target.checked;
|
||||
CR.columnMembers[label].checked = target.checked;
|
||||
if (label == "Spot")
|
||||
{
|
||||
window.opener.setRosterSpot(CR.rosterSettings.columns.Spot);
|
||||
}
|
||||
writeRosterSettings();
|
||||
viewRoster();
|
||||
resize();
|
||||
}
|
||||
|
|
|
@ -102,7 +102,8 @@ const ROSTER_COLUMNS = {
|
|||
tableData: (callObj) => ({
|
||||
rawAttrs: callObj.style.grid,
|
||||
onClick: `centerOn("${callObj.grid}")`,
|
||||
html: (callObj.grid.length > 0 ? callObj.grid : " ")
|
||||
name: "Grid",
|
||||
html: (callObj.grid.length > 0 ? callObj.gridHTML || callObj.grid : " ")
|
||||
})
|
||||
},
|
||||
|
||||
|
@ -111,13 +112,16 @@ const ROSTER_COLUMNS = {
|
|||
tableData: (callObj) => ({
|
||||
rawAttrs: callObj.style.calling,
|
||||
name: callObj.CQ ? "CQ" : "Calling",
|
||||
html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcall)
|
||||
html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcallHTML || callObj.DXcall)
|
||||
})
|
||||
},
|
||||
|
||||
Msg: {
|
||||
compare: callObjLocaleComparer("DXcall"),
|
||||
tableData: (callObj) => ({ html: callObj.msg })
|
||||
tableData: (callObj) => ({
|
||||
name: "Msg",
|
||||
html: callObj.msgHTML || htmlEntities(callObj.msg)
|
||||
})
|
||||
},
|
||||
|
||||
DXCC: {
|
||||
|
@ -144,7 +148,8 @@ const ROSTER_COLUMNS = {
|
|||
tableData: (callObj) => ({
|
||||
align: "center",
|
||||
rawAttrs: callObj.style.state,
|
||||
html: callObj.state ? callObj.state.substr(3) : " "
|
||||
html: callObj.state ? callObj.state.substr(3) : " ",
|
||||
title: (callObj.state in window.opener.GT.StateData) ? window.opener.GT.StateData[callObj.state].name : null
|
||||
})
|
||||
},
|
||||
|
||||
|
@ -449,7 +454,7 @@ function potaColumnHover(callObj)
|
|||
return value;
|
||||
}
|
||||
|
||||
WANTED_ORDER = ["call", "qrz", "regex", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"];
|
||||
WANTED_ORDER = ["call", "qrz", "watcher", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"];
|
||||
WANTED_LABELS = {};
|
||||
|
||||
function wantedColumnParts(callObj, options)
|
||||
|
@ -472,7 +477,7 @@ function wantedColumnParts(callObj, options)
|
|||
// else if (wanted == "caller") { parts.push("Called"); }
|
||||
else if (wanted == "hunted" && field == "qrz") { parts.push("Caller"); }
|
||||
else if (wanted == "hunted" && field == "oams") { parts.push("OAMS User"); }
|
||||
else if (wanted == "hunted" && field == "regex") { parts.push("Regex match"); }
|
||||
else if (wanted == "hunted" && field == "watcher") { parts.push(callObj.watcherKey); }
|
||||
else if (wanted == "hunted") { parts.push(`${options.html ? "<b>" : ""}New ${WANTED_LABELS[field]}${options.html ? "<b>" : ""}`); }
|
||||
else if (wanted == "worked") { parts.push(`Worked ${WANTED_LABELS[field]}`); }
|
||||
else if (wanted == "mixed") { parts.push(`${callObj.band} ${WANTED_LABELS[field]}`); }
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -43,24 +43,14 @@ function aimRotator(info)
|
|||
{
|
||||
const { callObj } = info
|
||||
|
||||
if (
|
||||
GT.pstrotatorSettings.enable == true &&
|
||||
GT.pstrotatorSettings.port > 0 &&
|
||||
GT.pstrotatorSettings.ip.length > 4 &&
|
||||
(callObj.distance > 0)
|
||||
)
|
||||
if (GT.pstrotatorSettings.enable == true && GT.pstrotatorSettings.port > 0 && GT.pstrotatorSettings.ip.length > 4 && callObj.distance > 0)
|
||||
{
|
||||
// If we have a .grid, we have a .distance and .heading, so just send the heading
|
||||
let payload = `<PST><AZIMUTH>${Math.round(callObj.heading)}</AZIMUTH></PST>`;
|
||||
|
||||
try
|
||||
{
|
||||
sendUdpMessage(
|
||||
payload,
|
||||
payload.length,
|
||||
parseInt(GT.pstrotatorSettings.port),
|
||||
GT.pstrotatorSettings.ip
|
||||
);
|
||||
sendUdpMessage(payload, payload.length, parseInt(GT.pstrotatorSettings.port), GT.pstrotatorSettings.ip);
|
||||
if (callObj.DEcall)
|
||||
{
|
||||
addLastTraffic(`<font style='color:white'>Aiming rotator at ${callObj.DEcall}</font>`);
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
*/
|
||||
return {
|
||||
type: "Feature",
|
||||
properties: {},
|
||||
properties: { prop: "shadow" },
|
||||
geometry: {
|
||||
type: "Polygon",
|
||||
coordinates: [
|
||||
|
@ -269,13 +269,11 @@
|
|||
});
|
||||
|
||||
var dayNight = {
|
||||
map: null,
|
||||
vectorSource: null,
|
||||
vectorLayer: null,
|
||||
|
||||
init: function (map)
|
||||
{
|
||||
this.map = map;
|
||||
|
||||
var geoJSON = new GeoJSONTerminator();
|
||||
|
||||
this.vectorSource = new ol.source.Vector({
|
||||
|
@ -295,7 +293,7 @@ var dayNight = {
|
|||
opacity: Number(GT.mapSettings.shadow),
|
||||
zIndex: 0
|
||||
});
|
||||
this.map.getLayers().insertAt(1, this.vectorLayer);
|
||||
map.getLayers().insertAt(1, this.vectorLayer);
|
||||
},
|
||||
refresh: function ()
|
||||
{
|
||||
|
@ -334,14 +332,12 @@ var dayNight = {
|
|||
};
|
||||
|
||||
var moonLayer = {
|
||||
map: null,
|
||||
vectorSource: null,
|
||||
vectorLayer: null,
|
||||
icon: null,
|
||||
pin: null,
|
||||
init: function (map)
|
||||
{
|
||||
this.map = map;
|
||||
|
||||
this.icon = new ol.style.Icon({
|
||||
src: "./img/luna.png",
|
||||
anchorYUnits: "pixels",
|
||||
|
@ -354,7 +350,8 @@ var moonLayer = {
|
|||
this.pin = iconFeature(
|
||||
ol.proj.fromLonLat(subLunar(timeNowSec()).ll),
|
||||
this.icon,
|
||||
0
|
||||
0,
|
||||
"moon"
|
||||
);
|
||||
this.pin.size = 99;
|
||||
this.vectorSource = new ol.source.Vector({});
|
||||
|
@ -363,7 +360,7 @@ var moonLayer = {
|
|||
source: this.vectorSource,
|
||||
zIndex: 30
|
||||
});
|
||||
this.map.getLayers().insertAt(1, this.vectorLayer);
|
||||
map.getLayers().insertAt(1, this.vectorLayer);
|
||||
},
|
||||
future: function (now)
|
||||
{
|
||||
|
@ -409,7 +406,7 @@ var moonLayer = {
|
|||
}
|
||||
|
||||
line = new ol.geom.LineString(line);
|
||||
var feature = new ol.Feature({ geometry: line, name: "moonFlight" });
|
||||
var feature = new ol.Feature({ geometry: line, prop: "moonFlight" });
|
||||
|
||||
feature.setStyle(
|
||||
new ol.style.Style({
|
||||
|
@ -430,7 +427,8 @@ var moonLayer = {
|
|||
this.pin = iconFeature(
|
||||
ol.proj.fromLonLat(subLunar(now).ll),
|
||||
this.icon,
|
||||
0
|
||||
0,
|
||||
"moon"
|
||||
);
|
||||
this.pin.size = 99;
|
||||
this.vectorSource.addFeature(this.pin);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// GridTracker Copyright © 2023 GridTracker.org
|
||||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
|
@ -125,10 +125,16 @@ function validateCallByElement(elementString)
|
|||
|
||||
function init()
|
||||
{
|
||||
openInfoTab(event, "workedBoxDiv", "showWorkedBox");
|
||||
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
|
||||
loadChildWindowI18n();
|
||||
}
|
||||
|
||||
function searchWorked(dxcc, band, mode)
|
||||
{
|
||||
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
|
||||
window.opener.searchWorked(dxcc, band, mode);
|
||||
}
|
||||
|
||||
function addTextToClipboard(data)
|
||||
{
|
||||
navigator.clipboard.writeText(data);
|
||||
|
@ -189,6 +195,10 @@ function Resize()
|
|||
|
||||
function reloadInfo(bandOrMode)
|
||||
{
|
||||
if (workedBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWorkedBox();
|
||||
}
|
||||
if (statBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showStatBox(false);
|
||||
|
|
|
@ -157,6 +157,38 @@ html, body {
|
|||
font-size: larger;
|
||||
}
|
||||
|
||||
.absoluteCenterDiv {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: #000000;
|
||||
-webkit-border-radius: 6px;
|
||||
vertical-align: top;
|
||||
font-size: larger;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.busyDiv {
|
||||
border: 1px solid rgb(153, 153, 153);
|
||||
-webkit-border-radius: 4px;
|
||||
background: linear-gradient(90deg, #ff6600, blue);
|
||||
background-size: 200% 200%;
|
||||
animation: AnimationQsoQsl 1s ease infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationQsoQsl {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
.myFlagtipEnd {
|
||||
vertical-align: top;
|
||||
-webkit-border-radius: 6px;
|
||||
|
@ -270,6 +302,7 @@ html, body {
|
|||
min-width: 20px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.roundBorderDEInfo {
|
||||
border: 1px solid white;
|
||||
-webkit-border-radius: 6px;
|
||||
|
@ -657,7 +690,7 @@ a {
|
|||
font-weight: bold;
|
||||
border-top-right-radius: 6px;
|
||||
border-top-left-radius: 6px;
|
||||
margin-left: 5px;
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
color: #eee;
|
||||
background: black;
|
||||
|
@ -683,12 +716,8 @@ a {
|
|||
text-align: center;
|
||||
width: auto;
|
||||
border-top: 1px solid green;
|
||||
|
||||
vertical-align: top;
|
||||
|
||||
white-space: normal;
|
||||
|
||||
/* animation: fadeEffect .3s; Fading effect takes 1 second */
|
||||
}
|
||||
|
||||
/* Style the tab content */
|
||||
|
|
|
@ -6,11 +6,16 @@ td {
|
|||
white-space: nowrap;
|
||||
font-family: Sans-Serif;
|
||||
text-align: auto;
|
||||
vertical-align: baseline;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
th {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
table,
|
||||
th,
|
||||
td,
|
||||
|
@ -21,24 +26,20 @@ select,
|
|||
|
||||
th,
|
||||
td {
|
||||
padding-bottom: 2px;
|
||||
padding-bottom: 1px;
|
||||
padding-right: 1px;
|
||||
margin-right: 2px;
|
||||
padding-left: 2px;
|
||||
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
appearance: checkbox !important;
|
||||
margin: 0;
|
||||
margin-top: -1px;
|
||||
margin-right: 1px;
|
||||
vertical-align: middle;
|
||||
vertical-align: top;
|
||||
position: relative;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
/* input[type="checkbox"]:checked {
|
||||
appearance: checkbox !important;
|
||||
} */
|
||||
}
|
||||
|
||||
select {
|
||||
appearance: none;
|
||||
|
@ -136,36 +137,42 @@ body.roster {
|
|||
min-height: 28px;
|
||||
margin-top: 4px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
#RosterControls.normal #MainRosterControls {
|
||||
margin-left: 160px;
|
||||
margin-right: 100px;
|
||||
margin-left: 1px;
|
||||
margin-top: 3px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
#TransmitControls {
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 6px;
|
||||
width: 160px;
|
||||
left: 3px;
|
||||
width: 246px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#MoreLessControls {
|
||||
#LessControls {
|
||||
position: absolute;
|
||||
top: 7px;
|
||||
right: 6px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#MoreControls {
|
||||
position: absolute;
|
||||
top: 7px;
|
||||
right: 6px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
|
||||
#RosterControls.normal #ShowFewerControlsLink {
|
||||
display: none;
|
||||
}
|
||||
|
@ -174,10 +181,11 @@ body.roster {
|
|||
}
|
||||
|
||||
#RosterControls.normal #MainRosterControls {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 250px;
|
||||
text-align: left;
|
||||
justify-content: left;
|
||||
}
|
||||
|
||||
#RosterControls.extended {
|
||||
|
@ -190,7 +198,7 @@ body.roster {
|
|||
|
||||
#RosterControls.extended #MainRosterControls {
|
||||
margin-top: 30px;
|
||||
min-width: 210px;
|
||||
min-width: 250px;
|
||||
flex: 0;
|
||||
}
|
||||
|
||||
|
@ -232,13 +240,13 @@ body.roster {
|
|||
max-height: 142px;
|
||||
}
|
||||
|
||||
@media (max-width: 1050px) {
|
||||
@media (max-width: 1000px) {
|
||||
#RosterControls.normal #HuntModeControls {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 735px) {
|
||||
@media (max-width: 800px) {
|
||||
#RosterControls.normal #CallsignsControls {
|
||||
display: none;
|
||||
}
|
||||
|
@ -274,7 +282,7 @@ body.roster {
|
|||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
margin-right: 8px;
|
||||
margin-right: 1px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
|
@ -305,16 +313,16 @@ body.roster {
|
|||
|
||||
.secondaryControlGroup {
|
||||
flex: 1;
|
||||
margin-left: 8px;
|
||||
margin-left: 4px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#huntingMatrixDiv {
|
||||
flex: 0.75;
|
||||
flex: .9;
|
||||
}
|
||||
|
||||
#exceptionDiv {
|
||||
flex: 1.25;
|
||||
flex: .7;
|
||||
}
|
||||
|
||||
.secondaryControlGroup h3 {
|
||||
|
@ -328,51 +336,57 @@ body.roster {
|
|||
#huntingMatrixDiv h3 {
|
||||
color: #099;
|
||||
border-bottom: 2px solid #066;
|
||||
margin-bottom: 2px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
#exceptionDiv h3 {
|
||||
color: #944;
|
||||
border-bottom: 2px solid #622;
|
||||
margin-bottom: 2px;
|
||||
color: rgb(206, 89, 89);
|
||||
border-bottom: 2px solid rgba(253, 113, 113, 0.644);
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.secondaryControlGroup .columns {
|
||||
/* column-count: 2; */
|
||||
max-height: 135px;
|
||||
max-height: 100px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
align-items: stretch;
|
||||
align-items: left;
|
||||
}
|
||||
|
||||
@media (min-width: 1100px) {
|
||||
.secondaryControlGroup .columns {
|
||||
max-height: 80px;
|
||||
}
|
||||
}
|
||||
|
||||
.secondaryControlGroup .columns > div {
|
||||
.secondaryControlGroup .columns div {
|
||||
text-align: left;
|
||||
margin-bottom: 2px;
|
||||
vertical-align: bottom;
|
||||
margin-top: 3px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.secondaryControlGroup input.slider {
|
||||
input.slider {
|
||||
display: inline-block;
|
||||
width: 75px;
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.secondaryControlGroup input.inputTextValue {
|
||||
.inputTextValue {
|
||||
border-radius: 6px;
|
||||
border: 1px solid #999;
|
||||
background-color: green;
|
||||
color: yellow;
|
||||
outline: none;
|
||||
margin: 0px;
|
||||
padding: 2px;
|
||||
border-style: inset;
|
||||
}
|
||||
|
||||
.secondaryControlGroup .roundBorderValue {
|
||||
padding: 2px;
|
||||
.inputTextValue:hover {
|
||||
border-color: #fff;
|
||||
border-style: outset;
|
||||
}
|
||||
|
||||
.roundBorderValue {
|
||||
padding: 3px;
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
#instancesWrapper .button {
|
||||
display: inline-block;
|
||||
|
@ -388,12 +402,14 @@ body.roster {
|
|||
/* == Other Elements ====================================== */
|
||||
|
||||
#txrxdec {
|
||||
width: 100px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
width: 68px;
|
||||
}
|
||||
|
||||
.link {
|
||||
cursor: hand;
|
||||
color: #ffffaa;
|
||||
color: #ffffaaa1;
|
||||
}
|
||||
|
||||
.link:hover {
|
||||
|
@ -410,7 +426,7 @@ table.awardTableCSS {
|
|||
margin: 0;
|
||||
}
|
||||
|
||||
table.awardTableCSS td,
|
||||
table.awardTableCSS td,
|
||||
table.awardTableCSS th {
|
||||
border: 1px solid #888;
|
||||
padding: 0px;
|
||||
|
@ -418,13 +434,13 @@ table.awardTableCSS th {
|
|||
border-left: none;
|
||||
border-right: none;
|
||||
font-size: 12px;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
table.awardTableCSS tr {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
max-height: 16px;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
table.awardTableCSS thead {
|
||||
|
@ -486,7 +502,8 @@ table.rosterTable thead th:first-child {
|
|||
}
|
||||
|
||||
.regexMatch {
|
||||
text-decoration: underline;
|
||||
background-color: #ffffff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.dxCaller {
|
||||
|
@ -568,3 +585,235 @@ table.rosterTable thead th:first-child {
|
|||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Style the tab */
|
||||
.infotab {
|
||||
overflow: hidden;
|
||||
background-color: black;
|
||||
}
|
||||
|
||||
/* Style the buttons that are used to open the tab content */
|
||||
.infotab button {
|
||||
border: 1px solid lightblue;
|
||||
padding: 3px;
|
||||
font-weight: bold;
|
||||
border-top-right-radius: 6px;
|
||||
border-top-left-radius: 6px;
|
||||
margin-left: 5px;
|
||||
margin-right: 0px;
|
||||
color: #eee;
|
||||
background: black;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
border-bottom-style: none;
|
||||
transition: 0.1s;
|
||||
}
|
||||
|
||||
/* Create an active/current tablink class */
|
||||
.infotab button.active {
|
||||
background-color: cyan;
|
||||
color: black;
|
||||
}
|
||||
/* Style the tab content */
|
||||
.infoTabcontent {
|
||||
margin: auto;
|
||||
display: none;
|
||||
background-color: black;
|
||||
padding: 0;
|
||||
padding-top: 4px;
|
||||
text-align: center;
|
||||
width: auto;
|
||||
left:0;
|
||||
right:0;
|
||||
border-top: 1px solid lightblue;
|
||||
vertical-align: top;
|
||||
white-space: normal;
|
||||
overflow:auto;
|
||||
min-width: 480px;
|
||||
}
|
||||
|
||||
.exceptionTab {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill,minmax(150px, 1fr));
|
||||
justify-content:center;
|
||||
align-items:center;
|
||||
}
|
||||
|
||||
.exceptionTab > div {
|
||||
margin: 6px;
|
||||
padding: 5px;
|
||||
height: 35px;
|
||||
width: 140px;
|
||||
border-width: 1px;
|
||||
border-color: #aaa;
|
||||
border-style: inset;
|
||||
vertical-align:baseline;
|
||||
border-radius: 4px;
|
||||
transition: border-color;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 4px;
|
||||
margin-bottom: 1px;
|
||||
margin-left: 1px;
|
||||
margin-right: 1px;
|
||||
}
|
||||
|
||||
.exceptionTab > div:hover {
|
||||
border-color: #fff;
|
||||
}
|
||||
|
||||
.break {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
:root {
|
||||
accent-color: #4ab9f8;
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
.columnEditView {
|
||||
margin:5px;
|
||||
padding:5px;
|
||||
vertical-align:top;
|
||||
display:inline-block;
|
||||
overflow:auto;
|
||||
overflow-x:hidden;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
.columnEditRow {
|
||||
display:grid;
|
||||
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||
margin-top:2px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.columnEditRowHeader {
|
||||
border: 1px solid #cecccc;
|
||||
grid-row: 1 / span 4;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.columnEditRow:hover {
|
||||
box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888;
|
||||
}
|
||||
|
||||
.columnAvailableRow {
|
||||
display:grid;
|
||||
grid-template-columns: 1fr 3fr;
|
||||
margin-top:2px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.columnAvailableRow:hover {
|
||||
box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888;
|
||||
}
|
||||
|
||||
.huzzah {
|
||||
background: linear-gradient(135deg, #360000, #00580f, rgb(11, 0, 80));
|
||||
background-size: 500% 500%;
|
||||
animation: AnimationHuzzah 5s alternate infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationHuzzah {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.rowBuilder {
|
||||
border-width: 1px;
|
||||
border-color: #aaa;
|
||||
border-style: outset;
|
||||
vertical-align: top;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
transition: border-color;
|
||||
text-align: center;
|
||||
vertical-align:middle;
|
||||
justify-content:center;
|
||||
align-items:center;
|
||||
width: fit-content;
|
||||
left:0;
|
||||
right:0;
|
||||
margin: auto;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.rowBuilder:hover {
|
||||
border-color: #fff;
|
||||
}
|
||||
|
||||
.rowBuilder > * {
|
||||
margin-right: 4px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.flexButton {
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
border-width: 1px;
|
||||
border-color: #999;
|
||||
border-style: outset;
|
||||
color: #eee;
|
||||
transition: border-style;
|
||||
vertical-align: middle;
|
||||
padding: 2px;
|
||||
padding-bottom: 1px;
|
||||
text-align: center;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.flexButton:hover {
|
||||
border-color: #fff;
|
||||
}
|
||||
.ignoresTables {
|
||||
margin:10px;
|
||||
padding:0px;
|
||||
vertical-align:top;
|
||||
display:inline-block;
|
||||
margin-right:2px;
|
||||
overflow:auto;
|
||||
overflow-x:hidden;
|
||||
}
|
||||
|
||||
#watcherTable {
|
||||
margin: auto;
|
||||
left:0;
|
||||
right:0;
|
||||
width:fit-content;
|
||||
padding:0px;
|
||||
vertical-align:top;
|
||||
display:inline-block;
|
||||
margin-top:2px;
|
||||
overflow:auto;
|
||||
overflow-x:hidden;
|
||||
}
|
||||
|
||||
#settingsDiv {
|
||||
padding: 3px;
|
||||
overflow: hidden;
|
||||
margin: auto;
|
||||
top: 3px;
|
||||
left:0;
|
||||
right:0;
|
||||
width: fit-content;
|
||||
display:none;
|
||||
padding: 1px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
position: absolute;
|
||||
z-index: 600;
|
||||
border: 1px solid lightblue;
|
||||
}
|
|
@ -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]];
|
||||
|
@ -302,7 +250,7 @@ function flightFeature(line, opts, layer, canAnimate) {
|
|||
|
||||
|
||||
line = new ol.geom.LineString(line);
|
||||
var feature = new ol.Feature({ geometry: line, name: 'flight' });
|
||||
var feature = new ol.Feature({ geometry: line, prop: 'flight' });
|
||||
|
||||
feature.setStyle(new ol.style.Style({
|
||||
stroke: new ol.style.Stroke({ color: opts.color, width: opts.weight, lineDash: dash, lineDashOffset:dashOff}) }));
|
||||
|
|
|
@ -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.1019",
|
||||
"version": "1.24.0512",
|
||||
"betaVersion": "",
|
||||
"description": "GridTracker: An Amateur Radio Companion",
|
||||
"author": "GridTracker.org",
|
||||
|
@ -12,7 +12,7 @@
|
|||
"icon": "gridview.png",
|
||||
"toolbar": false,
|
||||
"show": false,
|
||||
"width": 800,
|
||||
"width": 860,
|
||||
"height": 652
|
||||
},
|
||||
"webkit": {
|
||||
|
@ -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