kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
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
commit
d3082f3fca
|
@ -0,0 +1 @@
|
|||
/package.nw/lib/ol.js
|
|
@ -13,7 +13,7 @@ module.exports = {
|
|||
SharedArrayBuffer: "readonly"
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2021
|
||||
ecmaVersion: "latest"
|
||||
},
|
||||
rules: {
|
||||
/* See https://eslint.org/docs/rules/ */
|
||||
|
|
18
changes.txt
18
changes.txt
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);">
|
||||
🡄
|
||||
◀
|
||||
</div>
|
||||
<div style="display: inline-block" id="rigDiv">-no rig-</div>
|
||||
<div style="display: inline-block; cursor: pointer; right: 0px" onClick="rigChange(true);"> 🡆</div>
|
||||
<div style="display: inline-block; cursor: pointer; right: 0px" onClick="rigChange(true);"> ▶</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 (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 (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 © 2024 GridTracker.org</p>
|
||||
<img src="./gridview.png" /> <br />
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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 — 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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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": {},
|
||||
|
|
|
@ -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") {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 () {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 & 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>
|
||||
|
|
|
@ -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.
|
@ -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",
|
||||
|
|
|
@ -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 |
|
@ -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;
|
||||
}));
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -94,7 +94,7 @@ function callsignServicesInit()
|
|||
|
||||
function saveCallsignSettings()
|
||||
{
|
||||
localStorage.callsignLookups = JSON.stringify(GT.callsignLookups);
|
||||
GT.localStorage.callsignLookups = JSON.stringify(GT.callsignLookups);
|
||||
}
|
||||
|
||||
function lotwLoadCallsigns()
|
||||
|
|
|
@ -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,
|
||||
|
|
1549
package.nw/lib/gt.js
1549
package.nw/lib/gt.js
Plik diff jest za duży
Load Diff
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
@ -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));
|
|
@ -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));
|
|
@ -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));
|
|
@ -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));
|
|
@ -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));
|
|
@ -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
Plik diff jest za duży
Load Diff
|
@ -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
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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: "✔"
|
||||
|
@ -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: "✔"
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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) {});
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
Ładowanie…
Reference in New Issue