Merge branch 'early-sep-24' into 'master'

Map View FIlters collapsable

See merge request gridtracker.org/gridtracker!326

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
master v1.24.0907
T Loomis 2024-09-07 03:14:14 +00:00
commit d3082f3fca
54 zmienionych plików z 3902 dodań i 5467 usunięć

1
.eslintignore 100644
Wyświetl plik

@ -0,0 +1 @@
/package.nw/lib/ol.js

Wyświetl plik

@ -13,7 +13,7 @@ module.exports = {
SharedArrayBuffer: "readonly"
},
parserOptions: {
ecmaVersion: 2021
ecmaVersion: "latest"
},
rules: {
/* See https://eslint.org/docs/rules/ */

Wyświetl plik

@ -1,7 +1,17 @@
Running changes for next release (clear changes after each release please)
--------------------------------------------------------------------------
Map - Added layer attribution
Map - Added propagation prediction layers (MUF, foF2 NVIS, Sporadic-E)
Stats - Added US48 grids
System - BIGCTY update from August 9th
Main - Map View Filters can now be hidden
Main - Conditions button now planetary K-index (5 minute update)
Main - Fixed Prediction button not returning when going online
Map - All Grid Overlay - Field boundaries are bolder
Map - 6 character Maidenhead locators only supported in Pin mode
Map - Fixed zoom factor bug causing slow drawing
Map - Updated timezone data (corrects America/Mexico_City and others)
Settings - Proper map selections when in offline mode
System - Missing translations for Spanish and German fixed
System - Map engine OpenLayers updated to 10.1.0
System - BIGCTY update from September 5th
Call Roster - Fixed ignored grids not saving on exit

14
debian/changelog vendored
Wyświetl plik

@ -1,3 +1,17 @@
gridtracker (1.24.0907) unstable; urgency=low
- Main - Map View Filters can now be hidden
- Main - Conditions button now planetary K-index (5 minute update)
- Main - Fixed Prediction button not returning when going online
- Map - All Grid Overlay - Field boundaries are bolder
- Map - 6 character Maidenhead locators only supported in Pin mode
- Map - Fixed zoom factor bug causing slow drawing
- Map - Updated timezone data (corrects America/Mexico_City and others)
- Settings - Proper map selections when in offline mode
- System - Missing translations for Spanish and German fixed
- System - Map engine OpenLayers updated to 10.1.0
- System - BIGCTY update from September 5th
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 07 Sep 2024 00:00:00 -000
gridtracker (1.24.0814) unstable; urgency=low
- Map - Added layer attribution
- Map - Added propagation prediction layers (MUF, foF2 NVIS, Sporadic-E, Aurora)

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion
Version: 1.24.0814
Version: 1.24.0907
Release: 1%{?dist}
BuildArch: noarch
Source0: {{{ git_dir_pack }}}
@ -40,6 +40,19 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/
%changelog
* Sat Sep 07 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0907-1
- Main - Map View Filters can now be hidden
- Main - Conditions button now planetary K-index (5 minute update)
- Main - Fixed Prediction button not returning when going online
- Map - All Grid Overlay - Field boundaries are bolder
- Map - 6 character Maidenhead locators only supported in Pin mode
- Map - Fixed zoom factor bug causing slow drawing
- Map - Updated timezone data (corrects America/Mexico_City and others)
- Settings - Proper map selections when in offline mode
- System - Missing translations for Spanish and German fixed
- System - Map engine OpenLayers updated to 10.1.0
- System - BIGCTY update from September 5th
Call Roster - Fixed ignored grids not saving on exit
* Tue Aug 14 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0814-1
- Map - Added layer attribution
- Map - Added propagation prediction layers (MUF, foF2 NVIS, Sporadic-E, Aurora)

Wyświetl plik

@ -36,9 +36,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<title>GridTracker</title>
<link rel="stylesheet" href="./lib/ol.css" />
<link rel="stylesheet" href="./lib/style.css" />
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/defaults.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/gtCommon.js" type="text/javascript"></script>
<script src="./lib/alerts.js" type="text/javascript"></script>
<script src="./lib/third-party.js" type="text/javascript"></script>
@ -49,15 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<script src="./lib/moment-with-locales.js" type="text/javascript"></script>
<script src="./lib/moment-timezone-with-data.js" type="text/javascript"></script>
<script src="./lib/callsigns.js" type="text/javascript"></script>
<script src="./lib/jquery-3.6.1.min.js"></script>
<script src="./lib/i18n.js"></script>
<script src="./lib/CLDRPluralRuleParser.js"></script>
<script src="./lib/jquery.i18n.js"></script>
<script src="./lib/jquery.i18n.messagestore.js"></script>
<script src="./lib/jquery.i18n.fallbacks.js"></script>
<script src="./lib/jquery.i18n.parser.js"></script>
<script src="./lib/jquery.i18n.emitter.js"></script>
<script src="./lib/jquery.i18n.language.js"></script>
<script src="./lib/shadow.js" type="text/javascript"></script>
<script src="./lib/gtws.js" type="text/javascript"></script>
<script src="./lib/pota.js" type="text/javascript"></script>
@ -78,7 +70,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div>
<h3><i data-i18n="appname-sub-title">An Amateur Radio Companion</i></h3>
</div>
<div id="startupStatusDiv" data-i18n="startupStatusDiv">Initial Startup</div>
<div id="startupStatusDiv">Initial Startup</div>
</div>
<div id="documentsDiv" style="display: none">
<div>
@ -291,10 +283,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
padding: 2px;
" class="roundBorder">
<div style="display: inline-block; padding-top: 0px; cursor: pointer; left: 0px" onClick="rigChange(false);">
🡄&nbsp;
&nbsp;
</div>
<div style="display: inline-block" id="rigDiv">-no rig-</div>
<div style="display: inline-block; cursor: pointer; right: 0px" onClick="rigChange(true);">&nbsp;🡆</div>
<div style="display: inline-block; cursor: pointer; right: 0px" onClick="rigChange(true);">&nbsp;</div>
</div>
<div id="operatingMode" style="margin: 0; margin-bottom: 1px; cursor: pointer" onclick="ignoreMessagesToggle()"
title="Click to ignore incoming messages">
@ -382,14 +374,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div>
<div id="filterDiv" class="roundBorder"
style="position: relative; background-color: #000; border: 1px solid cyan; margin: 1px; margin-bottom: 1px"
title="Map View Control Panel">
<table align="center">
<tr>
<td data-i18n="mapFilter.title.label" colspan="2">Map View Filters</td>
</tr>
<tr title="Select Band&#10;(Auto tracks WSJT-X)">
<td data-i18n="mapFilter.band.label">Band</td>
>
<div>
<div data-i18n="mapFilter.title.label" style="display:inline-block;font-weight:bold;" onclick="checkMapViewFiltersMaximize()">Map View Filters</div>
<div style="float:right;margin-top:1px;margin-right:1px;cursor: pointer;" onclick="toggleMapViewFiltersCollapse()"><img id="mapViewFiltersCollapseImg" class="roundBorder" src="./img/minimize.png" height="12" title="Hide Controls" /></div>
</div>
<table align="center" id="mapViewFiltersTable">
<tr data-i18n="mapFilter.band.hover" title="Select Band&#10;(Auto tracks WSJT-X)">
<td data-i18n="mapFilter.band.label" style="color:lightgreen">Band</td>
<td>
<select id="gtBandFilter" onkeypress="return false;" onchange="gtBandFilterChanged(this);">
<option data-i18n="mapFilter.band.Auto" value="auto">Auto</option>
@ -430,8 +422,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</select>
</td>
</tr>
<tr title="Select Mode">
<td data-i18n="mapFilter.mode.label">Mode</td>
<tr data-i18n="mapFilter.mode.hover" title="Select Mode">
<td data-i18n="mapFilter.mode.label" style="color:orange">Mode</td>
<td>
<select id="gtModeFilter" onkeypress="return false;" onchange="gtModeFilterChanged(this);">
<option data-i18n="mapFilter.mode.Auto" value="auto">Auto</option>
@ -442,8 +434,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</select>
</td>
</tr>
<tr title="Select Propagation Mode">
<td data-i18n="mapFilter.prop.label">Prop</td>
<tr data-i18n="mapFilter.prop.hover" title="Select Propagation Mode">
<td data-i18n="mapFilter.prop.label" style="color:yellow">Prop</td>
<td>
<select id="gtPropFilter" onkeypress="return false;" onchange="gtPropFilterChanged(this);">
<option data-i18n="mapFilter.prop.Mixed" value="mixed">Mixed</option>
@ -472,7 +464,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</td>
</tr>
<tr>
<td data-i18n="mapFilter.data.label">Data</td>
<td data-i18n="mapFilter.data.label" style="color:cyan">Data</td>
<td>
<div data-i18n="mapFilter.data.LogLive" id="gridViewButton" onclick="cycleGridView()" class="button"
title="Cycle Grid View" style="
@ -527,9 +519,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="lunaButton" onclick="toggleMoon();" class="iconButton" title="Toggle Moon">
<img id="lunaButonImg" src="./img/luna.png" class="buttonImg" />
</div>
<!--div id="trophyButton" onclick="cycleTrophyOverlay();" class="iconButton" title="Cycle Award Overlays">
<img id="trophyImg" src="./img/blank_trophy.png" class="buttonImg" />
</div-->
<div id="helpButton" onclick="toggleHelp();" class="iconButton" title="Toggle Hotkey List">
<img src="./img/help.png" class="buttonImg" />
</div>
@ -542,34 +531,32 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="adifLoadDiv" onclick="adifLoadDialog()" class="iconButton" title="Load ADIF Log">
<img src="./img/adif.png" class="buttonImg" />
</div>
<div id="buttonAdifCheckBoxDiv" onclick="startupAdifLoadFunction()" class="iconButton"
title="Reload Local ADIF Files">
<img src="./img/log_local.png" class="buttonImg" />
</div>
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
</div>
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
</div>
<div id="buttonAdifCheckBoxDiv" onclick="startupAdifLoadFunction()" class="iconButton" title="Reload Local ADIF Files">
<img src="./img/log_local.png" class="buttonImg" />
</div>
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
</div>
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
</div>
<div id="modeModeDiv" onclick="toggleOffline()" class="iconButton" title="Toggle Online/Offline Mode">
<img id="offlineImg" src="" class="buttonImg" />
</div>
<div id="radarButton" onclick="toggleNexrad()" class="iconButton" title="Toggle US Nexrad">
<img id="radarImg" src="./img/radar-button.png" class="buttonImg" />
</div>
<div id="predButton" onclick="cyclePredLayer()" class="iconButton" title="Cycle Prediction Layer">
<img id="predImg" src="./img/no-pred.png" class="buttonImg" />
</div>
</div>
<div id="predButton" onclick="cyclePredLayer()" class="iconButton" title="Cycle Prediction Layer">
<img id="predImg" src="./img/no-pred.png" class="buttonImg" />
</div>
<div id="conditionsButton" onclick="showConditionsBox();" class="iconButton" title="View Current Conditions">
<img src="./img/conditions.png" class="buttonImg" />
</div>
<div id="buttonSpotsBoxDiv" onclick="cycleSpotsView()" class="iconButton" title="View Spot Reports">
<img id="spotsButtonImg" src="./img/spots.png" class="buttonImg" />
</div>
<div id="donateButton" onclick="gotoDonate();" class="iconButton" title="Donate with PayPal">
<img style="-webkit-filter: brightness(50%); filter: brightness(50%)" src="./img/donate.png"
class="buttonImg" />
<div id="donateButton" onclick="gotoDonate();" class="iconButton" title="Support GridTracker with a donation">
<img style="-webkit-filter: brightness(70%); filter: brightness(70%)" src="./img/donate.png" class="buttonImg" />
</div>
<div id="lookupButton" onclick="openLookupWindow(true)" class="iconButton" title="Open Lookup Window">
<img src="./img/lookup.png" class="buttonImg" />
@ -577,27 +564,21 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="buttonPsk24CheckBoxDiv" onclick="grabPsk24()" class="iconButton" title="Your PSK 24hour report">
<img id="pskImg" src="./img/psk_24_32.png" class="buttonImg" />
</div>
<div id="buttonQRZCheckBoxDiv" onclick="if ( ValidateQrzApi(qrzApiKey ) ) grabQrzComLog()" class="iconButton"
title="Download log from QRZ.com">
<img id="qrzLogImg" src="./img/log_QRZ.png" class="buttonImg" />
<div id="buttonQRZCheckBoxDiv" onclick="if ( ValidateQrzApi(qrzApiKey ) ) grabQrzComLog()" class="iconButton" title="Download log from QRZ.com">
<img id="qrzLogImg" src="./img/log_QRZ.png" class="buttonImg" />
</div>
<div id="buttonLOTWCheckBoxDiv"
onclick="if ( ValidateText(lotwLogin) && ValidateText(lotwPassword) ) { grabLOtWLog(false); } "
class="iconButton" title="Download log from Logbook of the World">
<img id="lotwLogImg" src="./img/log_LoTW.png" class="buttonImg" />
<div id="buttonLOTWCheckBoxDiv" onclick="if ( ValidateText(lotwLogin) && ValidateText(lotwPassword) ) { grabLOtWLog(false); } " class="iconButton" title="Download log from Logbook of the World">
<img id="lotwLogImg" src="./img/log_LoTW.png" class="buttonImg" />
</div>
<div id="buttonClubCheckBoxDiv"
onclick="if ( ValidateText(clubEmail) && ValidateText(clubPassword) ) grabClubLog()" class="iconButton"
title="Download log from ClubLog">
<img id="ClubLogImg" src="./img/log_club.png" class="buttonImg" />
<div id="buttonClubCheckBoxDiv" onclick="if ( ValidateText(clubEmail) && ValidateText(clubPassword) ) grabClubLog()" class="iconButton" title="Download log from ClubLog">
<img id="ClubLogImg" src="./img/log_club.png" class="buttonImg" />
</div>
<div id="potaButton" onClick="togglePotaMap();" class="iconButton" title="Parks On The Air">
<img id="potaImg" src="./img/pota.png" class="buttonImg" />
</div>
<div id="gtShareButton" onclick="toggleGtShareEnable();" class="iconButton"
title="Share your On-Air Status with other GridTracker users">
<img id="gtShareFlagImg" src="./img/share-off.png" class="buttonImg" />
</div>
<div id="gtShareButton" onclick="toggleGtShareEnable();" class="iconButton" title="Share your On-Air Status with other GridTracker users">
<img id="gtShareFlagImg" src="./img/share-off.png" class="buttonImg" />
</div>
<div id="gtFlagButton" onclick="toggleGtMap();" class="iconButton" title="Toggle View GridTracker Users">
<img id="gtFlagImg" src="" class="buttonImg" />
</div>
@ -1039,7 +1020,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div>
<br />
<div class="button"
onclick="require('nw.gui').Shell.openExternal('https://storage.googleapis.com/gt_app/gt_print.html');">
onclick="nw.Shell.openExternal('https://storage.googleapis.com/gt_app/gt_print.html');">
Print
</div>
</div>
@ -1122,7 +1103,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</td>
</tr>
<tr>
<td id="multicastTD" style="display: none">
<td id="multicastTD" >
<label data-i18n="settings.general.UDP.IP.label" for="multicastIpInput">IP</label>
<input id="multicastIpInput" type="text" class="inputTextValue" maxlength="255" size="16"
onkeypress="return validIpKeys(event.charCode);"
@ -1167,7 +1148,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td>
<label data-i18n="settings.general.Fwd.Enabled.label" for="setUdpForwardEnable">Enabled?</label>
<label data-i18n="settings.general.Fwd.Enabled.label" for="udpForwardEnable">Enabled?</label>
<input title="Enable / Disable UDP Message forwarding" type="checkbox" id="udpForwardEnable"
onclick="setUdpForwardEnable(this);" />
</td>
@ -1342,7 +1323,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td>
<div data-i18n="settings.general.ImportSettings.label" style="display: none"
<div data-i18n="settings.general.ImportSettings.label"
id="importSettingsButton" class="button" onclick="importSettings();">
Import Settings
</div>
@ -1350,7 +1331,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td>
<font style="display: none" id="importSettingsFile"></font>
<font id="importSettingsFile"></font>
</td>
</tr>
</table>
@ -1402,7 +1383,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
</table>
</div>
<div class="mapItem" id="lookupMissingGridDiv" style="display: none">
<div class="mapItem" id="lookupMissingGridDiv" style="">
<table align="center">
<tr>
<td data-i18n="settings.lookup.AddGrid.label" align="center">Add Lookup Grid if QSO Grid missing</td>
@ -1729,8 +1710,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<tr>
<td id="workingDateTd" title="Date/Time is UTC">
<label data-i18n="settings.logbook.date.date">Date</label> <input type="date" id="workingDateValue" value="1970-01-01" style="background-color: green; color: yellow;" onchange="workingDateChanged()" />
<label data-i18n="settings.logbook.date.time">Time</label> <input type="time" id="workingTimeValue" value="00:00" style="background-color: green; color: yellow;" onchange="workingDateChanged()" />
<label data-i18n="settings.logbook.date.date" for="workingDateValue">Date</label> <input type="date" id="workingDateValue" value="1970-01-01" style="background-color: green; color: yellow;" onchange="workingDateChanged()" />
<label data-i18n="settings.logbook.date.time" for="workingTimeValue">Time</label> <input type="time" id="workingTimeValue" value="00:00" style="background-color: green; color: yellow;" onchange="workingDateChanged()" />
</td>
</tr>
</table>
@ -1967,6 +1948,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<tr>
<td>
<select id="mapSelect" value="terrain-background" onchange="changeMapValues();"></select>
<select id="offlineMapSelect" value="terrain-background" onchange="changeOfflineMap();"></select>
</td>
</tr>
</table>
@ -1981,7 +1963,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<input type="checkbox" id="animateValue" onclick="changeAnimate()" />
</td>
</tr>
<tr style="display: none" id="animationSpeedTd">
<tr id="animationSpeedTd">
<td>
<input title="Animation Speed" type="range" min="1" max="20" value="10" step="1" class="slider"
id="animateSpeedValue" oninput="changeAnimateSpeedValue()" />
@ -2209,7 +2191,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td style="display: none" id="nightMapTd">
<td id="nightMapTd">
<div class="mapItem">
<table align="center">
<tr>
@ -2218,7 +2200,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<tr>
<td>
<select id="mapNightSelect" value="18" onchange="changeMapNightValues();"></select>
</td>
<select id="offlineMapNightSelect" value="terrain-background" onchange="changeOfflineNightMap();"></select>
</td
</tr>
</table>
</div>
@ -2251,7 +2234,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
</table>
</div>
<div class="mapItem" id="spotNightPathColorDiv" style="display: none">
<div class="mapItem" id="spotNightPathColorDiv">
<table align="center">
<tr align="center">
<td data-i18n="settings.map.NightRXSpot.color.label" align="center"><b>Night PSK-Spot Color</b></td>
@ -2456,7 +2439,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<input id="CloudlogAPI" type="password" class="inputTextValue" size="12"
oninput="ValidateText(this); adifTextValueChange(this);" />
<br />
<label data-i18n="settings.logging.CloudLog.details.StationProfile" for "CloudlogStationProfile">Station Profile</label>
<label data-i18n="settings.logging.CloudLog.details.StationProfile" for="CloudlogStationProfile">Station Profile</label>
<select id="CloudlogStationProfile" size="1"
onChange="CloudLogProfileChanged(this)" />
<option> </option>
@ -2687,7 +2670,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
onclick=" ValidateIPaddress(pstrotatorIpInput, this); ValidatePort(pstrotatorPortInput, this, null ); pstrotatorServiceChanged(); " />
</td>
<td>
<label data-i18n="settings.logging.pstrotator.details.IP" for="pstrotastorIpInput">IP</label>
<label data-i18n="settings.logging.pstrotator.details.IP" for="pstrotatorIpInput">IP</label>
<input id="pstrotatorIpInput" type="text" class="inputTextValue" maxlength="15" size="15"
onkeypress='return validIpKeys(event.charCode);'
oninput="ValidateIPaddress(this, pstrotatorCheckBox); pstrotatorServiceChanged(); " />
@ -3241,7 +3224,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<table align="center">
<tr>
<td>
<label data-i18n="settings.OAMS.simplepush.enable.label" for="msgSimplepush" style="cursor: pointer" onclick="require('nw.gui').Shell.openExternal('https://simplepush.io/');">
<label data-i18n="settings.OAMS.simplepush.enable.label" for="msgSimplepush" style="cursor: pointer" onclick="nw.Shell.openExternal('https://simplepush.io/');">
Enable / Disable Simplepush Message forwarding</label>
</td>
</tr>
@ -3281,7 +3264,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<table align="center">
<tr>
<td>
<label data-i18n="settings.OAMS.pushover.enable.label" for="msgPushover" style="cursor: pointer" onclick="require('nw.gui').Shell.openExternal('https://pushover.net/');">
<label data-i18n="settings.OAMS.pushover.enable.label" for="msgPushover" style="cursor: pointer" onclick="nw.Shell.openExternal('https://pushover.net/');">
Enable / Disable Pushover Message forwarding
</label>
</td>
@ -3347,7 +3330,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Current Solar Conditions and More!<br />
Learn more at
<a href="#" style="cursor: pointer"
onclick="require('nw.gui').Shell.openExternal('https://gridtracker.org/');">GridTracker.org!</a>
onclick="nw.Shell.openExternal('https://gridtracker.org/');">GridTracker.org!</a>
</p>
<p>Copyright &copy; 2024 GridTracker.org</p>
<img src="./gridview.png" /> <br />

Wyświetl plik

@ -1,94 +0,0 @@
{
"AF2V": {
"badge": "img/emojis/books.png",
"message": "GridTracker Documentation"
},
"BD3OOX": {
"badge": "img/emojis/speech.png",
"message": "GridTracker Translator"
},
"GI1MIC": {
"badge": "img/emojis/pizza.png",
"message": "GridTracker Tester"
},
"HI80": {
"badge": "img/emojis/speech.png",
"message": "GridTracker Translator"
},
"IW3HMH": {
"badge": "img/emojis/logbook.png",
"message": "Creator of Log4OM"
},
"K0EG": {
"badge": "img/emojis/books.png",
"message": "GridTracker Documentation"
},
"K1JT": {
"badge": "img/emojis/star.png",
"message": "Creator of FT8 and WSJT-X"
},
"K5TUX": {
"badge": "img/emojis/penguin.png",
"message": "GridTracker Partner"
},
"K9AN": {
"badge": "img/emojis/star.png",
"message": "Co-Creator of FT8"
},
"KA0AZS": {
"badge": "img/emojis/pizza.png",
"message": "GridTracker Tester"
},
"KB2YSI": {
"badge": "img/emojis/coffee.png",
"message": "GridTracker Developer"
},
"KD0YTE": {
"badge": "img/emojis/pizza.png",
"message": "GridTracker Tester"
},
"KE5EI": {
"badge": "img/emojis/grandfather.png",
"message": "GridTracker's Grandfather"
},
"KF5QHQ": {
"badge": "img/emojis/trophy.png",
"message": "GridTracker Developer"
},
"KI2D": {
"badge": "img/emojis/flatbread.png",
"message": "GridTracker Developer"
},
"N0TTL": {
"badge": "img/emojis/star.png",
"message": "Creator of GridTracker"
},
"N2VFL": {
"badge": "img/emojis/trophy.png",
"message": "GridTracker Developer"
},
"N3CAN": {
"badge": "img/emojis/books.png",
"message": "GridTracker Documentation"
},
"NR0Q": {
"badge": "img/emojis/coffee.png",
"message": "GridTracker Developer"
},
"W4IPA": {
"badge": "img/emojis/beer-mug.png",
"message": "GridTracker Tester"
},
"W5AFK": {
"badge": "img/emojis/pizza.png",
"message": "GridTracker Tester"
},
"WA4YA": {
"badge": "img/emojis/trophy.png",
"message": "GridTracker Developer"
},
"KE0YBL": {
"badge": "img/emojis/tractor.png",
"message": "GridTracker Developer"
}
}

Wyświetl plik

@ -3,19 +3,22 @@
"url": "http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",
"attributions": "<a href=\"http://openstreetmap.org/\" target=\"_blank\">OpenStreetMap</a>",
"minZoom": 0,
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Mapnik by OpenStreetMap (Deutsch)": {
"url": "http://{a-c}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png",
"attributions": "<a href=\"http://openstreetmap.de/\" target=\"_blank\">OpenStreetMap DE</a>",
"minZoom": 0,
"maxZoom": 18
"maxZoom": 18,
"offline": false
},
"Mapnik by OpenStreetMap (français)": {
"url": "http://{a-c}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png",
"attributions": "<a href=\"http://openstreetmap.fr/\" target=\"_blank\">OpenStreetMap FR</a>",
"minZoom": 0,
"maxZoom": 18
"maxZoom": 18,
"offline": false
},
"Toner by Stamen (No Labels)(Offline)": {
"url": "/map/toner-background/{z}/{x}/{y}.png",
@ -27,92 +30,109 @@
"National Geographic by Esri (English)": {
"url": "http://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri &mdash; National Geographic",
"maxZoom": 16
"maxZoom": 16,
"offline": false
},
"Street by Esri (English)": {
"url": "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri"
"attributions": "Esri",
"offline": false
},
"Topographical by Esri (English)": {
"url": "http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri"
"attributions": "Esri",
"offline": false
},
"Physical by Esri (No Labels)": {
"url": "http://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri",
"maxZoom": 8
"maxZoom": 8,
"offline": false
},
"Satellite by Esri (No Labels)": {
"url": "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri",
"maxZoom": 18
"maxZoom": 18,
"offline": false
},
"Humanitarian by OpenStreetMap (Intl)": {
"url": "http://{a-c}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",
"attributions": "<a href=\"http://openstreetmap.org/\" target=\"_blank\">OpenStreetMap</a>",
"minZoom": 0,
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Dark Gray by Esri (English)": {
"url": "http://services.arcgisonline.com/arcgis/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Light Gray by Esri (English)": {
"url": "http://services.arcgisonline.com/arcgis/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",
"attributions": "Esri",
"maxZoom": 16
"maxZoom": 16,
"offline": false
},
"Midnight Commander by Carto (No Labels)": {
"url": "https://cartocdn_{a-d}.global.ssl.fastly.net/base-midnight/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Antique by Carto (Minimal Labels)": {
"url": "https://cartocdn_{a-d}.global.ssl.fastly.net/base-antique/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Eco by Carto (Minimal Labels)": {
"url": "https://cartocdn_{a-d}.global.ssl.fastly.net/base-eco/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19,
"oldIndex": 25
"offline": false
},
"Voyager by Carto (English)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Positron by Carto (English)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/light_all/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Dark Matter by Carto (English)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/dark_all/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Voyager by Carto (No Labels)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Positron by Carto (No Labels)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/light_nolabels/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Dark Matter by Carto (No Labels)": {
"url": "https://{a-d}.basemaps.cartocdn.com/rastertiles/dark_nolabels/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Flat Blue by Carto (No Labels)": {
"url": "https://cartocdn_{a-d}.global.ssl.fastly.net/base-flatblue/{z}/{x}/{y}.png",
"attributions": "Carto",
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"Satellite by MapTiler (No Labels)(Offline)": {
"url": "/map/sat/{z}/{x}/{y}.png",
@ -132,12 +152,14 @@
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=m&gl=CN&x={x}&y={y}&z={z}",
"attributions": "GoogleCN",
"minZoom": 3,
"maxZoom": 19
"maxZoom": 19,
"offline": false
},
"GoogleMap Satellite by GoogleCN (Chinese)": {
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=s,m&gl=CN&x={x}&y={y}&z={z}",
"attributions": "GoogleCN",
"minZoom": 3,
"maxZoom": 19
"maxZoom": 19,
"offline": false
}
}

Wyświetl plik

@ -1519,7 +1519,7 @@
"VE9TEN/5",
"VE9XX/6",
"VE9ZP/4",
"VER20240809",
"VER20240905",
"VF0X",
"VF0X/M",
"VO/DL2GF",
@ -2563,6 +2563,7 @@
"AB7YO",
"AB8XX",
"AB9OM",
"AC1RU",
"AC2UJ",
"AC3DF",
"AC5ZY",
@ -2593,6 +2594,7 @@
"AG5LN",
"AG5OF",
"AG6PI",
"AG7HT",
"AG7XM",
"AH0AH",
"AH0H",
@ -2768,6 +2770,7 @@
"KC3MPG",
"KC3NUH",
"KC3QVN",
"KC3UWP",
"KC4MXQ",
"KC4MXR",
"KC4OPI",
@ -3346,6 +3349,7 @@
"WB6IIM",
"WB7RRK",
"WB7SFO",
"WB7TLC",
"WB7ULO",
"WB8BRU",
"WB9JZL",
@ -3357,7 +3361,6 @@
"WH6GCO",
"WH6IQ",
"WH7AK",
"WH7DC",
"WI5GUY",
"WJ6AA",
"WJ8M",
@ -7548,7 +7551,9 @@
"confirmed_bands": {},
"worked_modes": {},
"confirmed_modes": {},
"direct": [],
"direct": [
"VERSION"
],
"prefixITU": {},
"prefixCQ": {},
"directITU": {},
@ -10804,6 +10809,7 @@
"R2DXU/8",
"R2EA/8",
"R2EC/9",
"R2EC/M",
"R2ET/9",
"R2FCE/9",
"R2SD/9",
@ -10856,6 +10862,7 @@
"R44YETI/0",
"R44YETI/8",
"R44YETI/9",
"R450UFA",
"R4AK/0",
"R4AK/0/P",
"R4CDO/9/M",
@ -10983,6 +10990,7 @@
"R9XT/0",
"R9XT/9",
"R9YU/M",
"R9YU/P",
"RA/DD7QJ",
"RA/DF8DX",
"RA/DK2AI",
@ -11283,7 +11291,6 @@
"RK1B/0",
"RK1B/9",
"RK3AW/8",
"RK3AW/M",
"RK3BY/0",
"RK3DZJ/9",
"RK3PWJ/9",
@ -12166,6 +12173,7 @@
"RX0F",
"RX0L",
"RX0SD/9",
"RX0TX/P",
"RX15RX",
"RX17WG",
"RX20NY",
@ -15694,7 +15702,6 @@
"R400N": "31",
"R70B": "31",
"R9/EW1TM": "31",
"R9HAF/M": "31",
"R9UAG/N": "31",
"RA30KR": "31",
"RA4CQ/9": "31",
@ -15773,7 +15780,9 @@
"R6XBA/9": "31",
"R9/UN7JHC": "31",
"R9/UN7JMO": "31",
"R9HAF/M": "31",
"R9YU/M": "31",
"R9YU/P": "31",
"RA/IK5MIC": "31",
"RA/IK5MIC/M": "31",
"RA0CCJ/9": "31",
@ -16309,6 +16318,7 @@
"R1BIG/9": "32",
"R25ARCK/9": "32",
"R2AKM/0": "32",
"R2EC/M": "32",
"R3RRC/0/MM": "32",
"R3RRC/9": "32",
"R4FBJ/0": "32",
@ -16434,6 +16444,7 @@
"RP78BD": "32",
"RX0AE/0": "32",
"RX0AT/0/P": "32",
"RX0TX/P": "32",
"UA0ADU/0": "32",
"UA0WGD/0": "32",
"UA9ZZ/0/P": "32",
@ -16801,7 +16812,6 @@
"R400N": "18",
"R70B": "18",
"R9/EW1TM": "18",
"R9HAF/M": "18",
"R9UAG/N": "18",
"RA30KR": "18",
"RA4CQ/9": "18",
@ -16891,6 +16901,7 @@
"R27UFA": "16",
"R3XX/9": "16",
"R44WFF": "16",
"R450UFA": "16",
"R53ICGA": "16",
"R53ICGB": "16",
"R53ICGC": "16",
@ -16928,7 +16939,6 @@
"RD9W": "16",
"RF9W": "16",
"RG5A/8": "16",
"RK3AW/M": "16",
"RK3PWJ/9": "16",
"RK6YYA/9/M": "16",
"RK8W": "16",
@ -17041,7 +17051,6 @@
"RW9JZ/9": "16",
"RX22WN": "16",
"RX95WN": "16",
"RX9WT/P": "16",
"RY9W": "16",
"RZ16WF": "16",
"RZ90WU": "16",
@ -17077,7 +17086,9 @@
"R6XBA/9": "18",
"R9/UN7JHC": "18",
"R9/UN7JMO": "18",
"R9HAF/M": "18",
"R9YU/M": "18",
"R9YU/P": "18",
"RA/IK5MIC": "18",
"RA/IK5MIC/M": "18",
"RA0CCJ/9": "18",
@ -17613,6 +17624,7 @@
"R1BIG/9": "18",
"R25ARCK/9": "18",
"R2AKM/0": "18",
"R2EC/M": "18",
"R3RRC/0/MM": "18",
"R3RRC/9": "18",
"R4FBJ/0": "18",
@ -17738,6 +17750,7 @@
"RP78BD": "23",
"RX0AE/0": "23",
"RX0AT/0/P": "23",
"RX0TX/P": "23",
"UA0ADU/0": "23",
"UA0WGD/0": "23",
"UA9ZZ/0/P": "23",
@ -18073,6 +18086,7 @@
"EA5HCC/6",
"EA5IIG/6",
"EA5IKT/6",
"EA5IYX/6",
"EA5RKB/6",
"EA6/DJ5AA/LH",
"EA6/DJ7AO/LH",
@ -18480,6 +18494,7 @@
"EA4URE/9",
"EA5DCL/9",
"EA5ISM/9",
"EA5PC",
"EA5RKB/9",
"EA7JTF/9",
"EA7URM/9",
@ -19129,6 +19144,8 @@
"9M59MS",
"9M59MW",
"9M59SD",
"9M67MQ",
"9M67MS",
"9M7DX",
"9M9/7M2VPR",
"9M9/CCL",
@ -20598,6 +20615,7 @@
"R01DTV/7",
"R0AAE/6",
"R0AAI/4",
"R0AD/3/P",
"R0AGD/6",
"R0AI/3",
"R0AI/M",
@ -20616,6 +20634,7 @@
"R0LFX/6",
"R0QAO/3",
"R0QAW/3",
"R0QBB/3",
"R0RA/7",
"R0SBC/6",
"R0UAR/6",
@ -20667,7 +20686,6 @@
"R2DXU/1",
"R2DXU/9",
"R2EA/M",
"R2EC/M",
"R320P",
"R325G",
"R325P",
@ -20783,6 +20801,7 @@
"R8CZ/4",
"R8CZ/4/M",
"R8CZ/M",
"R8FF",
"R8FF/1",
"R8FF/3",
"R8FF/3/M",
@ -20916,7 +20935,6 @@
"R9XV/6",
"R9XZ/3",
"R9YU/3",
"R9YU/P",
"R9ZAC/1",
"RA/DK5JI",
"RA/UR5MKH",
@ -21043,6 +21061,7 @@
"RA9WU/4/P",
"RA9WU/6",
"RA9WU/M",
"RA9WU/P",
"RA9WW/6",
"RA9X",
"RA9XA/1",
@ -21122,6 +21141,7 @@
"RK21Z",
"RK30DR",
"RK3AW/4",
"RK3AW/M",
"RK3DSW/ANT",
"RK3DWA/3/N",
"RK3DZJ/1/LH",
@ -21242,6 +21262,7 @@
"RO80KEDR",
"RO80OW",
"RO80PS",
"RO80RK",
"RO80RO",
"RP61XX",
"RP62X",
@ -21587,6 +21608,7 @@
"RX9UL/3",
"RX9WN/3",
"RX9WN/4",
"RY0AAN/3/P",
"RY110RAEM",
"RY83HN",
"RY90FA",
@ -22695,6 +22717,7 @@
"RN9N/1": "19",
"RO25KL": "19",
"RO75RK": "19",
"RO80RK": "19",
"RP72PT": "19",
"RP72RK": "19",
"RP73PT": "19",
@ -22856,6 +22879,7 @@
"R4IN": "29",
"R4IO": "29",
"R4IT": "29",
"R4PBF/M": "30",
"R50VAZ": "30",
"R9DA/4": "30",
"RA4HL": "29",
@ -22983,7 +23007,6 @@
"RA9WU/4": "30",
"RA9WU/4/M": "30",
"RA9WU/4/P": "30",
"RA9WU/M": "30",
"RC4W": "30",
"RK4W": "30",
"RM4W": "30",
@ -23035,13 +23058,14 @@
"R9CZ/4": "30",
"R9CZ/4/M": "30",
"R9GM/M": "30",
"R9GM/P": "30",
"R9KC/4/M": "30",
"R9KC/8/M": "30",
"RA27FM": "30",
"RA9FDR/M": "30",
"RA9FEU/M": "30",
"RA9G": "30",
"RA9WU/M": "30",
"RA9WU/P": "30",
"RA9XAI/4": "30",
"RC20FM": "30",
"RC9F": "30",
@ -23106,7 +23130,6 @@
"R7BA/9/M": "20",
"R8MB/1": "20",
"R8MB/1/P": "20",
"R8XF/M": "20",
"R9/UR7IMG": "20",
"R95KOMI": "20",
"R9KD/9": "20",
@ -23205,13 +23228,14 @@
"R9CZ/4": "17",
"R9CZ/4/M": "17",
"R9GM/M": "17",
"R9GM/P": "17",
"R9KC/4/M": "17",
"R9KC/8/M": "17",
"RA27FM": "17",
"RA9FDR/M": "17",
"RA9FEU/M": "17",
"RA9G": "17",
"RA9WU/M": "17",
"RA9WU/P": "17",
"RA9XAI/4": "17",
"RC20FM": "17",
"RC9F": "17",
@ -23276,7 +23300,6 @@
"R7BA/9/M": "17",
"R8MB/1": "17",
"R8MB/1/P": "17",
"R8XF/M": "17",
"R9/UR7IMG": "17",
"R95KOMI": "17",
"R9KD/9": "17",
@ -26257,6 +26280,7 @@
"LU2IV/I",
"LU2JFC/D",
"LU2KLC/K",
"LU2LAR/L",
"LU2LDB/L",
"LU2MAA/H",
"LU2SN/L",
@ -26529,6 +26553,7 @@
"LU4EL/Y",
"LU4EOS/D",
"LU4EOU/D",
"LU4ERM/D",
"LU4ERS/D",
"LU4ERS/I",
"LU4ESP/D",
@ -26614,10 +26639,12 @@
"LU5BDS/V",
"LU5BE/D",
"LU5BE/GR",
"LU5BE/S",
"LU5BE/XA",
"LU5BE/XC",
"LU5BOJ/O",
"LU5BTL/D",
"LU5CAC/D",
"LU5CBA/D",
"LU5CFI/D",
"LU5CRE/D",
@ -26686,6 +26713,7 @@
"LU5FB/F",
"LU5FBM/F",
"LU5FCL/F",
"LU5FEE/H",
"LU5FES/F",
"LU5FF/F",
"LU5FHD/F",
@ -27119,6 +27147,7 @@
"LU8EEM/D",
"LU8EFF/D",
"LU8EFF/GR",
"LU8EFF/S",
"LU8EGC/D",
"LU8EGJ/D",
"LU8EGS/D",
@ -27155,6 +27184,7 @@
"LU8HBX/H",
"LU8HH/H",
"LU8HJ/H",
"LU8HM/H",
"LU8HOR/H",
"LU8HPV/H",
"LU8IEZ/I",
@ -28859,6 +28889,7 @@
"KD0AA",
"KD7IRV",
"KE4YSP",
"KE6YEL",
"KE7GMC",
"KE7IPG",
"KF4UFC",
@ -30662,6 +30693,7 @@
"AB4CO",
"AB6AP",
"AB6WI",
"AB7FL",
"AB7RT",
"AB8VQ",
"AC4PJ",
@ -30851,6 +30883,7 @@
"KC7LFM",
"KC7NZ",
"KC7PLG",
"KC7PSB",
"KC7USA",
"KC7VWU",
"KC7YXO",
@ -31195,6 +31228,7 @@
"N0FIX",
"N0KXY",
"N0PJV",
"N0SEX",
"N0VYO",
"N0ZSJ",
"N1CBF",
@ -31244,6 +31278,7 @@
"N7WAP",
"N7WBX",
"N7WLR",
"N8DSW",
"N8KGB",
"N8UXC",
"N9GFL",
@ -31316,7 +31351,6 @@
"W6SHH",
"W6SPO",
"W6UNX",
"W7CWT",
"W7EHP",
"W7NVQ",
"W7RCR",
@ -31679,6 +31713,7 @@
"GB4JDF",
"GB4MGR",
"GB4MNH",
"GB4MNX",
"GB4SPT",
"GB4WXM",
"GB4WXM/P",
@ -36942,9 +36977,7 @@
"confirmed_bands": {},
"worked_modes": {},
"confirmed_modes": {},
"direct": [
"N5J"
],
"direct": [],
"prefixITU": {},
"prefixCQ": {},
"directITU": {},
@ -37074,6 +37107,7 @@
"K4PFH",
"K4VIC",
"K4Z",
"K5DTC",
"K5YJR",
"K6BOT",
"K6VH",
@ -37242,6 +37276,7 @@
"KM4ZJW",
"KM4ZWY",
"KM6CTO",
"KM6NFV",
"KN4AWH",
"KN4GNO",
"KN4GYF",
@ -37323,6 +37358,7 @@
"N6RHF",
"N7BPT",
"N8TJH",
"NA7CW",
"NB0G",
"NP3M/LH",
"NP3VI/LH",
@ -37656,6 +37692,7 @@
"ON4OS/LH",
"ON4OSA/LH",
"ON4OSLN/LH",
"ON4PRA/LH",
"ON6UJ/LH",
"ON7PP/LH",
"ON7RU/LGT",
@ -39037,6 +39074,7 @@
"DJ7MH/LH",
"DJ8RH/LH",
"DJ9QE/LH",
"DK0BO/LH",
"DK0DAN/LH",
"DK0FC/LGT",
"DK0FC/LH",
@ -39045,6 +39083,7 @@
"DK0IZ/LH",
"DK0KTL/LH",
"DK0LWL/LH",
"DK0MAR/LH",
"DK0OC/LH",
"DK0PRE/LH",
"DK0RA/LH",
@ -39083,6 +39122,7 @@
"DL0HDF/LH",
"DL0HGW/LGT",
"DL0HGW/LH",
"DL0HOA/LH",
"DL0HST/LH",
"DL0II/LH",
"DL0IOO/LH",
@ -39133,6 +39173,7 @@
"DL6ABN/LH",
"DL6AP/LH",
"DL6KWN/LH",
"DL7A/LH",
"DL7ANC/LH",
"DL7BMG/LH",
"DL7MFK/LH",
@ -40358,11 +40399,13 @@
"EI0CPL/LH",
"EI0LHL/LH",
"EI0M/LH",
"EI0NDR/LH",
"EI1K/LH",
"EI1KARG/LH",
"EI1NC/LH",
"EI4LRC/LH",
"EI5ML/LH"
"EI5ML/LH",
"EI7MRE/LH"
],
"prefixITU": {},
"prefixCQ": {},
@ -40664,6 +40707,7 @@
"IT9RGY/4",
"IU0FSC/LH",
"IU1LCI/EMG",
"IU3EDK/LH",
"IU5JHK/J",
"IU7SCT/J",
"IU8BPS/AWD",
@ -40766,9 +40810,7 @@
"confirmed_bands": {},
"worked_modes": {},
"confirmed_modes": {},
"direct": [
"VERSION"
],
"direct": [],
"prefixITU": {},
"prefixCQ": {},
"directITU": {},
@ -41677,6 +41719,7 @@
"GB5BIG",
"GB5BL",
"GB5BL/LH",
"GB5BRC",
"GB5DPR",
"GB5NHS",
"GB5OMU",
@ -43033,7 +43076,6 @@
"GB2MUL",
"GB2NBC",
"GB2NEF",
"GB2NL",
"GB2NMM",
"GB2OL",
"GB2OWM",
@ -43160,6 +43202,7 @@
"GB6BEN",
"GB6DD",
"GB6TAA",
"GB6WL",
"GB6WLS",
"GB6WW",
"GB70M",
@ -44556,6 +44599,7 @@
"HB9DDZ/LH",
"HB9DLO/LH",
"HB9DWR/LH",
"HB9ILLW/LH",
"HB9OMI/LH",
"HE1G/LGT"
],
@ -45963,12 +46007,12 @@
"AH6IJ",
"AH6IP",
"AH6IW",
"AH6IX",
"AH6JH",
"AH6JN/4",
"AH6JN/M",
"AH6JS",
"AH6JZ",
"AH6K",
"AH6KB",
"AH6KD",
"AH6KG",
@ -45978,6 +46022,7 @@
"AH6LA",
"AH6LE",
"AH6LE/7",
"AH6LF",
"AH6LQ",
"AH6LS",
"AH6MD",
@ -46981,7 +47026,9 @@
"KH2JK",
"KH2JX",
"KH2KD",
"KH2KF",
"KH2KH",
"KH2LB",
"KH2LU",
"KH2LW",
"KH2LZ",
@ -47664,11 +47711,11 @@
"KL1RH",
"KL1RV",
"KL1RX",
"KL1SD",
"KL1SE",
"KL1SE/4",
"KL1SF/7",
"KL1SO",
"KL1SP",
"KL1SS",
"KL1T",
"KL1TQ",
@ -47777,6 +47824,7 @@
"KL2RB",
"KL2SX",
"KL2TD",
"KL2TK",
"KL2TP",
"KL2TR",
"KL2TV",
@ -48217,6 +48265,7 @@
"KL7KRT",
"KL7KSP",
"KL7KSW",
"KL7KSX",
"KL7KTC",
"KL7KTD",
"KL7KTE",
@ -48526,6 +48575,7 @@
"KP3SK",
"KP3SW",
"KP3U",
"KP3UFO",
"KP3VA/M",
"KP3Y",
"KP3YL",
@ -48784,6 +48834,7 @@
"N0DXE/M",
"N0EFP",
"N0EK",
"N0FUL",
"N0GIV/CS",
"N0IM/CS",
"N0INK",
@ -48887,6 +48938,7 @@
"N5ATC",
"N5GOT",
"N5HPW",
"N5J",
"N5JUM",
"N5LIT",
"N5LX",
@ -49031,6 +49083,7 @@
"NH2S",
"NH2W",
"NH2W/9",
"NH2W/P",
"NH6AC",
"NH6AD",
"NH6AE",
@ -49723,6 +49776,7 @@
"W7CID",
"W7CLN",
"W7CRR",
"W7CWT",
"W7DJK",
"W7EME",
"W7GCT",
@ -50255,6 +50309,7 @@
"WH7CY",
"WH7DA",
"WH7DB",
"WH7DC",
"WH7DE",
"WH7DG",
"WH7DH",
@ -50296,7 +50351,6 @@
"WH7TR",
"WH7TT",
"WH7TY",
"WH7U",
"WH7UP",
"WH7USA",
"WH7UZ",
@ -50739,6 +50793,7 @@
"WP4EVL",
"WP4EXH",
"WP4EYW",
"WP4FE",
"WP4FEI",
"WP4FKH",
"WP4FRK",
@ -50852,6 +50907,7 @@
"WP4MQN",
"WP4MQX",
"WP4MRB",
"WP4MRN",
"WP4MRT",
"WP4MSD",
"WP4MSX",
@ -52209,6 +52265,7 @@
"N0BHR": "07",
"N0CO": "07",
"N0DXE/M": "07",
"N0FUL": "07",
"N0GIV/CS": "07",
"N0IM/CS": "07",
"N0IVJ": "07",
@ -52590,6 +52647,7 @@
"AH2AL": "08",
"AH2O": "08",
"AH2P": "08",
"AH6LF": "08",
"AL0Q": "08",
"AL0Y": "08",
"AL2O": "08",
@ -53342,6 +53400,7 @@
"KL2HV": "08",
"KL2MQ": "08",
"KL2NN": "08",
"KL2TZ": "08",
"KL2UM": "08",
"KL2UQ": "08",
"KL2XI": "08",
@ -53453,6 +53512,7 @@
"KP3SK": "08",
"KP3SW": "08",
"KP3U": "08",
"KP3UFO": "08",
"KP4AD": "08",
"KP4AMG": "08",
"KP4AOD": "08",
@ -54240,6 +54300,8 @@
"KH2DF": "07",
"KH2DF/5": "07",
"KH2EV": "07",
"KH2KF": "07",
"KH2LB": "07",
"KH2TB": "07",
"KH2XD": "07",
"KH2XO": "07",
@ -54303,6 +54365,7 @@
"KL1MM": "07",
"KL1QV": "07",
"KL1RX": "07",
"KL1SD": "07",
"KL1TS": "07",
"KL1UR": "07",
"KL1WG": "07",
@ -54438,6 +54501,7 @@
"N4ERC": "07",
"N4WWT": "07",
"N5ATC": "07",
"N5J": "07",
"N5JUM": "07",
"N5LIT": "07",
"N5LX": "07",
@ -54549,6 +54613,7 @@
"W5TLB": "07",
"W6AUS": "07",
"W6MEF": "07",
"W7CWT": "07",
"W7KFI": "07",
"W7NX": "07",
"W9CCC": "07",
@ -54711,6 +54776,7 @@
"AH6CY": "06",
"AH6CY/P": "06",
"AH6HE": "06",
"AH6IX": "06",
"AH6KD": "06",
"AH6KG": "06",
"AH6ML": "06",
@ -55404,7 +55470,6 @@
"AL7D/R": "06",
"AL7DD": "06",
"AL7DU": "06",
"AL7EI": "06",
"AL7EJ": "06",
"AL7F": "06",
"AL7FA": "06",
@ -55795,7 +55860,6 @@
"KL1RH": "06",
"KL1RV": "06",
"KL1SF/7": "06",
"KL1SP": "06",
"KL1TQ": "06",
"KL1U": "06",
"KL1UA": "06",
@ -55831,8 +55895,8 @@
"KL2OJ": "06",
"KL2P": "06",
"KL2QE": "06",
"KL2TK": "06",
"KL2TR": "06",
"KL2TZ": "06",
"KL2VK": "06",
"KL2WE": "06",
"KL2YH": "06",
@ -55975,6 +56039,7 @@
"KL7KG/7": "06",
"KL7KSP": "06",
"KL7KSW": "06",
"KL7KSX": "06",
"KL7KTC": "06",
"KL7KTD": "06",
"KL7KTE": "06",
@ -56184,6 +56249,7 @@
"NH2JE/7": "06",
"NH2KR": "06",
"NH2W": "06",
"NH2W/P": "06",
"NH6AD": "06",
"NH6AJ": "06",
"NH6AY": "06",
@ -56470,6 +56536,7 @@
"WH7CY": "06",
"WH7DA": "06",
"WH7DB": "06",
"WH7DC": "06",
"WH7DE": "06",
"WH7EVR": "06",
"WH7G": "06",
@ -56485,7 +56552,6 @@
"WH7TC": "06",
"WH7TN": "06",
"WH7TR": "06",
"WH7U": "06",
"WH7UP": "06",
"WH7WP": "06",
"WH7WT": "06",
@ -56585,7 +56651,9 @@
"WP2ADG": "06",
"WP3ZO": "06",
"WP4DYP": "06",
"WP4FE": "06",
"WP4LHF": "06",
"WP4MRN": "06",
"WP4NBP": "06",
"WP4ROR": "06",
"WP4RPX": "06",
@ -56607,6 +56675,7 @@
"AL7AH": "08",
"AL7BA": "08",
"AL7BA/8": "08",
"AL7EI": "08",
"AL7GI": "08",
"AL7GI/8": "08",
"AL7J/8": "08",
@ -56755,7 +56824,6 @@
"AE3TT": "08",
"AH6DA": "08",
"AH6EZ/9": "08",
"AH6K": "08",
"AH6OM": "08",
"AH6PA": "08",
"AH6YL": "08",
@ -57425,6 +57493,7 @@
"N0BHR": "04",
"N0CO": "04",
"N0DXE/M": "04",
"N0FUL": "04",
"N0GIV/CS": "04",
"N0IM/CS": "04",
"N0IVJ": "04",
@ -57806,6 +57875,7 @@
"AH2AL": "05",
"AH2O": "05",
"AH2P": "05",
"AH6LF": "05",
"AL0Q": "05",
"AL0Y": "05",
"AL2O": "05",
@ -58558,6 +58628,7 @@
"KL2HV": "05",
"KL2MQ": "05",
"KL2NN": "05",
"KL2TZ": "05",
"KL2UM": "05",
"KL2UQ": "05",
"KL2XI": "05",
@ -58669,6 +58740,7 @@
"KP3SK": "05",
"KP3SW": "05",
"KP3U": "05",
"KP3UFO": "05",
"KP4AD": "05",
"KP4AMG": "05",
"KP4AOD": "05",
@ -59456,6 +59528,8 @@
"KH2DF": "04",
"KH2DF/5": "04",
"KH2EV": "04",
"KH2KF": "04",
"KH2LB": "04",
"KH2TB": "04",
"KH2XD": "04",
"KH2XO": "04",
@ -59519,6 +59593,7 @@
"KL1MM": "04",
"KL1QV": "04",
"KL1RX": "04",
"KL1SD": "04",
"KL1TS": "04",
"KL1UR": "04",
"KL1WG": "04",
@ -59654,6 +59729,7 @@
"N4ERC": "04",
"N4WWT": "04",
"N5ATC": "04",
"N5J": "04",
"N5JUM": "04",
"N5LIT": "04",
"N5LX": "04",
@ -59765,6 +59841,7 @@
"W5TLB": "04",
"W6AUS": "04",
"W6MEF": "04",
"W7CWT": "04",
"W7KFI": "04",
"W7NX": "04",
"W9CCC": "04",
@ -59927,6 +60004,7 @@
"AH6CY": "03",
"AH6CY/P": "03",
"AH6HE": "03",
"AH6IX": "03",
"AH6KD": "03",
"AH6KG": "03",
"AH6ML": "03",
@ -60620,7 +60698,6 @@
"AL7D/R": "03",
"AL7DD": "03",
"AL7DU": "03",
"AL7EI": "03",
"AL7EJ": "03",
"AL7F": "03",
"AL7FA": "03",
@ -61011,7 +61088,6 @@
"KL1RH": "03",
"KL1RV": "03",
"KL1SF/7": "03",
"KL1SP": "03",
"KL1TQ": "03",
"KL1U": "03",
"KL1UA": "03",
@ -61047,8 +61123,8 @@
"KL2OJ": "03",
"KL2P": "03",
"KL2QE": "03",
"KL2TK": "03",
"KL2TR": "03",
"KL2TZ": "03",
"KL2VK": "03",
"KL2WE": "03",
"KL2YH": "03",
@ -61191,6 +61267,7 @@
"KL7KG/7": "03",
"KL7KSP": "03",
"KL7KSW": "03",
"KL7KSX": "03",
"KL7KTC": "03",
"KL7KTD": "03",
"KL7KTE": "03",
@ -61400,6 +61477,7 @@
"NH2JE/7": "03",
"NH2KR": "03",
"NH2W": "03",
"NH2W/P": "03",
"NH6AD": "03",
"NH6AJ": "03",
"NH6AY": "03",
@ -61686,6 +61764,7 @@
"WH7CY": "03",
"WH7DA": "03",
"WH7DB": "03",
"WH7DC": "03",
"WH7DE": "03",
"WH7EVR": "03",
"WH7G": "03",
@ -61701,7 +61780,6 @@
"WH7TC": "03",
"WH7TN": "03",
"WH7TR": "03",
"WH7U": "03",
"WH7UP": "03",
"WH7WP": "03",
"WH7WT": "03",
@ -61801,7 +61879,9 @@
"WP2ADG": "03",
"WP3ZO": "03",
"WP4DYP": "03",
"WP4FE": "03",
"WP4LHF": "03",
"WP4MRN": "03",
"WP4NBP": "03",
"WP4ROR": "03",
"WP4RPX": "03",
@ -61823,6 +61903,7 @@
"AL7AH": "04",
"AL7BA": "04",
"AL7BA/8": "04",
"AL7EI": "04",
"AL7GI": "04",
"AL7GI/8": "04",
"AL7J/8": "04",
@ -61971,7 +62052,6 @@
"AE3TT": "04",
"AH6DA": "04",
"AH6EZ/9": "04",
"AH6K": "04",
"AH6OM": "04",
"AH6PA": "04",
"AH6YL": "04",
@ -63713,6 +63793,7 @@
],
"prefix": [
"9M",
"9M67M",
"9W"
],
"worked": false,
@ -67415,6 +67496,7 @@
"BD1PTA/0",
"BD1TX",
"BD4HF/9",
"BD4QB/0",
"BD5HSV/9",
"BD5QDM/9",
"BD6KF/0",
@ -70901,6 +70983,7 @@
"BA7CK": "26",
"BA7IA": "26",
"BD1TX": "26",
"BD4QB/0": "23",
"BD7HC": "26",
"BD7MQ/9": "23",
"BG6IFR/9": "23",
@ -75970,6 +76053,7 @@
"TO1PF",
"TO1PF/P",
"TO1TAAF",
"TO2DX",
"TO2R",
"TO2R/P",
"TO2Z",
@ -76158,7 +76242,7 @@
"3D2RRR",
"3D2RX",
"3D2VB/R",
"3D2Z"
"3D2Y"
],
"prefixITU": {},
"prefixCQ": {},
@ -77230,6 +77314,7 @@
"worked_modes": {},
"confirmed_modes": {},
"direct": [
"9A/DJ1KW/LH",
"9A/DL9CHR/LH",
"9A/F5OGG/LH",
"9A/IK3MZS/LH",
@ -77734,6 +77819,7 @@
"FO8RZ/P",
"K7ST/FO",
"TX0SIX",
"TX100REF",
"TX4PG",
"TX5A",
"TX5SPM",
@ -77742,8 +77828,11 @@
"TX7G",
"TX7L",
"TX7M",
"TX7MAS",
"TX7MB",
"TX7T"
"TX7N",
"TX7T",
"TX7WW"
],
"prefixITU": {},
"prefixCQ": {},

Wyświetl plik

@ -36,8 +36,8 @@
text-align: auto;
}
</style>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script>
document.addEventListener("contextmenu", function (ev) {
if (process.versions["nw-flavor"] != "sdk") {

Wyświetl plik

@ -18,8 +18,8 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Band Activity</title>
<link rel="stylesheet" href="./lib/style.css" />
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script>
document.addEventListener("dragover", function (event) {
event.preventDefault();

Wyświetl plik

@ -19,9 +19,9 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="./lib/style.css" />
<link rel="stylesheet" href="./lib/chat.css" />
<script src="./lib/screens.js"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/third-party.js" type="text/javascript"></script>
<script src="./lib/screens.js"></script>
<script type="text/javascript">
var g_knownSources = {};
@ -43,17 +43,6 @@
return parseInt(Date.now() / 1000);
}
function lockNewWindows()
{
var gui = require("nw.gui");
var win = gui.Window.get();
win.on("new-win-policy", function (frame, url, policy)
{
gui.Shell.openExternal(url);
policy.ignore();
});
}
function scrollDown(objDiv)
{
objDiv.scrollTop = objDiv.scrollHeight;
@ -125,6 +114,7 @@
function init()
{
window.opener.GT.chatWindowInitialized = true;
lockNewWindows();
if (window.opener.GT.appSettings.gtAgree != "user agrees to messaging")

Wyświetl plik

@ -37,6 +37,7 @@
text-align: center;
}
</style>
<script src="./lib/screens.js"></script>
<script>
document.oncontextmenu = function (event) {
if (process.versions["nw-flavor"] != "sdk") {
@ -52,16 +53,6 @@
event.preventDefault();
});
function lockNewWindows()
{
var gui = require("nw.gui");
var win = gui.Window.get();
win.on("new-win-policy", function (frame, url, policy) {
gui.Shell.openExternal(url);
policy.ignore();
});
}
function timeNowSec() {
return parseInt(Date.now() / 1000);
}
@ -91,7 +82,6 @@
window.opener.onMyKeyDown(event);
}
</script>
<script src="./lib/screens.js"></script>
</head>
<body style="margin: 0; top: 3px" onload="init();">
<div

Wyświetl plik

@ -19,16 +19,8 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Callsign Lookup</title>
<link rel="stylesheet" href="./lib/style.css" />
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js"></script>
<script src="./lib/jquery-3.6.1.min.js"></script>
<script src="./lib/CLDRPluralRuleParser.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.messagestore.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.fallbacks.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.parser.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.emitter.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.language.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/i18n.js" type="text/javascript"></script>
<script>
document.oncontextmenu = function () {

Wyświetl plik

@ -13,6 +13,7 @@
You should have received a copy of the GNU General Public License
along with GridTracker. If not, see <https://www.gnu.org/licenses/>.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Data Breakout</title>
@ -36,6 +37,7 @@
text-align: auto;
}
</style>
<script src="./lib/screens.js"></script>
<script>
function startLookup(call, grid)
{
@ -43,19 +45,9 @@
window.opener.focus();
}
function lockNewWindows()
{
var gui = require("nw.gui");
var win = gui.Window.get();
win.on("new-win-policy", function (frame, url, policy)
{
gui.Shell.openExternal(url);
policy.ignore();
});
}
function init()
{
window.opener.GT.popupWindowInitialized = true
lockNewWindows();
document.addEventListener("keydown", onMyKeyDown, false);
@ -74,13 +66,14 @@
}
};
</script>
<script src="./lib/screens.js"></script>
</head>
<body id="mainBody" onload="init();">
<body id="mainBody" onload="init();" style="background-color: black">
<div
id="main"
style="
margin: 0;
left:0;
right:0;
top: 0;
min-height: 60px;
width: auto;
@ -91,9 +84,10 @@
position: relative;
white-space: nowrap;
overflow: hidden;
z-index: 600;
"
>
<div id="adifTable"></div>
<div id="adifTable" style="display:inline-block;"></div>
</div>
</body>
</html>

Wyświetl plik

@ -20,17 +20,9 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="./lib/style.css" />
<link id="roster" rel="stylesheet" href="./lib/style_roster.css" />
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/third-party.js" type="text/javascript"></script>
<script src="./lib/jquery-3.6.1.min.js"></script>
<script src="./lib/CLDRPluralRuleParser.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.messagestore.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.fallbacks.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.parser.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.emitter.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.language.js" type="text/javascript"></script>
<script src="./lib/i18n.js" type="text/javascript"></script>
<script src="./lib/roster.js " type="text/javascript"></script>
<script src="./lib/roster/prepareRosterSettings.js" type="text/javascript"></script>
@ -456,7 +448,7 @@
<div id="MainRosterControls">
<div id="LogbookControls">
<label data-i18n="roster.controls.logbook.label">Logbook</label>
<label data-i18n="roster.controls.logbook.label" for="referenceNeed">Logbook</label>
<select id="referenceNeed" onchange="valuesChanged();">
<option data-i18n="roster.controls.logbook.awardTracker" value="6">Award Tracker</option>
<option data-i18n="roster.controls.logbook.liveBandMode" value="0" selected="true">Live Band &amp; Mode</option>
@ -469,7 +461,7 @@
</div>
<div id="CallsignsControls">
<label data-i18n="roster.controls.callsigns.label">Callsigns</label>
<label data-i18n="roster.controls.callsigns.label" for="callsignNeed">Callsigns</label>
<select id="callsignNeed" onchange="valuesChanged();">
<option data-i18n="roster.controls.callsigns.worked" value="worked">New</option>
<option data-i18n="roster.controls.callsigns.confirmed" value="confirmed">New+Unconfirmed</option>
@ -479,7 +471,7 @@
</div>
<div id="HuntModeControls">
<label data-i18n="roster.controls.hunting.label">Hunting</label>
<label data-i18n="roster.controls.hunting.label" for="huntMode">Hunting</label>
<select id="huntMode" onchange="valuesChanged();" value="callsign">
<option data-i18n="roster.controls.hunting.callsign" value="callsign">Callsign</option>
<option data-i18n="roster.controls.hunting.grid" value="grid">Grid</option>
@ -601,7 +593,7 @@
</div>
<div>
<input type="checkbox" id="huntWatcher" onchange="wantedChanged(this);" />
<label data-i18n="roster.watcher.label" class="flexButton" onclick="openWatcher();">Watcher</label>
<label data-i18n="roster.watcher.label" for="huntWatcher" class="flexButton" onclick="openWatcher();">Watcher</label>
</div>
</div>
</div>

Wyświetl plik

@ -19,15 +19,8 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Statistics</title>
<link rel="stylesheet" href="./lib/style.css" />
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/screens.js"></script>
<script src="./lib/jquery-3.6.1.min.js"></script>
<script src="./lib/jquery.i18n.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.messagestore.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.fallbacks.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.parser.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.emitter.js" type="text/javascript"></script>
<script src="./lib/jquery.i18n.language.js" type="text/javascript"></script>
<script src="./lib/protos.js" type="text/javascript"></script>
<script src="./lib/i18n.js" type="text/javascript"></script>
<script src="./lib/stats.js"></script>
</head>

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -355,6 +355,9 @@
"settings.logging.LoTW.details.station": "Stationsname",
"settings.logging.LoTW.test.downloadButton":"Test-Download",
"settings.logging.LoTW.test.TQSLButton": "Test TQSL",
"settings.logging.HamCQ.source": "HamCQ.cn",
"settings.logging.HamCQ.details.apiKey": "API Schlüssel",
"settings.logging.HamCQ.test.button": "Test",
"settings.logging.N1MM.source": "N1MM Logger+",
"settings.logging.N1MM.details.IP": "IP",
"settings.logging.N1MM.details.Port": "Port",
@ -467,6 +470,10 @@
"settings.OAMS.message.NotAway": "Nicht Abwesend",
"settings.OAMS.message.AmAway": "Ich bin abwesend",
"settings.OAMS.message.awayText": "Abwesenheitsnachricht",
"settings.OAMS.BandActivity.enable.label": "Bandaktivität",
"settings.OAMS.BandActivity.enable.hover": "Erhalten Sie Bandaktivitätsberichte über das OAMS-Netzwerk",
"settings.OAMS.BandActivity.neighbor.enable.label": "Angrenzende Gitter",
"settings.OAMS.BandActivity.neighbor.enable.hover": "Fügen Sie Ihre 8 Nachbargitter in den Bericht ein",
"settings.about.AppVersion": "GridTracker",
"settings.about.Brief": "GridTracker ist das Schweizer Taschenmesser mit Informationen für den Funkamateur in einer einfach zu benutzenden Benutzeroberfläche.",
"settings.about.FeatureList1": "Aus Live-Funkverkehr von WSJT-X",

Wyświetl plik

@ -82,6 +82,7 @@
"mapFilter.band.6m": "6m",
"mapFilter.band.4m": "4m",
"mapFilter.band.2m": "2m",
"mapFilter.band.1_25m": "1.25m",
"mapFilter.band.125cm": "125cm",
"mapFilter.band.70cm": "70cm",
"mapFilter.band.33cm": "33cm",
@ -462,6 +463,7 @@
"settings.OAMS.message.newAlert.60min": "1 hora",
"settings.OAMS.message.newAlert.Action": "Acción de nuevo mensaje",
"settings.OAMS.message.newAlert.Nothing": "No hacer nada",
"settings.OAMS.message.newAlert.OpenWindow": "Abrir ventana de mensajería",
"settings.OAMS.message.awayMode": "Modo ausente",
"settings.OAMS.message.NotAway": "No ausente",
"settings.OAMS.message.AmAway": "Estoy ausente",

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.5 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.4 KiB

Wyświetl plik

@ -1,685 +0,0 @@
/* eslint-disable no-tabs */
/**
* cldrpluralparser.js
* A parser engine for CLDR plural rules.
*
* Copyright 2012-2014 Santhosh Thottingal and other contributors
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
* @source https://github.com/santhoshtr/CLDRPluralRuleParser
* @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
* @author Timo Tijhof
* @author Amir Aharoni
*/
/**
* Evaluates a plural rule in CLDR syntax for a number
* @param {string} rule
* @param {integer} number
* @return {boolean} true if evaluation passed, false if evaluation failed.
*/
// UMD returnExports https://github.com/umdjs/umd/blob/master/returnExports.js
(function(root, factory)
{
if (typeof define === "function" && define.amd)
{
// AMD. Register as an anonymous module.
define(factory);
}
else if (typeof exports === "object")
{
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory();
}
else
{
// Browser globals (root is window)
root.pluralRuleParser = factory();
}
}(this, function()
{
function pluralRuleParser(rule, number)
{
"use strict";
/*
Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
-----------------------------------------------------------------
condition = and_condition ('or' and_condition)*
('@integer' samples)?
('@decimal' samples)?
and_condition = relation ('and' relation)*
relation = is_relation | in_relation | within_relation
is_relation = expr 'is' ('not')? value
in_relation = expr (('not')? 'in' | '=' | '!=') range_list
within_relation = expr ('not')? 'within' range_list
expr = operand (('mod' | '%') value)?
operand = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
range_list = (range | value) (',' range_list)*
value = digit+
digit = 0|1|2|3|4|5|6|7|8|9
range = value'..'value
samples = sampleRange (',' sampleRange)* (',' ('…'|'...'))?
sampleRange = decimalValue '~' decimalValue
decimalValue = value ('.' value)?
*/
// We don't evaluate the samples section of the rule. Ignore it.
rule = rule.split("@")[0].replace(/^\s*/, "").replace(/\s*$/, "");
if (!rule.length)
{
// Empty rule or 'other' rule.
return true;
}
// Indicates the current position in the rule as we parse through it.
// Shared among all parsing functions below.
var pos = 0,
operand,
expression,
relation,
result,
whitespace = makeRegexParser(/^\s+/),
value = makeRegexParser(/^\d+/),
_n_ = makeStringParser("n"),
_i_ = makeStringParser("i"),
_f_ = makeStringParser("f"),
_t_ = makeStringParser("t"),
_v_ = makeStringParser("v"),
_w_ = makeStringParser("w"),
_is_ = makeStringParser("is"),
_isnot_ = makeStringParser("is not"),
_isnot_sign_ = makeStringParser("!="),
_equal_ = makeStringParser("="),
_mod_ = makeStringParser("mod"),
_percent_ = makeStringParser("%"),
_not_ = makeStringParser("not"),
_in_ = makeStringParser("in"),
_within_ = makeStringParser("within"),
_range_ = makeStringParser(".."),
_comma_ = makeStringParser(","),
_or_ = makeStringParser("or"),
_and_ = makeStringParser("and");
function debug()
{
// console.log.apply(console, arguments);
}
debug("pluralRuleParser", rule, number);
// Try parsers until one works, if none work return null
function choice(parserSyntax)
{
return function()
{
var i, result;
for (i = 0; i < parserSyntax.length; i++)
{
result = parserSyntax[i]();
if (result !== null)
{
return result;
}
}
return null;
};
}
// Try several parserSyntax-es in a row.
// All must succeed; otherwise, return null.
// This is the only eager one.
function sequence(parserSyntax)
{
var i, parserRes,
originalPos = pos,
result = [];
for (i = 0; i < parserSyntax.length; i++)
{
parserRes = parserSyntax[i]();
if (parserRes === null)
{
pos = originalPos;
return null;
}
result.push(parserRes);
}
return result;
}
// Run the same parser over and over until it fails.
// Must succeed a minimum of n times; otherwise, return null.
function nOrMore(n, p)
{
return function()
{
var originalPos = pos,
result = [],
parsed = p();
while (parsed !== null)
{
result.push(parsed);
parsed = p();
}
if (result.length < n)
{
pos = originalPos;
return null;
}
return result;
};
}
// Helpers - just make parserSyntax out of simpler JS builtin types
function makeStringParser(s)
{
var len = s.length;
return function()
{
var result = null;
if (rule.substr(pos, len) === s)
{
result = s;
pos += len;
}
return result;
};
}
function makeRegexParser(regex)
{
return function()
{
var matches = rule.substr(pos).match(regex);
if (matches === null)
{
return null;
}
pos += matches[0].length;
return matches[0];
};
}
/**
* Integer digits of n.
*/
function i()
{
var result = _i_();
if (result === null)
{
debug(" -- failed i", parseInt(number, 10));
return result;
}
result = parseInt(number, 10);
debug(" -- passed i ", result);
return result;
}
/**
* Absolute value of the source number (integer and decimals).
*/
function n()
{
var result = _n_();
if (result === null)
{
debug(" -- failed n ", number);
return result;
}
result = parseFloat(number, 10);
debug(" -- passed n ", result);
return result;
}
/**
* Visible fractional digits in n, with trailing zeros.
*/
function f()
{
var result = _f_();
if (result === null)
{
debug(" -- failed f ", number);
return result;
}
result = (number + ".").split(".")[1] || 0;
debug(" -- passed f ", result);
return result;
}
/**
* Visible fractional digits in n, without trailing zeros.
*/
function t()
{
var result = _t_();
if (result === null)
{
debug(" -- failed t ", number);
return result;
}
result = (number + ".").split(".")[1].replace(/0$/, "") || 0;
debug(" -- passed t ", result);
return result;
}
/**
* Number of visible fraction digits in n, with trailing zeros.
*/
function v()
{
var result = _v_();
if (result === null)
{
debug(" -- failed v ", number);
return result;
}
result = (number + ".").split(".")[1].length || 0;
debug(" -- passed v ", result);
return result;
}
/**
* Number of visible fraction digits in n, without trailing zeros.
*/
function w()
{
var result = _w_();
if (result === null)
{
debug(" -- failed w ", number);
return result;
}
result = (number + ".").split(".")[1].replace(/0$/, "").length || 0;
debug(" -- passed w ", result);
return result;
}
// operand = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
operand = choice([n, i, f, t, v, w]);
// expr = operand (('mod' | '%') value)?
expression = choice([mod, operand]);
function mod()
{
var result = sequence(
[operand, whitespace, choice([_mod_, _percent_]), whitespace, value]
);
if (result === null)
{
debug(" -- failed mod");
return null;
}
debug(" -- passed " + parseInt(result[0], 10) + " " + result[2] + " " + parseInt(result[4], 10));
return parseFloat(result[0]) % parseInt(result[4], 10);
}
function not()
{
var result = sequence([whitespace, _not_]);
if (result === null)
{
debug(" -- failed not");
return null;
}
return result[1];
}
// is_relation = expr 'is' ('not')? value
function is()
{
var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
if (result !== null)
{
debug(" -- passed is : " + result[0] + " == " + parseInt(result[4], 10));
return result[0] === parseInt(result[4], 10);
}
debug(" -- failed is");
return null;
}
// is_relation = expr 'is' ('not')? value
function isnot()
{
var result = sequence(
[expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]
);
if (result !== null)
{
debug(" -- passed isnot: " + result[0] + " != " + parseInt(result[4], 10));
return result[0] !== parseInt(result[4], 10);
}
debug(" -- failed isnot");
return null;
}
function not_in()
{
var i, range_list,
result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
if (result !== null)
{
debug(" -- passed not_in: " + result[0] + " != " + result[4]);
range_list = result[4];
for (i = 0; i < range_list.length; i++)
{
if (parseInt(range_list[i], 10) === parseInt(result[0], 10))
{
return false;
}
}
return true;
}
debug(" -- failed not_in");
return null;
}
// range_list = (range | value) (',' range_list)*
function rangeList()
{
var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]),
resultList = [];
if (result !== null)
{
resultList = resultList.concat(result[0]);
if (result[1][0])
{
resultList = resultList.concat(result[1][0]);
}
return resultList;
}
debug(" -- failed rangeList");
return null;
}
function rangeTail()
{
// ',' range_list
var result = sequence([_comma_, rangeList]);
if (result !== null)
{
return result[1];
}
debug(" -- failed rangeTail");
return null;
}
// range = value'..'value
function range()
{
var i, array, left, right,
result = sequence([value, _range_, value]);
if (result !== null)
{
debug(" -- passed range");
array = [];
left = parseInt(result[0], 10);
right = parseInt(result[2], 10);
for (i = left; i <= right; i++)
{
array.push(i);
}
return array;
}
debug(" -- failed range");
return null;
}
function _in()
{
var result, range_list, i;
// in_relation = expr ('not')? 'in' range_list
result = sequence(
[expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]
);
if (result !== null)
{
debug(" -- passed _in:" + result);
range_list = result[5];
for (i = 0; i < range_list.length; i++)
{
if (parseInt(range_list[i], 10) === parseFloat(result[0]))
{
return (result[1][0] !== "not");
}
}
return (result[1][0] === "not");
}
debug(" -- failed _in ");
return null;
}
/**
* The difference between "in" and "within" is that
* "in" only includes integers in the specified range,
* while "within" includes all values.
*/
function within()
{
var range_list, result;
// within_relation = expr ('not')? 'within' range_list
result = sequence(
[expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]
);
if (result !== null)
{
debug(" -- passed within");
range_list = result[5];
if ((result[0] >= parseInt(range_list[0], 10)) &&
(result[0] < parseInt(range_list[range_list.length - 1], 10)))
{
return (result[1][0] !== "not");
}
return (result[1][0] === "not");
}
debug(" -- failed within ");
return null;
}
// relation = is_relation | in_relation | within_relation
relation = choice([is, not_in, isnot, _in, within]);
// and_condition = relation ('and' relation)*
function and()
{
var i,
result = sequence([relation, nOrMore(0, andTail)]);
if (result)
{
if (!result[0])
{
return false;
}
for (i = 0; i < result[1].length; i++)
{
if (!result[1][i])
{
return false;
}
}
return true;
}
debug(" -- failed and");
return null;
}
// ('and' relation)*
function andTail()
{
var result = sequence([whitespace, _and_, whitespace, relation]);
if (result !== null)
{
debug(" -- passed andTail" + result);
return result[3];
}
debug(" -- failed andTail");
return null;
}
// ('or' and_condition)*
function orTail()
{
var result = sequence([whitespace, _or_, whitespace, and]);
if (result !== null)
{
debug(" -- passed orTail: " + result[3]);
return result[3];
}
debug(" -- failed orTail");
return null;
}
// condition = and_condition ('or' and_condition)*
function condition()
{
var i,
result = sequence([and, nOrMore(0, orTail)]);
if (result)
{
for (i = 0; i < result[1].length; i++)
{
if (result[1][i])
{
return true;
}
}
return result[0];
}
return false;
}
result = condition();
/**
* For success, the pos must have gotten to the end of the rule
* and returned a non-null.
* n.b. This is part of language infrastructure,
* so we do not throw an internationalizable message.
*/
if (result === null)
{
throw new Error("Parse error at position " + pos.toString() + " for rule: " + rule);
}
if (pos !== rule.length)
{
debug("Warning: Rule not parsed completely. Parser stopped at " + rule.substr(0, pos) + " for rule: " + rule);
}
return result;
}
return pluralRuleParser;
}));

Wyświetl plik

@ -108,9 +108,9 @@ function initAdifWorker()
task.prefixToCQzone = GT.prefixToCQzone;
task.prefixToMap = GT.prefixToMap;
task.gridToState = GT.gridToState;
task.callsignDatabaseDXCC = GT.callsignDatabaseDXCC;
task.callsignDatabaseUS = GT.callsignDatabaseUS;
task.callsignDatabaseUSplus = GT.callsignDatabaseUSplus;
task.cqZones = GT.cqZones;
task.ituZones = GT.ituZones;
task.wacZones = GT.wacZones;
task.modes = GT.modes;
task.modes_phone = GT.modes_phone;
task.QSOhash = GT.QSOhash;
@ -575,7 +575,7 @@ function adifMenuCheckBoxChanged(what)
document.getElementById(menuItem).style.display = "none";
}
localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
GT.localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
if (what == buttonAdifCheckBox) setAdifStartup(loadAdifCheckBox);
}
@ -583,7 +583,7 @@ function adifMenuCheckBoxChanged(what)
function adifStartupCheckBoxChanged(what)
{
GT.adifLogSettings.startup[what.id] = what.checked;
localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
GT.localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
if (what == loadAdifCheckBox) setAdifStartup(loadAdifCheckBox);
}
@ -604,7 +604,7 @@ function adifLogQsoCheckBoxChanged(what)
trustedTestButton.style.display = "none";
}
}
localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
GT.localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
}
function adifNicknameCheckBoxChanged(what)
@ -621,14 +621,14 @@ function adifNicknameCheckBoxChanged(what)
eQSLNickname.style.display = "none";
}
}
localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
GT.localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
}
function adifTextValueChange(what)
{
what.value = what.value.trim();
GT.adifLogSettings.text[what.id] = what.value;
localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
GT.localStorage.adifLogSettings = JSON.stringify(GT.adifLogSettings);
}
GT.fileSelector = document.createElement("input");
@ -662,7 +662,7 @@ function addLogToStartupList(fileObject, selector = null)
newObject.name = fileObject.name;
newObject.file = fileObject.path;
GT.startupLogs.push(newObject);
localStorage.startupLogs = JSON.stringify(GT.startupLogs);
GT.localStorage.startupLogs = JSON.stringify(GT.startupLogs);
if (selector != null)
{
@ -738,8 +738,6 @@ GT.tqslFileSelector.onchange = function ()
if (this.files && this.files[0])
{
GT.trustedQslSettings.binaryFile = this.files[0].path;
var fs = require("fs");
if (
fs.existsSync(GT.trustedQslSettings.binaryFile) &&
(GT.trustedQslSettings.binaryFile.endsWith("tqsl.exe") ||
@ -760,14 +758,12 @@ GT.tqslFileSelector.onchange = function ()
}
tqslFileDiv.innerHTML = "<b>" + start_and_end(this.files[0].path) + "</b>";
localStorage.trustedQslSettings = JSON.stringify(GT.trustedQslSettings);
GT.localStorage.trustedQslSettings = JSON.stringify(GT.trustedQslSettings);
}
};
function loadGtQSOLogFile()
{
var fs = require("fs");
if (fs.existsSync(GT.qsoLogFile))
{
fs.readFile(GT.qsoLogFile, "utf-8", handleAdifLoad);
@ -776,7 +772,6 @@ function loadGtQSOLogFile()
function getFilesizeInBytes(filename)
{
var fs = require("fs");
var stats = fs.statSync(filename);
var fileSizeInBytes = stats.size;
return fileSizeInBytes;
@ -784,8 +779,6 @@ function getFilesizeInBytes(filename)
function loadLoTWLogFile()
{
var fs = require("fs");
if (fs.existsSync(GT.LoTWLogFile) && getFilesizeInBytes(GT.LoTWLogFile) > 0)
{
fs.readFile(GT.LoTWLogFile, "utf-8", handleAdifLoadLocalLoTW);
@ -809,7 +802,6 @@ function loadLoTWLogFile()
function loadWsjtLogFile()
{
var fs = require("fs");
if (fs.existsSync(GT.workingIniPath + "wsjtx_log.adi"))
{
fs.readFile(GT.workingIniPath + "wsjtx_log.adi", "utf-8", handleAdifLoad);
@ -818,7 +810,6 @@ function loadWsjtLogFile()
function findTrustedQSLPaths()
{
var process = require("process");
var base = null;
if (GT.trustedQslSettings.stationFileValid == true)
@ -988,13 +979,11 @@ function findTrustedQSLPaths()
}
}
}
localStorage.trustedQslSettings = JSON.stringify(GT.trustedQslSettings);
GT.localStorage.trustedQslSettings = JSON.stringify(GT.trustedQslSettings);
}
function startupAdifLoadFunction()
{
var fs = require("fs");
for (var i in GT.startupLogs)
{
try
@ -1092,7 +1081,7 @@ function removeStartupLog(i)
if (i in GT.startupLogs)
{
GT.startupLogs.splice(i, 1);
localStorage.startupLogs = JSON.stringify(GT.startupLogs);
GT.localStorage.startupLogs = JSON.stringify(GT.startupLogs);
setAdifStartup(loadAdifCheckBox);
}
}
@ -1119,15 +1108,14 @@ function startupAdifLoadCheck()
function getABuffer(file_url, callback, flag, mode, port, imgToGray, stringOfFlag, timeoutX)
{
var url = require("url");
var http = require(mode);
var fileBuffer = null;
var options = null;
options = {
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
host: nwURL.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
path: nwURL.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
method: "get"
};
@ -1234,14 +1222,13 @@ function getAPostBuffer(
{
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
host: nwURL.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
path: nwURL.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
@ -1711,7 +1698,6 @@ function finishSendingReport(record, localMode)
// Log worthy
if (logGTqsoCheckBox.checked == true)
{
var fs = require("fs");
fs.appendFileSync(GT.qsoLogFile, reportWithPota + "\r\n");
addLastTraffic(
"<font style='color:white'>Logged to GridTracker backup</font>"
@ -2106,7 +2092,7 @@ function n1mmLoggerChanged()
GT.N1MMSettings.ip = N1MMIpInput.value;
GT.N1MMSettings.port = N1MMPortInput.value;
localStorage.N1MMSettings = JSON.stringify(GT.N1MMSettings);
GT.localStorage.N1MMSettings = JSON.stringify(GT.N1MMSettings);
}
function log4OMLoggerChanged()
@ -2115,7 +2101,7 @@ function log4OMLoggerChanged()
GT.log4OMSettings.ip = log4OMIpInput.value;
GT.log4OMSettings.port = log4OMPortInput.value;
localStorage.log4OMSettings = JSON.stringify(GT.log4OMSettings);
GT.localStorage.log4OMSettings = JSON.stringify(GT.log4OMSettings);
}
function acLogLoggerChanged()
@ -2124,7 +2110,7 @@ function acLogLoggerChanged()
GT.acLogSettings.ip = acLogIpInput.value;
GT.acLogSettings.port = acLogPortInput.value;
localStorage.acLogSettings = JSON.stringify(GT.acLogSettings);
GT.localStorage.acLogSettings = JSON.stringify(GT.acLogSettings);
}
function dxkLogLoggerChanged()
@ -2133,7 +2119,7 @@ function dxkLogLoggerChanged()
GT.dxkLogSettings.ip = dxkLogIpInput.value;
GT.dxkLogSettings.port = dxkLogPortInput.value;
localStorage.dxkLogSettings = JSON.stringify(GT.dxkLogSettings);
GT.localStorage.dxkLogSettings = JSON.stringify(GT.dxkLogSettings);
}
function hrdLogbookLoggerChanged()
@ -2142,7 +2128,7 @@ function hrdLogbookLoggerChanged()
GT.HRDLogbookLogSettings.ip = hrdLogbookIpInput.value;
GT.HRDLogbookLogSettings.port = hrdLogbookPortInput.value;
localStorage.HRDLogbookLogSettings = JSON.stringify(GT.HRDLogbookLogSettings);
GT.localStorage.HRDLogbookLogSettings = JSON.stringify(GT.HRDLogbookLogSettings);
}
function CloudUrlErrorCallback(
@ -2698,14 +2684,13 @@ function getPostJSONBuffer(
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 protocol = nwURL.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
host: nwURL.parse(file_url).hostname, // eslint-disable-line node/no-deprecated-api
port: nwURL.parse(file_url).port, // eslint-disable-line node/no-deprecated-api
path: nwURL.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
method: "post",
headers: {
"Content-Type": "application/json",

Wyświetl plik

@ -38,9 +38,22 @@ function initGlobals(task)
GT.prefixToCQzone = task.prefixToCQzone;
GT.prefixToMap = task.prefixToMap;
GT.gridToState = task.gridToState;
GT.callsignDatabaseDXCC = task.callsignDatabaseDXCC;
GT.callsignDatabaseUS = task.callsignDatabaseUS;
GT.callsignDatabaseUSplus = task.callsignDatabaseUSplus;
GT.cqZones = task.cqZones;
for (const key in GT.cqZones)
{
GT.cqZones[key].geo = null;
}
GT.ituZones = task.ituZones;
for (const key in GT.ituZones)
{
GT.ituZones[key].geo = null;
}
GT.wacZones = task.wacZones;
for (const key in GT.wacZones)
{
GT.wacZones[key].geo = null;
}
GT.modes = task.modes;
GT.modes_phone = task.modes_phone;
GT.QSOhash = task.QSOhash;
@ -194,7 +207,7 @@ function onAdiLoadComplete(task)
var finalPropMode = (object.PROP_MODE || "").toUpperCase();
var finalSatName = (object.SAT_NAME || "").toUpperCase();
var finalCont = (object.CONT || "").toUpperCase();
if (finalCont.length == 0)
if (!(finalCont in GT.wacZones))
{
finalCont = null;
}
@ -262,20 +275,23 @@ function onAdiLoadComplete(task)
finalCqZone = "0" + finalCqZone;
}
if (parseInt(finalCqZone) < 1 || parseInt(finalCqZone) > 40)
{
finalCqZone = "";
}
finalCqZone = String(finalCqZone);
if (!(finalCqZone in GT.cqZones))
{
finalCqZone = null;
}
var finalItuZone = (object.ITUZ || "");
if (finalItuZone.length == 1) finalItuZone = "0" + finalItuZone;
if (parseInt(finalItuZone) < 1 || parseInt(finalItuZone) > 90)
{
finalItuZone = "";
}
finalItuZone = String(finalItuZone);
if (!(finalItuZone in GT.ituZones))
{
finalItuZone = null;
}
var finalIOTA = (object.IOTA || "").toUpperCase();
var qrzConfirmed = (object.APP_QRZLOG_STATUS || "").toUpperCase();
@ -456,8 +472,8 @@ function addQSO(
if (finalRSTsent.length > 0) details.RSTsent = finalRSTsent;
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
if (finalCqZone.length > 0) details.cqz = finalCqZone;
if (finalItuZone.length > 0) details.ituz = finalItuZone;
if (finalCqZone) details.cqz = finalCqZone;
if (finalItuZone) details.ituz = finalItuZone;
if (details.state != null && finalState != null && details.state != finalState && confirmed == true && canWrite == true)
{
details.state = finalState;
@ -559,11 +575,11 @@ function addQSO(
}
}
if (!details.cqz || details.cqz.length == 0)
if (!details.cqz)
{
details.cqz = cqZoneFromCallsign(finalDXcall, details.dxcc);
}
if (!details.ituz || details.ituz.length == 0)
if (!details.ituz)
{
details.ituz = ituZoneFromCallsign(finalDXcall, details.dxcc);
}

Wyświetl plik

@ -10,7 +10,7 @@ GT.alertSettings = Object();
function loadAlerts()
{
if (typeof localStorage.classicAlertsVersion == "undefined")
if (typeof GT.localStorage.classicAlertsVersion == "undefined")
{
GT.classicAlerts = {
huntCallsign: false,
@ -44,7 +44,7 @@ function loadAlerts()
huntITUzNotifyMedia: "none",
huntStatesNotifyMedia: "none"
};
localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
GT.localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
GT.alertSettings = Object();
GT.alertSettings.requireGrid = true;
@ -66,26 +66,26 @@ function loadAlerts()
GT.alertSettings.reference = 0;
GT.alertSettings.logEventMedia = "Ping-coin.mp3";
localStorage.alertSettings = JSON.stringify(GT.alertSettings);
localStorage.classicAlertsVersion = gtVersion;
GT.localStorage.alertSettings = JSON.stringify(GT.alertSettings);
GT.localStorage.classicAlertsVersion = gtVersion;
}
else
{
GT.classicAlerts = JSON.parse(localStorage.classicAlerts);
GT.alertSettings = JSON.parse(localStorage.alertSettings);
GT.classicAlerts = JSON.parse(GT.localStorage.classicAlerts);
GT.alertSettings = JSON.parse(GT.localStorage.alertSettings);
}
if (typeof GT.alertSettings.reference == "undefined")
{
GT.alertSettings.reference = 0;
localStorage.alertSettings = JSON.stringify(GT.alertSettings);
GT.localStorage.alertSettings = JSON.stringify(GT.alertSettings);
}
if (typeof GT.alertSettings.logEventMedia == "undefined")
{
GT.alertSettings.logEventMedia = "Ping-coin.mp3";
localStorage.alertSettings = JSON.stringify(GT.alertSettings);
GT.localStorage.alertSettings = JSON.stringify(GT.alertSettings);
}
if (typeof GT.classicAlerts.huntRoster == "undefined")
@ -95,12 +95,12 @@ function loadAlerts()
GT.classicAlerts.huntRosterNotifyWord = "New hit";
GT.classicAlerts.huntRosterNotifyMedia = "none";
localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
GT.localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
}
loadClassicAlertView();
if (typeof localStorage.savedAlerts == "undefined")
if (typeof GT.localStorage.savedAlerts == "undefined")
{
GT.alerts = {
popup: {
@ -121,7 +121,7 @@ function loadAlerts()
}
else
{
GT.alerts = JSON.parse(localStorage.savedAlerts);
GT.alerts = JSON.parse(GT.localStorage.savedAlerts);
for (var key in GT.alerts)
{
if (
@ -164,7 +164,7 @@ function loadAlerts()
function newLogEventSetting(obj)
{
GT.alertSettings.logEventMedia = obj.value;
localStorage.alertSettings = JSON.stringify(GT.alertSettings);
GT.localStorage.alertSettings = JSON.stringify(GT.alertSettings);
}
function exceptionValuesChanged()
@ -193,7 +193,7 @@ function exceptionValuesChanged()
GT.alertSettings.reference = referenceNeed.value;
localStorage.alertSettings = JSON.stringify(GT.alertSettings);
GT.localStorage.alertSettings = JSON.stringify(GT.alertSettings);
}
function hashMaker(band, mode)
@ -286,12 +286,12 @@ function setAudioView()
function saveAudioSettings()
{
localStorage.audioSettings = JSON.stringify(GT.audioSettings);
GT.localStorage.audioSettings = JSON.stringify(GT.audioSettings);
}
function saveAlerts()
{
localStorage.savedAlerts = JSON.stringify(GT.alerts);
GT.localStorage.savedAlerts = JSON.stringify(GT.alerts);
}
GT.testAudioTimer = null;
@ -339,7 +339,7 @@ function addNewAlert()
if (alertMediaSelect.value == "none")
{
valid = false;
error = $.i18n("alerts.addNew.SelectFile");
error = I18N("alerts.addNew.SelectFile");
}
else
{
@ -1012,7 +1012,7 @@ function wantedChanged(what)
{
GT.classicAlerts[what.id] = what.checked;
}
localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
GT.localStorage.classicAlerts = JSON.stringify(GT.classicAlerts);
}
GT.classic_alert_count_template = {

Wyświetl plik

@ -94,7 +94,7 @@ function callsignServicesInit()
function saveCallsignSettings()
{
localStorage.callsignLookups = JSON.stringify(GT.callsignLookups);
GT.localStorage.callsignLookups = JSON.stringify(GT.callsignLookups);
}
function lotwLoadCallsigns()

Wyświetl plik

@ -11,6 +11,7 @@ var validSettings = [
"blockedCQ",
"ignoredCQ",
"blockedCalls",
"blockedGrid",
"blockedDxcc",
"blockedCQz",
"blockedITUz",
@ -101,7 +102,8 @@ var def_appSettings = {
workingDateEnable: false,
workingDate: 0,
qsoItemsPerPage: 100,
qslAuthority: "L"
qslAuthority: "L",
collapsedMapViewFilters: false
};
var def_mapSettings = {
@ -119,11 +121,13 @@ var def_mapSettings = {
latitude: 0.0,
loudness: 1,
mapIndex: "Mapnik by OpenStreetMap (Intl)",
offlineMapIndex: "Satellite by MapTiler (No Labels)(Offline)",
mergeOverlay: false,
mouseOver: true,
nightLoudness: 0.8,
nightMapEnable: false,
nightMapIndex: "Dark Gray by Esri (English)",
offlineNightMapIndex: "Toner by Stamen (No Labels)(Offline)",
nightPathColor: 361,
nightQrzPathColor: 1,
offlineMode: false,

Plik diff jest za duży Load Diff

Wyświetl plik

@ -4,6 +4,27 @@
// gtCommon.js is common functions used by gt.js , adifWorker.js, trackerWorker.js and others
// var GT must be initiliazed before loading this script.
GT.callsignDatabaseDXCC = {
291: true,
1: true,
6: true,
110: true,
202: true
};
GT.callsignDatabaseUS = {
291: true,
6: true,
110: true
};
GT.callsignDatabaseUSplus = {
291: true,
6: true,
110: true,
202: true
};
function validateGridFromString(inputText)
{
var validGrid = false;

Wyświetl plik

@ -856,7 +856,7 @@ function toggleGtMap()
function notifyNoChat(id)
{
if (GT.chatWindowHandle != null)
if (GT.chatWindowInitialized)
{
try
{
@ -868,7 +868,7 @@ function notifyNoChat(id)
function updateChatWindow(id = null)
{
if (GT.chatWindowHandle != null)
if (GT.chatWindowInitialized)
{
try
{
@ -890,7 +890,7 @@ function newChatMessage(id, jsmesg)
var hasFocus = false;
if (GT.msgSettings.msgActionSelect == 1) showMessaging();
if (GT.chatWindowHandle != null)
if (GT.chatWindowInitialized)
{
try
{

Wyświetl plik

@ -1,4 +1,4 @@
let languages = {
GT.languages = {
en: "i18n/en.json",
cn: "i18n/cn.json",
cnt: "i18n/cn-t.json",
@ -8,19 +8,73 @@ let languages = {
es: "i18n/es.json"
};
function loadI18n()
GT.i18n = {};
function readLocaleFile(locale)
{
$.i18n().load(languages).done(function ()
if (locale in GT.languages)
{
$.i18n().locale = GT.appSettings.locale;
refreshI18NStrings();
});
try
{
GT.i18n = require(GT.languages[locale]);
}
catch (e)
{
console.error("Failed to load: " + GT.languages[locale]);
GT.i18n = {};
}
}
}
function renderI18n(locale)
function loadI18n()
{
$.i18n().locale = locale;
$("body").i18n();
readLocaleFile(GT.appSettings.locale);
refreshI18NStrings();
}
function renderI18n()
{
const elements = document.querySelectorAll("[data-i18n]");
for (let x = 0; x < elements.length; x++)
{
const key = elements[x].getAttribute("data-i18n");
if (key in GT.i18n)
{
if (key.endsWith(".hover"))
{
elements[x].title = GT.i18n[key];
}
else
{
elements[x].innerHTML = GT.i18n[key];
if (key.endsWith(".label"))
{
let hover = key.replace(".label", ".hover");
if (hover in GT.i18n)
{
elements[x].title = GT.i18n[hover];
}
}
}
}
else
{
console.error("Missing Body I18N Key: ", key);
}
}
}
function I18N(key)
{
if (key in GT.i18n)
{
return GT.i18n[key];
}
else
{
console.error("Missing Direct I18N Key: ", key);
return key;
}
}
function changeLocale()
@ -32,22 +86,18 @@ function changeLocale()
function loadChildWindowI18n()
{
$.i18n().load(languages).done(function ()
{
renderI18n(window.opener.GT.appSettings.locale);
});
readLocaleFile(window.opener.GT.appSettings.locale);
renderI18n();
}
function loadRosterI18n()
{
$.i18n().load(languages).done(function ()
{
renderI18n(window.opener.GT.appSettings.locale);
addControls();
});
readLocaleFile(window.opener.GT.appSettings.locale);
renderI18n();
addControls();
}
function renderLocale()
{
renderI18n(GT.appSettings.locale);
renderI18n();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -1,186 +0,0 @@
/* eslint-disable no-tabs */
/*!
* jQuery Internationalization library
*
* Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
(function ($)
{
"use strict";
var MessageParserEmitter = function ()
{
this.language = $.i18n.languages[String.locale] || $.i18n.languages.default;
};
MessageParserEmitter.prototype = {
constructor: MessageParserEmitter,
/**
* (We put this method definition here, and not in prototype, to make
* sure it's not overwritten by any magic.) Walk entire node structure,
* applying replacements and template functions when appropriate
*
* @param {Mixed} node abstract syntax tree (top node or subnode)
* @param {Array} replacements for $1, $2, ... $n
* @return {Mixed} single-string node or array of nodes suitable for
* jQuery appending.
*/
emit: function (node, replacements)
{
var ret, subnodes, operation,
messageParserEmitter = this;
switch (typeof node)
{
case "string":
case "number":
ret = node;
break;
case "object":
// node is an array of nodes
subnodes = $.map(node.slice(1), function (n)
{
return messageParserEmitter.emit(n, replacements);
});
operation = node[0].toLowerCase();
if (typeof messageParserEmitter[operation] === "function")
{
ret = messageParserEmitter[operation](subnodes, replacements);
}
else
{
throw new Error("unknown operation \"" + operation + "\"");
}
break;
case "undefined":
// Parsing the empty string (as an entire expression, or as a
// paramExpression in a template) results in undefined
// Perhaps a more clever parser can detect this, and return the
// empty string? Or is that useful information?
// The logical thing is probably to return the empty string here
// when we encounter undefined.
ret = "";
break;
default:
throw new Error("unexpected type in AST: " + typeof node);
}
return ret;
},
/**
* Parsing has been applied depth-first we can assume that all nodes
* here are single nodes Must return a single node to parents -- a
* jQuery with synthetic span However, unwrap any other synthetic spans
* in our children and pass them upwards
*
* @param {Array} nodes Mixed, some single nodes, some arrays of nodes.
* @return {string}
*/
concat: function (nodes)
{
var result = "";
$.each(nodes, function (i, node)
{
// strings, integers, anything else
result += node;
});
return result;
},
/**
* Return escaped replacement of correct index, or string if
* unavailable. Note that we expect the parsed parameter to be
* zero-based. i.e. $1 should have become [ 0 ]. if the specified
* parameter is not found return the same string (e.g. "$99" ->
* parameter 98 -> not found -> return "$99" ) TODO throw error if
* nodes.length > 1 ?
*
* @param {Array} nodes One element, integer, n >= 0
* @param {Array} replacements for $1, $2, ... $n
* @return {string} replacement
*/
replace: function (nodes, replacements)
{
var index = parseInt(nodes[0], 10);
if (index < replacements.length)
{
// replacement is not a string, don't touch!
return replacements[index];
}
else
{
// index not found, fallback to displaying variable
return "$" + (index + 1);
}
},
/**
* Transform parsed structure into pluralization n.b. The first node may
* be a non-integer (for instance, a string representing an Arabic
* number). So convert it back with the current language's
* convertNumber.
*
* @param {Array} nodes List [ {String|Number}, {String}, {String} ... ]
* @return {string} selected pluralized form according to current
* language.
*/
plural: function (nodes)
{
var count = parseFloat(this.language.convertNumber(nodes[0], 10)),
forms = nodes.slice(1);
return forms.length ? this.language.convertPlural(count, forms) : "";
},
/**
* Transform parsed structure into gender Usage
* {{gender:gender|masculine|feminine|neutral}}.
*
* @param {Array} nodes List [ {String}, {String}, {String} , {String} ]
* @return {string} selected gender form according to current language
*/
gender: function (nodes)
{
var gender = nodes[0],
forms = nodes.slice(1);
return this.language.gender(gender, forms);
},
/**
* Transform parsed structure into grammar conversion. Invoked by
* putting {{grammar:form|word}} in a message
*
* @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]
* @return {string} selected grammatical form according to current
* language.
*/
grammar: function (nodes)
{
var form = nodes[0],
word = nodes[1];
return word && form && this.language.convertGrammar(word, form);
}
};
$.extend($.i18n.parser.emitter, new MessageParserEmitter());
}(jQuery));

Wyświetl plik

@ -1,187 +0,0 @@
/*!
* jQuery Internationalization library
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
* choose one license or the other and you don't have to notify anyone which license you are using.
* You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
(function ($)
{
"use strict";
$.i18n = $.i18n || {};
$.extend($.i18n.fallbacks, {
ab: ["ru"],
ace: ["id"],
aln: ["sq"],
// Not so standard - als is supposed to be Tosk Albanian,
// but in Wikipedia it's used for a Germanic language.
als: ["gsw", "de"],
an: ["es"],
anp: ["hi"],
arn: ["es"],
arz: ["ar"],
av: ["ru"],
ay: ["es"],
ba: ["ru"],
bar: ["de"],
"bat-smg": ["sgs", "lt"],
bcc: ["fa"],
"be-x-old": ["be-tarask"],
bh: ["bho"],
bjn: ["id"],
bm: ["fr"],
bpy: ["bn"],
bqi: ["fa"],
bug: ["id"],
"cbk-zam": ["es"],
ce: ["ru"],
crh: ["crh-latn"],
"crh-cyrl": ["ru"],
csb: ["pl"],
cv: ["ru"],
"de-at": ["de"],
"de-ch": ["de"],
"de-formal": ["de"],
dsb: ["de"],
dtp: ["ms"],
egl: ["it"],
eml: ["it"],
ff: ["fr"],
fit: ["fi"],
"fiu-vro": ["vro", "et"],
frc: ["fr"],
frp: ["fr"],
frr: ["de"],
fur: ["it"],
gag: ["tr"],
gan: ["gan-hant", "zh-hant", "zh-hans"],
"gan-hans": ["zh-hans"],
"gan-hant": ["zh-hant", "zh-hans"],
gl: ["pt"],
glk: ["fa"],
gn: ["es"],
gsw: ["de"],
hif: ["hif-latn"],
hsb: ["de"],
ht: ["fr"],
ii: ["zh-cn", "zh-hans"],
inh: ["ru"],
iu: ["ike-cans"],
jut: ["da"],
jv: ["id"],
kaa: ["kk-latn", "kk-cyrl"],
kbd: ["kbd-cyrl"],
khw: ["ur"],
kiu: ["tr"],
kk: ["kk-cyrl"],
"kk-arab": ["kk-cyrl"],
"kk-latn": ["kk-cyrl"],
"kk-cn": ["kk-arab", "kk-cyrl"],
"kk-kz": ["kk-cyrl"],
"kk-tr": ["kk-latn", "kk-cyrl"],
kl: ["da"],
"ko-kp": ["ko"],
koi: ["ru"],
krc: ["ru"],
ks: ["ks-arab"],
ksh: ["de"],
ku: ["ku-latn"],
"ku-arab": ["ckb"],
kv: ["ru"],
lad: ["es"],
lb: ["de"],
lbe: ["ru"],
lez: ["ru"],
li: ["nl"],
lij: ["it"],
liv: ["et"],
lmo: ["it"],
ln: ["fr"],
ltg: ["lv"],
lzz: ["tr"],
mai: ["hi"],
"map-bms": ["jv", "id"],
mg: ["fr"],
mhr: ["ru"],
min: ["id"],
mo: ["ro"],
mrj: ["ru"],
mwl: ["pt"],
myv: ["ru"],
mzn: ["fa"],
nah: ["es"],
nap: ["it"],
nds: ["de"],
"nds-nl": ["nl"],
"nl-informal": ["nl"],
no: ["nb"],
os: ["ru"],
pcd: ["fr"],
pdc: ["de"],
pdt: ["de"],
pfl: ["de"],
pms: ["it"],
pt: ["pt-br"],
"pt-br": ["pt"],
qu: ["es"],
qug: ["qu", "es"],
rgn: ["it"],
rmy: ["ro"],
"roa-rup": ["rup"],
rue: ["uk", "ru"],
ruq: ["ruq-latn", "ro"],
"ruq-cyrl": ["mk"],
"ruq-latn": ["ro"],
sa: ["hi"],
sah: ["ru"],
scn: ["it"],
sg: ["fr"],
sgs: ["lt"],
sli: ["de"],
sr: ["sr-ec"],
srn: ["nl"],
stq: ["de"],
su: ["id"],
szl: ["pl"],
tcy: ["kn"],
tg: ["tg-cyrl"],
tt: ["tt-cyrl", "ru"],
"tt-cyrl": ["ru"],
ty: ["fr"],
udm: ["ru"],
ug: ["ug-arab"],
uk: ["ru"],
vec: ["it"],
vep: ["et"],
vls: ["nl"],
vmf: ["de"],
vot: ["fi"],
vro: ["et"],
wa: ["fr"],
wo: ["fr"],
wuu: ["zh-hans"],
xal: ["ru"],
xmf: ["ka"],
yi: ["he"],
za: ["zh-hans"],
zea: ["nl"],
zh: ["zh-hans"],
"zh-classical": ["lzh"],
"zh-cn": ["zh-hans"],
"zh-hant": ["zh-hans"],
"zh-hk": ["zh-hant", "zh-hans"],
"zh-min-nan": ["nan"],
"zh-mo": ["zh-hk", "zh-hant", "zh-hans"],
"zh-my": ["zh-sg", "zh-hans"],
"zh-sg": ["zh-hans"],
"zh-tw": ["zh-hant", "zh-hans"],
"zh-yue": ["yue"]
});
}(jQuery));

Wyświetl plik

@ -1,333 +0,0 @@
/* eslint-disable no-tabs */
/*!
* jQuery Internationalization library
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
(function ($)
{
"use strict";
var I18N,
slice = Array.prototype.slice;
/**
* @constructor
* @param {Object} options
*/
I18N = function (options)
{
// Load defaults
this.options = $.extend({}, I18N.defaults, options);
this.parser = this.options.parser;
this.locale = this.options.locale;
this.messageStore = this.options.messageStore;
this.languages = {};
};
I18N.prototype = {
/**
* Localize a given messageKey to a locale.
* @param {string} messageKey
* @return {string} Localized message
*/
localize: function (messageKey)
{
var localeParts, localePartIndex, locale, fallbackIndex,
tryingLocale, message;
locale = this.locale;
fallbackIndex = 0;
while (locale)
{
// Iterate through locales starting at most-specific until
// localization is found. As in fi-Latn-FI, fi-Latn and fi.
localeParts = locale.split("-");
localePartIndex = localeParts.length;
do
{
tryingLocale = localeParts.slice(0, localePartIndex).join("-");
message = this.messageStore.get(tryingLocale, messageKey);
if (message)
{
return message;
}
localePartIndex--;
} while (localePartIndex);
if (locale === this.options.fallbackLocale)
{
break;
}
locale = ($.i18n.fallbacks[this.locale] &&
$.i18n.fallbacks[this.locale][fallbackIndex]) ||
this.options.fallbackLocale;
$.i18n.log("Trying fallback locale for " + this.locale + ": " + locale + " (" + messageKey + ")");
fallbackIndex++;
}
// key not found
return "";
},
/*
* Destroy the i18n instance.
*/
destroy: function ()
{
$.removeData(document, "i18n");
},
/**
* General message loading API This can take a URL string for
* the json formatted messages. Example:
* <code>load('path/to/all_localizations.json');</code>
*
* To load a localization file for a locale:
* <code>
* load('path/to/de-messages.json', 'de' );
* </code>
*
* To load a localization file from a directory:
* <code>
* load('path/to/i18n/directory', 'de' );
* </code>
* The above method has the advantage of fallback resolution.
* ie, it will automatically load the fallback locales for de.
* For most usecases, this is the recommended method.
* It is optional to have trailing slash at end.
*
* A data object containing message key- message translation mappings
* can also be passed. Example:
* <code>
* load( { 'hello' : 'Hello' }, optionalLocale );
* </code>
*
* A source map containing key-value pair of languagename and locations
* can also be passed. Example:
* <code>
* load( {
* bn: 'i18n/bn.json',
* he: 'i18n/he.json',
* en: 'i18n/en.json'
* } )
* </code>
*
* If the data argument is null/undefined/false,
* all cached messages for the i18n instance will get reset.
*
* @param {string|Object} source
* @param {string} locale Language tag
* @return {jQuery.Promise}
*/
load: function (source, locale)
{
var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
if (!source && !locale)
{
source = "i18n/" + $.i18n().locale + ".json";
locale = $.i18n().locale;
}
if (typeof source === "string" &&
// source extension should be json, but can have query params after that.
source.split("?")[0].split(".").pop() !== "json"
)
{
// Load specified locale then check for fallbacks when directory is
// specified in load()
sourceMap[locale] = source + "/" + locale + ".json";
fallbackLocales = ($.i18n.fallbacks[locale] || [])
.concat(this.options.fallbackLocale);
for (locIndex = 0; locIndex < fallbackLocales.length; locIndex++)
{
fallbackLocale = fallbackLocales[locIndex];
sourceMap[fallbackLocale] = source + "/" + fallbackLocale + ".json";
}
return this.load(sourceMap);
}
else
{
return this.messageStore.load(source, locale);
}
},
/**
* Does parameter and magic word substitution.
*
* @param {string} key Message key
* @param {Array} parameters Message parameters
* @return {string}
*/
parse: function (key, parameters)
{
var message = this.localize(key);
// FIXME: This changes the state of the I18N object,
// should probably not change the 'this.parser' but just
// pass it to the parser.
this.parser.language = $.i18n.languages[$.i18n().locale] || $.i18n.languages.default;
if (message === "")
{
message = key;
}
return this.parser.parse(message, parameters);
}
};
/**
* Process a message from the $.I18N instance
* for the current document, stored in jQuery.data(document).
*
* @param {string} key Key of the message.
* @param {string} param1 [param...] Variadic list of parameters for {key}.
* @return {string|$.I18N} Parsed message, or if no key was given
* the instance of $.I18N is returned.
*/
$.i18n = function (key, param1)
{
var parameters,
i18n = $.data(document, "i18n"),
options = typeof key === "object" && key;
// If the locale option for this call is different then the setup so far,
// update it automatically. This doesn't just change the context for this
// call but for all future call as well.
// If there is no i18n setup yet, don't do this. It will be taken care of
// by the `new I18N` construction below.
// NOTE: It should only change language for this one call.
// Then cache instances of I18N somewhere.
if (options && options.locale && i18n && i18n.locale !== options.locale)
{
i18n.locale = options.locale;
}
if (!i18n)
{
i18n = new I18N(options);
$.data(document, "i18n", i18n);
}
if (typeof key === "string")
{
if (param1 !== undefined)
{
parameters = slice.call(arguments, 1);
}
else
{
parameters = [];
}
return i18n.parse(key, parameters);
}
else
{
// FIXME: remove this feature/bug.
return i18n;
}
};
$.fn.i18n = function ()
{
var i18n = $.data(document, "i18n");
if (!i18n)
{
i18n = new I18N();
$.data(document, "i18n", i18n);
}
return this.each(function ()
{
var $this = $(this),
messageKey = $this.data("i18n"),
lBracket, rBracket, type, key;
if (messageKey)
{
lBracket = messageKey.indexOf("[");
rBracket = messageKey.indexOf("]");
if (lBracket !== -1 && rBracket !== -1 && lBracket < rBracket)
{
type = messageKey.slice(lBracket + 1, rBracket);
key = messageKey.slice(rBracket + 1);
if (type === "html")
{
$this.html(i18n.parse(key));
}
else
{
$this.attr(type, i18n.parse(key));
}
}
else
{
$this.text(i18n.parse(messageKey));
}
}
else
{
$this.find("[data-i18n]").i18n();
}
});
};
function getDefaultLocale()
{
var locale = $("html").attr("lang");
if (!locale)
{
locale = navigator.language || navigator.userLanguage || "";
}
return locale;
}
$.i18n.languages = {};
$.i18n.messageStore = $.i18n.messageStore || {};
$.i18n.parser = {
// The default parser only handles variable substitution
parse: function (message, parameters)
{
return message.replace(/\$(\d+)/g, function (str, match)
{
var index = parseInt(match, 10) - 1;
return parameters[index] !== undefined ? parameters[index] : "$" + match;
});
},
emitter: {}
};
$.i18n.fallbacks = {};
$.i18n.debug = false;
$.i18n.log = function (/* arguments */)
{
if (window.console && $.i18n.debug)
{
window.console.log.apply(window.console, arguments);
}
};
/* Static members */
I18N.defaults = {
locale: getDefaultLocale(),
fallbackLocale: "en",
parser: $.i18n.parser,
messageStore: $.i18n.messageStore
};
// Expose constructor
$.i18n.constructor = I18N;
}(jQuery));

Wyświetl plik

@ -1,530 +0,0 @@
/* eslint-disable no-tabs */
/* global pluralRuleParser */
(function ($)
{
"use strict";
// jscs:disable
var language = {
// CLDR plural rules generated using
// libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
pluralRules: {
ak: {
one: "n = 0..1"
},
am: {
one: "i = 0 or n = 1"
},
ar: {
zero: "n = 0",
one: "n = 1",
two: "n = 2",
few: "n % 100 = 3..10",
many: "n % 100 = 11..99"
},
ars: {
zero: "n = 0",
one: "n = 1",
two: "n = 2",
few: "n % 100 = 3..10",
many: "n % 100 = 11..99"
},
as: {
one: "i = 0 or n = 1"
},
be: {
one: "n % 10 = 1 and n % 100 != 11",
few: "n % 10 = 2..4 and n % 100 != 12..14",
many: "n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14"
},
bh: {
one: "n = 0..1"
},
bn: {
one: "i = 0 or n = 1"
},
br: {
one: "n % 10 = 1 and n % 100 != 11,71,91",
two: "n % 10 = 2 and n % 100 != 12,72,92",
few: "n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99",
many: "n != 0 and n % 1000000 = 0"
},
bs: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"
},
cs: {
one: "i = 1 and v = 0",
few: "i = 2..4 and v = 0",
many: "v != 0"
},
cy: {
zero: "n = 0",
one: "n = 1",
two: "n = 2",
few: "n = 3",
many: "n = 6"
},
da: {
one: "n = 1 or t != 0 and i = 0,1"
},
dsb: {
one: "v = 0 and i % 100 = 1 or f % 100 = 1",
two: "v = 0 and i % 100 = 2 or f % 100 = 2",
few: "v = 0 and i % 100 = 3..4 or f % 100 = 3..4"
},
fa: {
one: "i = 0 or n = 1"
},
ff: {
one: "i = 0,1"
},
fil: {
one: "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9"
},
fr: {
one: "i = 0,1"
},
ga: {
one: "n = 1",
two: "n = 2",
few: "n = 3..6",
many: "n = 7..10"
},
gd: {
one: "n = 1,11",
two: "n = 2,12",
few: "n = 3..10,13..19"
},
gu: {
one: "i = 0 or n = 1"
},
guw: {
one: "n = 0..1"
},
gv: {
one: "v = 0 and i % 10 = 1",
two: "v = 0 and i % 10 = 2",
few: "v = 0 and i % 100 = 0,20,40,60,80",
many: "v != 0"
},
he: {
one: "i = 1 and v = 0",
two: "i = 2 and v = 0",
many: "v = 0 and n != 0..10 and n % 10 = 0"
},
hi: {
one: "i = 0 or n = 1"
},
hr: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"
},
hsb: {
one: "v = 0 and i % 100 = 1 or f % 100 = 1",
two: "v = 0 and i % 100 = 2 or f % 100 = 2",
few: "v = 0 and i % 100 = 3..4 or f % 100 = 3..4"
},
hy: {
one: "i = 0,1"
},
is: {
one: "t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0"
},
iu: {
one: "n = 1",
two: "n = 2"
},
iw: {
one: "i = 1 and v = 0",
two: "i = 2 and v = 0",
many: "v = 0 and n != 0..10 and n % 10 = 0"
},
kab: {
one: "i = 0,1"
},
kn: {
one: "i = 0 or n = 1"
},
kw: {
one: "n = 1",
two: "n = 2"
},
lag: {
zero: "n = 0",
one: "i = 0,1 and n != 0"
},
ln: {
one: "n = 0..1"
},
lt: {
one: "n % 10 = 1 and n % 100 != 11..19",
few: "n % 10 = 2..9 and n % 100 != 11..19",
many: "f != 0"
},
lv: {
zero: "n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19",
one: "n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1"
},
mg: {
one: "n = 0..1"
},
mk: {
one: "v = 0 and i % 10 = 1 or f % 10 = 1"
},
mo: {
one: "i = 1 and v = 0",
few: "v != 0 or n = 0 or n != 1 and n % 100 = 1..19"
},
mr: {
one: "i = 0 or n = 1"
},
mt: {
one: "n = 1",
few: "n = 0 or n % 100 = 2..10",
many: "n % 100 = 11..19"
},
naq: {
one: "n = 1",
two: "n = 2"
},
nso: {
one: "n = 0..1"
},
pa: {
one: "n = 0..1"
},
pl: {
one: "i = 1 and v = 0",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14",
many: "v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14"
},
prg: {
zero: "n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19",
one: "n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1"
},
pt: {
one: "i = 0..1"
},
ro: {
one: "i = 1 and v = 0",
few: "v != 0 or n = 0 or n != 1 and n % 100 = 1..19"
},
ru: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14",
many: "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14"
},
se: {
one: "n = 1",
two: "n = 2"
},
sh: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"
},
shi: {
one: "i = 0 or n = 1",
few: "n = 2..10"
},
si: {
one: "n = 0,1 or i = 0 and f = 1"
},
sk: {
one: "i = 1 and v = 0",
few: "i = 2..4 and v = 0",
many: "v != 0"
},
sl: {
one: "v = 0 and i % 100 = 1",
two: "v = 0 and i % 100 = 2",
few: "v = 0 and i % 100 = 3..4 or v != 0"
},
sma: {
one: "n = 1",
two: "n = 2"
},
smi: {
one: "n = 1",
two: "n = 2"
},
smj: {
one: "n = 1",
two: "n = 2"
},
smn: {
one: "n = 1",
two: "n = 2"
},
sms: {
one: "n = 1",
two: "n = 2"
},
sr: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"
},
ti: {
one: "n = 0..1"
},
tl: {
one: "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9"
},
tzm: {
one: "n = 0..1 or n = 11..99"
},
uk: {
one: "v = 0 and i % 10 = 1 and i % 100 != 11",
few: "v = 0 and i % 10 = 2..4 and i % 100 != 12..14",
many: "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14"
},
wa: {
one: "n = 0..1"
},
zu: {
one: "i = 0 or n = 1"
}
},
// jscs:enable
/**
* Plural form transformations, needed for some languages.
*
* @param {integer} count
* Non-localized quantifier
* @param {Array} forms
* List of plural forms
* @return {string} Correct form for quantifier in this language
*/
convertPlural: function (count, forms)
{
var pluralRules,
pluralFormIndex,
index,
explicitPluralPattern = /\d+=/i,
formCount,
form;
if (!forms || forms.length === 0)
{
return "";
}
// Handle for Explicit 0= & 1= values
for (index = 0; index < forms.length; index++)
{
form = forms[index];
if (explicitPluralPattern.test(form))
{
formCount = parseInt(form.slice(0, form.indexOf("=")), 10);
if (formCount === count)
{
return (form.slice(form.indexOf("=") + 1));
}
forms[index] = undefined;
}
}
forms = $.map(forms, function (form)
{
if (form !== undefined)
{
return form;
}
});
pluralRules = this.pluralRules[$.i18n().locale];
if (!pluralRules)
{
// default fallback.
return (count === 1) ? forms[0] : forms[1];
}
pluralFormIndex = this.getPluralForm(count, pluralRules);
pluralFormIndex = Math.min(pluralFormIndex, forms.length - 1);
return forms[pluralFormIndex];
},
/**
* For the number, get the plural for index
*
* @param {integer} number
* @param {Object} pluralRules
* @return {integer} plural form index
*/
getPluralForm: function (number, pluralRules)
{
var i,
pluralForms = ["zero", "one", "two", "few", "many", "other"],
pluralFormIndex = 0;
for (i = 0; i < pluralForms.length; i++)
{
if (pluralRules[pluralForms[i]])
{
if (pluralRuleParser(pluralRules[pluralForms[i]], number))
{
return pluralFormIndex;
}
pluralFormIndex++;
}
}
return pluralFormIndex;
},
/**
* Converts a number using digitTransformTable.
*
* @param {number} num Value to be converted
* @param {boolean} integer Convert the return value to an integer
* @return {string} The number converted into a String.
*/
convertNumber: function (num, integer)
{
var tmp, item, i,
transformTable, numberString, convertedNumber;
// Set the target Transform table:
transformTable = this.digitTransformTable($.i18n().locale);
numberString = String(num);
convertedNumber = "";
if (!transformTable)
{
return num;
}
// Check if the restore to Latin number flag is set:
if (integer)
{
if (parseFloat(num, 10) === num)
{
return num;
}
tmp = [];
for (item in transformTable)
{
tmp[transformTable[item]] = item;
}
transformTable = tmp;
}
for (i = 0; i < numberString.length; i++)
{
if (transformTable[numberString[i]])
{
convertedNumber += transformTable[numberString[i]];
}
else
{
convertedNumber += numberString[i];
}
}
return integer ? parseFloat(convertedNumber, 10) : convertedNumber;
},
/**
* Grammatical transformations, needed for inflected languages.
* Invoked by putting {{grammar:form|word}} in a message.
* Override this method for languages that need special grammar rules
* applied dynamically.
*
* @param {string} word
* @param {string} form
* @return {string}
*/
// eslint-disable-next-line no-unused-vars
convertGrammar: function (word, form)
{
return word;
},
/**
* Provides an alternative text depending on specified gender. Usage
* {{gender:[gender|user object]|masculine|feminine|neutral}}. If second
* or third parameter are not specified, masculine is used.
*
* These details may be overriden per language.
*
* @param {string} gender
* male, female, or anything else for neutral.
* @param {Array} forms
* List of gender forms
*
* @return {string}
*/
gender: function (gender, forms)
{
if (!forms || forms.length === 0)
{
return "";
}
while (forms.length < 2)
{
forms.push(forms[forms.length - 1]);
}
if (gender === "male")
{
return forms[0];
}
if (gender === "female")
{
return forms[1];
}
return (forms.length === 3) ? forms[2] : forms[0];
},
/**
* Get the digit transform table for the given language
* See http://cldr.unicode.org/translation/numbering-systems
*
* @param {string} language
* @return {Array|boolean} List of digits in the passed language or false
* representation, or boolean false if there is no information.
*/
digitTransformTable: function (language)
{
var tables = {
ar: "٠١٢٣٤٥٦٧٨٩",
fa: "۰۱۲۳۴۵۶۷۸۹",
ml: "൦൧൨൩൪൫൬൭൮൯",
kn: "೦೧೨೩೪೫೬೭೮೯",
lo: "໐໑໒໓໔໕໖໗໘໙",
or: "୦୧୨୩୪୫୬୭୮୯",
kh: "០១២៣៤៥៦៧៨៩",
nqo: "߀߁߂߃߄߅߆߇߈߉", // Note that the digits go right to left
pa: "੦੧੨੩੪੫੬੭੮੯",
gu: "૦૧૨૩૪૫૬૭૮૯",
hi: "०१२३४५६७८९",
my: "၀၁၂၃၄၅၆၇၈၉",
ta: "௦௧௨௩௪௫௬௭௮௯",
te: "౦౧౨౩౪౫౬౭౮౯",
th: "๐๑๒๓๔๕๖๗๘๙", // FIXME use iso 639 codes
bo: "༠༡༢༣༤༥༦༧༨༩" // FIXME use iso 639 codes
};
if (!tables[language])
{
return false;
}
return tables[language].split("");
}
};
$.extend($.i18n.languages, {
default: language
});
}(jQuery));

Wyświetl plik

@ -1,140 +0,0 @@
/* eslint-disable no-tabs */
/*!
* jQuery Internationalization library - Message Store
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
* choose one license or the other and you don't have to notify anyone which license you are using.
* You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
(function ($)
{
"use strict";
var MessageStore = function ()
{
this.messages = {};
this.sources = {};
};
function jsonMessageLoader(url)
{
var deferred = $.Deferred();
$.getJSON(url)
.done(deferred.resolve)
.fail(function (jqxhr, settings, exception)
{
$.i18n.log("Error in loading messages from " + url + " Exception: " + exception);
// Ignore 404 exception, because we are handling fallabacks explicitly
deferred.resolve();
});
return deferred.promise();
}
/**
* See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
*/
MessageStore.prototype = {
/**
* General message loading API This can take a URL string for
* the json formatted messages.
* <code>load('path/to/all_localizations.json');</code>
*
* This can also load a localization file for a locale <code>
* load( 'path/to/de-messages.json', 'de' );
* </code>
* A data object containing message key- message translation mappings
* can also be passed Eg:
* <code>
* load( { 'hello' : 'Hello' }, optionalLocale );
* </code> If the data argument is
* null/undefined/false,
* all cached messages for the i18n instance will get reset.
*
* @param {string|Object} source
* @param {string} locale Language tag
* @return {jQuery.Promise}
*/
load: function (source, locale)
{
var key = null,
deferreds = [],
messageStore = this;
if (typeof source === "string")
{
// This is a URL to the messages file.
$.i18n.log("Loading messages from: " + source);
return jsonMessageLoader(source)
.then(function (localization)
{
return messageStore.load(localization, locale);
});
}
if (locale)
{
// source is an key-value pair of messages for given locale
messageStore.set(locale, source);
return $.Deferred().resolve();
}
else
{
// source is a key-value pair of locales and their source
for (key in source)
{
if (Object.prototype.hasOwnProperty.call(source, key))
{
locale = key;
// No {locale} given, assume data is a group of languages,
// call this function again for each language.
deferreds.push(messageStore.load(source[key], locale));
}
}
return $.when.apply($, deferreds);
}
},
/**
* Set messages to the given locale.
* If locale exists, add messages to the locale.
*
* @param {string} locale
* @param {Object} messages
*/
set: function (locale, messages)
{
if (!this.messages[locale])
{
this.messages[locale] = messages;
}
else
{
this.messages[locale] = $.extend(this.messages[locale], messages);
}
},
/**
*
* @param {string} locale
* @param {string} messageKey
* @return {boolean}
*/
get: function (locale, messageKey)
{
return this.messages[locale] && this.messages[locale][messageKey];
}
};
$.extend($.i18n.messageStore, new MessageStore());
}(jQuery));

Wyświetl plik

@ -1,354 +0,0 @@
/* eslint-disable no-tabs */
/*!
* jQuery Internationalization library
*
* Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
(function ($)
{
"use strict";
var MessageParser = function (options)
{
this.options = $.extend({}, $.i18n.parser.defaults, options);
this.language = $.i18n.languages[String.locale] || $.i18n.languages.default;
this.emitter = $.i18n.parser.emitter;
};
MessageParser.prototype = {
constructor: MessageParser,
simpleParse: function (message, parameters)
{
return message.replace(/\$(\d+)/g, function (str, match)
{
var index = parseInt(match, 10) - 1;
return parameters[index] !== undefined ? parameters[index] : "$" + match;
});
},
parse: function (message, replacements)
{
if (message.indexOf("{{") < 0)
{
return this.simpleParse(message, replacements);
}
this.emitter.language = $.i18n.languages[$.i18n().locale] ||
$.i18n.languages.default;
return this.emitter.emit(this.ast(message), replacements);
},
ast: function (message)
{
var pipe, colon, backslash, anyCharacter, dollar, digits, regularLiteral,
regularLiteralWithoutBar, regularLiteralWithoutSpace, escapedOrLiteralWithoutBar,
escapedOrRegularLiteral, templateContents, templateName, openTemplate,
closeTemplate, expression, paramExpression, result,
pos = 0;
// Try parsers until one works, if none work return null
function choice(parserSyntax)
{
return function ()
{
var i, result;
for (i = 0; i < parserSyntax.length; i++)
{
result = parserSyntax[i]();
if (result !== null)
{
return result;
}
}
return null;
};
}
// Try several parserSyntax-es in a row.
// All must succeed; otherwise, return null.
// This is the only eager one.
function sequence(parserSyntax)
{
var i, res,
originalPos = pos,
result = [];
for (i = 0; i < parserSyntax.length; i++)
{
res = parserSyntax[i]();
if (res === null)
{
pos = originalPos;
return null;
}
result.push(res);
}
return result;
}
// Run the same parser over and over until it fails.
// Must succeed a minimum of n times; otherwise, return null.
function nOrMore(n, p)
{
return function ()
{
var originalPos = pos,
result = [],
parsed = p();
while (parsed !== null)
{
result.push(parsed);
parsed = p();
}
if (result.length < n)
{
pos = originalPos;
return null;
}
return result;
};
}
// Helpers -- just make parserSyntax out of simpler JS builtin types
function makeStringParser(s)
{
var len = s.length;
return function ()
{
var result = null;
if (message.slice(pos, pos + len) === s)
{
result = s;
pos += len;
}
return result;
};
}
function makeRegexParser(regex)
{
return function ()
{
var matches = message.slice(pos).match(regex);
if (matches === null)
{
return null;
}
pos += matches[0].length;
return matches[0];
};
}
pipe = makeStringParser("|");
colon = makeStringParser(":");
backslash = makeStringParser("\\");
anyCharacter = makeRegexParser(/^./);
dollar = makeStringParser("$");
digits = makeRegexParser(/^\d+/);
regularLiteral = makeRegexParser(/^[^{}[\]$\\]/);
regularLiteralWithoutBar = makeRegexParser(/^[^{}[\]$\\|]/);
regularLiteralWithoutSpace = makeRegexParser(/^[^{}[\]$\s]/);
// There is a general pattern:
// parse a thing;
// if it worked, apply transform,
// otherwise return null.
// But using this as a combinator seems to cause problems
// when combined with nOrMore().
// May be some scoping issue.
function transform(p, fn)
{
return function ()
{
var result = p();
return result === null ? null : fn(result);
};
}
// Used to define "literals" within template parameters. The pipe
// character is the parameter delimeter, so by default
// it is not a literal in the parameter
function literalWithoutBar()
{
var result = nOrMore(1, escapedOrLiteralWithoutBar)();
return result === null ? null : result.join("");
}
function literal()
{
var result = nOrMore(1, escapedOrRegularLiteral)();
return result === null ? null : result.join("");
}
function escapedLiteral()
{
var result = sequence([backslash, anyCharacter]);
return result === null ? null : result[1];
}
choice([escapedLiteral, regularLiteralWithoutSpace]);
escapedOrLiteralWithoutBar = choice([escapedLiteral, regularLiteralWithoutBar]);
escapedOrRegularLiteral = choice([escapedLiteral, regularLiteral]);
function replacement()
{
var result = sequence([dollar, digits]);
if (result === null)
{
return null;
}
return ["REPLACE", parseInt(result[1], 10) - 1];
}
templateName = transform(
// see $wgLegalTitleChars
// not allowing : due to the need to catch "PLURAL:$1"
makeRegexParser(/^[ !"$&'()*,./0-9;=?@A-Z^_`a-z~\x80-\xFF+-]+/),
function (result)
{
return result.toString();
}
);
function templateParam()
{
var expr,
result = sequence([pipe, nOrMore(0, paramExpression)]);
if (result === null)
{
return null;
}
expr = result[1];
// use a "CONCAT" operator if there are multiple nodes,
// otherwise return the first node, raw.
return expr.length > 1 ? ["CONCAT"].concat(expr) : expr[0];
}
function templateWithReplacement()
{
var result = sequence([templateName, colon, replacement]);
return result === null ? null : [result[0], result[2]];
}
function templateWithOutReplacement()
{
var result = sequence([templateName, colon, paramExpression]);
return result === null ? null : [result[0], result[2]];
}
templateContents = choice([
function ()
{
var res = sequence([
// templates can have placeholders for dynamic
// replacement eg: {{PLURAL:$1|one car|$1 cars}}
// or no placeholders eg:
// {{GRAMMAR:genitive|{{SITENAME}}}
choice([templateWithReplacement, templateWithOutReplacement]),
nOrMore(0, templateParam)
]);
return res === null ? null : res[0].concat(res[1]);
},
function ()
{
var res = sequence([templateName, nOrMore(0, templateParam)]);
if (res === null)
{
return null;
}
return [res[0]].concat(res[1]);
}
]);
openTemplate = makeStringParser("{{");
closeTemplate = makeStringParser("}}");
function template()
{
var result = sequence([openTemplate, templateContents, closeTemplate]);
return result === null ? null : result[1];
}
expression = choice([template, replacement, literal]);
paramExpression = choice([template, replacement, literalWithoutBar]);
function start()
{
var result = nOrMore(0, expression)();
if (result === null)
{
return null;
}
return ["CONCAT"].concat(result);
}
result = start();
/*
* For success, the pos must have gotten to the end of the input
* and returned a non-null.
* n.b. This is part of language infrastructure, so we do not throw an
* internationalizable message.
*/
if (result === null || pos !== message.length)
{
throw new Error("Parse error at position " + pos.toString() + " in input: " + message);
}
return result;
}
};
$.extend($.i18n.parser, new MessageParser());
}(jQuery));

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -1,2 +1,354 @@
.ol-box{box-sizing:border-box;border-radius:2px;border:1.5px solid #b3c5db;background-color:rgba(255,255,255,.4)}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;transition:all .25s}.ol-scale-singlebar-even{background-color:#000}.ol-scale-singlebar-odd{background-color:#fff}.ol-scale-bar{position:absolute;bottom:8px;left:8px}.ol-scale-step-marker{width:1px;height:15px;background-color:#000;float:right;z-index:10}.ol-scale-step-text{position:absolute;bottom:-5px;font-size:12px;z-index:11;color:#000;text-shadow:-2px 0 #fff,0 2px #fff,2px 0 #fff,0 -2px #fff}.ol-scale-text{position:absolute;font-size:14px;text-align:center;bottom:25px;color:#000;text-shadow:-2px 0 #fff,0 2px #fff,2px 0 #fff,0 -2px #fff}.ol-scale-singlebar{position:relative;height:10px;z-index:9;box-sizing:border-box;border:1px solid #000}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-viewport canvas{all:unset}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-weight:700;text-decoration:none;font-size:inherit;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);display:flex;flex-flow:row-reverse;align-items:center}.ol-attribution a{color:rgba(0,60,136,.7);text-decoration:none}.ol-attribution ul{margin:0;padding:1px .5em;color:#000;text-shadow:0 0 2px #fff;font-size:12px}.ol-attribution li{display:inline;list-style:none}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button{flex-shrink:0}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:2px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move}
/*# sourceMappingURL=ol.css.map */
:root,
:host {
--ol-background-color: white;
--ol-accent-background-color: #F5F5F5;
--ol-subtle-background-color: rgba(128, 128, 128, 0.25);
--ol-partial-background-color: rgba(255, 255, 255, 0.75);
--ol-foreground-color: #333333;
--ol-subtle-foreground-color: #666666;
--ol-brand-color: #00AAFF;
}
.ol-box {
box-sizing: border-box;
border-radius: 2px;
border: 1.5px solid var(--ol-background-color);
background-color: var(--ol-partial-background-color);
}
.ol-mouse-position {
top: 8px;
right: 8px;
position: absolute;
}
.ol-scale-line {
background: var(--ol-partial-background-color);
border-radius: 4px;
bottom: 8px;
left: 8px;
padding: 2px;
position: absolute;
}
.ol-scale-line-inner {
border: 1px solid var(--ol-subtle-foreground-color);
border-top: none;
color: var(--ol-foreground-color);
font-size: 10px;
text-align: center;
margin: 1px;
will-change: contents, width;
transition: all 0.25s;
}
.ol-scale-bar {
position: absolute;
bottom: 8px;
left: 8px;
}
.ol-scale-bar-inner {
display: flex;
}
.ol-scale-step-marker {
width: 1px;
height: 15px;
background-color: var(--ol-foreground-color);
float: right;
z-index: 10;
}
.ol-scale-step-text {
position: absolute;
bottom: -5px;
font-size: 10px;
z-index: 11;
color: var(--ol-foreground-color);
text-shadow: -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color);
}
.ol-scale-text {
position: absolute;
font-size: 12px;
text-align: center;
bottom: 25px;
color: var(--ol-foreground-color);
text-shadow: -1.5px 0 var(--ol-partial-background-color), 0 1.5px var(--ol-partial-background-color), 1.5px 0 var(--ol-partial-background-color), 0 -1.5px var(--ol-partial-background-color);
}
.ol-scale-singlebar {
position: relative;
height: 10px;
z-index: 9;
box-sizing: border-box;
border: 1px solid var(--ol-foreground-color);
}
.ol-scale-singlebar-even {
background-color: var(--ol-subtle-foreground-color);
}
.ol-scale-singlebar-odd {
background-color: var(--ol-background-color);
}
.ol-unsupported {
display: none;
}
.ol-viewport,
.ol-unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
}
.ol-viewport canvas {
all: unset;
overflow: hidden;
}
.ol-viewport {
touch-action: pan-x pan-y;
}
.ol-selectable {
-webkit-touch-callout: default;
-webkit-user-select: text;
-moz-user-select: text;
user-select: text;
}
.ol-grabbing {
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
.ol-grab {
cursor: move;
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.ol-control {
position: absolute;
background-color: var(--ol-subtle-background-color);
border-radius: 4px;
}
.ol-zoom {
top: .5em;
left: .5em;
}
.ol-rotate {
top: .5em;
right: .5em;
transition: opacity .25s linear, visibility 0s linear;
}
.ol-rotate.ol-hidden {
opacity: 0;
visibility: hidden;
transition: opacity .25s linear, visibility 0s linear .25s;
}
.ol-zoom-extent {
top: 4.643em;
left: .5em;
}
.ol-full-screen {
right: .5em;
top: .5em;
}
.ol-control button {
display: block;
margin: 1px;
padding: 0;
color: var(--ol-subtle-foreground-color);
font-weight: bold;
text-decoration: none;
font-size: inherit;
text-align: center;
height: 1.375em;
width: 1.375em;
line-height: .4em;
background-color: var(--ol-background-color);
border: none;
border-radius: 2px;
}
.ol-control button::-moz-focus-inner {
border: none;
padding: 0;
}
.ol-zoom-extent button {
line-height: 1.4em;
}
.ol-compass {
display: block;
font-weight: normal;
will-change: transform;
}
.ol-touch .ol-control button {
font-size: 1.5em;
}
.ol-touch .ol-zoom-extent {
top: 5.5em;
}
.ol-control button:hover,
.ol-control button:focus {
text-decoration: none;
outline: 1px solid var(--ol-subtle-foreground-color);
color: var(--ol-foreground-color);
}
.ol-zoom .ol-zoom-in {
border-radius: 2px 2px 0 0;
}
.ol-zoom .ol-zoom-out {
border-radius: 0 0 2px 2px;
}
.ol-attribution {
text-align: right;
bottom: .5em;
right: .5em;
max-width: calc(100% - 1.3em);
display: flex;
flex-flow: row-reverse;
align-items: center;
}
.ol-attribution a {
color: var(--ol-subtle-foreground-color);
text-decoration: none;
}
.ol-attribution ul {
margin: 0;
padding: 1px .5em;
color: var(--ol-foreground-color);
text-shadow: 0 0 2px var(--ol-background-color);
font-size: 12px;
}
.ol-attribution li {
display: inline;
list-style: none;
}
.ol-attribution li:not(:last-child):after {
content: " ";
}
.ol-attribution img {
max-height: 2em;
max-width: inherit;
vertical-align: middle;
}
.ol-attribution button {
flex-shrink: 0;
}
.ol-attribution.ol-collapsed ul {
display: none;
}
.ol-attribution:not(.ol-collapsed) {
background: var(--ol-partial-background-color);
}
.ol-attribution.ol-uncollapsible {
bottom: 0;
right: 0;
border-radius: 4px 0 0;
}
.ol-attribution.ol-uncollapsible img {
margin-top: -.2em;
max-height: 1.6em;
}
.ol-attribution.ol-uncollapsible button {
display: none;
}
.ol-zoomslider {
top: 4.5em;
left: .5em;
height: 200px;
}
.ol-zoomslider button {
position: relative;
height: 10px;
}
.ol-touch .ol-zoomslider {
top: 5.5em;
}
.ol-overviewmap {
left: 0.5em;
bottom: 0.5em;
}
.ol-overviewmap.ol-uncollapsible {
bottom: 0;
left: 0;
border-radius: 0 4px 0 0;
}
.ol-overviewmap .ol-overviewmap-map,
.ol-overviewmap button {
display: block;
}
.ol-overviewmap .ol-overviewmap-map {
border: 1px solid var(--ol-subtle-foreground-color);
height: 150px;
width: 150px;
}
.ol-overviewmap:not(.ol-collapsed) button {
bottom: 0;
left: 0;
position: absolute;
}
.ol-overviewmap.ol-collapsed .ol-overviewmap-map,
.ol-overviewmap.ol-uncollapsible button {
display: none;
}
.ol-overviewmap:not(.ol-collapsed) {
background: var(--ol-subtle-background-color);
}
.ol-overviewmap-box {
border: 1.5px dotted var(--ol-subtle-foreground-color);
}
.ol-overviewmap .ol-overviewmap-box:hover {
cursor: move;
}
.ol-overviewmap .ol-viewport:hover {
cursor: pointer;
}

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -1,7 +1,7 @@
// GridTracker Copyright © 2024 GridTracker.org
// All rights reserved.
// See LICENSE for more information.
const nwURL = require("url");
const fs = require("fs");
// var CR is in screen.js
@ -191,51 +191,56 @@ document.addEventListener("drop", function (event)
window.addEventListener("message", receiveMessage, false);
if (typeof localStorage.awardTracker == "undefined")
if (typeof GT.localStorage.awardTracker == "undefined")
{
localStorage.awardTracker = "{}";
GT.localStorage.awardTracker = "{}";
CR.rosterSettings = {};
writeRosterSettings();
}
CR.awardTracker = JSON.parse(localStorage.awardTracker);
CR.awardTracker = JSON.parse(GT.localStorage.awardTracker);
// These two need to stay here because of an old bug.
if (typeof localStorage.blockedCQz == "undefined")
if (typeof GT.localStorage.blockedCQz == "undefined")
{
localStorage.blockedCQz = "{}";
GT.localStorage.blockedCQz = "{}";
}
if (typeof localStorage.blockedITUz == "undefined")
if (typeof GT.localStorage.blockedCQ == "undefined")
{
localStorage.blockedITUz = "{}";
GT.localStorage.blockedCQ = "{}";
}
if (typeof localStorage.blockedGrid == "undefined")
if (typeof GT.localStorage.blockedITUz == "undefined")
{
localStorage.blockedGrid = "{}";
GT.localStorage.blockedITUz = "{}";
}
if (typeof localStorage.blockedCalls != "undefined")
if (typeof GT.localStorage.blockedGrid == "undefined")
{
CR.blockedCalls = JSON.parse(localStorage.blockedCalls);
CR.blockedCQ = JSON.parse(localStorage.blockedCQ);
CR.blockedDxcc = JSON.parse(localStorage.blockedDxcc);
CR.blockedGrid = JSON.parse(localStorage.blockedGrid);
CR.blockedCQz = JSON.parse(localStorage.blockedCQz);
CR.blockedITUz = JSON.parse(localStorage.blockedITUz);
GT.localStorage.blockedGrid = "{}";
}
if (typeof GT.localStorage.blockedCalls != "undefined")
{
CR.blockedCalls = JSON.parse(GT.localStorage.blockedCalls);
CR.blockedCQ = JSON.parse(GT.localStorage.blockedCQ);
CR.blockedDxcc = JSON.parse(GT.localStorage.blockedDxcc);
CR.blockedGrid = JSON.parse(GT.localStorage.blockedGrid);
CR.blockedCQz = JSON.parse(GT.localStorage.blockedCQz);
CR.blockedITUz = JSON.parse(GT.localStorage.blockedITUz);
}
else
{
localStorage.blockedCalls = "{}";
localStorage.blockedDxcc = "{}";
localStorage.blockedGrid = "{}";
localStorage.blockedCQz = "{}";
localStorage.blockedITUz = "{}";
localStorage.ignoredCQ = "{}";
GT.localStorage.blockedCalls = "{}";
GT.localStorage.blockedDxcc = "{}";
GT.localStorage.blockedGrid = "{}";
GT.localStorage.blockedCQz = "{}";
GT.localStorage.blockedITUz = "{}";
GT.localStorage.ignoredCQ = "{}";
}
if (typeof localStorage.ignoredCQ == "undefined")
if (typeof GT.localStorage.ignoredCQ == "undefined")
{
// CR.blockedCQ is deprecated, we don't clear it, we copy it
// This is protection against them rolling back to a previous version
@ -262,17 +267,17 @@ if (typeof localStorage.ignoredCQ == "undefined")
}
else
{
CR.ignoredCQ = JSON.parse(localStorage.ignoredCQ);
CR.ignoredCQ = JSON.parse(GT.localStorage.ignoredCQ);
}
function storeBlocks(render = true)
{
localStorage.blockedCalls = JSON.stringify(CR.blockedCalls);
localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ);
localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc);
localStorage.blockedGrid = JSON.stringify(CR.blockedGrid);
localStorage.blockedCQz = JSON.stringify(CR.blockedCQz);
localStorage.blockedITUz = JSON.stringify(CR.blockedITUz);
GT.localStorage.blockedCalls = JSON.stringify(CR.blockedCalls);
GT.localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ);
GT.localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc);
GT.localStorage.blockedGrid = JSON.stringify(CR.blockedGrid);
GT.localStorage.blockedCQz = JSON.stringify(CR.blockedCQz);
GT.localStorage.blockedITUz = JSON.stringify(CR.blockedITUz);
if (render)
{
renderIgnoresTab();
@ -281,15 +286,15 @@ function storeBlocks(render = true)
function storeAwardTracker()
{
localStorage.awardTracker = JSON.stringify(CR.awardTracker);
GT.localStorage.awardTracker = JSON.stringify(CR.awardTracker);
}
function loadSettings()
{
let readSettings = {};
if (typeof localStorage.rosterSettings != "undefined")
if (typeof GT.localStorage.rosterSettings != "undefined")
{
readSettings = JSON.parse(localStorage.rosterSettings);
readSettings = JSON.parse(GT.localStorage.rosterSettings);
}
CR.rosterSettings = deepmerge(CR.defaultSettings, readSettings);
@ -297,7 +302,7 @@ function loadSettings()
writeRosterSettings();
// Code reducder
// Code reducer
CR.watchers = CR.rosterSettings.watchers;
}
@ -331,7 +336,7 @@ function writeRosterSettings()
CR.rosterSettings.watchers[key].test = null;
}
localStorage.rosterSettings = JSON.stringify(CR.rosterSettings);
GT.localStorage.rosterSettings = JSON.stringify(CR.rosterSettings);
}
function isKnownCallsignDXCC(dxcc)
@ -354,20 +359,6 @@ function timeNowSec()
return parseInt(Date.now() / 1000);
}
function lockNewWindows()
{
if (typeof nw != "undefined")
{
let gui = require("nw.gui");
let win = gui.Window.get();
win.on("new-win-policy", function (frame, url, policy)
{
gui.Shell.openExternal(url);
policy.ignore();
});
}
}
function hashMaker(start, callObj, reference)
{
if (reference == LOGBOOK_LIVE_BAND_LIVE_MODE) return `${start}${callObj.band}${callObj.mode}`;
@ -502,16 +493,12 @@ function initiateQso(thisHash)
function callLookup(thisHash, grid)
{
window.opener.startLookup(
CR.callRoster[thisHash].DEcall,
CR.callRoster[thisHash].grid
);
window.opener.startLookup(CR.callRoster[thisHash].DEcall, CR.callRoster[thisHash].grid);
}
function callingLookup(thisHash, grid)
{
let thisCall = CR.callRoster[thisHash].DXcall;
window.opener.startLookup(thisCall, grid);
window.opener.startLookup(CR.callRoster[thisHash].DXcall, grid);
}
function callGenMessage(thisHash, grid)
@ -1151,16 +1138,15 @@ function resetFilters()
function getBuffer(file_url, callback, flag, mode, port, cookie)
{
let url = require("url");
let http = require(mode);
let fileBuffer = null;
let options = null;
if (cookie != null)
{
options = {
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
host: nwURL.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
path: nwURL.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
headers: {
Cookie: cookie
}
@ -1169,9 +1155,9 @@ function getBuffer(file_url, callback, flag, mode, port, cookie)
else
{
options = {
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
host: nwURL.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
path: nwURL.parse(file_url).path // eslint-disable-line node/no-deprecated-api
};
}
http.get(options, function (res)
@ -1863,7 +1849,7 @@ function init()
function toggleShowControls()
{
CR.rosterSettings.controls = !CR.rosterSettings.controls;
let newLabel = CR.rosterSettings.controls ? $.i18n("roster.menu.HideControls") : $.i18n("roster.menu.ShowControls");
let newLabel = CR.rosterSettings.controls ? I18N("roster.menu.HideControls") : I18N("roster.menu.ShowControls");
CR.compactMenu.items[0].label = newLabel;
CR.menu.items[0].label = newLabel;
writeRosterSettings();
@ -1874,20 +1860,20 @@ function toggleShowControls()
function addControls()
{
WANTED_LABELS = {
cont: $.i18n("rosterColumns.Wanted.cont"),
cqz: $.i18n("rosterColumns.Wanted.cqz"),
ituz: $.i18n("rosterColumns.Wanted.ituz"),
dxcc: $.i18n("rosterColumns.Wanted.dxcc"),
dxccMarathon: $.i18n("rosterColumns.Wanted.dxccMarathon"),
cqzMarathon: $.i18n("rosterColumns.Wanted.cqzMarathon"),
state: $.i18n("rosterColumns.Wanted.state"),
grid: $.i18n("rosterColumns.Wanted.grid"),
cnty: $.i18n("rosterColumns.Wanted.cnty"),
wpx: $.i18n("rosterColumns.Wanted.wpx"),
call: $.i18n("rosterColumns.Wanted.call"),
watcher: $.i18n("roster.watcher.label"),
oams: $.i18n("rosterColumns.Wanted.oams"),
pota: $.i18n("rosterColumns.Wanted.pota")
cont: I18N("rosterColumns.Wanted.cont"),
cqz: I18N("rosterColumns.Wanted.cqz"),
ituz: I18N("rosterColumns.Wanted.ituz"),
dxcc: I18N("rosterColumns.Wanted.dxcc"),
dxccMarathon: I18N("rosterColumns.Wanted.dxccMarathon"),
cqzMarathon: I18N("rosterColumns.Wanted.cqzMarathon"),
state: I18N("rosterColumns.Wanted.state"),
grid: I18N("rosterColumns.Wanted.grid"),
cnty: I18N("rosterColumns.Wanted.cnty"),
wpx: I18N("rosterColumns.Wanted.wpx"),
call: I18N("rosterColumns.Wanted.call"),
watcher: I18N("roster.watcher.label"),
oams: I18N("rosterColumns.Wanted.oams"),
pota: I18N("rosterColumns.Wanted.pota")
}
window.opener.setRosterSpot(CR.rosterSettings.columns.Spot);
@ -1900,8 +1886,8 @@ function addControls()
CR.menu = new nw.Menu();
CR.compactMenu = new nw.Menu();
let showControlsText = $.i18n("roster.menu.ShowControls");
let hideControlsText = $.i18n("roster.menu.HideControls");
let showControlsText = I18N("roster.menu.ShowControls");
let hideControlsText = I18N("roster.menu.HideControls");
let item = new nw.MenuItem({
type: "normal",
label: CR.rosterSettings.controls ? hideControlsText : showControlsText,
@ -1926,7 +1912,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.Lookup"),
label: I18N("roster.menu.Lookup"),
click: function ()
{
callLookup(CR.targetHash, "");
@ -1937,7 +1923,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.GenMesg"),
label: I18N("roster.menu.GenMesg"),
click: function ()
{
callGenMessage(CR.targetHash, "");
@ -1947,7 +1933,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
label: I18N("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetHash].DEcall, "Callsign");
@ -1963,7 +1949,7 @@ function addControls()
{
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.AimRotator"),
label: I18N("roster.menu.AimRotator"),
click: function ()
{
let target = CR.callRoster[CR.targetHash]
@ -1978,7 +1964,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.IgnoreCall"),
label: I18N("roster.menu.IgnoreCall"),
click: function ()
{
ignoreCallsign(CR.callRoster[CR.targetHash].DEcall);
@ -1989,7 +1975,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
label: I18N("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
@ -2002,7 +1988,7 @@ function addControls()
CR.callingMenu = new nw.Menu();
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.Lookup"),
label: I18N("roster.menu.Lookup"),
click: function ()
{
callingLookup(CR.targetHash, "");
@ -2013,7 +1999,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.GenMesg"),
label: I18N("roster.menu.GenMesg"),
click: function ()
{
callingGenMessage(CR.targetHash, "");
@ -2024,7 +2010,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
label: I18N("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetHash].DXcall, "Callsign");
@ -2043,7 +2029,7 @@ function addControls()
{
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.AimRotator"),
label: I18N("roster.menu.AimRotator"),
click: function ()
{
let target = CR.callRoster[CR.targetHash]
@ -2055,7 +2041,7 @@ function addControls()
item = new nw.MenuItem({
type: "checkbox",
label: $.i18n("roster.menu.Realtime"),
label: I18N("roster.menu.Realtime"),
checked: CR.rosterSettings.realtime,
click: function ()
{
@ -2070,7 +2056,7 @@ function addControls()
CR.menuItemForMoveLeftColumn = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.MoveLeft"),
label: I18N("roster.menu.MoveLeft"),
click: function ()
{
moveColumnLeft(CR.currentColumnName);
@ -2080,7 +2066,7 @@ function addControls()
CR.menuItemForMoveRightColumn = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.MoveRight"),
label: I18N("roster.menu.MoveRight"),
click: function ()
{
moveColumnRight(CR.currentColumnName);
@ -2115,7 +2101,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
label: I18N("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetHash].callObj.msg, "Message");
@ -2128,7 +2114,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
label: I18N("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetCQ].DXcall, "Calling");
@ -2163,7 +2149,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.IgnoreCQZone"),
label: I18N("roster.menu.IgnoreCQZone"),
click: function ()
{
ignoreCQz(CR.callRoster[CR.targetCQz].callObj.cqz);
@ -2174,7 +2160,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
label: I18N("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
@ -2188,7 +2174,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.IgnoreITUZone"),
label: I18N("roster.menu.IgnoreITUZone"),
click: function ()
{
ignoreITUz(CR.callRoster[CR.targetITUz].callObj.itu);
@ -2199,7 +2185,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
label: I18N("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
@ -2213,7 +2199,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.IgnoreDXCC"),
label: I18N("roster.menu.IgnoreDXCC"),
click: function ()
{
ignoreDxcc(CR.targetDxcc);
@ -2224,7 +2210,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
label: I18N("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
@ -2238,7 +2224,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
label: I18N("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetHash].callObj.grid, "Grid");
@ -2260,7 +2246,7 @@ function addControls()
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
label: I18N("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
@ -2319,7 +2305,7 @@ function addControls()
function setCompactView()
{
compactModeDiv.innerHTML = CR.rosterSettings.compact ? $.i18n("roster.menu.RosterMode") : $.i18n("roster.menu.CompactMode");
compactModeDiv.innerHTML = CR.rosterSettings.compact ? I18N("roster.menu.RosterMode") : I18N("roster.menu.CompactMode");
compactEnityDiv.style.display = CR.rosterSettings.compact ? "" : "none";
columnsBoxDiv.style.display = columnsbox.style.display = CR.rosterSettings.compact ? "none" : "";
}
@ -3491,8 +3477,6 @@ function loadAwardJson()
try
{
CR.awards = JSON.parse(fileBuf);
// fs.writeFileSync("./data/awards.json", JSON.stringify(CR.awards,null,2));
for (const sp in CR.awards)
{
for (const aw in CR.awards[sp].awards)
@ -3816,7 +3800,7 @@ function ValidateTextInput(inputText, validDiv = null)
{
inputText.style.color = "#000";
inputText.style.backgroundColor = "yellow";
if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid");
if (validDiv) validDiv.innerHTML = I18N("stats.Validate.Invalid");
return false;
}
}
@ -3824,7 +3808,7 @@ function ValidateTextInput(inputText, validDiv = null)
{
inputText.style.color = "#000";
inputText.style.backgroundColor = "yellow";
if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid");
if (validDiv) validDiv.innerHTML = I18N("stats.Validate.Invalid");
return false;
}
}
@ -3856,19 +3840,19 @@ function watcherTypeChanged(value)
watcherType.value = value;
if (value == "Callsign")
{
watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.callsign");
watcherTextTh.innerHTML = I18N("roster.controls.hunting.callsign");
}
if (value == "Calling")
{
watcherTextTh.innerHTML = $.i18n("alerts.QRZ.speech");
watcherTextTh.innerHTML = I18N("alerts.QRZ.speech");
}
if (value == "Grid")
{
watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.grid");
watcherTextTh.innerHTML = I18N("roster.controls.hunting.grid");
}
if (value == "Message")
{
watcherTextTh.innerHTML = $.i18n("gt.WSJTMessage.Message");
watcherTextTh.innerHTML = I18N("gt.WSJTMessage.Message");
}
watcherStartDateEnable(watcherStartDateCheckbox.checked);

Wyświetl plik

@ -133,7 +133,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
if (hash in CR.tracker.confirmed.call)
{
callObj.callFlags.confirmed = true;
callPointer = "text-decoration: line-through; ";
callPointer = "text-decoration: line-through;";
callConf = "";
}
}
@ -146,11 +146,14 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
{
if (cid in window.opener.GT.gtFlagPins && window.opener.GT.gtFlagPins[cid].canmsg == true)
{
// found the first one we can message, break now
callObj.callFlags.oams = true;
callObj.gt = cid;
hasGtPin = true;
break;
if (window.opener.GT.gtFlagPins[cid].src == "GT")
{
// a GT user, lets go with it
break;
}
}
}
}

Wyświetl plik

@ -166,7 +166,7 @@ const ROSTER_COLUMNS = {
}
if (callObj.cnty && callObj.qual == false)
{
attrs.title = $.i18n("rosterColumns.County.title")
attrs.title = I18N("rosterColumns.County.title")
attrs.onClick = `window.opener.lookupCallsign("${callObj.DEcall}", "${callObj.grid}")`
attrs.html = attrs.html + " +" + String(window.opener.GT.zipToCounty[callObj.zipcode].length - 1)
attrs.style = "cursor: pointer; color: cyan;"
@ -265,7 +265,7 @@ const ROSTER_COLUMNS = {
return {
style: "color: yellow;",
align: "center",
title: `${$.i18n("rosterColumns.LoTW.NoUpdate")} ${toYM(Number(months))}`,
title: `${I18N("rosterColumns.LoTW.NoUpdate")} ${toYM(Number(months))}`,
html: "?"
}
}
@ -274,7 +274,7 @@ const ROSTER_COLUMNS = {
return {
style: "color: #0F0;",
align: "center",
title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${
title: `${I18N("rosterColumns.LoTW.LastUpdate")}${
window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000)
}`,
html: "&#10004;"
@ -286,7 +286,7 @@ const ROSTER_COLUMNS = {
return {
style: "color: #0F0;",
align: "center",
title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${
title: `${I18N("rosterColumns.LoTW.LastUpdate")}${
window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000)
}`,
html: "&#10004;"

Wyświetl plik

@ -60,8 +60,8 @@ function sendAlerts(callRoster, rosterSettings)
scriptIcon.innerHTML =
"<div class='buttonScript' onclick='window.opener.toggleCRScript();'>" +
(window.opener.GT.crScript == 1
? `<font color='lightgreen'>${$.i18n("sendAlerts.scriptEnabled")}</font>`
: `<font color='yellow'>${$.i18n("sendAlerts.scriptDisabled")}</font>`) +
? `<font color='lightgreen'>${I18N("sendAlerts.scriptEnabled")}</font>`
: `<font color='yellow'>${I18N("sendAlerts.scriptDisabled")}</font>`) +
"</div>";
scriptIcon.style.display = "block";
}

Wyświetl plik

@ -1,5 +1,4 @@
const nodeTimers = require("timers");
const dns = require("node:dns");
try
@ -18,13 +17,62 @@ var GT = {};
var CR = {};
var isShowing = false;
var s_title = null;
var s_screenSettings = {};
var s_zoomLevel = 0;
nw.Screen.Init();
// Look for our own settings file, if not, we'll rely on GT.localStorage being accurate
if (document.title.substring(0, 12).trim() == "GridTracker")
{
const path = require("path");
const fs = require("fs");
let filename = path.join(path.join(nw.App.dataPath, "Ginternal"), "settings.json");
try
{
if (fs.existsSync(filename))
{
let data = JSON.parse(fs.readFileSync(filename));
if (data)
{
GT.localStorage = data;
}
else
{
// safety catch
GT.localStorage = {};
for (var key in localStorage)
{
GT.localStorage[key] = localStorage[key];
}
}
}
else
{
// This should happen only once for new users
GT.localStorage = {};
for (var key in localStorage)
{
GT.localStorage[key] = localStorage[key];
}
}
}
catch (e)
{
GT.localStorage = {};
for (var key in localStorage)
{
GT.localStorage[key] = localStorage[key];
}
console.log(e);
}
}
else
{
GT.localStorage = window.opener.GT.localStorage;
}
var g_screenLost = false;
var g_windowInfo = {};
var g_initialScreenCount = nw.Screen.screens.length;
@ -92,11 +140,11 @@ function saveScreenSettings()
var setting = { showing: isShowing, zoomLevel: s_zoomLevel, window: g_windowInfo };
s_screenSettings = JSON.parse(localStorage.screenSettings);
s_screenSettings = JSON.parse(GT.localStorage.screenSettings);
s_screenSettings[s_title] = setting;
localStorage.screenSettings = JSON.stringify(s_screenSettings);
GT.localStorage.screenSettings = JSON.stringify(s_screenSettings);
}
// listen to screen events
nw.Screen.on("displayAdded", screenCB.onDisplayAdded);
@ -105,14 +153,14 @@ nw.Screen.on("displayRemoved", screenCB.onDisplayRemoved);
nw.Window.get().on("loaded", function ()
{
// Use the first 12 bytes of the title(trimmed) as storage names
// This cannot be changed as current installs (12,000+) use this naming convention
// This cannot be changed as current installs (38,000+) use this naming convention
s_title = document.title.substr(0, 12).trim();
isShowing = false;
if (typeof localStorage.screenSettings == "undefined")
if (typeof GT.localStorage.screenSettings == "undefined")
{
localStorage.screenSettings = "{}";
GT.localStorage.screenSettings = "{}";
}
s_screenSettings = JSON.parse(localStorage.screenSettings);
s_screenSettings = JSON.parse(GT.localStorage.screenSettings);
if (!(s_title in s_screenSettings))
{
@ -216,6 +264,15 @@ function resetZoom()
saveScreenSettings();
}
var g_process = require("process");
function lockNewWindows()
{
var gui = require("nw.gui");
var win = gui.Window.get();
win.on("new-win-policy", function (frame, url, policy)
{
nw.Shell.openExternal(url);
policy.ignore();
});
}
g_process.on("uncaughtException", function (e) {});
process.on("uncaughtException", function (e) {});

Wyświetl plik

@ -43,13 +43,6 @@
return this._toGeoJSON(latLngs);
}
setTime(date)
{
this.options.time = date;
var latLngs = this._compute(date);
return this._toGeoJSON(latLngs);
}
_toGeoJSON(latLngs)
{
/* Return 'pseudo' GeoJSON representation of the coordinates

Wyświetl plik

@ -98,14 +98,14 @@ function ValidateCallsign(inputText, validDiv)
{
inputText.style.color = "#FF0";
inputText.style.backgroundColor = "green";
if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Valid");
if (validDiv) validDiv.innerHTML = I18N("stats.Validate.Valid");
return true;
}
else
{
inputText.style.color = "#000";
inputText.style.backgroundColor = "yellow";
if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid");
if (validDiv) validDiv.innerHTML = I18N("stats.Validate.Invalid");
return false;
}
}
@ -113,7 +113,7 @@ function ValidateCallsign(inputText, validDiv)
{
inputText.style.color = "#000";
inputText.style.backgroundColor = "yellow";
if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid");
if (validDiv) validDiv.innerHTML = I18N("stats.Validate.Invalid");
return false;
}
}

Wyświetl plik

@ -194,6 +194,16 @@ html, body {
background-position: 0% 50%;
}
}
@keyframes geoStorm {
0% {
background-size: 100% 100%;
}
100% {
background-size: 200% 200%;
}
}
.myFlagtipEnd {
vertical-align: top;
-webkit-border-radius: 6px;

Wyświetl plik

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