2021-12-12 22:34:02 +00:00
|
|
|
// GridTracker Copyright © 2022 GridTracker.org
|
2021-06-13 03:08:47 +00:00
|
|
|
// All rights reserved.
|
|
|
|
// See LICENSE for more information.
|
|
|
|
|
|
|
|
var selectStartupLink = null;
|
|
|
|
|
|
|
|
function dragOverHandler(ev)
|
|
|
|
{
|
|
|
|
// Prevent default behavior (Prevent file from being opened)
|
|
|
|
ev.preventDefault();
|
|
|
|
}
|
|
|
|
|
|
|
|
function dropHandler(ev)
|
|
|
|
{
|
|
|
|
// Prevent default behavior (Prevent file from being opened)
|
|
|
|
ev.preventDefault();
|
|
|
|
if (ev.dataTransfer.items)
|
|
|
|
{
|
|
|
|
// Use DataTransferItemList interface to access the file(s)
|
|
|
|
for (var i = 0; i < ev.dataTransfer.items.length; i++)
|
|
|
|
{
|
|
|
|
// If dropped items aren't files, reject them
|
|
|
|
Entry = ev.dataTransfer.items[i].webkitGetAsEntry();
|
|
|
|
if (Entry && typeof Entry.isFile != "undefined" && Entry.isFile == true)
|
|
|
|
{
|
|
|
|
var filename = ev.dataTransfer.items[i].getAsFile().path;
|
|
|
|
var test = filename.toLowerCase();
|
|
|
|
var valid = test.endsWith(".adi")
|
|
|
|
? true
|
|
|
|
: test.endsWith(".adif")
|
|
|
|
? true
|
|
|
|
: test.endsWith(".log")
|
|
|
|
? true
|
|
|
|
: !!test.endsWith(".txt");
|
|
|
|
if (valid && fs.existsSync(filename))
|
|
|
|
{
|
|
|
|
onAdiLoadComplete(fs.readFileSync(filename, "UTF-8"), false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-03 21:59:16 +00:00
|
|
|
function dateToISO8601(dString, tZone)
|
|
|
|
{
|
|
|
|
var retDate = "";
|
|
|
|
var tZone = (typeof tZone !== "undefined") ? tZone : "Z";
|
|
|
|
var dateParts = dString.match(/(\d{4}-\d{2}-\d{2})(\s+(\d{2}:\d{2}:\d{2}))?/);
|
|
|
|
|
|
|
|
if (dateParts !== null)
|
|
|
|
{
|
|
|
|
retDate = dateParts[1]
|
|
|
|
if ((typeof dateParts[3]) !== "undefined")
|
|
|
|
{
|
|
|
|
retDate += "T" + dateParts[3] + ".000" + tZone;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
retDate += "T00:00:00.000" + tZone;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return retDate;
|
|
|
|
}
|
|
|
|
|
2021-06-13 03:08:47 +00:00
|
|
|
function findAdiField(row, field)
|
|
|
|
{
|
|
|
|
var value = "";
|
|
|
|
var regex = new RegExp("<" + field + ":", "i");
|
|
|
|
var firstSplitArray = row.split(regex);
|
|
|
|
if (firstSplitArray && firstSplitArray.length == 2)
|
|
|
|
{
|
|
|
|
var secondSplitArray = firstSplitArray[1].split(">");
|
|
|
|
if (secondSplitArray.length > 1)
|
|
|
|
{
|
|
|
|
var newLenSearch = secondSplitArray[0].split(":");
|
|
|
|
var newLen = newLenSearch[0];
|
|
|
|
value = secondSplitArray[1].slice(0, newLen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
function onAdiLoadComplete(adiBuffer, saveAdifFile, adifFileName, newFile)
|
|
|
|
{
|
|
|
|
let rawAdiBuffer = "";
|
|
|
|
if (typeof adiBuffer == "object") rawAdiBuffer = String(adiBuffer);
|
|
|
|
else rawAdiBuffer = adiBuffer;
|
|
|
|
|
|
|
|
let activeAdifArray = Array();
|
|
|
|
let activeAdifLogMode = true;
|
|
|
|
let eQSLfile = false;
|
|
|
|
|
|
|
|
if (rawAdiBuffer.indexOf("PSKReporter") > -1) activeAdifLogMode = false;
|
|
|
|
|
|
|
|
if (rawAdiBuffer.indexOf("Received eQSLs") > -1) eQSLfile = true;
|
|
|
|
|
|
|
|
if (rawAdiBuffer.length > 1)
|
|
|
|
{
|
|
|
|
let regex = new RegExp("<EOR>", "i");
|
|
|
|
activeAdifArray = rawAdiBuffer.split(regex);
|
|
|
|
}
|
|
|
|
|
|
|
|
let dateTime = new Date();
|
|
|
|
let dupes = 0;
|
|
|
|
|
|
|
|
for (let x = 0; x < activeAdifArray.length; x++)
|
|
|
|
{
|
|
|
|
let finalMode = "";
|
|
|
|
|
Squashed commit of the following:
commit afb25f406b51a9d52d35e25cebb78547c964884a
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Sep 5 21:45:16 2022 -0400
WIP german translation
commit 3abbf5cd5fe89fbe474ade395a1ad2d0ddd8c1b0
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Sep 3 15:06:47 2022 -0400
WIP german translation and some programmatic translation from CR
commit 4c8fcc656b4085e88151cb5a3ce9f6c5e5bf3a21
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 22:14:16 2022 -0500
progress so far, fixed what got broke in CR and fixed being able to close and reopen CR. still need to get i18n figured out
commit 78aaaed2ade1094add163d5850bef6ab1b2226fb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 20:19:09 2022 -0500
one step forward, 2 steps backwards
commit 903319452bf0c5ed8a2da879281d8b08ef7ff05e
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 15 23:23:51 2022 +0200
WIP translating strings in js: roster.js
commit 934f619af63a97363dcff19ef2343b3e12e269ee
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 00:06:13 2022 -0500
add JA because may have a JA contributor
commit 8c7bd091acf83b45a8e0957e4990c4660f3673a2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 23:41:29 2022 -0500
all JS files have been passed through, may need another pass through all files though
commit 835892b70b7b229fe0d353831271b21fc2fa716a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 20:03:18 2022 -0500
Finished gt.js tags
commit 404dd1a2477e27b2c665dc3ecaba77dafcc7be20
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 18:10:34 2022 -0500
progress so far (up to line 9871 in gt.js)
commit c59473f8986fab8b2b336f212b0ead9d10617899
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 12:43:01 2022 -0500
add comment between adif and alerts js files in en.json
commit 80cb9d5178a255dcc1a15482b0bcabce1555aa61
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 12:42:27 2022 -0500
Fix Chinese label to a more proper one
commit 08a00eeae86d7d9a97cf17aa6029468024bf6784
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 16:54:32 2022 +0200
moved scripts
commit 8c9569b1c5f6b4d1b4b92db1ce7806b7246862fe
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 16:51:10 2022 +0200
started german translation
commit b857ecf91e97bed0479ca759eddf234da65c5313
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 01:37:39 2022 -0500
tags for adif and alerts js files
commit 9c328de842bbe773746beddaeec0d2ea81225752
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 08:23:51 2022 +0200
fixed cn.json additonal keys
commit 7bc459195f8738cf77835329acf962274cd9cc38
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 08:20:22 2022 +0200
Revert "fixed CN.json"
This reverts commit f2f71c94dbb8f270aff76223a5d30769d8819b1a.
commit 236bea23bd13324f25cbcdbd39c3ec008a679f10
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 19:02:49 2022 -0500
cleanup and lint
commit a78d32ed1bb5457be0d7e227492cdd1c3e77c431
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 19:01:47 2022 -0500
THis works!
commit edc0d40256b32f81a135f5efc3819c04018774d6
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 18:17:15 2022 -0500
more tweaks trying to make it work
commit f2f71c94dbb8f270aff76223a5d30769d8819b1a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 17:09:39 2022 -0500
fixed CN.json
commit 9b90cf4b142f0c52bd0e4ba7ce926ad145f90ecd
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 16:33:09 2022 -0500
language change so far
commit dd60fc5012fa8f7a8655dacc9b8e0c0237e33f4e
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 13 22:19:25 2022 +0200
added missing keys to cn.json
commit fc5e25c81a7541d2fe03ed9b79950c4ddbd71abb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 15:18:54 2022 -0500
Fixed linting`
commit 485adc6da114a28f58e2d112f5f83f7541af9843
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 14:57:30 2022 -0500
slight cleanup
commit dada794ccdf699fe4eaf179b2cfef2a96e6a82fb
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 13 21:55:55 2022 +0200
fixed cn json
commit 82809c0458e0b99159e87e1d22eba4cde6339015
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 14:45:21 2022 -0500
added dropdown for language in settings
commit 3159040b514f497a23b7169fb9512b032ee8b942
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Fri Aug 12 22:29:51 2022 +0200
added raw output of the i18n extractor. needs cleanup
commit 8f31e9e757f6c6a29678f0c0bddad1c6dc360df4
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Thu Aug 11 22:29:12 2022 +0200
added i18n generator script based off of a patch file
commit de81e35754dd2bb4c838aa6c7bf12a2025b1ded1
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 8 22:20:47 2022 +0200
added cascading install for nested package.json
commit bf7ecfeb4f44b0c65bbea0c5a43eb0e809652384
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 8 22:11:18 2022 +0200
added pota key
commit e14bca8172272d4a4f53eb5282d3d5576e057a2a
Merge: f8c7232 91145aa
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 18:39:40 2022 +0000
Merge branch 'master' into 'cbayer-i18n'
Master
See merge request gridtracker.org/gridtracker!182
If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
commit f8c7232c38ea4194fa8f69fe5721a74689b7ef2a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 12:54:04 2022 -0500
add jquery to npm depends
commit 734e972d9e3a66ca8d85debbe1a8f75c6f824020
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 12:53:24 2022 -0500
wip, i18n debugging
commit 013d9c8ebfc67f0f4ce8a4df8bea86bf812fd880
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 7 10:34:19 2022 +0200
small fixes
commit 8da135bb6db8e15069eefb07397c9ceeee6d8bac
Merge: 0183434 c1f7f1b
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 6 22:39:24 2022 +0200
Merge branch 'master' into cbayer-i18n
commit 0183434bba0d7c6b7652b3b8700bac3630902737
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 6 22:27:35 2022 +0200
removed banana import
commit 670001a6db028dc93bc56ddb8b29d2e897974ffa
Merge: c120df0 236ff10
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue May 17 18:38:11 2022 -0500
Merge branch 'master' into cbayer-i18n
commit c120df0e3ba77a985fdbd8c9a76028aee9a8d8d0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 15:15:21 2021 -0600
the linter lints
commit 2243beddb2aaa1a163b1ba142a95fce60774e2e7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:39:00 2021 -0600
mostly finished with gridtracker.html file's i18n
commit 33d69c950145dc398d10723f56102dbec77ba0b5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:36:34 2021 -0600
add functions to get acks json off website and overwrite file
commit 98170dce4f1313cbf42bd0ae4bf5d1c490a077da
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 15:02:46 2021 -0600
Initial workup for LoTW throttling & diff fetching
commit 655c0416635c5cafecaa612f8f6fd9a20db21f58
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:31:19 2021 -0600
WIP banana i18n
commit 26495c1f1436e5b99c317d8305101dbecd8f2b95
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Wed Dec 15 11:52:08 2021 -0600
update rpm spec 1.21.1212
commit e00269304da44ea6da20362f96714584164ba8b2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:47:50 2021 -0600
Trigger COPR and AUR repos and build .deb
commit 2b2e660108ca4f000a6ac31c347f80010e7b11b8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Wed Dec 15 11:46:41 2021 -0600
updated changelog / release notes
commit 0265f75fd85509081d5992db0d729149521254f5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 20:48:27 2021 -0600
update changelog
commit cd28c73c8a1dcb569fe3629e03b8d9646c832e5f
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 19:04:23 2021 -0600
update changelog
commit 058dbea415898134f345653532a3789ee7855ef0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 19:03:46 2021 -0600
Fix #76
commit f50ea44466328d0d632955b8a8725bf780417068
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 16:18:51 2021 -0600
update changelog to recent bug fixes
commit 3b0c9b5acc8cf3c57a2b0526451edf8250c11b89
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 16:18:37 2021 -0600
Fix #91
commit d906ee7d5f18e682ab0b47277474170dd89622de
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 15:54:51 2021 -0600
Fixes #107
commit 8252ca3f82843758edf5594d804989c3c4a1d6f0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 12:13:23 2021 -0600
fix hunting
commit c1f3ae9e1c7605a31635bad8ed5e793f8a5d39d1
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 13:09:46 2021 -0500
Really fix roster counts
commit 0054993dc8ab1406da8b0b4644382f453f9b4584
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 11:54:19 2021 -0500
Fix roster counts
commit 69e1152e7883369b3a818f516f3302681800c241
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 10:09:19 2021 -0600
update check for bad dxcc
commit a0b2595e9ea38e0a936fb97e691aaa7a7bb2d31e
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 11:04:53 2021 -0500
Fixed spot sorting in refactored code
commit 298e8cfbd7b9ee9b4560cb6c66e642e14abcae87
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 16:37:52 2021 -0600
update changelog
commit eb793d5607721231574a301fe1a4ea577628abf8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:47:21 2021 -0600
Update Copyright for 2022
commit 0eb2fac9a0efa2e1b97389a5a09cba4ba83ccfa1
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:46:52 2021 -0600
change vars to lets per Tag's suggestion
commit c78ea075b4f948dc88c91447ff66e471b21cc192
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 15:46:17 2021 -0600
RC build
commit 0c5cde472bffa1d2e2fe502449164aca153dd159
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 04:11:44 2021 +0000
Update .gitlab-ci.yml file
commit 492b791bc058555e49a16616ecb32c3cd9dd4ca4
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 04:10:31 2021 +0000
Update .gitlab-ci.yml
commit e77b9922ed1eea9c0ecd00860a4755b2523dba5b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 03:56:53 2021 +0000
Update .gitlab-ci.yml - include security scanning
commit 13c1236f7bf50c60756f1688b061f56d14f3afb9
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:46:20 2021 -0600
Fix acknowledgement icons
commit 28772768e8253edfb6b14b3a97908bf8102ad239
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:45:31 2021 -0600
Add support for Apple Silicon Macs, by hardcoding x64 mode in Phoenix
commit 0cec076dbb43d513ec93a63aaf51cf1423a9ebbb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:45:05 2021 -0600
allow package-lock to be uploaded to repo
commit 8b23a4ef25d12c417747b663334b046b723d703a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 09:11:24 2021 -0600
beta III of call roster testing
commit cc476c84ed84cb7e55e68cf6d482bfdd569f78a0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 09:09:57 2021 -0600
if dxcc = -1, no roster
commit ca5a4db664876a48b7d8a5ffaff28d7b067d99d0
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 20:59:15 2021 -0600
beta version for testing fix to CR
commit 5556bbfee08d0d1480d987dc396130cceed6cf20
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 14:31:02 2021 -0600
a few of SD's roster tweaks
commit 2b65f293a788b5c083efd04cfd4c803796df1b03
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 13:53:20 2021 -0600
could this cure the free text messages breaking the CR?
commit 43ea47a09d1058baa6bee5a109d7454cab6218c8
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 20:43:48 2021 -0500
roll v for beta build
commit f1d9db2e6fd14362a4fbf4d742be9a95ee871f0e
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 15:17:33 2021 -0500
better handling of /MM so that it doesn't tear a hole in space-time
commit 9fed1b4aca10997081f32e5e1777b52a3072d3d6
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 14:00:29 2021 -0500
remove the exception handler for callObj.style because need to fix the root cause
commit 7a73c988dac34545da26fd4a736a964215ebc872
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 13:31:15 2021 -0500
handle undefined callObj.style
commit 71a2df7e20e8e424aa0ec90ea5d8d9d3492487ff
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 12:42:58 2021 -0500
handle bug line 114
commit 8d5117b76b6844df4eeced0e9f0e01d1e28be2e2
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 20:36:10 2021 -0500
inc v for beta 2
commit b199c4c4fad3558843d6d21958761ef6b9996fa7
Author: christian <christian_bay@gmx.de>
Date: Sun Oct 24 21:23:40 2021 -0400
fixed linting
commit 7830e52978f964c5da015b1bb0928f56028c260b
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 20:15:07 2021 -0500
cleaned up linting
commit ac51710ff3fb3d296ddd4edeeff4957e677fb6ec
Author: Christian Bayer <christian_bay@gmx.de>
Date: Sun Oct 24 20:56:21 2021 -0400
fixed reference error on huntedCount
commit 66f7ad87b3d91397cab29bc8c0bcca9e137e682e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:44:39 2021 -0600
fix pack.json and changelog to reflect test V#
commit 7a43853533e364cf85e70262b6573afe47542fbc
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:44:14 2021 -0600
add settings.json to gitignore
commit 4f2ce9d89099b674fed2c5053cc80f7f9866f325
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Oct 21 00:41:12 2021 +0000
Update package.json
commit dbc297a00c6405971219ccba4ad27416ef321282
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:43:52 2021 -0600
Update package.json
commit 6c68a190dbd73b385fbaea9878f513ba0684dc2c
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:43:31 2021 -0600
Update changelog
commit 3125b01a17f9fa4c44ec139a4a58fcd8effbf3cd
Author: christian <christian@t530>
Date: Wed Jul 7 15:08:03 2021 -0400
clear call roster on band change: option added
commit 6f4c15c157ff956352bebd9e20a06610ef3d3196
Author: christian <christian@t530>
Date: Sun Jul 4 23:07:51 2021 -0400
unknown dxxc filter for roster
commit a444d163cae7fd3256992571a2f95b6ac5b921a1
Author: christian <christian@t530>
Date: Thu Jul 1 21:39:50 2021 -0400
fixed other sorts
commit cb73f21a937c95541ca756ee9988d54f8056fd16
Author: christian <christian@t530>
Date: Wed Jun 30 20:37:27 2021 -0400
fixed alert script call
commit 2226f707bd41ab4f271ca3b2c8c72f8028735894
Author: christian <christian@t530>
Date: Wed Jun 30 07:52:36 2021 -0400
fixed dxcc sorting
commit d395b8dd0e0df8fcee8d8da9701428803ef0c5af
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 23:18:43 2021 -0500
tweak for compact mode
commit 86fb507d5a45a3418ae7f98d828e91f74f5af9a9
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 23:08:13 2021 -0500
IT WORKS!
commit d55ac551d1c1d923b184c121af69d065ccc3eb70
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:51:52 2021 -0500
fix grid
commit 0a85e764931371591899a503609bcafb35babb30
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:50:49 2021 -0500
bunch of stuff moved to the right places
commit 68f81c62003e0826f2766b5065f464d008b95db7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:37:49 2021 -0500
fix some small stuff
commit db738a4230fd6d6f79c122643ba48d687da783b7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:26:40 2021 -0500
lost show bands/modes on render call rows
commit 68f7544b1a2e8dfca87bbfc3708aa30aae4b2b31
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:24:32 2021 -0500
fix line 73
commit 95920077bd64eea14a6dee6f4d112f4f65031450
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:21:19 2021 -0500
fix line 34
commit 84059439c1108a083f52aed5b2302adca2bb7ead
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:18:32 2021 -0500
fix broken array
commit 817e9c5e18868bee13b7dfa029b4bbc008ded300
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:12:23 2021 -0500
fix sendAlerts undefined object
commit 7a0b16d262f77dfbaf56bdeb678637f67f4c45a0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:08:06 2021 -0500
more broke fixed
commit 6a9896ce4112b3b84fb9f1429285885ed5f8085b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:00:27 2021 -0500
re-added r_sortFunction that somehow wondered off
commit 856a49b720f41c68b91cb38ca135b82cb5a36e09
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 21:58:05 2021 -0500
fix some more broken stuff
commit 076a7e5eec824af2db9edf8e083807d0dff4fb8d
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 20:42:07 2021 -0500
fixed a bunch of broken refs to rosterSettings
commit 443409b90253c2e45d7d080819286a9b6dd39e88
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 19:19:26 2021 -0500
refactor so far
commit 1f452992861643d61caf5bcf85739c199a28582b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 17:26:44 2021 -0500
big roster refactor - starting
Co-authored-by: Sebastian Delmont <sd@notso.net>
Matthew Chambers <nr0q@gridtracker.org>
commit 4ed8b2c3cbd7e1f850256d4589c7cc6621825eed
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 18:46:42 2021 -0500
missing comma line 422
commit b089caf50ad28215280b343eca43e816d0e8aaad
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 18:04:46 2021 -0500
add array with exception test function names, need to create functions yet
commit 0b27feb3677218b7a3185ecb8c187384572451eb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 11:06:31 2021 -0500
some notes that might aid in refactoring
commit 0518d6e40caf7cede1b1a3ecced412d910f3bdeb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:42:44 2021 -0600
add functions to get acks json off website and overwrite file
commit 268459833bdd6bfbb84cd8d05df2a649ab34f1cc
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:41:03 2021 -0600
Initial workup for LoTW throttling & diff fetching
commit 9330df84f38f9705d8c6f8ff56bd2479cacd108a
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 12:59:29 2021 -0500
save work so far
commit 0761163ddd2b851c617ca6d4cc497f32063c2bf6
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 21:54:26 2021 -0500
adding i18n to other html files, need to call scripts I think to make them "work"
commit 3a00b5b3d0bbbdbb494bd90ba8638f9be0434e6a
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 21:16:02 2021 -0500
i18n chat html and format chat.css
commit 220fc036b8b6d200ffbe79a5e293770b9a17d88c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 20:57:05 2021 -0500
refactor chat css into it's own css file, fix linting in gt.js start adding i18n in chat and bandactivity htmls
commit fceaaaa4aa8076ae5dbb544bbe63eef812606503
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 19:39:21 2021 -0500
update all except hover/title elements with i18n in GridTracker.html
commit 215bc2c55c770575a5594a48872b1fb28bb160b1
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 18:28:48 2021 -0500
mostly finished with gridtracker.html file's i18n
commit 9a63953b7d407530cebd9c341ddda3dd08346750
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 17:58:13 2021 -0500
all through Audio Alerts done
commit bbe38ea60d0c7ba8359a4a599ecc2d4e8e8537f7
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 17:05:47 2021 -0500
check in everything up to mid alert settings
commit 99d89f68fca24ded7d4080942aa8303898a3d86c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 13:00:00 2021 -0500
fix badly broken HTML
commit 934f097b7019c9d02e220bd26ab4e2dbf96d252c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 12:39:04 2021 -0500
update through to Lookup tab
commit efd03b85aee05e489a558d3d9769bf524340f769
Author: chrbayer84 <christian_bay@gmx.de>
Date: Wed Sep 29 18:04:22 2021 +0000
Update README.md
commit ac5299cbb516fefce635a5cd99c72048e4bb678d
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Sep 29 12:26:50 2021 -0500
add Getting GridTracker to readme
commit 8f3a7f81ae27b6d7382ac4b75e89f5582c79c4d2
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Sep 28 14:58:22 2021 -0500
copy of NWJS's license
commit 645b2222b084b575b8b0b4fb8ea61be8c972b010
Author: T Loomis <tag.loomis@gmail.com>
Date: Tue Sep 28 19:09:45 2021 +0000
Removed OAMS messaging pop-up reset
commit 17035c84a092be7cabeff4648f9827bc87cf445e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Sep 27 18:04:00 2021 +0000
updated arm to NWJS 0.54.2 with 64 bit capability
rolled to v1.21.0928
commit 75421054f92497a4a8f7466eefa4c30684206ac2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Sep 27 18:00:48 2021 +0000
Treat adif record values as byte length vs string length
commit 44d54dd5dfecb3389317f3c6a88793c38c78f7ff
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Thu Sep 16 20:37:04 2021 -0500
updated V-num for beta build
commit 50c65ac2c4bdc10da679d495f794e4424981f935
Author: jangliss <jon+gh@netdork.net>
Date: Thu Sep 16 20:27:21 2021 -0500
Remove looking at fetched records for last fetch date for LoTW. Use only header
commit 421601e36d3bde33c13ae7646f12d4cc1c617eff
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Sun Aug 29 14:39:18 2021 -0500
new donors yay
commit 3eb3fa4b21f6ab580ed6f1f8cf348b1e6e1fbe2d
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Sat Aug 28 13:06:48 2021 -0500
acks data update
commit cdb524a887cbabfeac288fad2d04f6126665b601
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Wed Aug 25 14:38:51 2021 -0500
data update
commit f91cc0968cdb25164894739693c8bfc15aa7af9d
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jul 5 11:47:16 2021 -0500
acks update 5-july-2021
commit 0ca37bf71eaef8c7423944a478f9b3836d7320c7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Jun 29 16:41:47 2021 -0500
ack update 29 July 2021
commit 53f6168e2363e26c548d108f735805dcfba8330e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Jun 22 11:49:53 2021 -0500
update acknowledgements.json for 6/22/2021
commit 2b79d75f0989c1fcb35ea90d72266e9238bd285e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Jun 20 13:13:40 2021 -0500
update acknowledgements.json
commit c30d004c69824a71d8391129cf38ece5a84dc3a7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 16:19:52 2021 -0500
update acknowledgements.json
commit c3bef85eabb56709833ac36fd299cbb90e07aa4f
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 20:58:02 2021 +0000
Update acks json
commit 260e4bc9bc3d15d02b45e5efe0c955c5beaddd27
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 12:01:43 2021 -0500
general updates for new general release
commit fc742c95a868269ff691b0579aef3c61d6643591
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 14:36:13 2021 -0500
fix line 15581
commit 6a04b9cb7bc2c11f458cae3aad8e9569ae7a0a58
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 13:44:44 2021 -0500
more better
commit 229efb099a1688b00af4469d9d5f3b15f067d84a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 13:26:06 2021 -0500
better get acks code (Thanks Tag)
commit 7b30fb3093212e034ea57f42090f72ec768f6320
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:43:05 2021 -0500
fix missing " around http line 11141
commit 24e180ffdcb34c8f26dcf183607c83f704168695
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:33:04 2021 -0500
call checkForNewAcks when checkForNewVersion
commit e9d9f8b24a3bf927040bd7f77227edcaafd631e8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:17:29 2021 -0500
add functions to get acks json off website and overwrite file
commit 56e4d5816918078152fb74ca8a542179d87b6077
Author: jangliss <jon+gh@netdork.net>
Date: Fri Jun 18 20:28:25 2021 -0500
Date.parse behavior to local time instead of UTC
commit 74db81d764f165d1c45aab54cd24137062e7a204
Author: jangliss <jon+gh@netdork.net>
Date: Thu Jun 17 17:56:37 2021 -0500
More LoTW Fixes to do diff fetching
commit cedeef59f878ca42e6190b41d8774ee4ce4eb640
Author: jangliss <jon+gh@netdork.net>
Date: Tue Jun 15 21:03:15 2021 -0500
Initial workup for LoTW throttling & diff fetching
commit 4576c519c85b0445dad7ba655e2d22b387c9a26f
Author: Santiago Mejia <santiago.hi8smx@gmail.com>
Date: Wed Jun 16 19:59:05 2021 +0000
Upload New File
commit f79010707a3fac0e29c63ef1b741a737bcab522c
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 19 15:44:51 2021 -0500
Fix linting warning
commit 9b31e8c1a859fe94109f295f6376d4cffd87a1c2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 12 22:13:03 2021 -0500
update changelog etc for v1.21.0613
commit 3706978e8b45855f70e4c5723898d0797e7066b5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Jun 13 03:27:38 2021 +0000
Update acks json
commit bbd17c1e32dc2685a57871a446ee8e3d5bc5b3c9
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 22:20:32 2021 -0500
Linting hates me. Remove space on comment.
commit 80466b0edab9b138fd78c45ef270ce8a7b644fc1
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 22:08:47 2021 -0500
Fix npm wanting a space after comment syntax
commit 5791ba583e4c04de01058807a61af9fb49599114
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 21:55:50 2021 -0500
Temporarily disable LoTW full downloads on startup
commit d5478ee4ab7730af7eac637f839a05348558b517
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 17:17:41 2021 -0500
small fixes in typos in data-i18n tags
commit ec541a5a835eec2233d752a88b809ff0dbc9e78b
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 14:08:50 2021 -0500
it all works and created es file for Santiago to start on
commit 6c14637639be2e5ff7535c26c5c4f3db07c5add2
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 13:51:09 2021 -0500
loading the local file helps, added a statup function to do that
commit 635431735822ad0385fd713c8def0ffd094fd2ec
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Oct 13 16:25:07 2021 -0500
add .vscode to gitignore
commit 27cc542b65cf486a25ba93fb06901ff7b0a888d8
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Oct 13 10:20:55 2021 -0500
finished i18n tags through map vew filters
commit ef4683c8ea3235670509a17b4a2b6108c7d27bab
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 20:23:12 2021 -0500
added data-i18n tags up through mapFilter.mode
commit 0aa862afbe239cd062902804de9ccad95e354839
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 16:49:03 2021 -0500
more data-i18n tags
commit bbd39a640fd5b31366b141bb687fad04b27c64fd
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 16:07:39 2021 -0500
adding data-i18n fields to tags
commit 603c8c039d6ba6113cd2de62c994d8c5bba42e08
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 17:37:11 2021 -0500
all HTML files done
commit 7e97e9d2af6db22b95205ace9a00887b493a2be8
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 16:08:52 2021 -0500
i18n up to the about tab
commit 0c65ab8f3ae0b54f80be894067547bbc5674f5d5
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 13:51:09 2021 -0500
i18n en strings through audio settings
commit 39152109a5156f08f4984364a0f7488cd617dd18
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 13:18:35 2021 -0500
cleaner keys
commit 59a93e3f30cabdc7529aef005b085c3a9e582ecf
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 11:46:28 2021 -0500
i18n through control panel
commit 17be5a28434dda24fff0fb7e198cc89ac0bbfb5c
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 10:43:25 2021 -0500
check in what I have so far
commit aa65ad9936c7c37ada7b5d8b7263adddf60dec8f
Author: christian <christian@t530>
Date: Sun Jun 13 14:21:43 2021 -0400
added jquery.i18n
commit 9d31645823b45417f393d68951a18b4d05bb8e93
Author: christian <christian@t530>
Date: Wed Jun 9 21:29:23 2021 -0400
i18n hook for main gt.html
commit 7e9e5b9cfe1bdbbee391565f1fda282a27f0bb55
Author: christian <christian@t530>
Date: Mon May 24 21:08:15 2021 -0400
WIP banana i18n
2022-09-06 01:57:15 +00:00
|
|
|
let appLoTW_RXQSO = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"APP_LoTW_RXQSO"
|
|
|
|
);
|
|
|
|
|
|
|
|
if (appLoTW_RXQSO != "")
|
|
|
|
{
|
|
|
|
let dRXQSO = Date.parse(appLoTW_RXQSO);
|
|
|
|
let dLastLOTW_QSO = Date.parse(g_adifLogSettings.lastFetch.lotw_qso);
|
|
|
|
if ((isNaN(dRXQSO) == false) && (isNaN(dLastLOTW_QSO) == false) && (dRXQSO > dLastLOTW_QSO))
|
|
|
|
{
|
|
|
|
g_adifLogSettings.lastFetch.lotw_qso = appLoTW_RXQSO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let appLoTW_RXQSL = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"APP_LoTW_RXQSL"
|
|
|
|
);
|
|
|
|
|
|
|
|
if (appLoTW_RXQSL != "")
|
|
|
|
{
|
|
|
|
let dRXQSL = Date.parse(appLoTW_RXQSL);
|
|
|
|
let dLastLOTW_QSL = Date.parse(g_adifLogSettings.lastFetch.lotw_qsl);
|
|
|
|
if ((isNaN(dRXQSL) == false) && (isNaN(dLastLOTW_QSL) == false) && (dRXQSL > dLastLOTW_QSL))
|
|
|
|
{
|
|
|
|
g_adifLogSettings.lastFetch.lotw_qso = appLoTW_RXQSO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-13 03:08:47 +00:00
|
|
|
if (activeAdifArray[x].length > 3)
|
|
|
|
{
|
|
|
|
if (activeAdifLogMode)
|
|
|
|
{
|
|
|
|
let confirmed = false;
|
|
|
|
let finalGrid = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"GRIDSQUARE"
|
|
|
|
).toUpperCase();
|
|
|
|
let vuccGrids = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"VUCC_GRIDS"
|
|
|
|
).toUpperCase();
|
|
|
|
let finalVucc = [];
|
|
|
|
let finalDXcall = findAdiField(activeAdifArray[x], "CALL").replace(
|
|
|
|
"_",
|
|
|
|
"/"
|
|
|
|
);
|
|
|
|
let finalDEcall = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"STATION_CALLSIGN"
|
|
|
|
).replace("_", "/");
|
|
|
|
|
|
|
|
if (finalDEcall == "") finalDEcall = myDEcall;
|
|
|
|
if (
|
|
|
|
g_appSettings.workingCallsignEnable &&
|
|
|
|
!(finalDEcall in g_appSettings.workingCallsigns)
|
|
|
|
)
|
|
|
|
{ continue; }
|
|
|
|
let finalRSTsent = findAdiField(activeAdifArray[x], "RST_SENT");
|
|
|
|
let finalRSTrecv = findAdiField(activeAdifArray[x], "RST_RCVD");
|
|
|
|
let finalBand = findAdiField(activeAdifArray[x], "BAND").toLowerCase();
|
|
|
|
let dateVal = findAdiField(activeAdifArray[x], "QSO_DATE");
|
|
|
|
let timeVal = findAdiField(activeAdifArray[x], "TIME_ON");
|
|
|
|
let finalState = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"STATE"
|
|
|
|
).toUpperCase();
|
|
|
|
if (finalState.length == 0) finalState = null;
|
|
|
|
let finalPropMode = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"PROP_MODE"
|
|
|
|
).toUpperCase();
|
|
|
|
let finalSatName = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"SAT_NAME"
|
|
|
|
).toUpperCase();
|
|
|
|
let finalCont = findAdiField(activeAdifArray[x], "CONT").toUpperCase();
|
|
|
|
if (finalCont.length == 0) finalCont = null;
|
|
|
|
let finalCnty = findAdiField(activeAdifArray[x], "CNTY").toUpperCase();
|
|
|
|
if (finalCnty.length == 0) finalCnty = null;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
finalCnty = finalCnty.replaceAll(" ", "");
|
|
|
|
}
|
|
|
|
let finalMode = findAdiField(activeAdifArray[x], "MODE").toUpperCase();
|
|
|
|
let subMode = findAdiField(activeAdifArray[x], "SUBMODE");
|
|
|
|
if (subMode == "FT4" && (finalMode == "MFSK" || finalMode == "DATA"))
|
|
|
|
{ finalMode = "FT4"; }
|
|
|
|
if (subMode == "JS8" && finalMode == "MFSK") finalMode = "JS8";
|
|
|
|
|
|
|
|
if (finalBand == "oob" || finalBand == "")
|
|
|
|
{
|
|
|
|
finalBand = Number(
|
|
|
|
findAdiField(activeAdifArray[x], "FREQ")
|
|
|
|
).formatBand();
|
|
|
|
}
|
|
|
|
|
|
|
|
let finalMsg = findAdiField(activeAdifArray[x], "COMMENT");
|
|
|
|
let finalQslMsg = findAdiField(activeAdifArray[x], "QSLMSG");
|
|
|
|
let finalQslMsgIntl = findAdiField(activeAdifArray[x], "QSLMSG_INTL");
|
|
|
|
if (finalQslMsg.length > 1) finalMsg = finalQslMsg;
|
|
|
|
if (finalQslMsgIntl.length > 1 && finalMsg == "")
|
|
|
|
{ finalMsg = finalQslMsgIntl; }
|
|
|
|
|
|
|
|
let finalDxcc = Number(findAdiField(activeAdifArray[x], "DXCC"));
|
|
|
|
if (finalDxcc == 0) finalDxcc = Number(callsignToDxcc(finalDXcall));
|
|
|
|
|
2022-10-16 00:16:06 +00:00
|
|
|
if (!(finalDxcc in g_dxccInfo))
|
2021-06-13 03:08:47 +00:00
|
|
|
{ finalDxcc = Number(callsignToDxcc(finalDXcall)); }
|
|
|
|
|
|
|
|
// If my callsign isn't present, it must be for me anyway
|
|
|
|
|
|
|
|
let finalCqZone = findAdiField(activeAdifArray[x], "CQZ");
|
|
|
|
if (finalCqZone.length == 1) finalCqZone = "0" + finalCqZone;
|
|
|
|
|
|
|
|
if (parseInt(finalCqZone) < 1 || parseInt(finalCqZone) > 40)
|
|
|
|
{ finalCqZone = ""; }
|
|
|
|
finalCqZone = String(finalCqZone);
|
|
|
|
let finalItuZone = findAdiField(activeAdifArray[x], "ITUZ");
|
|
|
|
if (finalItuZone.length == 1) finalItuZone = "0" + finalItuZone;
|
|
|
|
|
|
|
|
if (parseInt(finalItuZone) < 1 || parseInt(finalItuZone) > 90)
|
|
|
|
{ finalItuZone = ""; }
|
|
|
|
finalItuZone = String(finalItuZone);
|
|
|
|
|
|
|
|
let finalIOTA = findAdiField(activeAdifArray[x], "IOTA").toUpperCase();
|
|
|
|
|
|
|
|
let qrzConfirmed = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"APP_QRZLOG_STATUS"
|
|
|
|
).toUpperCase();
|
|
|
|
let lotwConfirmed1 = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"QSL_RCVD"
|
|
|
|
).toUpperCase();
|
|
|
|
let lotw_qsl_rcvd = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"LOTW_QSL_RCVD"
|
|
|
|
).toUpperCase();
|
|
|
|
let eqsl_qsl_rcvd = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"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; }
|
|
|
|
|
|
|
|
let dateTime = new Date(
|
|
|
|
Date.UTC(
|
|
|
|
dateVal.substr(0, 4),
|
|
|
|
parseInt(dateVal.substr(4, 2)) - 1,
|
|
|
|
dateVal.substr(6, 2),
|
|
|
|
timeVal.substr(0, 2),
|
|
|
|
timeVal.substr(2, 2),
|
|
|
|
timeVal.substr(4, 2)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
let finalTime = parseInt(dateTime.getTime() / 1000);
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_appSettings.workingDateEnable &&
|
|
|
|
finalTime < g_appSettings.workingDate
|
|
|
|
)
|
|
|
|
{ continue; }
|
|
|
|
|
|
|
|
finalGrid = finalGrid.substr(0, 6);
|
|
|
|
if (!validateGridFromString(finalGrid)) finalGrid = "";
|
|
|
|
if (finalGrid == "" && vuccGrids != "")
|
|
|
|
{
|
|
|
|
finalVucc = vuccGrids.split(",");
|
|
|
|
finalGrid = finalVucc[0];
|
|
|
|
finalVucc.shift();
|
|
|
|
}
|
|
|
|
let isDigital = false;
|
|
|
|
let isPhone = false;
|
|
|
|
if (finalMode in g_modes)
|
|
|
|
{
|
|
|
|
isDigital = g_modes[finalMode];
|
|
|
|
}
|
|
|
|
if (finalMode in g_modes_phone)
|
|
|
|
{
|
|
|
|
isPhone = g_modes_phone[finalMode];
|
|
|
|
}
|
2022-09-28 20:41:19 +00:00
|
|
|
// TODO: Revisit when we support more than one park ID
|
|
|
|
let finalPOTA = findAdiField(activeAdifArray[x], "POTA").toUpperCase();
|
|
|
|
if (finalPOTA.length == 0)
|
|
|
|
{
|
|
|
|
finalPOTA = null;
|
|
|
|
}
|
|
|
|
|
2021-06-13 03:08:47 +00:00
|
|
|
if (finalDXcall != "")
|
|
|
|
{
|
|
|
|
addDeDx(
|
|
|
|
finalGrid,
|
|
|
|
finalDXcall,
|
|
|
|
finalDEcall,
|
|
|
|
finalRSTsent,
|
|
|
|
finalTime,
|
|
|
|
finalMsg,
|
|
|
|
finalMode,
|
|
|
|
finalBand,
|
|
|
|
confirmed,
|
2022-09-28 22:46:38 +00:00
|
|
|
true,
|
2021-06-13 03:08:47 +00:00
|
|
|
finalRSTrecv,
|
|
|
|
finalDxcc,
|
|
|
|
finalState,
|
|
|
|
finalCont,
|
|
|
|
finalCnty,
|
|
|
|
finalCqZone,
|
|
|
|
finalItuZone,
|
|
|
|
finalVucc,
|
|
|
|
finalPropMode,
|
|
|
|
isDigital,
|
|
|
|
isPhone,
|
|
|
|
finalIOTA,
|
2022-09-28 20:41:19 +00:00
|
|
|
finalSatName,
|
|
|
|
finalPOTA
|
2021-06-13 03:08:47 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
let finalMyGrid = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"MY_GRIDSQUARE"
|
|
|
|
).toUpperCase();
|
|
|
|
let finalGrid = findAdiField(
|
|
|
|
activeAdifArray[x],
|
|
|
|
"GRIDSQUARE"
|
|
|
|
).toUpperCase();
|
|
|
|
let finalDXcall = findAdiField(activeAdifArray[x], "CALL");
|
|
|
|
let finalDEcall = findAdiField(activeAdifArray[x], "OPERATOR");
|
|
|
|
let finalRSTsent = findAdiField(activeAdifArray[x], "APP_PSKREP_SNR");
|
|
|
|
let dateVal = findAdiField(activeAdifArray[x], "QSO_DATE");
|
|
|
|
let timeVal = findAdiField(activeAdifArray[x], "TIME_ON");
|
|
|
|
let finalMode = findAdiField(activeAdifArray[x], "MODE");
|
|
|
|
let finalBand = Number(
|
|
|
|
findAdiField(activeAdifArray[x], "FREQ")
|
|
|
|
).formatBand();
|
|
|
|
let finalMsg = "-";
|
|
|
|
let finalDxcc = Number(findAdiField(activeAdifArray[x], "DXCC"));
|
|
|
|
if (finalDxcc == 0)
|
|
|
|
{
|
|
|
|
if (finalDXcall == myDEcall) finalDxcc = callsignToDxcc(finalDEcall);
|
|
|
|
else finalDxcc = callsignToDxcc(finalDXcall);
|
|
|
|
}
|
|
|
|
|
|
|
|
finalGrid = finalGrid.substr(0, 6);
|
|
|
|
|
|
|
|
let dateTime = new Date(
|
|
|
|
Date.UTC(
|
|
|
|
dateVal.substr(0, 4),
|
|
|
|
parseInt(dateVal.substr(4, 2)) - 1,
|
|
|
|
dateVal.substr(6, 2),
|
|
|
|
timeVal.substr(0, 2),
|
|
|
|
timeVal.substr(2, 2),
|
|
|
|
timeVal.substr(4, 2)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
let finalTime = parseInt(dateTime.getTime() / 1000);
|
|
|
|
if (
|
|
|
|
finalGrid != "" &&
|
|
|
|
finalDXcall != "" &&
|
|
|
|
validateGridFromString(finalGrid)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (finalDXcall == myDEcall)
|
|
|
|
{
|
|
|
|
addDeDx(
|
|
|
|
finalMyGrid,
|
|
|
|
finalDEcall,
|
|
|
|
finalDXcall,
|
|
|
|
null,
|
|
|
|
finalTime,
|
|
|
|
finalMsg,
|
|
|
|
finalMode,
|
|
|
|
finalBand,
|
|
|
|
false,
|
2022-09-28 22:46:38 +00:00
|
|
|
false,
|
2021-06-13 03:08:47 +00:00
|
|
|
finalRSTsent,
|
|
|
|
finalDxcc,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else if (finalDEcall == myDEcall)
|
|
|
|
{
|
|
|
|
addDeDx(
|
|
|
|
finalGrid,
|
|
|
|
finalDXcall,
|
|
|
|
"-",
|
|
|
|
finalRSTsent,
|
|
|
|
finalTime,
|
|
|
|
finalMsg,
|
|
|
|
finalMode,
|
|
|
|
finalBand,
|
|
|
|
false,
|
2022-09-28 22:46:38 +00:00
|
|
|
false,
|
2021-06-13 03:08:47 +00:00
|
|
|
null,
|
|
|
|
finalDxcc,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
addDeDx(
|
|
|
|
finalGrid,
|
|
|
|
finalDXcall,
|
|
|
|
finalDEcall,
|
|
|
|
finalRSTsent,
|
|
|
|
finalTime,
|
|
|
|
finalMsg,
|
|
|
|
finalMode,
|
|
|
|
finalBand,
|
|
|
|
false,
|
2022-09-28 22:46:38 +00:00
|
|
|
false,
|
2021-06-13 03:08:47 +00:00
|
|
|
null,
|
|
|
|
finalDxcc,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
redrawGrids();
|
|
|
|
updateCountStats();
|
|
|
|
updateLogbook();
|
|
|
|
|
|
|
|
if (g_fromDirectCallNoFileDialog == false)
|
|
|
|
{
|
|
|
|
fileSelector.setAttribute("type", "");
|
|
|
|
fileSelector.setAttribute("type", "file");
|
|
|
|
fileSelector.setAttribute("accept", ".adi,");
|
|
|
|
fileSelector.value = null;
|
|
|
|
}
|
|
|
|
g_fromDirectCallNoFileDialog = false;
|
|
|
|
|
|
|
|
updateRosterWorked();
|
|
|
|
goProcessRoster();
|
|
|
|
}
|
|
|
|
|
|
|
|
function clubLogCallback(buffer, flag, cookie)
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = String(buffer);
|
|
|
|
if (rawAdiBuffer.indexOf("Invalid login") > -1)
|
|
|
|
{
|
|
|
|
if (flag) clubTestResult.innerHTML = "Invalid";
|
|
|
|
}
|
|
|
|
else if (buffer == null)
|
|
|
|
{
|
|
|
|
if (flag) clubTestResult.innerHTML = "Unknown Error";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (flag) clubTestResult.innerHTML = "Passed";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
|
|
|
|
rawAdiBuffer = cleanAndPrepADIF("clublog.adif", rawAdiBuffer);
|
|
|
|
|
|
|
|
tryToWriteAdifToDocFolder("clublog.adif", rawAdiBuffer);
|
|
|
|
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, true, "clublog.adif", true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var g_isGettingClub = false;
|
|
|
|
function grabClubLog(test)
|
|
|
|
{
|
|
|
|
if (g_isGettingClub == false)
|
|
|
|
{
|
|
|
|
if (test) clubTestResult.innerHTML = "Testing";
|
|
|
|
|
|
|
|
var postData = {
|
|
|
|
email: clubEmail.value,
|
|
|
|
password: clubPassword.value,
|
|
|
|
call: clubCall.value
|
|
|
|
};
|
|
|
|
getAPostBuffer(
|
|
|
|
"https://clublog.org/getadif.php",
|
|
|
|
clubLogCallback,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
postData,
|
|
|
|
ClubLogImg,
|
|
|
|
"g_isGettingClub"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function tryToWriteAdifToDocFolder(filename, buffer, append = false)
|
|
|
|
{
|
|
|
|
var finalFile = g_appData + g_dirSeperator + filename;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (append == false)
|
|
|
|
{
|
|
|
|
fs.writeFileSync(finalFile, buffer);
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fs.appendFileSync(finalFile, buffer);
|
|
|
|
return fs.readFileSync(finalFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function cleanAndPrepADIF(name, adiBuffer, reverse = false, noheader = false)
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = adiBuffer;
|
|
|
|
var regex = new RegExp("<APP_LOTW_EOF>", "i");
|
|
|
|
rawAdiBuffer = rawAdiBuffer.replace(regex, "");
|
|
|
|
regex = new RegExp("<EOH>", "i");
|
|
|
|
var adiArray = rawAdiBuffer.split(regex);
|
|
|
|
var activeAdifArray = Array();
|
|
|
|
var activeAdifLogMode = true;
|
|
|
|
var finalBuffer = "";
|
|
|
|
|
|
|
|
if (noheader == false) finalBuffer = name + "<EOH>\r\n";
|
|
|
|
|
|
|
|
if (adiArray.length > 1)
|
|
|
|
{
|
|
|
|
regex = new RegExp("<EOR>", "i");
|
|
|
|
activeAdifArray = adiArray[1].split(regex);
|
|
|
|
|
|
|
|
if (reverse == false)
|
|
|
|
{
|
|
|
|
for (var x = 0; x < activeAdifArray.length - 1; x++)
|
|
|
|
{
|
|
|
|
var row = activeAdifArray[x].replace(/[\n\r]/g, "");
|
|
|
|
if (row.length > 0) finalBuffer += row + "<EOR>\r\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (var x = activeAdifArray.length - 1; x > -1; x--)
|
|
|
|
{
|
|
|
|
var row = activeAdifArray[x].replace(/[\n\r]/g, "");
|
|
|
|
if (row.length > 0) finalBuffer += row + "<EOR>\r\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return finalBuffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
function addZero(i)
|
|
|
|
{
|
|
|
|
if (i < 10)
|
|
|
|
{
|
|
|
|
i = "0" + i;
|
|
|
|
}
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getUTCString(d)
|
|
|
|
{
|
|
|
|
var Y = d.getUTCFullYear();
|
|
|
|
var M = addZero(d.getUTCMonth() + 1);
|
|
|
|
var D = addZero(d.getUTCDate());
|
|
|
|
var h = addZero(d.getUTCHours());
|
|
|
|
var m = addZero(d.getUTCMinutes());
|
|
|
|
var s = addZero(d.getUTCSeconds());
|
|
|
|
return Y + "-" + M + "-" + D + " " + h + ":" + m + ":" + s;
|
|
|
|
}
|
|
|
|
|
|
|
|
function lotwCallback(buffer, flag)
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = String(buffer);
|
|
|
|
if (rawAdiBuffer.indexOf("password incorrect") > -1)
|
|
|
|
{
|
|
|
|
if (flag) lotwTestResult.innerHTML = "Invalid";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (flag) lotwTestResult.innerHTML = "Passed";
|
|
|
|
else
|
|
|
|
{
|
|
|
|
var shouldAppend = false;
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
|
2021-06-16 02:03:15 +00:00
|
|
|
// Extract header showing last fetched date from call
|
|
|
|
var lotwQSHeader = rawAdiBuffer.match(/^<APP_LoTW_LAST(QSL|QSORX):\d+>(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/m);
|
|
|
|
if (lotwQSHeader !== null)
|
|
|
|
{
|
|
|
|
if (lotwQSHeader[1].toUpperCase() == "QSORX")
|
2021-06-17 22:56:37 +00:00
|
|
|
{
|
|
|
|
g_adifLogSettings.lastFetch.lotw_qso = lotwQSHeader[2]
|
|
|
|
}
|
|
|
|
else if (lotwQSHeader[1].toUpperCase() == "QSL")
|
|
|
|
{
|
|
|
|
g_adifLogSettings.lastFetch.lotw_qsl = lotwQSHeader[2];
|
|
|
|
}
|
2021-06-16 02:03:15 +00:00
|
|
|
}
|
|
|
|
|
2021-06-13 03:08:47 +00:00
|
|
|
rawAdiBuffer = cleanAndPrepADIF(
|
|
|
|
"lotw.adif",
|
|
|
|
rawAdiBuffer,
|
|
|
|
true,
|
|
|
|
shouldAppend
|
|
|
|
);
|
|
|
|
|
|
|
|
rawAdiBuffer = tryToWriteAdifToDocFolder(
|
|
|
|
"lotw.adif",
|
|
|
|
rawAdiBuffer,
|
|
|
|
shouldAppend
|
|
|
|
);
|
|
|
|
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, true, "lotw.adif", true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function shouldWeAppendInsteadOfCreate(filename)
|
|
|
|
{
|
|
|
|
var finalFile = g_appData + g_dirSeperator + filename;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (fs.existsSync(finalFile)) return true;
|
|
|
|
else return false;
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function tryToDeleteLog(filename)
|
|
|
|
{
|
|
|
|
var finalFile = g_appData + g_dirSeperator + filename;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (fs.existsSync(finalFile))
|
|
|
|
{
|
|
|
|
fs.unlinkSync(finalFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
var g_lotwCount = 0;
|
|
|
|
|
|
|
|
var g_isGettingLOTW = false;
|
|
|
|
|
|
|
|
function grabLOtWLog(test)
|
2021-06-17 22:56:37 +00:00
|
|
|
{
|
|
|
|
var lastQSLDateString = "";
|
|
|
|
|
|
|
|
if (test == true && g_isGettingLOTW == false)
|
|
|
|
{
|
|
|
|
lotwTestResult.innerHTML = "Testing";
|
|
|
|
lastQSLDateString = "&qso_qsosince=2100-01-01";
|
|
|
|
|
|
|
|
// Fetch Test Results
|
|
|
|
getABuffer(
|
|
|
|
"https://lotw.arrl.org/lotwuser/lotwreport.adi?login=" +
|
|
|
|
lotwLogin.value +
|
|
|
|
"&password=" +
|
|
|
|
encodeURIComponent(lotwPassword.value) +
|
|
|
|
"&qso_query=1&qso_qsl=no&qso_qsldetail=yes&qso_withown=yes" +
|
|
|
|
lastQSLDateString,
|
|
|
|
lotwCallback,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
lotwLogImg,
|
|
|
|
"g_isGettingLOTW",
|
|
|
|
150000
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (test == false)
|
|
|
|
{
|
2022-10-02 18:28:32 +00:00
|
|
|
nodeTimers.setTimeout(grabLoTWQSO, 500);
|
|
|
|
nodeTimers.setTimeout(grabLoTWQSL, 10000);
|
2021-06-17 22:56:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function grabLoTWQSO()
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
2021-06-19 01:28:25 +00:00
|
|
|
var dLoTWQSO = Date.parse(dateToISO8601(g_adifLogSettings.lastFetch.lotw_qso, "Z"));
|
2021-06-16 02:03:15 +00:00
|
|
|
var tmpDate = ((new Date().getTime()) - 300);
|
|
|
|
|
2021-06-17 22:56:37 +00:00
|
|
|
if ((g_isGettingLOTW == false) && ((isNaN(dLoTWQSO) == false) && (dLoTWQSO < tmpDate)))
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
2021-06-16 02:03:15 +00:00
|
|
|
// Fetch QSOs
|
2021-06-17 22:56:37 +00:00
|
|
|
lastQSLDateString = "&qso_qsorxsince=" + g_adifLogSettings.lastFetch.lotw_qso;
|
2021-06-13 03:08:47 +00:00
|
|
|
getABuffer(
|
|
|
|
"https://lotw.arrl.org/lotwuser/lotwreport.adi?login=" +
|
2021-06-17 22:56:37 +00:00
|
|
|
lotwLogin.value +
|
|
|
|
"&password=" +
|
|
|
|
encodeURIComponent(lotwPassword.value) +
|
|
|
|
"&qso_query=1&qso_qsl=no&qso_qsldetail=yes&qso_withown=yes" +
|
|
|
|
lastQSLDateString,
|
2021-06-13 03:08:47 +00:00
|
|
|
lotwCallback,
|
2021-06-17 22:56:37 +00:00
|
|
|
false,
|
2021-06-13 03:08:47 +00:00
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
lotwLogImg,
|
|
|
|
"g_isGettingLOTW",
|
|
|
|
120000
|
|
|
|
);
|
2021-06-17 22:56:37 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-16 02:03:15 +00:00
|
|
|
|
2021-06-17 22:56:37 +00:00
|
|
|
function grabLoTWQSL()
|
|
|
|
{
|
2021-06-19 01:28:25 +00:00
|
|
|
var dLoTWQSL = Date.parse(dateToISO8601(g_adifLogSettings.lastFetch.lotw_qsl, "Z"));
|
2021-06-17 22:56:37 +00:00
|
|
|
var tmpDate = ((new Date().getTime()) - 300);
|
|
|
|
|
|
|
|
if ((g_isGettingLOTW == false) && ((isNaN(dLoTWQSL) == false) && (dLoTWQSL < tmpDate)))
|
|
|
|
{
|
|
|
|
lastQSLDateString = "&qso_qslsince=" + g_adifLogSettings.lastFetch.lotw_qsl;
|
|
|
|
getABuffer(
|
|
|
|
"https://lotw.arrl.org/lotwuser/lotwreport.adi?login=" +
|
|
|
|
lotwLogin.value +
|
|
|
|
"&password=" +
|
|
|
|
encodeURIComponent(lotwPassword.value) +
|
|
|
|
"&qso_query=1&qso_qsl=yes&qso_qsldetail=yes&qso_withown=yes" +
|
|
|
|
lastQSLDateString,
|
|
|
|
lotwCallback,
|
|
|
|
false,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
lotwLogImg,
|
|
|
|
"g_isGettingLOTW",
|
|
|
|
120000
|
|
|
|
);
|
Squashed commit of the following:
commit afb25f406b51a9d52d35e25cebb78547c964884a
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Sep 5 21:45:16 2022 -0400
WIP german translation
commit 3abbf5cd5fe89fbe474ade395a1ad2d0ddd8c1b0
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Sep 3 15:06:47 2022 -0400
WIP german translation and some programmatic translation from CR
commit 4c8fcc656b4085e88151cb5a3ce9f6c5e5bf3a21
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 22:14:16 2022 -0500
progress so far, fixed what got broke in CR and fixed being able to close and reopen CR. still need to get i18n figured out
commit 78aaaed2ade1094add163d5850bef6ab1b2226fb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 20:19:09 2022 -0500
one step forward, 2 steps backwards
commit 903319452bf0c5ed8a2da879281d8b08ef7ff05e
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 15 23:23:51 2022 +0200
WIP translating strings in js: roster.js
commit 934f619af63a97363dcff19ef2343b3e12e269ee
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Aug 15 00:06:13 2022 -0500
add JA because may have a JA contributor
commit 8c7bd091acf83b45a8e0957e4990c4660f3673a2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 23:41:29 2022 -0500
all JS files have been passed through, may need another pass through all files though
commit 835892b70b7b229fe0d353831271b21fc2fa716a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 20:03:18 2022 -0500
Finished gt.js tags
commit 404dd1a2477e27b2c665dc3ecaba77dafcc7be20
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 18:10:34 2022 -0500
progress so far (up to line 9871 in gt.js)
commit c59473f8986fab8b2b336f212b0ead9d10617899
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 12:43:01 2022 -0500
add comment between adif and alerts js files in en.json
commit 80cb9d5178a255dcc1a15482b0bcabce1555aa61
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 12:42:27 2022 -0500
Fix Chinese label to a more proper one
commit 08a00eeae86d7d9a97cf17aa6029468024bf6784
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 16:54:32 2022 +0200
moved scripts
commit 8c9569b1c5f6b4d1b4b92db1ce7806b7246862fe
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 16:51:10 2022 +0200
started german translation
commit b857ecf91e97bed0479ca759eddf234da65c5313
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 14 01:37:39 2022 -0500
tags for adif and alerts js files
commit 9c328de842bbe773746beddaeec0d2ea81225752
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 08:23:51 2022 +0200
fixed cn.json additonal keys
commit 7bc459195f8738cf77835329acf962274cd9cc38
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 14 08:20:22 2022 +0200
Revert "fixed CN.json"
This reverts commit f2f71c94dbb8f270aff76223a5d30769d8819b1a.
commit 236bea23bd13324f25cbcdbd39c3ec008a679f10
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 19:02:49 2022 -0500
cleanup and lint
commit a78d32ed1bb5457be0d7e227492cdd1c3e77c431
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 19:01:47 2022 -0500
THis works!
commit edc0d40256b32f81a135f5efc3819c04018774d6
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 18:17:15 2022 -0500
more tweaks trying to make it work
commit f2f71c94dbb8f270aff76223a5d30769d8819b1a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 17:09:39 2022 -0500
fixed CN.json
commit 9b90cf4b142f0c52bd0e4ba7ce926ad145f90ecd
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 16:33:09 2022 -0500
language change so far
commit dd60fc5012fa8f7a8655dacc9b8e0c0237e33f4e
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 13 22:19:25 2022 +0200
added missing keys to cn.json
commit fc5e25c81a7541d2fe03ed9b79950c4ddbd71abb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 15:18:54 2022 -0500
Fixed linting`
commit 485adc6da114a28f58e2d112f5f83f7541af9843
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 14:57:30 2022 -0500
slight cleanup
commit dada794ccdf699fe4eaf179b2cfef2a96e6a82fb
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 13 21:55:55 2022 +0200
fixed cn json
commit 82809c0458e0b99159e87e1d22eba4cde6339015
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Aug 13 14:45:21 2022 -0500
added dropdown for language in settings
commit 3159040b514f497a23b7169fb9512b032ee8b942
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Fri Aug 12 22:29:51 2022 +0200
added raw output of the i18n extractor. needs cleanup
commit 8f31e9e757f6c6a29678f0c0bddad1c6dc360df4
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Thu Aug 11 22:29:12 2022 +0200
added i18n generator script based off of a patch file
commit de81e35754dd2bb4c838aa6c7bf12a2025b1ded1
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 8 22:20:47 2022 +0200
added cascading install for nested package.json
commit bf7ecfeb4f44b0c65bbea0c5a43eb0e809652384
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Mon Aug 8 22:11:18 2022 +0200
added pota key
commit e14bca8172272d4a4f53eb5282d3d5576e057a2a
Merge: f8c7232 91145aa
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 18:39:40 2022 +0000
Merge branch 'master' into 'cbayer-i18n'
Master
See merge request gridtracker.org/gridtracker!182
If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
commit f8c7232c38ea4194fa8f69fe5721a74689b7ef2a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 12:54:04 2022 -0500
add jquery to npm depends
commit 734e972d9e3a66ca8d85debbe1a8f75c6f824020
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Aug 7 12:53:24 2022 -0500
wip, i18n debugging
commit 013d9c8ebfc67f0f4ce8a4df8bea86bf812fd880
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sun Aug 7 10:34:19 2022 +0200
small fixes
commit 8da135bb6db8e15069eefb07397c9ceeee6d8bac
Merge: 0183434 c1f7f1b
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 6 22:39:24 2022 +0200
Merge branch 'master' into cbayer-i18n
commit 0183434bba0d7c6b7652b3b8700bac3630902737
Author: Christian Bayer <chrbayer84@googlemail.com>
Date: Sat Aug 6 22:27:35 2022 +0200
removed banana import
commit 670001a6db028dc93bc56ddb8b29d2e897974ffa
Merge: c120df0 236ff10
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue May 17 18:38:11 2022 -0500
Merge branch 'master' into cbayer-i18n
commit c120df0e3ba77a985fdbd8c9a76028aee9a8d8d0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 15:15:21 2021 -0600
the linter lints
commit 2243beddb2aaa1a163b1ba142a95fce60774e2e7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:39:00 2021 -0600
mostly finished with gridtracker.html file's i18n
commit 33d69c950145dc398d10723f56102dbec77ba0b5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:36:34 2021 -0600
add functions to get acks json off website and overwrite file
commit 98170dce4f1313cbf42bd0ae4bf5d1c490a077da
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 15:02:46 2021 -0600
Initial workup for LoTW throttling & diff fetching
commit 655c0416635c5cafecaa612f8f6fd9a20db21f58
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:31:19 2021 -0600
WIP banana i18n
commit 26495c1f1436e5b99c317d8305101dbecd8f2b95
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Wed Dec 15 11:52:08 2021 -0600
update rpm spec 1.21.1212
commit e00269304da44ea6da20362f96714584164ba8b2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:47:50 2021 -0600
Trigger COPR and AUR repos and build .deb
commit 2b2e660108ca4f000a6ac31c347f80010e7b11b8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Wed Dec 15 11:46:41 2021 -0600
updated changelog / release notes
commit 0265f75fd85509081d5992db0d729149521254f5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 20:48:27 2021 -0600
update changelog
commit cd28c73c8a1dcb569fe3629e03b8d9646c832e5f
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 19:04:23 2021 -0600
update changelog
commit 058dbea415898134f345653532a3789ee7855ef0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 19:03:46 2021 -0600
Fix #76
commit f50ea44466328d0d632955b8a8725bf780417068
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 16:18:51 2021 -0600
update changelog to recent bug fixes
commit 3b0c9b5acc8cf3c57a2b0526451edf8250c11b89
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 16:18:37 2021 -0600
Fix #91
commit d906ee7d5f18e682ab0b47277474170dd89622de
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 15:54:51 2021 -0600
Fixes #107
commit 8252ca3f82843758edf5594d804989c3c4a1d6f0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 12:13:23 2021 -0600
fix hunting
commit c1f3ae9e1c7605a31635bad8ed5e793f8a5d39d1
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 13:09:46 2021 -0500
Really fix roster counts
commit 0054993dc8ab1406da8b0b4644382f453f9b4584
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 11:54:19 2021 -0500
Fix roster counts
commit 69e1152e7883369b3a818f516f3302681800c241
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Dec 13 10:09:19 2021 -0600
update check for bad dxcc
commit a0b2595e9ea38e0a936fb97e691aaa7a7bb2d31e
Author: Sebastian Delmont <sd@notso.net>
Date: Mon Dec 13 11:04:53 2021 -0500
Fixed spot sorting in refactored code
commit 298e8cfbd7b9ee9b4560cb6c66e642e14abcae87
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 16:37:52 2021 -0600
update changelog
commit eb793d5607721231574a301fe1a4ea577628abf8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:47:21 2021 -0600
Update Copyright for 2022
commit 0eb2fac9a0efa2e1b97389a5a09cba4ba83ccfa1
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:46:52 2021 -0600
change vars to lets per Tag's suggestion
commit c78ea075b4f948dc88c91447ff66e471b21cc192
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 15:46:17 2021 -0600
RC build
commit 0c5cde472bffa1d2e2fe502449164aca153dd159
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 04:11:44 2021 +0000
Update .gitlab-ci.yml file
commit 492b791bc058555e49a16616ecb32c3cd9dd4ca4
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 04:10:31 2021 +0000
Update .gitlab-ci.yml
commit e77b9922ed1eea9c0ecd00860a4755b2523dba5b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Nov 16 03:56:53 2021 +0000
Update .gitlab-ci.yml - include security scanning
commit 13c1236f7bf50c60756f1688b061f56d14f3afb9
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:46:20 2021 -0600
Fix acknowledgement icons
commit 28772768e8253edfb6b14b3a97908bf8102ad239
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:45:31 2021 -0600
Add support for Apple Silicon Macs, by hardcoding x64 mode in Phoenix
commit 0cec076dbb43d513ec93a63aaf51cf1423a9ebbb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:45:05 2021 -0600
allow package-lock to be uploaded to repo
commit 8b23a4ef25d12c417747b663334b046b723d703a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 09:11:24 2021 -0600
beta III of call roster testing
commit cc476c84ed84cb7e55e68cf6d482bfdd569f78a0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Dec 12 09:09:57 2021 -0600
if dxcc = -1, no roster
commit ca5a4db664876a48b7d8a5ffaff28d7b067d99d0
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 20:59:15 2021 -0600
beta version for testing fix to CR
commit 5556bbfee08d0d1480d987dc396130cceed6cf20
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 14:31:02 2021 -0600
a few of SD's roster tweaks
commit 2b65f293a788b5c083efd04cfd4c803796df1b03
Author: nr0q <nr0q@gridtracker.org>
Date: Thu Dec 9 13:53:20 2021 -0600
could this cure the free text messages breaking the CR?
commit 43ea47a09d1058baa6bee5a109d7454cab6218c8
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 20:43:48 2021 -0500
roll v for beta build
commit f1d9db2e6fd14362a4fbf4d742be9a95ee871f0e
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 15:17:33 2021 -0500
better handling of /MM so that it doesn't tear a hole in space-time
commit 9fed1b4aca10997081f32e5e1777b52a3072d3d6
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 14:00:29 2021 -0500
remove the exception handler for callObj.style because need to fix the root cause
commit 7a73c988dac34545da26fd4a736a964215ebc872
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 13:31:15 2021 -0500
handle undefined callObj.style
commit 71a2df7e20e8e424aa0ec90ea5d8d9d3492487ff
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 25 12:42:58 2021 -0500
handle bug line 114
commit 8d5117b76b6844df4eeced0e9f0e01d1e28be2e2
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 20:36:10 2021 -0500
inc v for beta 2
commit b199c4c4fad3558843d6d21958761ef6b9996fa7
Author: christian <christian_bay@gmx.de>
Date: Sun Oct 24 21:23:40 2021 -0400
fixed linting
commit 7830e52978f964c5da015b1bb0928f56028c260b
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 20:15:07 2021 -0500
cleaned up linting
commit ac51710ff3fb3d296ddd4edeeff4957e677fb6ec
Author: Christian Bayer <christian_bay@gmx.de>
Date: Sun Oct 24 20:56:21 2021 -0400
fixed reference error on huntedCount
commit 66f7ad87b3d91397cab29bc8c0bcca9e137e682e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:44:39 2021 -0600
fix pack.json and changelog to reflect test V#
commit 7a43853533e364cf85e70262b6573afe47542fbc
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:44:14 2021 -0600
add settings.json to gitignore
commit 4f2ce9d89099b674fed2c5053cc80f7f9866f325
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Oct 21 00:41:12 2021 +0000
Update package.json
commit dbc297a00c6405971219ccba4ad27416ef321282
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:43:52 2021 -0600
Update package.json
commit 6c68a190dbd73b385fbaea9878f513ba0684dc2c
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:43:31 2021 -0600
Update changelog
commit 3125b01a17f9fa4c44ec139a4a58fcd8effbf3cd
Author: christian <christian@t530>
Date: Wed Jul 7 15:08:03 2021 -0400
clear call roster on band change: option added
commit 6f4c15c157ff956352bebd9e20a06610ef3d3196
Author: christian <christian@t530>
Date: Sun Jul 4 23:07:51 2021 -0400
unknown dxxc filter for roster
commit a444d163cae7fd3256992571a2f95b6ac5b921a1
Author: christian <christian@t530>
Date: Thu Jul 1 21:39:50 2021 -0400
fixed other sorts
commit cb73f21a937c95541ca756ee9988d54f8056fd16
Author: christian <christian@t530>
Date: Wed Jun 30 20:37:27 2021 -0400
fixed alert script call
commit 2226f707bd41ab4f271ca3b2c8c72f8028735894
Author: christian <christian@t530>
Date: Wed Jun 30 07:52:36 2021 -0400
fixed dxcc sorting
commit d395b8dd0e0df8fcee8d8da9701428803ef0c5af
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 23:18:43 2021 -0500
tweak for compact mode
commit 86fb507d5a45a3418ae7f98d828e91f74f5af9a9
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 23:08:13 2021 -0500
IT WORKS!
commit d55ac551d1c1d923b184c121af69d065ccc3eb70
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:51:52 2021 -0500
fix grid
commit 0a85e764931371591899a503609bcafb35babb30
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:50:49 2021 -0500
bunch of stuff moved to the right places
commit 68f81c62003e0826f2766b5065f464d008b95db7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:37:49 2021 -0500
fix some small stuff
commit db738a4230fd6d6f79c122643ba48d687da783b7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:26:40 2021 -0500
lost show bands/modes on render call rows
commit 68f7544b1a2e8dfca87bbfc3708aa30aae4b2b31
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:24:32 2021 -0500
fix line 73
commit 95920077bd64eea14a6dee6f4d112f4f65031450
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:21:19 2021 -0500
fix line 34
commit 84059439c1108a083f52aed5b2302adca2bb7ead
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:18:32 2021 -0500
fix broken array
commit 817e9c5e18868bee13b7dfa029b4bbc008ded300
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:12:23 2021 -0500
fix sendAlerts undefined object
commit 7a0b16d262f77dfbaf56bdeb678637f67f4c45a0
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:08:06 2021 -0500
more broke fixed
commit 6a9896ce4112b3b84fb9f1429285885ed5f8085b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 22:00:27 2021 -0500
re-added r_sortFunction that somehow wondered off
commit 856a49b720f41c68b91cb38ca135b82cb5a36e09
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 21:58:05 2021 -0500
fix some more broken stuff
commit 076a7e5eec824af2db9edf8e083807d0dff4fb8d
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 20:42:07 2021 -0500
fixed a bunch of broken refs to rosterSettings
commit 443409b90253c2e45d7d080819286a9b6dd39e88
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 19:19:26 2021 -0500
refactor so far
commit 1f452992861643d61caf5bcf85739c199a28582b
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jun 28 17:26:44 2021 -0500
big roster refactor - starting
Co-authored-by: Sebastian Delmont <sd@notso.net>
Matthew Chambers <nr0q@gridtracker.org>
commit 4ed8b2c3cbd7e1f850256d4589c7cc6621825eed
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 18:46:42 2021 -0500
missing comma line 422
commit b089caf50ad28215280b343eca43e816d0e8aaad
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 18:04:46 2021 -0500
add array with exception test function names, need to create functions yet
commit 0b27feb3677218b7a3185ecb8c187384572451eb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Jun 24 11:06:31 2021 -0500
some notes that might aid in refactoring
commit 0518d6e40caf7cede1b1a3ecced412d910f3bdeb
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:42:44 2021 -0600
add functions to get acks json off website and overwrite file
commit 268459833bdd6bfbb84cd8d05df2a649ab34f1cc
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Thu Dec 16 14:41:03 2021 -0600
Initial workup for LoTW throttling & diff fetching
commit 9330df84f38f9705d8c6f8ff56bd2479cacd108a
Author: nr0q <nr0q@gridtracker.org>
Date: Sun Oct 24 12:59:29 2021 -0500
save work so far
commit 0761163ddd2b851c617ca6d4cc497f32063c2bf6
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 21:54:26 2021 -0500
adding i18n to other html files, need to call scripts I think to make them "work"
commit 3a00b5b3d0bbbdbb494bd90ba8638f9be0434e6a
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 21:16:02 2021 -0500
i18n chat html and format chat.css
commit 220fc036b8b6d200ffbe79a5e293770b9a17d88c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 20:57:05 2021 -0500
refactor chat css into it's own css file, fix linting in gt.js start adding i18n in chat and bandactivity htmls
commit fceaaaa4aa8076ae5dbb544bbe63eef812606503
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 19:39:21 2021 -0500
update all except hover/title elements with i18n in GridTracker.html
commit 215bc2c55c770575a5594a48872b1fb28bb160b1
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 18:28:48 2021 -0500
mostly finished with gridtracker.html file's i18n
commit 9a63953b7d407530cebd9c341ddda3dd08346750
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 17:58:13 2021 -0500
all through Audio Alerts done
commit bbe38ea60d0c7ba8359a4a599ecc2d4e8e8537f7
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 17:05:47 2021 -0500
check in everything up to mid alert settings
commit 99d89f68fca24ded7d4080942aa8303898a3d86c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 13:00:00 2021 -0500
fix badly broken HTML
commit 934f097b7019c9d02e220bd26ab4e2dbf96d252c
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 19 12:39:04 2021 -0500
update through to Lookup tab
commit efd03b85aee05e489a558d3d9769bf524340f769
Author: chrbayer84 <christian_bay@gmx.de>
Date: Wed Sep 29 18:04:22 2021 +0000
Update README.md
commit ac5299cbb516fefce635a5cd99c72048e4bb678d
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Sep 29 12:26:50 2021 -0500
add Getting GridTracker to readme
commit 8f3a7f81ae27b6d7382ac4b75e89f5582c79c4d2
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Sep 28 14:58:22 2021 -0500
copy of NWJS's license
commit 645b2222b084b575b8b0b4fb8ea61be8c972b010
Author: T Loomis <tag.loomis@gmail.com>
Date: Tue Sep 28 19:09:45 2021 +0000
Removed OAMS messaging pop-up reset
commit 17035c84a092be7cabeff4648f9827bc87cf445e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Sep 27 18:04:00 2021 +0000
updated arm to NWJS 0.54.2 with 64 bit capability
rolled to v1.21.0928
commit 75421054f92497a4a8f7466eefa4c30684206ac2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Sep 27 18:00:48 2021 +0000
Treat adif record values as byte length vs string length
commit 44d54dd5dfecb3389317f3c6a88793c38c78f7ff
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Thu Sep 16 20:37:04 2021 -0500
updated V-num for beta build
commit 50c65ac2c4bdc10da679d495f794e4424981f935
Author: jangliss <jon+gh@netdork.net>
Date: Thu Sep 16 20:27:21 2021 -0500
Remove looking at fetched records for last fetch date for LoTW. Use only header
commit 421601e36d3bde33c13ae7646f12d4cc1c617eff
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Sun Aug 29 14:39:18 2021 -0500
new donors yay
commit 3eb3fa4b21f6ab580ed6f1f8cf348b1e6e1fbe2d
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Sat Aug 28 13:06:48 2021 -0500
acks data update
commit cdb524a887cbabfeac288fad2d04f6126665b601
Author: Matthew Chambers <NR0Q@gridtracker.org>
Date: Wed Aug 25 14:38:51 2021 -0500
data update
commit f91cc0968cdb25164894739693c8bfc15aa7af9d
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Mon Jul 5 11:47:16 2021 -0500
acks update 5-july-2021
commit 0ca37bf71eaef8c7423944a478f9b3836d7320c7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Jun 29 16:41:47 2021 -0500
ack update 29 July 2021
commit 53f6168e2363e26c548d108f735805dcfba8330e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Tue Jun 22 11:49:53 2021 -0500
update acknowledgements.json for 6/22/2021
commit 2b79d75f0989c1fcb35ea90d72266e9238bd285e
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Jun 20 13:13:40 2021 -0500
update acknowledgements.json
commit c30d004c69824a71d8391129cf38ece5a84dc3a7
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 16:19:52 2021 -0500
update acknowledgements.json
commit c3bef85eabb56709833ac36fd299cbb90e07aa4f
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 20:58:02 2021 +0000
Update acks json
commit 260e4bc9bc3d15d02b45e5efe0c955c5beaddd27
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 12:01:43 2021 -0500
general updates for new general release
commit fc742c95a868269ff691b0579aef3c61d6643591
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 14:36:13 2021 -0500
fix line 15581
commit 6a04b9cb7bc2c11f458cae3aad8e9569ae7a0a58
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 13:44:44 2021 -0500
more better
commit 229efb099a1688b00af4469d9d5f3b15f067d84a
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 13:26:06 2021 -0500
better get acks code (Thanks Tag)
commit 7b30fb3093212e034ea57f42090f72ec768f6320
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:43:05 2021 -0500
fix missing " around http line 11141
commit 24e180ffdcb34c8f26dcf183607c83f704168695
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:33:04 2021 -0500
call checkForNewAcks when checkForNewVersion
commit e9d9f8b24a3bf927040bd7f77227edcaafd631e8
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 19 11:17:29 2021 -0500
add functions to get acks json off website and overwrite file
commit 56e4d5816918078152fb74ca8a542179d87b6077
Author: jangliss <jon+gh@netdork.net>
Date: Fri Jun 18 20:28:25 2021 -0500
Date.parse behavior to local time instead of UTC
commit 74db81d764f165d1c45aab54cd24137062e7a204
Author: jangliss <jon+gh@netdork.net>
Date: Thu Jun 17 17:56:37 2021 -0500
More LoTW Fixes to do diff fetching
commit cedeef59f878ca42e6190b41d8774ee4ce4eb640
Author: jangliss <jon+gh@netdork.net>
Date: Tue Jun 15 21:03:15 2021 -0500
Initial workup for LoTW throttling & diff fetching
commit 4576c519c85b0445dad7ba655e2d22b387c9a26f
Author: Santiago Mejia <santiago.hi8smx@gmail.com>
Date: Wed Jun 16 19:59:05 2021 +0000
Upload New File
commit f79010707a3fac0e29c63ef1b741a737bcab522c
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 19 15:44:51 2021 -0500
Fix linting warning
commit 9b31e8c1a859fe94109f295f6376d4cffd87a1c2
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sat Jun 12 22:13:03 2021 -0500
update changelog etc for v1.21.0613
commit 3706978e8b45855f70e4c5723898d0797e7066b5
Author: Matthew Chambers <nr0q@gridtracker.org>
Date: Sun Jun 13 03:27:38 2021 +0000
Update acks json
commit bbd17c1e32dc2685a57871a446ee8e3d5bc5b3c9
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 22:20:32 2021 -0500
Linting hates me. Remove space on comment.
commit 80466b0edab9b138fd78c45ef270ce8a7b644fc1
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 22:08:47 2021 -0500
Fix npm wanting a space after comment syntax
commit 5791ba583e4c04de01058807a61af9fb49599114
Author: jangliss <jon+gh@netdork.net>
Date: Sat Jun 12 21:55:50 2021 -0500
Temporarily disable LoTW full downloads on startup
commit d5478ee4ab7730af7eac637f839a05348558b517
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 17:17:41 2021 -0500
small fixes in typos in data-i18n tags
commit ec541a5a835eec2233d752a88b809ff0dbc9e78b
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 14:08:50 2021 -0500
it all works and created es file for Santiago to start on
commit 6c14637639be2e5ff7535c26c5c4f3db07c5add2
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 18 13:51:09 2021 -0500
loading the local file helps, added a statup function to do that
commit 635431735822ad0385fd713c8def0ffd094fd2ec
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Oct 13 16:25:07 2021 -0500
add .vscode to gitignore
commit 27cc542b65cf486a25ba93fb06901ff7b0a888d8
Author: nr0q <nr0q@gridtracker.org>
Date: Wed Oct 13 10:20:55 2021 -0500
finished i18n tags through map vew filters
commit ef4683c8ea3235670509a17b4a2b6108c7d27bab
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 20:23:12 2021 -0500
added data-i18n tags up through mapFilter.mode
commit 0aa862afbe239cd062902804de9ccad95e354839
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 16:49:03 2021 -0500
more data-i18n tags
commit bbd39a640fd5b31366b141bb687fad04b27c64fd
Author: nr0q <nr0q@gridtracker.org>
Date: Tue Oct 12 16:07:39 2021 -0500
adding data-i18n fields to tags
commit 603c8c039d6ba6113cd2de62c994d8c5bba42e08
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 17:37:11 2021 -0500
all HTML files done
commit 7e97e9d2af6db22b95205ace9a00887b493a2be8
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 16:08:52 2021 -0500
i18n up to the about tab
commit 0c65ab8f3ae0b54f80be894067547bbc5674f5d5
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 13:51:09 2021 -0500
i18n en strings through audio settings
commit 39152109a5156f08f4984364a0f7488cd617dd18
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 13:18:35 2021 -0500
cleaner keys
commit 59a93e3f30cabdc7529aef005b085c3a9e582ecf
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 11:46:28 2021 -0500
i18n through control panel
commit 17be5a28434dda24fff0fb7e198cc89ac0bbfb5c
Author: nr0q <nr0q@gridtracker.org>
Date: Mon Oct 11 10:43:25 2021 -0500
check in what I have so far
commit aa65ad9936c7c37ada7b5d8b7263adddf60dec8f
Author: christian <christian@t530>
Date: Sun Jun 13 14:21:43 2021 -0400
added jquery.i18n
commit 9d31645823b45417f393d68951a18b4d05bb8e93
Author: christian <christian@t530>
Date: Wed Jun 9 21:29:23 2021 -0400
i18n hook for main gt.html
commit 7e9e5b9cfe1bdbbee391565f1fda282a27f0bb55
Author: christian <christian@t530>
Date: Mon May 24 21:08:15 2021 -0400
WIP banana i18n
2022-09-06 01:57:15 +00:00
|
|
|
|
|
|
|
// Fetch QSLs
|
|
|
|
var tQSO = setTimeout(function()
|
|
|
|
{
|
|
|
|
if (test == false) lotwLogLoaded = true;
|
|
|
|
getABuffer(
|
|
|
|
"https://lotw.arrl.org/lotwuser/lotwreport.adi?login=" +
|
|
|
|
lotwLogin.value +
|
|
|
|
"&password=" +
|
|
|
|
encodeURIComponent(lotwPassword.value) +
|
|
|
|
"&qso_query=1&qso_qsl=yes&qso_qsldetail=yes&qso_withown=yes" +
|
|
|
|
lastQSLDateString,
|
|
|
|
lotwCallback,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
lotwLogImg,
|
|
|
|
"g_isGettingLOTW",
|
|
|
|
120000
|
|
|
|
);
|
|
|
|
}, 10000);
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function qrzCallback(buffer, flag)
|
|
|
|
{
|
|
|
|
if (buffer.indexOf("invalid api key") > -1)
|
|
|
|
{
|
|
|
|
if (flag) qrzTestResult.innerHTML = "Invalid";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (flag)
|
|
|
|
{
|
|
|
|
qrzTestResult.innerHTML = "Passed";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
var htmlString = String(buffer).replace(/</g, "<");
|
|
|
|
htmlString = htmlString.replace(/>/g, ">");
|
|
|
|
htmlString = htmlString.replace("ADIF=", "QRZ<EOH>\r\n");
|
|
|
|
|
|
|
|
htmlString = cleanAndPrepADIF("qrz.adif", htmlString);
|
|
|
|
|
|
|
|
tryToWriteAdifToDocFolder("qrz.adif", htmlString);
|
|
|
|
|
|
|
|
onAdiLoadComplete(htmlString, true, "qrz.adif", true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var g_isGettingQRZCom = false;
|
|
|
|
function grabQrzComLog(test)
|
|
|
|
{
|
|
|
|
if (g_isGettingQRZCom == false)
|
|
|
|
{
|
|
|
|
var action = "FETCH";
|
|
|
|
if (test)
|
|
|
|
{
|
|
|
|
qrzTestResult.innerHTML = "Testing";
|
|
|
|
action = "STATUS";
|
|
|
|
}
|
|
|
|
|
|
|
|
getABuffer(
|
|
|
|
"https://logbook.qrz.com/api?KEY=" +
|
|
|
|
qrzApiKey.value +
|
|
|
|
"&ACTION=" +
|
|
|
|
action,
|
|
|
|
qrzCallback,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
qrzLogImg,
|
|
|
|
"g_isGettingQRZCom",
|
|
|
|
null
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function ValidateQrzApi(inputText)
|
|
|
|
{
|
|
|
|
inputText.value = inputText.value.toUpperCase();
|
|
|
|
if (inputText.value.length == 19)
|
|
|
|
{
|
|
|
|
var passed = false;
|
|
|
|
var dashcount = 0;
|
|
|
|
for (var i = 0; i < inputText.value.length; i++)
|
|
|
|
{
|
|
|
|
if (inputText.value[i] == "-") dashcount++;
|
|
|
|
}
|
|
|
|
if (dashcount == 3)
|
|
|
|
{
|
|
|
|
passed = true;
|
|
|
|
}
|
|
|
|
if (passed)
|
|
|
|
{
|
|
|
|
inputText.style.color = "#FF0";
|
|
|
|
inputText.style.backgroundColor = "green";
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inputText.style.color = "white";
|
|
|
|
inputText.style.backgroundColor = "red";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inputText.style.color = "white";
|
|
|
|
inputText.style.backgroundColor = "red";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function ValidateText(inputText)
|
|
|
|
{
|
|
|
|
if (inputText.value.length > 0)
|
|
|
|
{
|
|
|
|
inputText.style.color = "#FF0";
|
|
|
|
inputText.style.backgroundColor = "green";
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
inputText.style.color = "white";
|
|
|
|
inputText.style.backgroundColor = "red";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function pskCallback(buffer, flag)
|
|
|
|
{
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
var rawAdiBuffer = String(buffer);
|
|
|
|
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
var g_isGettingPsk = false;
|
|
|
|
|
|
|
|
function grabPsk24()
|
|
|
|
{
|
|
|
|
if (g_isGettingPsk == true) return;
|
|
|
|
|
|
|
|
if (myDEcall.length > 0 && myDEcall != "NOCALL")
|
|
|
|
{
|
|
|
|
var days = 1;
|
|
|
|
if (pskImg.src == 1) days = 7;
|
|
|
|
getABuffer(
|
|
|
|
"https://pskreporter.info/cgi-bin/pskdata.pl?adif=1&days=" +
|
|
|
|
days +
|
|
|
|
"&receiverCallsign=" +
|
|
|
|
myDEcall.toLowerCase(),
|
|
|
|
pskCallback,
|
|
|
|
null,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
pskImg,
|
|
|
|
"g_isGettingPsk"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifMenuCheckBoxChanged(what)
|
|
|
|
{
|
|
|
|
g_adifLogSettings.menu[what.id] = what.checked;
|
|
|
|
var menuItem = what.id + "Div";
|
|
|
|
if (what.checked == true)
|
|
|
|
{
|
|
|
|
document.getElementById(menuItem).style.display = "inline-block";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
document.getElementById(menuItem).style.display = "none";
|
|
|
|
}
|
|
|
|
|
|
|
|
localStorage.adifLogSettings = JSON.stringify(g_adifLogSettings);
|
|
|
|
|
|
|
|
if (what == buttonAdifCheckBox) setAdifStartup(loadAdifCheckBox);
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifStartupCheckBoxChanged(what)
|
|
|
|
{
|
|
|
|
g_adifLogSettings.startup[what.id] = what.checked;
|
|
|
|
localStorage.adifLogSettings = JSON.stringify(g_adifLogSettings);
|
|
|
|
|
|
|
|
if (what == loadAdifCheckBox) setAdifStartup(loadAdifCheckBox);
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifLogQsoCheckBoxChanged(what)
|
|
|
|
{
|
|
|
|
g_adifLogSettings.qsolog[what.id] = what.checked;
|
|
|
|
if (what.id == "logLOTWqsoCheckBox")
|
|
|
|
{
|
|
|
|
if (what.checked == true)
|
|
|
|
{
|
|
|
|
lotwUpload.style.display = "inline-block";
|
|
|
|
trustedTestButton.style.display = "inline-block";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lotwUpload.style.display = "none";
|
|
|
|
trustedTestButton.style.display = "none";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
localStorage.adifLogSettings = JSON.stringify(g_adifLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifNicknameCheckBoxChanged(what)
|
|
|
|
{
|
|
|
|
g_adifLogSettings.nickname[what.id] = what.checked;
|
|
|
|
if (what.id == "nicknameeQSLCheckBox")
|
|
|
|
{
|
|
|
|
if (what.checked == true)
|
|
|
|
{
|
|
|
|
eQSLNickname.style.display = "inline-block";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
eQSLNickname.style.display = "none";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
localStorage.adifLogSettings = JSON.stringify(g_adifLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifTextValueChange(what)
|
|
|
|
{
|
|
|
|
what.value = what.value.trim();
|
|
|
|
g_adifLogSettings.text[what.id] = what.value;
|
|
|
|
localStorage.adifLogSettings = JSON.stringify(g_adifLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
var fileSelector = document.createElement("input");
|
|
|
|
fileSelector.setAttribute("type", "file");
|
|
|
|
fileSelector.setAttribute("accept", ".adi,.adif");
|
|
|
|
fileSelector.onchange = function ()
|
|
|
|
{
|
|
|
|
if (this.files && this.files[0])
|
|
|
|
{
|
|
|
|
let path = this.value.replace(this.files[0].name, "");
|
|
|
|
fileSelector.setAttribute("nwworkingdir", path);
|
|
|
|
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onload = function (e)
|
|
|
|
{
|
|
|
|
if (e.target.error == null)
|
|
|
|
{
|
|
|
|
onAdiLoadComplete(e.target.result, false);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
reader.readAsText(this.files[0]);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function adifLoadDialog()
|
|
|
|
{
|
|
|
|
var exists = fileSelector.getAttribute("nwworkingdir");
|
|
|
|
|
|
|
|
fileSelector.setAttribute("nwworkingdir", g_appData);
|
|
|
|
|
|
|
|
fileSelector.click();
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
var startupFileSelector = document.createElement("input");
|
|
|
|
startupFileSelector.setAttribute("type", "file");
|
|
|
|
startupFileSelector.setAttribute("accept", ".adi,.adif");
|
|
|
|
startupFileSelector.onchange = function ()
|
|
|
|
{
|
|
|
|
if (this.files && this.files[0])
|
|
|
|
{
|
|
|
|
for (var i in g_startupLogs)
|
|
|
|
{
|
|
|
|
if (this.value == g_startupLogs[i].file) return;
|
|
|
|
}
|
|
|
|
var newObject = Object();
|
|
|
|
newObject.name = this.files[0].name;
|
|
|
|
newObject.file = this.value;
|
|
|
|
g_startupLogs.push(newObject);
|
|
|
|
localStorage.startupLogs = JSON.stringify(g_startupLogs);
|
|
|
|
|
|
|
|
let path = this.value.replace(this.files[0].name, "");
|
|
|
|
startupFileSelector.setAttribute("nwworkingdir", path);
|
|
|
|
|
|
|
|
setAdifStartup(loadAdifCheckBox);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function start_and_end(str)
|
|
|
|
{
|
|
|
|
if (str.length > 31)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
str.substr(0, 16) + " ... " + str.substr(str.length - 15, str.length)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setFileSelectors()
|
|
|
|
{
|
|
|
|
selectStartupLink = document.getElementById("selectAdifButton");
|
|
|
|
selectStartupLink.onclick = function ()
|
|
|
|
{
|
|
|
|
var exists = startupFileSelector.getAttribute("nwworkingdir");
|
|
|
|
if (exists == null)
|
|
|
|
{
|
|
|
|
if (g_workingIniPath.length > 1)
|
|
|
|
{ startupFileSelector.setAttribute("nwworkingdir", g_appData); }
|
|
|
|
}
|
|
|
|
|
|
|
|
startupFileSelector.click();
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
selectTqsl = document.getElementById("selectTQSLButton");
|
|
|
|
selectTqsl.onclick = function ()
|
|
|
|
{
|
|
|
|
tqslFileSelector.click();
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
lotwUpload.prepend(selectTqsl);
|
|
|
|
}
|
|
|
|
|
|
|
|
var tqslFileSelector = document.createElement("input");
|
|
|
|
tqslFileSelector.setAttribute("type", "file");
|
|
|
|
tqslFileSelector.setAttribute("accept", "*");
|
|
|
|
tqslFileSelector.onchange = function ()
|
|
|
|
{
|
|
|
|
if (this.files && this.files[0])
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = this.files[0].path;
|
|
|
|
var fs = require("fs");
|
|
|
|
|
|
|
|
if (
|
|
|
|
fs.existsSync(g_trustedQslSettings.binaryFile) &&
|
|
|
|
(g_trustedQslSettings.binaryFile.endsWith("tqsl.exe") ||
|
|
|
|
g_trustedQslSettings.binaryFile.endsWith("tqsl"))
|
|
|
|
)
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else g_trustedQslSettings.binaryFileValid = false;
|
|
|
|
|
|
|
|
if (g_trustedQslSettings.binaryFileValid == true)
|
|
|
|
{
|
|
|
|
tqslFileDiv.style.backgroundColor = "blue";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tqslFileDiv.style.backgroundColor = "red";
|
|
|
|
}
|
|
|
|
|
|
|
|
tqslFileDiv.innerHTML = "<b>" + start_and_end(this.files[0].path) + "</b>";
|
|
|
|
localStorage.trustedQslSettings = JSON.stringify(g_trustedQslSettings);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function loadGtQSOLogFile()
|
|
|
|
{
|
|
|
|
var fs = require("fs");
|
|
|
|
|
|
|
|
if (fs.existsSync(g_qsoLogFile))
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = fs.readFileSync(g_qsoLogFile);
|
|
|
|
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-16 02:03:15 +00:00
|
|
|
var lotwLogLoaded = false;
|
|
|
|
function loadLoTWLogFile()
|
|
|
|
{
|
|
|
|
var fs = require("fs");
|
|
|
|
|
|
|
|
if (fs.existsSync(g_LoTWLogFile))
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = fs.readFileSync(g_LoTWLogFile);
|
|
|
|
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, false);
|
|
|
|
lotwLogLoaded = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-13 03:08:47 +00:00
|
|
|
function loadWsjtLogFile()
|
|
|
|
{
|
|
|
|
var fs = require("fs");
|
|
|
|
if (fs.existsSync(g_workingIniPath + "wsjtx_log.adi"))
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = fs.readFileSync(g_workingIniPath + "wsjtx_log.adi");
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function findTrustedQSLPaths()
|
|
|
|
{
|
|
|
|
var process = require("process");
|
|
|
|
var base = null;
|
|
|
|
|
|
|
|
if (g_trustedQslSettings.stationFileValid == true)
|
|
|
|
{
|
|
|
|
// double check the presence of the station_data;
|
|
|
|
if (!fs.existsSync(g_trustedQslSettings.stationFile))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.stationFileValid = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g_trustedQslSettings.stationFileValid == false)
|
|
|
|
{
|
|
|
|
if (g_platform == "windows")
|
|
|
|
{
|
|
|
|
base = process.env.APPDATA + "\\TrustedQSL\\station_data";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.stationFile = base;
|
|
|
|
g_trustedQslSettings.stationFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base = process.env.LOCALAPPDATA + "\\TrustedQSL\\station_data";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.stationFile = base;
|
|
|
|
g_trustedQslSettings.stationFileValid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base = process.env.HOME + "/.tqsl/station_data";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.stationFile = base;
|
|
|
|
g_trustedQslSettings.stationFileValid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g_trustedQslSettings.stationFileValid == true)
|
|
|
|
{
|
|
|
|
var validate = false;
|
|
|
|
var option = document.createElement("option");
|
|
|
|
option.value = "";
|
|
|
|
option.text = "Select a Station";
|
|
|
|
lotwStation.appendChild(option);
|
|
|
|
|
|
|
|
var buffer = fs.readFileSync(g_trustedQslSettings.stationFile, "UTF-8");
|
|
|
|
parser = new DOMParser();
|
|
|
|
xmlDoc = parser.parseFromString(buffer, "text/xml");
|
|
|
|
var x = xmlDoc.getElementsByTagName("StationData");
|
|
|
|
for (var i = 0; i < x.length; i++)
|
|
|
|
{
|
|
|
|
option = document.createElement("option");
|
|
|
|
option.value = x[i].getAttribute("name");
|
|
|
|
option.text = x[i].getAttribute("name");
|
|
|
|
if (option.value == g_adifLogSettings.text.lotwStation)
|
|
|
|
{
|
|
|
|
option.selected = true;
|
|
|
|
validate = true;
|
|
|
|
}
|
|
|
|
lotwStation.appendChild(option);
|
|
|
|
}
|
|
|
|
if (validate)
|
|
|
|
{
|
|
|
|
ValidateText(lotwStation);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g_trustedQslSettings.binaryFileValid == true)
|
|
|
|
{
|
|
|
|
// double check the presence of the TrustedQSL binary;
|
|
|
|
if (!fs.existsSync(g_trustedQslSettings.binaryFile))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFileValid = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g_trustedQslSettings.binaryFileValid == false || g_platform == "mac")
|
|
|
|
{
|
|
|
|
if (g_platform == "windows")
|
|
|
|
{
|
|
|
|
base = process.env["ProgramFiles(x86)"] + "\\TrustedQSL\\tqsl.exe";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (g_platform == "mac")
|
|
|
|
{
|
|
|
|
base = "/Applications/TrustedQSL/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base =
|
|
|
|
process.env.HOME +
|
|
|
|
"/Applications/TrustedQSL/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base =
|
|
|
|
process.env.HOME + "/Applications/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base = "/Applications/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base =
|
|
|
|
process.env.HOME +
|
|
|
|
"/Desktop/TrustedQSL/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base =
|
|
|
|
process.env.HOME +
|
|
|
|
"/Applications/Ham Radio/tqsl.app/Contents/MacOS/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (g_platform == "linux")
|
|
|
|
{
|
|
|
|
base = "/usr/bin/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
base = "/usr/local/bin/tqsl";
|
|
|
|
if (fs.existsSync(base))
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFile = base;
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
localStorage.trustedQslSettings = JSON.stringify(g_trustedQslSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function startupAdifLoadFunction()
|
|
|
|
{
|
|
|
|
var fs = require("fs");
|
|
|
|
|
|
|
|
for (var i in g_startupLogs)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (fs.existsSync(g_startupLogs[i].file))
|
|
|
|
{
|
|
|
|
var rawAdiBuffer = fs.readFileSync(g_startupLogs[i].file);
|
|
|
|
g_fromDirectCallNoFileDialog = true;
|
|
|
|
onAdiLoadComplete(rawAdiBuffer, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e) {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setAdifStartup(checkbox)
|
|
|
|
{
|
|
|
|
if (g_trustedQslSettings.binaryFile == null)
|
|
|
|
{ g_trustedQslSettings.binaryFile = ""; }
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_trustedQslSettings.binaryFile.endsWith("tqsl.exe") ||
|
|
|
|
g_trustedQslSettings.binaryFile.endsWith("tqsl")
|
|
|
|
)
|
|
|
|
{
|
|
|
|
g_trustedQslSettings.binaryFileValid = true;
|
|
|
|
}
|
|
|
|
else g_trustedQslSettings.binaryFileValid = false;
|
|
|
|
|
|
|
|
if (g_trustedQslSettings.binaryFileValid == true)
|
|
|
|
{
|
|
|
|
tqslFileDiv.style.backgroundColor = "blue";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tqslFileDiv.style.backgroundColor = "red";
|
|
|
|
}
|
|
|
|
tqslFileDiv.innerHTML =
|
|
|
|
"<b>" + start_and_end(g_trustedQslSettings.binaryFile) + "</b>";
|
|
|
|
|
|
|
|
if (buttonAdifCheckBox.checked || loadAdifCheckBox.checked)
|
|
|
|
{
|
|
|
|
var worker = "";
|
|
|
|
if (g_startupLogs.length > 0)
|
|
|
|
{
|
|
|
|
worker += "<table class='darkTable'>";
|
|
|
|
for (var i in g_startupLogs)
|
|
|
|
{
|
|
|
|
worker +=
|
|
|
|
"<tr title='" +
|
|
|
|
g_startupLogs[i].file +
|
|
|
|
"'><td>" +
|
|
|
|
g_startupLogs[i].name +
|
|
|
|
"</td><td onclick='removeStartupLog(" +
|
|
|
|
i +
|
|
|
|
")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px;cursor:pointer'></td></tr>";
|
|
|
|
}
|
|
|
|
worker += "</table>";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
worker = "No file(s) selected";
|
|
|
|
}
|
|
|
|
startupLogFileDiv.innerHTML = worker;
|
|
|
|
selectFileOnStartupDiv.style.display = "block";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
startupLogFileDiv.innerHTML = "No file(s) selected";
|
|
|
|
startupFileSelector.setAttribute("type", "");
|
|
|
|
startupFileSelector.setAttribute("type", "file");
|
|
|
|
startupFileSelector.setAttribute("accept", ".adi*");
|
|
|
|
startupFileSelector.value = null;
|
|
|
|
selectFileOnStartupDiv.style.display = "none";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function removeStartupLog(i)
|
|
|
|
{
|
|
|
|
if (i in g_startupLogs)
|
|
|
|
{
|
|
|
|
g_startupLogs.splice(i, 1);
|
|
|
|
localStorage.startupLogs = JSON.stringify(g_startupLogs);
|
|
|
|
setAdifStartup(loadAdifCheckBox);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function startupAdifLoadCheck()
|
|
|
|
{
|
|
|
|
logEventMedia.value = g_alertSettings.logEventMedia;
|
|
|
|
|
|
|
|
loadWsjtLogFile();
|
|
|
|
|
|
|
|
if (loadGTCheckBox.checked == true) loadGtQSOLogFile();
|
|
|
|
|
|
|
|
if (loadAdifCheckBox.checked == true && g_startupLogs.length > 0)
|
|
|
|
{ startupAdifLoadFunction(); }
|
|
|
|
|
|
|
|
if (g_mapSettings.offlineMode == false)
|
|
|
|
{
|
|
|
|
if (g_appSettings.gtFlagImgSrc == 1) showGtFlags();
|
|
|
|
|
2021-06-16 02:03:15 +00:00
|
|
|
if (loadLOTWCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
loadLoTWLogFile();
|
|
|
|
grabLOtWLog(false);
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
|
|
|
|
if (loadQRZCheckBox.checked == true) grabQrzComLog(false);
|
|
|
|
|
|
|
|
if (loadClubCheckBox.checked == true) grabClubLog(false);
|
|
|
|
|
|
|
|
if (loadPsk24CheckBox.checked == true) grabPsk24();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getABuffer(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
imgToGray,
|
|
|
|
stringOfFlag,
|
|
|
|
timeoutX
|
|
|
|
)
|
|
|
|
{
|
|
|
|
let url = require("url");
|
|
|
|
let http = require(mode);
|
|
|
|
let fileBuffer = null;
|
|
|
|
let options = null;
|
|
|
|
|
|
|
|
options = {
|
|
|
|
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
|
|
|
port: port,
|
|
|
|
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
|
|
|
method: "get"
|
|
|
|
};
|
|
|
|
|
|
|
|
if (typeof stringOfFlag != "undefined") window[stringOfFlag] = true;
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background =
|
|
|
|
"linear-gradient(grey 0%, black 0% 100% )";
|
|
|
|
imgToGray.style.webkitFilter = "invert(100%) grayscale(1)";
|
|
|
|
}
|
|
|
|
|
|
|
|
let req = http.request(options, function (res)
|
|
|
|
{
|
|
|
|
let fsize = res.headers["content-length"];
|
|
|
|
let cookies = null;
|
|
|
|
if (typeof res.headers["set-cookie"] != "undefined")
|
|
|
|
{ cookies = res.headers["set-cookie"]; }
|
|
|
|
|
|
|
|
res
|
|
|
|
.on("data", function (data)
|
|
|
|
{
|
|
|
|
if (fileBuffer == null) fileBuffer = data;
|
|
|
|
else fileBuffer += data;
|
|
|
|
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
let percent = 0;
|
|
|
|
if (fsize > 0) percent = parseInt((fileBuffer.length / fsize) * 100);
|
|
|
|
else percent = parseInt(((fileBuffer.length / 100000) * 100) % 100);
|
|
|
|
imgToGray.parentNode.style.background =
|
|
|
|
"linear-gradient(grey " +
|
|
|
|
percent +
|
|
|
|
"%, black " +
|
|
|
|
Number(percent + 10) +
|
|
|
|
"% 100% )";
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on("end", function ()
|
|
|
|
{
|
|
|
|
if (typeof stringOfFlag != "undefined")
|
|
|
|
{
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
}
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
2021-06-17 22:56:37 +00:00
|
|
|
if (typeof callback === "function")
|
|
|
|
{
|
|
|
|
// Call it, since we have confirmed it is callable
|
|
|
|
callback(fileBuffer, flag, cookies);
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
})
|
|
|
|
.on("error", function ()
|
|
|
|
{
|
|
|
|
if (typeof stringOfFlag != "undefined")
|
|
|
|
{
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
}
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
req.on("socket", function (socket)
|
|
|
|
{
|
|
|
|
socket.on("timeout", function ()
|
|
|
|
{
|
|
|
|
req.abort();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
req.on("error", function ()
|
|
|
|
{
|
|
|
|
if (typeof stringOfFlag != "undefined")
|
|
|
|
{
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
}
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
req.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
function getAPostBuffer(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
imgToGray,
|
|
|
|
stringOfFlag
|
|
|
|
)
|
|
|
|
{
|
|
|
|
var querystring = require("querystring");
|
|
|
|
var postData = querystring.stringify(theData);
|
|
|
|
var url = require("url");
|
|
|
|
var http = require(mode);
|
|
|
|
var fileBuffer = null;
|
|
|
|
|
|
|
|
var options = {
|
|
|
|
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
|
|
|
port: port,
|
|
|
|
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
|
|
|
method: "post",
|
|
|
|
headers: {
|
|
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
|
|
"Content-Length": postData.length
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
window[stringOfFlag] = true;
|
|
|
|
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background =
|
|
|
|
"linear-gradient(grey 0%, black 0% 100% )";
|
|
|
|
imgToGray.style.webkitFilter = "invert(100%) grayscale(1)";
|
|
|
|
}
|
|
|
|
|
|
|
|
var req = http.request(options, function (res)
|
|
|
|
{
|
|
|
|
var fsize = res.headers["content-length"];
|
|
|
|
var cookies = null;
|
|
|
|
if (typeof res.headers["set-cookie"] != "undefined")
|
|
|
|
{ cookies = res.headers["set-cookie"]; }
|
|
|
|
|
|
|
|
res
|
|
|
|
.on("data", function (data)
|
|
|
|
{
|
|
|
|
if (fileBuffer == null) fileBuffer = data;
|
|
|
|
else fileBuffer += data;
|
|
|
|
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
var percent = 0;
|
|
|
|
if (fsize > 0) percent = parseInt((fileBuffer.length / fsize) * 100);
|
|
|
|
else percent = parseInt(((fileBuffer.length / 100000) * 100) % 100);
|
|
|
|
|
|
|
|
imgToGray.parentNode.style.background =
|
|
|
|
"linear-gradient(grey " +
|
|
|
|
percent +
|
|
|
|
"%, black " +
|
|
|
|
Number(percent + 10) +
|
|
|
|
"% 100% )";
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on("end", function ()
|
|
|
|
{
|
|
|
|
if (typeof callback === "function")
|
|
|
|
{
|
|
|
|
// Call it, since we have confirmed it is callable
|
|
|
|
callback(fileBuffer, flag, cookies);
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on("error", function ()
|
|
|
|
{
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
req.on("socket", function (socket)
|
|
|
|
{
|
|
|
|
socket.on("timeout", function ()
|
|
|
|
{
|
|
|
|
req.abort();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
req.on("error", function (err) // eslint-disable-line node/handle-callback-err
|
|
|
|
{
|
|
|
|
window[stringOfFlag] = false;
|
|
|
|
if (typeof imgToGray != "undefined")
|
|
|
|
{
|
|
|
|
imgToGray.parentNode.style.background = "";
|
|
|
|
imgToGray.style.webkitFilter = "";
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
req.write(postData);
|
|
|
|
req.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendUdpMessage(msg, length, port, address)
|
|
|
|
{
|
|
|
|
var dgram = require("dgram");
|
|
|
|
var socket = dgram.createSocket({ type: "udp4", reuseAddr: true });
|
|
|
|
socket.send(msg, 0, length, port, address, (err) => // eslint-disable-line node/handle-callback-err
|
|
|
|
{
|
|
|
|
socket.close();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendTcpMessage(msg, length, port, address)
|
|
|
|
{
|
|
|
|
var net = require("net");
|
|
|
|
var client = new net.Socket();
|
|
|
|
client.setTimeout(30000);
|
|
|
|
client.connect(port, address, function ()
|
|
|
|
{
|
2021-09-27 18:00:48 +00:00
|
|
|
client.write(Buffer.from(msg, "utf-8"));
|
2021-06-13 03:08:47 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
client.on("close", function () {});
|
|
|
|
}
|
|
|
|
|
|
|
|
function valueToAdiField(field, value)
|
|
|
|
{
|
|
|
|
var adi = "<" + field + ":";
|
2021-09-27 18:00:48 +00:00
|
|
|
adi += Buffer.byteLength(String(value)) + ">";
|
2021-06-13 03:08:47 +00:00
|
|
|
adi += String(value) + " ";
|
|
|
|
return adi;
|
|
|
|
}
|
|
|
|
|
|
|
|
function pad(value)
|
|
|
|
{
|
|
|
|
if (value < 10)
|
|
|
|
{
|
|
|
|
return "0" + value;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function HMSfromMilli(milli)
|
|
|
|
{
|
|
|
|
var seconds = parseInt(milli / 1000);
|
|
|
|
var days = Math.floor(seconds / (3600 * 24));
|
|
|
|
seconds -= days * 3600 * 24;
|
|
|
|
var hrs = Math.floor(seconds / 3600);
|
|
|
|
seconds -= hrs * 3600;
|
|
|
|
var mnts = Math.floor(seconds / 60);
|
|
|
|
seconds -= mnts * 60;
|
|
|
|
|
|
|
|
val = String(pad(hrs)) + String(pad(mnts)) + String(pad(seconds));
|
|
|
|
return String(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
function colonHMSfromMilli(milli)
|
|
|
|
{
|
|
|
|
var seconds = parseInt(milli / 1000);
|
|
|
|
var days = Math.floor(seconds / (3600 * 24));
|
|
|
|
seconds -= days * 3600 * 24;
|
|
|
|
var hrs = Math.floor(seconds / 3600);
|
|
|
|
seconds -= hrs * 3600;
|
|
|
|
var mnts = Math.floor(seconds / 60);
|
|
|
|
seconds -= mnts * 60;
|
|
|
|
|
|
|
|
val = String(pad(hrs)) + ":" + String(pad(mnts)) + ":" + String(pad(seconds));
|
|
|
|
return String(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
function colonHMSfromSeconds(secondsIn)
|
|
|
|
{
|
|
|
|
var seconds = secondsIn;
|
|
|
|
var days = Math.floor(seconds / (3600 * 24));
|
|
|
|
seconds -= days * 3600 * 24;
|
|
|
|
var hrs = Math.floor(seconds / 3600);
|
|
|
|
seconds -= hrs * 3600;
|
|
|
|
var mnts = Math.floor(seconds / 60);
|
|
|
|
seconds -= mnts * 60;
|
|
|
|
|
|
|
|
val = String(pad(hrs)) + ":" + String(pad(mnts)) + ":" + String(pad(seconds));
|
|
|
|
return String(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
function convertToDate(julian)
|
|
|
|
{
|
|
|
|
var DAY = 86400000;
|
|
|
|
var HALF_DAY = DAY / 2;
|
|
|
|
var UNIX_EPOCH_JULIAN_DATE = 2440587.5;
|
|
|
|
var UNIX_EPOCH_JULIAN_DAY = 2440587;
|
|
|
|
return new Date((Number(julian) - UNIX_EPOCH_JULIAN_DATE) * DAY);
|
|
|
|
}
|
|
|
|
|
|
|
|
var CLk = "25bc718451a71954cb6d0d1b50541dd45d4ba148";
|
|
|
|
|
2022-09-14 01:15:49 +00:00
|
|
|
var g_lastReport = "";
|
2021-06-13 03:08:47 +00:00
|
|
|
|
|
|
|
var g_oldStyleLogMessage = null;
|
|
|
|
|
|
|
|
function oldSendToLogger()
|
|
|
|
{
|
|
|
|
var newMessage = Object.assign({}, g_oldStyleLogMessage);
|
|
|
|
|
|
|
|
var band = Number(newMessage.Frequency / 1000000).formatBand();
|
|
|
|
|
|
|
|
if (
|
|
|
|
newMessage.DXGrid.length == 0 &&
|
|
|
|
newMessage.DXCall + band + newMessage.MO in g_liveCallsigns
|
|
|
|
)
|
|
|
|
{
|
|
|
|
newMessage.DXGrid = g_liveCallsigns[
|
|
|
|
newMessage.DXCall + band + newMessage.MO
|
|
|
|
].grid.substr(0, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
var report = "<EOH>";
|
|
|
|
|
|
|
|
report += valueToAdiField(
|
|
|
|
"BAND",
|
|
|
|
Number(newMessage.Frequency / 1000000).formatBand()
|
|
|
|
);
|
|
|
|
report += valueToAdiField("CALL", newMessage.DXCall.toUpperCase());
|
|
|
|
report += valueToAdiField(
|
|
|
|
"FREQ",
|
|
|
|
Number(newMessage.Frequency / 1000000).toFixed(6)
|
|
|
|
);
|
|
|
|
report += valueToAdiField("MODE", newMessage.MO.toUpperCase());
|
|
|
|
var date = convertToDate(parseInt(newMessage.DateOn));
|
|
|
|
var dataString =
|
|
|
|
date.getUTCFullYear() +
|
|
|
|
("0" + (date.getUTCMonth() + 1)).slice(-2) +
|
|
|
|
("0" + date.getUTCDate()).slice(-2);
|
|
|
|
report += valueToAdiField("QSO_DATE", dataString);
|
|
|
|
report += valueToAdiField("TIME_ON", HMSfromMilli(newMessage.TimeOn));
|
|
|
|
|
|
|
|
date = convertToDate(parseInt(newMessage.DateOff));
|
|
|
|
dataString =
|
|
|
|
date.getUTCFullYear() +
|
|
|
|
("0" + (date.getUTCMonth() + 1)).slice(-2) +
|
|
|
|
("0" + date.getUTCDate()).slice(-2);
|
|
|
|
report += valueToAdiField("QSO_DATE_OFF", dataString);
|
|
|
|
report += valueToAdiField("TIME_OFF", HMSfromMilli(newMessage.TimeOff));
|
|
|
|
|
|
|
|
report += valueToAdiField("RST_RCVD", newMessage.ReportRecieved);
|
|
|
|
report += valueToAdiField("RST_SENT", newMessage.ReportSend);
|
|
|
|
report += valueToAdiField("TX_PWR", parseInt(newMessage.TXPower));
|
|
|
|
report += valueToAdiField("GRIDSQUARE", newMessage.DXGrid);
|
|
|
|
|
|
|
|
if (newMessage.Comments.length > 0)
|
|
|
|
{ report += valueToAdiField("COMMENT", newMessage.Comments); }
|
|
|
|
|
|
|
|
if (newMessage.Name.length > 0)
|
|
|
|
{ report += valueToAdiField("NAME", newMessage.Name); }
|
|
|
|
|
|
|
|
if (newMessage.Operatorcall.length > 0)
|
|
|
|
{
|
|
|
|
report += valueToAdiField("OPERATOR", newMessage.Operatorcall);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newMessage.Mycall.length > 0)
|
|
|
|
{
|
|
|
|
report += valueToAdiField("STATION_CALLSIGN", newMessage.Mycall);
|
|
|
|
}
|
|
|
|
else if (myDEcall != "NOCALL" && myDEcall.length > 0)
|
|
|
|
{ report += valueToAdiField("STATION_CALLSIGN", myDEcall); }
|
|
|
|
|
|
|
|
if (newMessage.Mygrid.length > 0)
|
|
|
|
{
|
|
|
|
report += valueToAdiField("MY_GRIDSQUARE", newMessage.Mygrid);
|
|
|
|
}
|
|
|
|
else if (myDEGrid.length > 1)
|
|
|
|
{ report += valueToAdiField("MY_GRIDSQUARE", myDEGrid); }
|
|
|
|
|
|
|
|
report += "<EOR>";
|
|
|
|
|
|
|
|
sendToLogger(report);
|
|
|
|
}
|
|
|
|
|
|
|
|
var g_adifLookupMap = {
|
|
|
|
name: "NAME",
|
|
|
|
iota: "IOTA",
|
|
|
|
sota: "SOTA_REF",
|
|
|
|
continent: "CONT",
|
|
|
|
cqzone: "CQZ",
|
|
|
|
ituzone: "ITUZ",
|
|
|
|
email: "EMAIL",
|
|
|
|
county: "CNTY"
|
|
|
|
};
|
|
|
|
|
|
|
|
function sendToLogger(ADIF)
|
|
|
|
{
|
|
|
|
let regex = new RegExp("<EOH>", "i");
|
|
|
|
let record = parseADIFRecord(ADIF.split(regex)[1]);
|
|
|
|
let localMode = record.MODE;
|
|
|
|
|
|
|
|
if (localMode == "MFSK" && "SUBMODE" in record)
|
|
|
|
{
|
|
|
|
localMode = record.SUBMODE;
|
|
|
|
}
|
|
|
|
|
2022-09-29 22:52:18 +00:00
|
|
|
let localHash = record.CALL + record.BAND + localMode;
|
2021-06-13 03:08:47 +00:00
|
|
|
if (
|
|
|
|
(!("GRIDSQUARE" in record) || record.GRIDSQUARE.length == 0) &&
|
2022-09-29 22:52:18 +00:00
|
|
|
localHash in g_liveCallsigns
|
2021-06-13 03:08:47 +00:00
|
|
|
)
|
|
|
|
{
|
2022-09-29 22:52:18 +00:00
|
|
|
record.GRIDSQUARE = g_liveCallsigns[localHash].grid.substr(0, 4);
|
|
|
|
}
|
|
|
|
|
2022-10-02 04:23:27 +00:00
|
|
|
if (g_appSettings.potaEnabled == 1 && localHash in g_liveCallsigns && g_liveCallsigns[localHash].pota.length > 0)
|
2022-09-29 22:52:18 +00:00
|
|
|
{
|
|
|
|
let pota = g_liveCallsigns[localHash].pota[0];
|
|
|
|
if (pota != "?-????")
|
|
|
|
{
|
|
|
|
record.POTA = pota;
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ("TX_PWR" in record)
|
|
|
|
{
|
|
|
|
record.TX_PWR = String(parseInt(record.TX_PWR));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
(!("STATION_CALLSIGN" in record) ||
|
|
|
|
record.STATION_CALLSIGN.length == 0) &&
|
|
|
|
myDEcall != "NOCALL" &&
|
|
|
|
myDEcall.length > 0
|
|
|
|
)
|
|
|
|
{
|
|
|
|
record.STATION_CALLSIGN = myDEcall;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
(!("MY_GRIDSQUARE" in record) || record.MY_GRIDSQUARE.length == 0) &&
|
|
|
|
myDEGrid.length > 1
|
|
|
|
)
|
|
|
|
{
|
|
|
|
record.MY_GRIDSQUARE = myDEGrid;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!("DXCC" in record))
|
|
|
|
{
|
|
|
|
let dxcc = callsignToDxcc(record.CALL);
|
|
|
|
if (dxcc == -1) dxcc = 0;
|
|
|
|
record.DXCC = String(dxcc);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tag: This is going to bite us in the butt later, but leaving it alone.
|
|
|
|
if (!("COUNTRY" in record) && Number(record.DXCC) > 0)
|
|
|
|
{
|
|
|
|
record.COUNTRY = g_dxccToADIFName[Number(record.DXCC)];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g_appSettings.lookupMerge == true)
|
|
|
|
{
|
|
|
|
let request = g_Idb
|
|
|
|
.transaction(["lookups"], "readwrite")
|
|
|
|
.objectStore("lookups")
|
|
|
|
.get(record.CALL);
|
|
|
|
|
|
|
|
request.onsuccess = function (event)
|
|
|
|
{
|
|
|
|
if (request.result)
|
|
|
|
{
|
|
|
|
let lookup = request.result;
|
|
|
|
for (let key in lookup)
|
|
|
|
{
|
|
|
|
if (key in g_adifLookupMap)
|
|
|
|
{
|
|
|
|
record[g_adifLookupMap[key]] = lookup[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ("GRIDSQUARE" in record && "grid" in lookup)
|
|
|
|
{
|
|
|
|
if (
|
|
|
|
record.GRIDSQUARE.substr(0, 4) == lookup.grid.substr(0, 4)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
record.GRIDSQUARE = lookup.grid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
g_appSettings.lookupMissingGrid &&
|
|
|
|
"grid" in lookup &&
|
|
|
|
(!("GRIDSQUARE" in record) || record.GRIDSQUARE.length == 0)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
record.GRIDSQUARE = lookup.grid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
finishSendingReport(record, localMode);
|
|
|
|
};
|
|
|
|
|
|
|
|
request.onerror = function (event)
|
|
|
|
{
|
|
|
|
finishSendingReport(record, localMode);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
finishSendingReport(record, localMode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function finishSendingReport(record, localMode)
|
|
|
|
{
|
|
|
|
let report = "";
|
2022-09-29 22:52:18 +00:00
|
|
|
for (const key in record)
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
2022-09-29 22:52:18 +00:00
|
|
|
if (key != "POTA")
|
|
|
|
{
|
|
|
|
report += "<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
report += "<EOR>";
|
2022-09-29 22:52:18 +00:00
|
|
|
|
|
|
|
// this report is for internal use ONLY!
|
|
|
|
let reportWithPota = "";
|
|
|
|
for (const key in record)
|
|
|
|
{
|
|
|
|
reportWithPota += "<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
|
|
|
|
}
|
|
|
|
reportWithPota += "<EOR>";
|
2021-06-13 03:08:47 +00:00
|
|
|
|
2022-09-14 01:15:49 +00:00
|
|
|
// Full record dupe check
|
|
|
|
if (report != g_lastReport)
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
2022-09-14 01:15:49 +00:00
|
|
|
g_lastReport = report;
|
2022-09-29 22:52:18 +00:00
|
|
|
|
2022-10-02 04:23:27 +00:00
|
|
|
if (g_appSettings.potaEnabled == 1 && "POTA" in record)
|
2022-09-29 22:52:18 +00:00
|
|
|
{
|
|
|
|
reportPotaQSO(record);
|
|
|
|
addLastTraffic("<font style='color:white'>Spotted to POTA</font>");
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
g_N1MMSettings.enable == true &&
|
|
|
|
g_N1MMSettings.port > 1024 &&
|
|
|
|
g_N1MMSettings.ip.length > 4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
sendUdpMessage(
|
|
|
|
report,
|
|
|
|
report.length,
|
|
|
|
parseInt(g_N1MMSettings.port),
|
|
|
|
g_N1MMSettings.ip
|
|
|
|
);
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to N1MM</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_log4OMSettings.enable == true &&
|
|
|
|
g_log4OMSettings.port > 1024 &&
|
|
|
|
g_log4OMSettings.ip.length > 4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
sendUdpMessage(
|
|
|
|
"ADD " + report,
|
|
|
|
report.length + 4,
|
|
|
|
parseInt(g_log4OMSettings.port),
|
|
|
|
g_log4OMSettings.ip
|
|
|
|
);
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to Log4OM</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2022-09-29 22:52:18 +00:00
|
|
|
onAdiLoadComplete("GT<EOH>" + reportWithPota);
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception Internal Log</font>");
|
|
|
|
}
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// Log worthy
|
|
|
|
if (logGTqsoCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
var fs = require("fs");
|
2022-09-29 22:52:18 +00:00
|
|
|
fs.appendFileSync(g_qsoLogFile, reportWithPota + "\r\n");
|
2021-06-13 03:08:47 +00:00
|
|
|
addLastTraffic(
|
|
|
|
"<font style='color:white'>Logged to GridTracker backup</font>"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic(
|
|
|
|
"<font style='color:red'>Exception GridTracker backup</font>"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendQrzLogEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception QRZ Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendClubLogEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception ClubLog Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendHrdLogEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception HrdLog.net Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendCloudlogEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception Cloudlog Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_acLogSettings.enable == true &&
|
|
|
|
g_acLogSettings.port > 0 &&
|
|
|
|
g_acLogSettings.ip.length > 4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendACLogMessage(record, g_acLogSettings.port, g_acLogSettings.ip);
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to N3FJP</font>");
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception N3FJP Log</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_dxkLogSettings.enable == true &&
|
|
|
|
g_dxkLogSettings.port > 0 &&
|
|
|
|
g_dxkLogSettings.ip.length > 4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendDXKeeperLogMessage(
|
|
|
|
report,
|
|
|
|
g_dxkLogSettings.port,
|
|
|
|
g_dxkLogSettings.ip
|
|
|
|
);
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to DXKeeper</font>");
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception DXKeeper Log</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
g_HRDLogbookLogSettings.enable == true &&
|
|
|
|
g_HRDLogbookLogSettings.port > 0 &&
|
|
|
|
g_HRDLogbookLogSettings.ip.length > 4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendHRDLogbookEntry(
|
|
|
|
record,
|
|
|
|
g_HRDLogbookLogSettings.port,
|
|
|
|
g_HRDLogbookLogSettings.ip
|
|
|
|
);
|
|
|
|
addLastTraffic(
|
|
|
|
"<font style='color:white'>Logged to HRD Logbook</font>"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception HRD Log</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendLotwLogEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception LoTW Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
logeQSLQSOCheckBox.checked == true &&
|
|
|
|
nicknameeQSLCheckBox.checked == true &&
|
|
|
|
eQSLNickname.value.trim().length > 0
|
|
|
|
)
|
|
|
|
{
|
|
|
|
record.APP_EQSL_QTH_NICKNAME = eQSLNickname.value.trim();
|
|
|
|
report = "";
|
|
|
|
for (var key in record)
|
|
|
|
{
|
|
|
|
report +=
|
2021-09-27 18:00:48 +00:00
|
|
|
"<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
report += "<EOR>";
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendeQSLEntry(report);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception LoTW Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
alertLogMessage();
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception Alert Log</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lookupCloseLog.checked == true)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
openLookupWindow(false);
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Exception Hide Lookup</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return report;
|
|
|
|
}
|
|
|
|
|
|
|
|
function alertLogMessage()
|
|
|
|
{
|
|
|
|
if (logEventMedia.value != "none")
|
|
|
|
{
|
|
|
|
playAlertMediaFile(logEventMedia.value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function eqslCallback(buffer, flag)
|
|
|
|
{
|
|
|
|
var result = String(buffer);
|
|
|
|
if (flag)
|
|
|
|
{
|
|
|
|
if (result.indexOf("No such Username/Password found") != -1)
|
|
|
|
{
|
|
|
|
eQSLTestResult.innerHTML = "Bad<br/>Password<br/>or<br/>Nickname";
|
|
|
|
logeQSLQSOCheckBox.checked = false;
|
|
|
|
adifLogQsoCheckBoxChanged(logeQSLQSOCheckBox);
|
|
|
|
}
|
|
|
|
else if (result.indexOf("No such Callsign found") != -1)
|
|
|
|
{
|
|
|
|
eQSLTestResult.innerHTML = "Unknown<br/>Callsign";
|
|
|
|
logeQSLQSOCheckBox.checked = false;
|
|
|
|
adifLogQsoCheckBoxChanged(logeQSLQSOCheckBox);
|
|
|
|
}
|
|
|
|
else if (result.indexOf("Your ADIF log file has been built") > -1 || result.indexOf("You have no log entries") > -1)
|
|
|
|
{
|
|
|
|
eQSLTestResult.innerHTML = "Passed";
|
|
|
|
}
|
|
|
|
else if (result.indexOf("specify the desired User by using the QTHNickname") != -1)
|
|
|
|
{
|
|
|
|
eQSLTestResult.innerHTML = "QTH Nickname<br/>Needed";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
eQSLTestResult.innerHTML = "Unknown<br/>Error";
|
|
|
|
logeQSLQSOCheckBox.checked = false;
|
|
|
|
adifLogQsoCheckBoxChanged(logeQSLQSOCheckBox);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (result.indexOf("Error: No match on eQSL_User/eQSL_Pswd") != -1)
|
|
|
|
{
|
|
|
|
addLastTraffic(
|
|
|
|
"<font style='color:red'>Fail log eQSL.cc (credentials)</font>"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
result.indexOf("specify the desired User by using the QTHNickname") != -1
|
|
|
|
)
|
|
|
|
{
|
|
|
|
addLastTraffic(
|
|
|
|
"<font style='color:red'>Fail log eQSL.cc (nickname)</font>"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else if (result.indexOf("Result: 0 out of 1 records") != -1)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Fail log eQSL.cc (dupe)</font>");
|
|
|
|
}
|
|
|
|
else if (result.indexOf("Result: 1 out of 1 records added") != -1)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to eQSL.cc</font>");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Fail log eQSL.cc (?)</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function eQSLTest(test)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
eQSLTestResult.innerHTML = "Testing";
|
|
|
|
|
|
|
|
var fUrl =
|
|
|
|
"https://www.eQSL.cc/qslcard/DownloadInBox.cfm?UserName=" +
|
|
|
|
encodeURIComponent(eQSLUser.value) +
|
|
|
|
"&Password=" +
|
|
|
|
encodeURIComponent(eQSLPassword.value) +
|
|
|
|
"&RcvdSince=2020101";
|
|
|
|
|
|
|
|
if (nicknameeQSLCheckBox.checked == true)
|
|
|
|
{ fUrl += "&QTHNickname=" + encodeURIComponent(eQSLNickname.value); }
|
|
|
|
getABuffer(fUrl, eqslCallback, true, "https", 443);
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendeQSLEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (logeQSLQSOCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
var pid = "GridTracker";
|
|
|
|
var pver = String(gtVersion);
|
|
|
|
var header = "<PROGRAMID:" + pid.length + ">" + pid + "\r\n";
|
|
|
|
header += "<PROGRAMVERSION:" + pver.length + ">" + pver + "\r\n";
|
|
|
|
header += "<EOH>\r\n";
|
|
|
|
var eReport = encodeURIComponent(header + report);
|
|
|
|
var fUrl =
|
|
|
|
"https://www.eQSL.cc/qslcard/importADIF.cfm?ADIFData=" +
|
|
|
|
eReport +
|
|
|
|
"&EQSL_USER=" +
|
|
|
|
encodeURIComponent(eQSLUser.value) +
|
|
|
|
"&EQSL_PSWD=" +
|
|
|
|
encodeURIComponent(eQSLPassword.value);
|
|
|
|
getABuffer(fUrl, eqslCallback, false, "https", 443);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function testTrustedQSL(test)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true)
|
|
|
|
{
|
|
|
|
lotwTestResult.innerHTML = "Currently<br/>offline";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
logLOTWqsoCheckBox.checked == true &&
|
|
|
|
g_trustedQslSettings.binaryFileValid == true &&
|
|
|
|
g_trustedQslSettings.stationFileValid == true &&
|
|
|
|
lotwStation.value.length > 0
|
|
|
|
)
|
|
|
|
{
|
|
|
|
lotwTestResult.innerHTML = "Testing Upload";
|
|
|
|
|
|
|
|
var child_process = require("child_process");
|
|
|
|
var options = Array();
|
|
|
|
options.push("-q");
|
|
|
|
options.push("-v");
|
|
|
|
|
|
|
|
child_process.execFile(
|
|
|
|
g_trustedQslSettings.binaryFile,
|
|
|
|
options,
|
|
|
|
(error, stdout, stderr) =>
|
|
|
|
{
|
|
|
|
if (error)
|
|
|
|
{
|
|
|
|
lotwTestResult.innerHTML = "Error encountered";
|
|
|
|
}
|
|
|
|
lotwTestResult.innerHTML = stderr;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
var worker = "";
|
|
|
|
if (g_trustedQslSettings.binaryFileValid == false)
|
|
|
|
{ worker += "Invalid tqsl executable<br/>"; }
|
|
|
|
if (g_trustedQslSettings.stationFileValid == false)
|
|
|
|
{ worker += "TrustQSL not installed<br/>"; }
|
|
|
|
if (!ValidateText(lotwTrusted)) worker += "TQSL Password missing<br/>";
|
|
|
|
if (!ValidateText(lotwStation)) worker += "Select Station<br/>";
|
|
|
|
lotwTestResult.innerHTML = worker;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var g_trustTempPath = "";
|
|
|
|
|
|
|
|
function sendLotwLogEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (
|
|
|
|
logLOTWqsoCheckBox.checked == true &&
|
|
|
|
g_trustedQslSettings.binaryFileValid == true &&
|
|
|
|
g_trustedQslSettings.stationFileValid == true &&
|
|
|
|
lotwStation.value.length > 0
|
|
|
|
)
|
|
|
|
{
|
|
|
|
var header =
|
|
|
|
"Generated " + userTimeString(null) + " for " + myDEcall + "\r\n\r\n";
|
|
|
|
var pid = "GridTracker";
|
|
|
|
var pver = String(gtVersion);
|
|
|
|
header += "<PROGRAMID:" + pid.length + ">" + pid + "\r\n";
|
|
|
|
header += "<PROGRAMVERSION:" + pver.length + ">" + pver + "\r\n";
|
|
|
|
header += "<EOH>\r\n";
|
|
|
|
var finalLog = header + report + "\r\n";
|
|
|
|
|
|
|
|
g_trustTempPath = os.tmpdir() + g_dirSeperator + unique(report) + ".adif";
|
|
|
|
fs.writeFileSync(g_trustTempPath, finalLog);
|
|
|
|
|
|
|
|
var child_process = require("child_process");
|
|
|
|
var options = Array();
|
|
|
|
options.push("-a");
|
|
|
|
options.push("all");
|
|
|
|
options.push("-l");
|
|
|
|
options.push(lotwStation.value);
|
|
|
|
if (lotwTrusted.value.length > 0)
|
|
|
|
{
|
|
|
|
options.push("-p");
|
|
|
|
options.push(lotwTrusted.value);
|
|
|
|
}
|
|
|
|
options.push("-q");
|
|
|
|
options.push("-x");
|
|
|
|
options.push("-d");
|
|
|
|
options.push("-u");
|
|
|
|
options.push(g_trustTempPath);
|
|
|
|
|
|
|
|
child_process.execFile(
|
|
|
|
g_trustedQslSettings.binaryFile,
|
|
|
|
options,
|
|
|
|
(error, stdout, stderr) => // eslint-disable-line node/handle-callback-err
|
|
|
|
{
|
|
|
|
if (stderr.indexOf("Final Status: Success") < 0)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Fail log to TQSL</font>");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to TQSL</font>");
|
|
|
|
}
|
|
|
|
fs.unlinkSync(g_trustTempPath);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function n1mmLoggerChanged()
|
|
|
|
{
|
|
|
|
g_N1MMSettings.enable = buttonN1MMCheckBox.checked;
|
|
|
|
g_N1MMSettings.ip = N1MMIpInput.value;
|
|
|
|
g_N1MMSettings.port = N1MMPortInput.value;
|
|
|
|
|
|
|
|
localStorage.N1MMSettings = JSON.stringify(g_N1MMSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function log4OMLoggerChanged()
|
|
|
|
{
|
|
|
|
g_log4OMSettings.enable = buttonLog4OMCheckBox.checked;
|
|
|
|
g_log4OMSettings.ip = log4OMIpInput.value;
|
|
|
|
g_log4OMSettings.port = log4OMPortInput.value;
|
|
|
|
|
|
|
|
localStorage.log4OMSettings = JSON.stringify(g_log4OMSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function acLogLoggerChanged()
|
|
|
|
{
|
|
|
|
g_acLogSettings.enable = buttonacLogCheckBox.checked;
|
|
|
|
g_acLogSettings.ip = acLogIpInput.value;
|
|
|
|
g_acLogSettings.port = acLogPortInput.value;
|
|
|
|
|
|
|
|
localStorage.acLogSettings = JSON.stringify(g_acLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function dxkLogLoggerChanged()
|
|
|
|
{
|
|
|
|
g_dxkLogSettings.enable = buttondxkLogCheckBox.checked;
|
|
|
|
g_dxkLogSettings.ip = dxkLogIpInput.value;
|
|
|
|
g_dxkLogSettings.port = dxkLogPortInput.value;
|
|
|
|
|
|
|
|
localStorage.dxkLogSettings = JSON.stringify(g_dxkLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function hrdLogbookLoggerChanged()
|
|
|
|
{
|
|
|
|
g_HRDLogbookLogSettings.enable = buttonHrdLogbookCheckBox.checked;
|
|
|
|
g_HRDLogbookLogSettings.ip = hrdLogbookIpInput.value;
|
|
|
|
g_HRDLogbookLogSettings.port = hrdLogbookPortInput.value;
|
|
|
|
|
|
|
|
localStorage.HRDLogbookLogSettings = JSON.stringify(g_HRDLogbookLogSettings);
|
|
|
|
}
|
|
|
|
|
|
|
|
function CloudUrlErrorCallback(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
message
|
|
|
|
)
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = message;
|
|
|
|
}
|
|
|
|
|
|
|
|
function CloudlogSendLogResult(buffer, flag)
|
|
|
|
{
|
|
|
|
if (flag && flag == true)
|
|
|
|
{
|
|
|
|
if (buffer)
|
|
|
|
{
|
|
|
|
if (buffer.indexOf("missing api key") > -1)
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = "API Key Invalid";
|
|
|
|
}
|
|
|
|
else if (buffer.indexOf("created") > -1)
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = "Passed";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = "Invalid Response";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = "Invalid Response";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (buffer && buffer.indexOf("created") > -1)
|
|
|
|
{ addLastTraffic("<font style='color:white'>Logged to Cloudlog</font>"); }
|
|
|
|
else addLastTraffic("<font style='color:red'>Fail log to Cloudlog</font>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function qrzSendLogResult(buffer, flag)
|
|
|
|
{
|
|
|
|
if (typeof buffer != "undefined" && buffer != null)
|
|
|
|
{
|
|
|
|
var data = String(buffer);
|
|
|
|
var kv = data.split("&");
|
|
|
|
if (kv.length > 0)
|
|
|
|
{
|
|
|
|
var arrData = Object();
|
|
|
|
for (var x in kv)
|
|
|
|
{
|
|
|
|
var split = kv[x].split("=");
|
|
|
|
arrData[split[0]] = split[1];
|
|
|
|
}
|
2022-10-02 20:04:25 +00:00
|
|
|
if (typeof arrData.RESULT == "undefined" || arrData.RESULT != "OK")
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Fail log to QRZ.com</font>");
|
|
|
|
}
|
|
|
|
else
|
2022-10-02 20:04:25 +00:00
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to QRZ.com</font>");
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
}
|
2022-10-02 20:04:25 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:red'>Fail log to QRZ.com</font>");
|
|
|
|
}
|
2021-06-13 03:08:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function postDialogRetryCallback(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
who
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (window.confirm("Error sending QSO to " + who + ", retry?"))
|
|
|
|
{
|
|
|
|
getPostBuffer(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
postDialogRetryCallback,
|
|
|
|
who
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function postRetryErrorCallaback(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
who
|
|
|
|
)
|
|
|
|
{
|
|
|
|
getPostBuffer(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
postDialogRetryCallback,
|
|
|
|
who
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendQrzLogEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (logQRZqsoCheckBox.checked == true && ValidateQrzApi(qrzApiKey))
|
|
|
|
{
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
|
|
|
var postData = {
|
|
|
|
KEY: qrzApiKey.value,
|
|
|
|
ACTION: "INSERT",
|
|
|
|
ADIF: report
|
|
|
|
};
|
|
|
|
getPostBuffer(
|
|
|
|
"https://logbook.qrz.com/api",
|
|
|
|
qrzSendLogResult,
|
|
|
|
null,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
postData,
|
|
|
|
30000,
|
|
|
|
postRetryErrorCallaback,
|
|
|
|
"QRZ.com"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function clubLogQsoResult(buffer, flag)
|
|
|
|
{
|
|
|
|
addLastTraffic("<font style='color:white'>Logged to ClubLog.org</font>");
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendClubLogEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (logClubqsoCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
|
|
|
var postData = {
|
|
|
|
email: clubEmail.value,
|
|
|
|
password: clubPassword.value,
|
|
|
|
callsign: clubCall.value,
|
|
|
|
adif: report,
|
|
|
|
api: CLk
|
|
|
|
};
|
|
|
|
|
|
|
|
getPostBuffer(
|
|
|
|
"https://clublog.org/realtime.php",
|
|
|
|
clubLogQsoResult,
|
|
|
|
null,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
postData,
|
|
|
|
30000,
|
|
|
|
postRetryErrorCallaback,
|
|
|
|
"ClubLog.org"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendCloudlogEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (logCloudlogQSOCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
2022-07-01 14:52:58 +00:00
|
|
|
var postData = { key: CloudlogAPI.value, station_profile_id: CloudlogStationProfileID.value, type: "adif", string: report };
|
2021-06-13 03:08:47 +00:00
|
|
|
getPostJSONBuffer(
|
|
|
|
CloudlogURL.value,
|
|
|
|
CloudlogSendLogResult,
|
|
|
|
null,
|
|
|
|
"https",
|
|
|
|
80,
|
|
|
|
postData,
|
|
|
|
10000,
|
|
|
|
CloudUrlErrorCallback,
|
|
|
|
"Failed to Send"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function hrdSendLogResult(buffer, flag)
|
|
|
|
{
|
|
|
|
if (flag && flag == true)
|
|
|
|
{
|
|
|
|
if (buffer.indexOf("Unknown user") > -1)
|
|
|
|
{
|
|
|
|
HRDLogTestResult.innerHTML = "Failed";
|
|
|
|
logHRDLOGqsoCheckBox.checked = false;
|
|
|
|
adifLogQsoCheckBoxChanged(logHRDLOGqsoCheckBox);
|
|
|
|
}
|
|
|
|
else HRDLogTestResult.innerHTML = "Passed";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (buffer.indexOf("Unknown user") == -1)
|
|
|
|
{ addLastTraffic("<font style='color:white'>Logged to HRDLOG.net</font>"); }
|
|
|
|
else
|
|
|
|
{ addLastTraffic("<font style='color:red'>Fail log to HRDLOG.net</font>"); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendHrdLogEntry(report)
|
|
|
|
{
|
|
|
|
if (g_mapSettings.offlineMode == true) return;
|
|
|
|
|
|
|
|
if (logHRDLOGqsoCheckBox.checked == true)
|
|
|
|
{
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
|
|
|
var postData = {
|
|
|
|
Callsign: HRDLOGCallsign.value,
|
|
|
|
Code: HRDLOGUploadCode.value,
|
|
|
|
App: "GridTracker " + gtVersion,
|
|
|
|
ADIFData: report
|
|
|
|
};
|
|
|
|
getPostBuffer(
|
|
|
|
"https://www.hrdlog.net/NewEntry.aspx",
|
|
|
|
hrdSendLogResult,
|
|
|
|
null,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
postData,
|
|
|
|
30000,
|
|
|
|
postRetryErrorCallaback,
|
|
|
|
"HRDLog.net"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function hrdCredentialTest(test)
|
|
|
|
{
|
|
|
|
if (test && test == true)
|
|
|
|
{
|
|
|
|
HRDLogTestResult.innerHTML = "Testing";
|
|
|
|
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
|
|
|
var postData = {
|
|
|
|
Callsign: HRDLOGCallsign.value,
|
|
|
|
Code: HRDLOGUploadCode.value
|
|
|
|
};
|
|
|
|
getPostBuffer(
|
|
|
|
"https://www.hrdlog.net/NewEntry.aspx",
|
|
|
|
hrdSendLogResult,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
443,
|
|
|
|
postData
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function ClublogTest(test)
|
|
|
|
{
|
|
|
|
if (test && test == true)
|
|
|
|
{
|
|
|
|
CloudlogTestResult.innerHTML = "Testing";
|
|
|
|
|
|
|
|
if (typeof nw != "undefined")
|
|
|
|
{
|
|
|
|
var postData = { key: CloudlogAPI.value, type: "adif", string: "<eor>" };
|
|
|
|
getPostJSONBuffer(
|
|
|
|
CloudlogURL.value,
|
|
|
|
CloudlogSendLogResult,
|
|
|
|
test,
|
|
|
|
"https",
|
|
|
|
80,
|
|
|
|
postData,
|
|
|
|
10000,
|
|
|
|
CloudUrlErrorCallback,
|
|
|
|
"No Response<br/>or</br>Timeout"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getPostJSONBuffer(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
port,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
who
|
|
|
|
)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var postData = JSON.stringify(theData);
|
|
|
|
var url = require("url");
|
|
|
|
var protocol = url.parse(file_url).protocol; // eslint-disable-line node/no-deprecated-api
|
|
|
|
var http = require(protocol.replace(":", ""));
|
|
|
|
var fileBuffer = null;
|
|
|
|
var options = {
|
|
|
|
host: url.parse(file_url).hostname, // eslint-disable-line node/no-deprecated-api
|
|
|
|
port: url.parse(file_url).port, // eslint-disable-line node/no-deprecated-api
|
|
|
|
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
|
|
|
method: "post",
|
|
|
|
headers: {
|
|
|
|
"Content-Type": "application/json",
|
|
|
|
"Content-Length": postData.length
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var req = http.request(options, function (res)
|
|
|
|
{
|
|
|
|
var fsize = res.headers["content-length"];
|
|
|
|
var cookies = null;
|
|
|
|
if (typeof res.headers["set-cookie"] != "undefined")
|
|
|
|
{ cookies = res.headers["set-cookie"]; }
|
|
|
|
res
|
|
|
|
.on("data", function (data)
|
|
|
|
{
|
|
|
|
if (fileBuffer == null) fileBuffer = data;
|
|
|
|
else fileBuffer += data;
|
|
|
|
})
|
|
|
|
.on("end", function ()
|
|
|
|
{
|
|
|
|
if (typeof callback === "function")
|
|
|
|
{
|
|
|
|
// Call it, since we have confirmed it is callable
|
|
|
|
callback(fileBuffer, flag, cookies);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on("error", function () {});
|
|
|
|
});
|
|
|
|
if (typeof timeoutMs == "number" && timeoutMs > 0)
|
|
|
|
{
|
|
|
|
req.on("socket", function (socket)
|
|
|
|
{
|
|
|
|
socket.setTimeout(timeoutMs);
|
|
|
|
socket.on("timeout", function ()
|
|
|
|
{
|
|
|
|
req.abort();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
req.on("error", function (err) // eslint-disable-line node/handle-callback-err
|
|
|
|
{
|
2022-09-28 20:41:19 +00:00
|
|
|
if (typeof timeoutCallback === "function")
|
2021-06-13 03:08:47 +00:00
|
|
|
{
|
|
|
|
timeoutCallback(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
80,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
who
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
req.write(postData);
|
|
|
|
req.end();
|
|
|
|
}
|
|
|
|
catch (e)
|
|
|
|
{
|
|
|
|
if (typeof timeoutCallback != "undefined")
|
|
|
|
{
|
|
|
|
timeoutCallback(
|
|
|
|
file_url,
|
|
|
|
callback,
|
|
|
|
flag,
|
|
|
|
mode,
|
|
|
|
80,
|
|
|
|
theData,
|
|
|
|
timeoutMs,
|
|
|
|
timeoutCallback,
|
|
|
|
"Invalid Url"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function valueToXmlField(field, value)
|
|
|
|
{
|
|
|
|
var adi = "<" + field + ">";
|
|
|
|
adi += String(value);
|
|
|
|
adi += "</" + field + ">";
|
|
|
|
return adi;
|
|
|
|
}
|
|
|
|
|
|
|
|
function aclUpdateControlValue(control, value)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
valueToXmlField(
|
|
|
|
"CMD",
|
|
|
|
"<UPDATE>" +
|
|
|
|
valueToXmlField("CONTROL", control) +
|
|
|
|
valueToXmlField("VALUE", value)
|
|
|
|
) + "\r\n"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function aclAction(action)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
valueToXmlField("CMD", "<ACTION>" + valueToXmlField("VALUE", action)) +
|
|
|
|
"\r\n"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function adifField(record, key)
|
|
|
|
{
|
2022-09-08 06:28:46 +00:00
|
|
|
if (key in record) return record[key].trim();
|
2021-06-13 03:08:47 +00:00
|
|
|
else return "";
|
|
|
|
}
|
|
|
|
function sendACLogMessage(record, port, address)
|
|
|
|
{
|
|
|
|
var report = "";
|
|
|
|
|
|
|
|
report += aclAction("CLEAR");
|
|
|
|
report += aclUpdateControlValue("TXTENTRYBAND", adifField(record, "BAND"));
|
|
|
|
report += aclUpdateControlValue("TXTENTRYCALL", adifField(record, "CALL"));
|
|
|
|
report += aclAction("CALLTAB");
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYFREQUENCY",
|
|
|
|
adifField(record, "FREQ")
|
|
|
|
);
|
|
|
|
if (adifField(record, "SUBMODE").length > 0)
|
|
|
|
{
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYMODE",
|
|
|
|
adifField(record, "SUBMODE")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ report += aclUpdateControlValue("TXTENTRYMODE", adifField(record, "MODE")); }
|
|
|
|
|
|
|
|
var date = adifField(record, "QSO_DATE");
|
|
|
|
var dataString =
|
|
|
|
date.substr(0, 4) + "/" + date.substr(4, 2) + "/" + date.substr(6);
|
|
|
|
|
|
|
|
report += aclUpdateControlValue("TXTENTRYDATE", dataString);
|
|
|
|
|
|
|
|
var timeVal = adifField(record, "TIME_ON");
|
|
|
|
var whenString =
|
|
|
|
timeVal.substr(0, 2) +
|
|
|
|
":" +
|
|
|
|
timeVal.substr(2, 2) +
|
|
|
|
":" +
|
|
|
|
timeVal.substr(4, 2);
|
|
|
|
report += aclUpdateControlValue("TXTENTRYTIMEON", whenString);
|
|
|
|
|
|
|
|
timeVal = adifField(record, "TIME_OFF");
|
|
|
|
whenString =
|
|
|
|
timeVal.substr(0, 2) +
|
|
|
|
":" +
|
|
|
|
timeVal.substr(2, 2) +
|
|
|
|
":" +
|
|
|
|
timeVal.substr(4, 2);
|
|
|
|
report += aclUpdateControlValue("TXTENTRYTIMEOFF", whenString);
|
|
|
|
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYRSTR",
|
|
|
|
adifField(record, "RST_RCVD")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYRSTS",
|
|
|
|
adifField(record, "RST_SENT")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue("TXTENTRYPOWER", adifField(record, "TX_PWR"));
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYGRID",
|
|
|
|
adifField(record, "GRIDSQUARE")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYCOMMENTS",
|
|
|
|
adifField(record, "COMMENT")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue("TXTENTRYNAMER", adifField(record, "NAME"));
|
|
|
|
report += aclUpdateControlValue("TXTENTRYIOTA", adifField(record, "IOTA"));
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYCONTINENT",
|
|
|
|
adifField(record, "CONT")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue("TXTENTRYITUZ", adifField(record, "ITUZ"));
|
|
|
|
report += aclUpdateControlValue("TXTENTRYCQZONE", adifField(record, "CQZ"));
|
2022-09-08 21:08:23 +00:00
|
|
|
report += aclUpdateControlValue(
|
2022-09-09 01:53:23 +00:00
|
|
|
"TXTENTRYCOUNTYR",
|
2022-09-08 21:08:23 +00:00
|
|
|
adifField(record, "CNTY").replaceAll(", ", ",")
|
|
|
|
);
|
2021-06-13 03:08:47 +00:00
|
|
|
|
|
|
|
var sentSpcNum = false;
|
|
|
|
if (adifField(record, "SRX").length > 0)
|
|
|
|
{
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYSERIALNOR",
|
|
|
|
adifField(record, "SRX")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else if (adifField(record, "CONTEST_ID").length > 0)
|
|
|
|
{
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYSPCNUM",
|
|
|
|
adifField(record, "SRX_STRING")
|
|
|
|
);
|
|
|
|
sentSpcNum = true;
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYCLASS",
|
|
|
|
adifField(record, "CLASS")
|
|
|
|
);
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYSECTION",
|
|
|
|
adifField(record, "ARRL_SECT")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (adifField(record, "STATE").length > 0)
|
|
|
|
{
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYSTATE",
|
|
|
|
adifField(record, "STATE")
|
|
|
|
);
|
|
|
|
if (sentSpcNum == false)
|
|
|
|
{
|
|
|
|
report += aclUpdateControlValue(
|
|
|
|
"TXTENTRYSPCNUM",
|
|
|
|
adifField(record, "STATE")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
report += aclAction("ENTER");
|
|
|
|
|
|
|
|
sendTcpMessage(report, report.length, port, address);
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendDXKeeperLogMessage(newMessage, port, address)
|
|
|
|
{
|
|
|
|
var report = "";
|
|
|
|
|
|
|
|
report += valueToAdiField("command", "log");
|
|
|
|
report += valueToAdiField("parameters", newMessage);
|
|
|
|
report += "\r\n";
|
|
|
|
|
|
|
|
sendTcpMessage(report, report.length, Number(port) + 1, address);
|
|
|
|
}
|
|
|
|
|
|
|
|
function parseADIFRecord(adif)
|
|
|
|
{
|
|
|
|
var regex = new RegExp("<EOR>", "i");
|
|
|
|
var newLine = adif.split(regex);
|
|
|
|
var line = newLine[0].trim(); // Catch the naughty case of someone sending two records at the same time
|
|
|
|
var record = {};
|
|
|
|
|
|
|
|
// because strings are not escaped for adif.. ie: :'s and <'s .. we have to walk from left to right
|
|
|
|
// cheesy, but damn i'm tired of parsing things
|
|
|
|
var x = 0;
|
|
|
|
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(":");
|
|
|
|
if (where != -1)
|
|
|
|
{
|
|
|
|
var fieldName = line.substr(0, where).toUpperCase();
|
|
|
|
line = line.substr(fieldName.length + 1);
|
|
|
|
var fieldLength = parseInt(line);
|
|
|
|
var end = line.indexOf(">");
|
|
|
|
if (end > 0)
|
|
|
|
{
|
|
|
|
line = line.substr(end + 1);
|
|
|
|
var fieldValue = line.substr(0, fieldLength);
|
|
|
|
line = line.substr(fieldLength);
|
|
|
|
record[fieldName] = fieldValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return record;
|
|
|
|
}
|
|
|
|
|
|
|
|
function sendHRDLogbookEntry(report, port, address)
|
|
|
|
{
|
|
|
|
var command = "ver\rdb add {";
|
|
|
|
var items = Object.assign({}, report);
|
|
|
|
|
|
|
|
items.FREQ = items.FREQ.split(".").join("");
|
|
|
|
|
|
|
|
for (var item in items)
|
|
|
|
{
|
|
|
|
command += item + "=\"" + items[item] + "\" ";
|
|
|
|
}
|
|
|
|
|
|
|
|
command += "}\rexit\r";
|
|
|
|
|
|
|
|
sendTcpMessage(command, command.length, Number(port), address);
|
|
|
|
}
|