kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
				
				
				
			Import vendor version 1.20.0821
							rodzic
							
								
									58cb0e42f1
								
							
						
					
					
						commit
						84993ea6ce
					
				| 
						 | 
				
			
			@ -181,7 +181,7 @@
 | 
			
		|||
		<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 colspan=2>Map View</td></tr>
 | 
			
		||||
				<tr><td colspan=2>Map View Filters</td></tr>
 | 
			
		||||
			
 | 
			
		||||
				<tr title="Select Band
(Auto tracks WSJT-X)"><td><font color="lightgreen">Band</font></td>
 | 
			
		||||
				<td >
 | 
			
		||||
| 
						 | 
				
			
			@ -224,6 +224,35 @@
 | 
			
		|||
				<option value="Phone">Phone</option>
 | 
			
		||||
			</select>
 | 
			
		||||
			</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr title="Select Propagation Mode">
 | 
			
		||||
			<td><font color="yellow">Prop</font></td>
 | 
			
		||||
			<td>
 | 
			
		||||
			<select id="gtPropFilter"  onkeypress="return false;" onchange="gtPropFilterChanged(this);">
 | 
			
		||||
				<option value="mixed">Mixed</option>
 | 
			
		||||
				<option value="xx" disabled>----------</option>
 | 
			
		||||
				<option value="">Unknown</option>
 | 
			
		||||
				<option value="xx" disabled>----------</option>
 | 
			
		||||
				<option value="AS">Aircraft Scatter</option>
 | 
			
		||||
				<option value="AUE">Aurora-E</option>
 | 
			
		||||
				<option value="AUR">Aurora</option>
 | 
			
		||||
				<option value="BS">Back Scatter</option>
 | 
			
		||||
				<option value="ECH">EchoLink</option>
 | 
			
		||||
				<option value="EME">EME</option>
 | 
			
		||||
				<option value="ES">Sporadic E</option>
 | 
			
		||||
				<option value="F2">F2 Reflection</option>
 | 
			
		||||
				<option value="FAI">Field Aligned I</option>
 | 
			
		||||
				<option value="INTERNET">Inet-assist</option>
 | 
			
		||||
				<option value="ION">Ionoscatter</option>
 | 
			
		||||
				<option value="IRL">IRLP</option>
 | 
			
		||||
				<option value="MS">Meteor Scatter</option>
 | 
			
		||||
				<option value="RPT">Repeater</option>
 | 
			
		||||
				<option value="RS">Rain Scatter</option>
 | 
			
		||||
				<option value="SAT">Satellite</option>
 | 
			
		||||
				<option value="TEP">Trans-equatorial</option>
 | 
			
		||||
				<option value="TR">Tropo-ducting</option>
 | 
			
		||||
			</select>
 | 
			
		||||
			</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
				<tr>
 | 
			
		||||
				<td><font color="cyan">Data</font></td>
 | 
			
		||||
| 
						 | 
				
			
			@ -233,7 +262,7 @@
 | 
			
		|||
			</table>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div id="buttonsDiv" style="margin-left:0px;white-space:normal;">
 | 
			
		||||
				<div id="callRosterButton" style="width:190px;color:yellow;font-weight:bold;border-width:2px;margin-bottom:0px" class="button" onclick="openCallRosterWindow();" title="Open Callalable Roster" >Callable Roster</div>
 | 
			
		||||
				<div id="callRosterButton" style="color:#EEE;font-weight:bold;border-width:2px;margin:0px;padding-left:2px;padding-right:2px;text-align:center" class="button" onclick="openCallRosterWindow();" title="Open Call Roster" >Call Roster + Award Tracker</div>
 | 
			
		||||
				<div id="modeModeDiv" onclick="toggleOffline()"  class="iconButton" title="Toggle Online/Offline Mode"><img id="offlineImg" src="" class="buttonImg" /></div>
 | 
			
		||||
				<div id="earthShadow" onclick="toggleEarth()"  class="iconButton" title="Toggle Grayline"><img id="earthImg" src="" class="buttonImg" /></div>
 | 
			
		||||
				<div id="pushPinButton" onclick="togglePushPinMode();" class="iconButton" title="Toggle Push-Pin Mode"><img  id="pinImg" src="" class="buttonImg" /></div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7511,7 +7511,7 @@
 | 
			
		|||
  },
 | 
			
		||||
    "ARRL": {
 | 
			
		||||
    "compiledBy": "N0TTL",
 | 
			
		||||
    "sponsor": "Amatuer Radio Relay League",
 | 
			
		||||
    "sponsor": "Amateur Radio Relay League",
 | 
			
		||||
    "website": "https://arrl.org/",
 | 
			
		||||
    "qsl_req": "confirmed",
 | 
			
		||||
	"mixed" : [ "160m", "80m",  "40m", "30m", "20m", "17m", "15m", "12m", "10m", "6m",  "2m", "1.5m", "70cm" , "23cm"],
 | 
			
		||||
| 
						 | 
				
			
			@ -7654,7 +7654,7 @@
 | 
			
		|||
				291
 | 
			
		||||
			  ],
 | 
			
		||||
			  "endorse": [
 | 
			
		||||
				"160m",  "6m", "2m", "1.5m", "70cm", "23cm"
 | 
			
		||||
				"Mixed"
 | 
			
		||||
			  ],
 | 
			
		||||
			  "mode": [
 | 
			
		||||
				"Mixed",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
<html xmlns="http://www.w3.org/1999/xhtml" style="height:100%;width:100%">
 | 
			
		||||
<head >
 | 
			
		||||
<title>GridTracker : Callable Roster</title>
 | 
			
		||||
<title>GridTracker : Call Roster</title>
 | 
			
		||||
<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">
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
<body onload="init();" onresize="resize();">
 | 
			
		||||
	<div id="main" style="margin:0px;top:0;left:0;width:100%;background-color:black;position:absolute;white-space:nowrap;overflow:auto;" >
 | 
			
		||||
		<div id="mainCallRoster" >
 | 
			
		||||
			<div id="rosterHead" style="width:100%">
 | 
			
		||||
			<div id="rosterHead" style="width:100%;padding:0;margin:0">
 | 
			
		||||
				<div id="viewDiv" class="controlItem"  style="border:1px solid #006;vertical-align:middle;">
 | 
			
		||||
				<table  style="text-align:center;border-collapse:collapse;">
 | 
			
		||||
					<tr><td colspan=3 >
 | 
			
		||||
| 
						 | 
				
			
			@ -88,24 +88,24 @@
 | 
			
		|||
					<tr style="padding:0;margin:0"><td colspan=2 style="padding:0;margin:0"><div id="scriptIcon" style="display:none;padding:0;margin:0"></div></td></tr>
 | 
			
		||||
				</table>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div id="awardWantedDiv" class="controlItem" style="border:none;overflow:auto;overflow-x:hidden;" ></div>
 | 
			
		||||
				<div id="huntingMatrixDiv" class="controlItem" style="border:1px solid #066;margin:0:padding:0">
 | 
			
		||||
					<table  style="border-collapse:collapse;" >
 | 
			
		||||
				<div id="awardWantedDiv" class="controlItem" style="border:none;overflow:auto;overflow-x:hidden" ></div>
 | 
			
		||||
				<div id="huntingMatrixDiv" class="controlItem" style="border:1px solid #066">
 | 
			
		||||
					<table  style="border-collapse:collapse;" title="Wanted" >
 | 
			
		||||
						<tr><th colspan=2>Wanted</th></tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 ><label><input type="checkbox" id="huntCallsign" onchange="wantedChanged(this);">Callsign</label></td><td colspan=1 ><label><input type="checkbox" id="huntCQz" onchange="wantedChanged(this);">CQ Zone</label></td>
 | 
			
		||||
							<td colspan=1 ><label><input type="checkbox" id="huntCallsign" onchange="wantedChanged(this);">Callsign</label></td><td colspan=1 ><label><input type="checkbox" id="huntCQz" onchange="wantedChanged(this);">CQz</label></td>
 | 
			
		||||
						</tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntGrid" onchange="wantedChanged(this);">Grid</td>	<td colspan=1 ><input type="checkbox" id="huntITUz" onchange="wantedChanged(this);">ITU Zone</td>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntGrid" onchange="wantedChanged(this);">Grid</td>	<td colspan=1 ><input type="checkbox" id="huntITUz" onchange="wantedChanged(this);">ITUz</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntDXCC" onchange="wantedChanged(this);">DXCC</td> <td colspan=1 ><input type="checkbox" id="huntState" onchange="wantedChanged(this);">US State</td>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntDXCC" onchange="wantedChanged(this);">DXCC</td> <td colspan=1 ><input type="checkbox" id="huntState" onchange="wantedChanged(this);">State</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 title='Stations calling *you*'><input type="checkbox" id="huntQRZ" onchange="wantedChanged(this);">QRZ</td><td colspan=1 ><input type="checkbox" id="huntCounty" onchange="wantedChanged(this);">US County</td>
 | 
			
		||||
							<td colspan=1 title='Stations calling *you*'><input type="checkbox" id="huntQRZ" onchange="wantedChanged(this);">QRZ</td><td colspan=1 ><input type="checkbox" id="huntCounty" onchange="wantedChanged(this);">County</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntPX" onchange="wantedChanged(this);">WPX</td><td colspan=1 ><input type="checkbox" id="huntCont" onchange="wantedChanged(this);">Continent</td>
 | 
			
		||||
							<td colspan=1 ><input type="checkbox" id="huntPX" onchange="wantedChanged(this);">WPX</td><td colspan=1 ><input type="checkbox" id="huntCont" onchange="wantedChanged(this);">Cont</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td colspan=1 title='Off-Air Message Service Users'><input type="checkbox" id="huntOAMS" onchange="wantedChanged(this);">OAMS</td>
 | 
			
		||||
| 
						 | 
				
			
			@ -113,7 +113,7 @@
 | 
			
		|||
					</table>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div id="exceptionDiv" class="controlItem"  style="border:1px solid #622;" > 
 | 
			
		||||
					<table  style="border-collapse:collapse" title="Exceptions">
 | 
			
		||||
					<table  style="border-collapse:collapse;margin:0;padding:0;" title="Exceptions">
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td>
 | 
			
		||||
								<table style="border-collapse:collapse;" >
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +121,7 @@
 | 
			
		|||
								 <td colspan=2 ><label><input type="checkbox" id="cqOnly" onchange="valuesChanged();">CQ Only</label></td>
 | 
			
		||||
								</tr>
 | 
			
		||||
								<tr>
 | 
			
		||||
								 <td colspan=2 ><label><input type="checkbox" id="wantGrid" onchange="valuesChanged();">Require Grid</label></td>
 | 
			
		||||
								 <td colspan=2 ><label><input type="checkbox" id="wantGrid" onchange="valuesChanged();">Has Grid</label></td>
 | 
			
		||||
								</tr>
 | 
			
		||||
								<tr>
 | 
			
		||||
								 <td  ><input type="checkbox" id="wantMinDB" onchange="valuesChanged();"/>Min dB</td>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,71 +1,79 @@
 | 
			
		|||
<center>
 | 
			
		||||
<!--center>
 | 
			
		||||
<img style=" display: inline-block;" src="./img/award-medal.svg" width="75px">
 | 
			
		||||
<div style=" display: inline-block;font-size:36px;font-weight:bold;vertical-align:top;padding-top:15px;">
 | 
			
		||||
Award Tracker is here!  
 | 
			
		||||
</div>
 | 
			
		||||
<img  style=" display: inline-block;" src="./img/award-trophy.svg" width="75px">
 | 
			
		||||
</center>
 | 
			
		||||
</center-->
 | 
			
		||||
<pre>
 | 
			
		||||
[v1.20.0819] August 19th, 2020
 | 
			
		||||
[v1.20.0821] August 21st, 2020
 | 
			
		||||
 | 
			
		||||
Callable Roster:
 | 
			
		||||
GridTracker Main Window:
 | 
			
		||||
	Update:
 | 
			
		||||
		"Map View" renamed "Map View Filters"
 | 
			
		||||
		"Callable Roster" renamed "Call Roster + Award Tracker"
 | 
			
		||||
		Minimum width now 200 pixels (you can hide the map now)
 | 
			
		||||
		
 | 
			
		||||
	New:
 | 
			
		||||
		"Window Always On Top" option in Settings -> "Call Roster"
 | 
			
		||||
			default disabled
 | 
			
		||||
		"Prop" added to "Map View Filters"
 | 
			
		||||
			Propagation Mode for filtering Logbook data *only* 
 | 
			
		||||
				Live data view is unaffected
 | 
			
		||||
			
 | 
			
		||||
		Award Tracker!
 | 
			
		||||
			Click on "Logbook" and select "Award Tracker"
 | 
			
		||||
			Click "Add Awards" and select your sponsor and award name
 | 
			
		||||
			
 | 
			
		||||
			Hover over the award indicator to get quick-stats
 | 
			
		||||
			quick-stats is a place holder until I get the stats tab built
 | 
			
		||||
			
 | 
			
		||||
			Award Tracking is 'best guess'. confirm with your award sponsor the
 | 
			
		||||
			validity of your logbooks, GridTracker will try its best but could
 | 
			
		||||
			be wrong
 | 
			
		||||
			
 | 
			
		||||
			Award tally may be incorrect or incomplete, we are working on it
 | 
			
		||||
			
 | 
			
		||||
			Not every award is available yet for tracking
 | 
			
		||||
			
 | 
			
		||||
			Special thanks to NR0Q and KB2YSI for compiling awards definitions
 | 
			
		||||
			
 | 
			
		||||
			At this time IOTA is processed but not a trackable field (yet)
 | 
			
		||||
		
 | 
			
		||||
		US County (Wanted , Column, Right-Click Menu)
 | 
			
		||||
			If US callsign database is enabled, best guess on stations county
 | 
			
		||||
		
 | 
			
		||||
		Continent (Wanted , Column, Right-Click Menu)
 | 
			
		||||
			Why did I not have this sooner?!
 | 
			
		||||
	
 | 
			
		||||
		Changed "No Round-up and "Only Round-up" to "No" and "Only" Decode Message
 | 
			
		||||
			If "No" or "Only" are checked, then the decoded message is checked
 | 
			
		||||
			You can enter any thing you want (Grid, Callsign, CQ target)
 | 
			
		||||
			The fields also support regex, but not required
 | 
			
		||||
			
 | 
			
		||||
		Compact Mode - Great for Contesting!!!
 | 
			
		||||
			Right-click menu, "Compact Mode" only shows callsigns
 | 
			
		||||
			The order is the order of the last column sorted in "Roster Mode"
 | 
			
		||||
			I *will* be improving this in future releases!
 | 
			
		||||
		
 | 
			
		||||
		Text Sizing
 | 
			
		||||
			Ctrl-0(zero) resets text size to default value
 | 
			
		||||
				
 | 
			
		||||
	Update:
 | 
			
		||||
		"Reference" renamed "Logbook" with "Logbook Reference" tooltip
 | 
			
		||||
		Added Spot report to tooltip in Spot column
 | 
			
		||||
	
 | 
			
		||||
Logbook Reference:
 | 
			
		||||
		Removed "FFMA" and "GMA" award layers and replaced with "US48" layer
 | 
			
		||||
			To view your Fred Fish Memorial "FFMA" Award:
 | 
			
		||||
				Select "US48" hotkey (8) then;
 | 
			
		||||
					Set your Band filter to "6m"
 | 
			
		||||
			
 | 
			
		||||
			To view your AMSAT GridMaster "GMA" Award:
 | 
			
		||||
				Select "US48" hotkey (8) then;
 | 
			
		||||
					Set your Band & Mode filters to "Mixed"
 | 
			
		||||
					Set your Prop filter to "Satellite"
 | 
			
		||||
		
 | 
			
		||||
Call Roster:
 | 
			
		||||
	Update:
 | 
			
		||||
		Callable Roster renamed to "Call Roster"
 | 
			
		||||
		
 | 
			
		||||
	Fixed:
 | 
			
		||||
		Turkey Region 1 now in Europe
 | 
			
		||||
		Award Tracking:
 | 
			
		||||
			"Wanted" box remains as it's needed
 | 
			
		||||
			Fix bad filtering flags
 | 
			
		||||
			
 | 
			
		||||
		When enabling "Wanted" entities; right-click menu now tracks correctly 
 | 
			
		||||
		
 | 
			
		||||
		Issue with New/Unconfirmed callsigns not showing up at all
 | 
			
		||||
		
 | 
			
		||||
		Return of the "strikeout" on callsigns that have been confirmed
 | 
			
		||||
			by popular demand
 | 
			
		||||
			
 | 
			
		||||
	Compact Mode:
 | 
			
		||||
		Sorted by "Age" for now 
 | 
			
		||||
			(Will add a right-click menu to select sort type later on)
 | 
			
		||||
			
 | 
			
		||||
		Added "DXCC" under "Callsign"
 | 
			
		||||
		
 | 
			
		||||
		Tooltip(mouse-over) added with decode details
 | 
			
		||||
			(Will add Worked/Confirmed status by band/mode later on)
 | 
			
		||||
			
 | 
			
		||||
				
 | 
			
		||||
PSK-Spots:
 | 
			
		||||
	Fixed: 
 | 
			
		||||
		Memory issue when 1500 spots in 24 hours
 | 
			
		||||
			Thanks to mister "I get out" NR0Q for finding this one
 | 
			
		||||
			
 | 
			
		||||
Logging:
 | 
			
		||||
	Local Files(s)
 | 
			
		||||
		Details:
 | 
			
		||||
			Filename now has a tooltip with the full file path
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
Lookups:
 | 
			
		||||
	Update:
 | 
			
		||||
		Display previous worked and confirmed by band
 | 
			
		||||
	
 | 
			
		||||
Legend:
 | 
			
		||||
	Update:
 | 
			
		||||
		Button moved from map settings back to the button panel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Thank you for reading the entire update! 
 | 
			
		||||
| 
						 | 
				
			
			@ -79,10 +87,14 @@ Thank you for reading the entire update!
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Mention "phone-sofa" in any forum I read and I'll send you a GridTracker token
 | 
			
		||||
to the address associated with your callsign lookup
 | 
			
		||||
 | 
			
		||||
Please don't mention this easter-egg to anyone. I want to see who reads the update
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
To the 21 of you out of 650-ish, who downloaded and read the update in v1.20.0819: 
 | 
			
		||||
	I salute you! And I'll be shipping out tokens when I get a chance! Thank you!
 | 
			
		||||
 | 
			
		||||
</pre>
 | 
			
		||||
<center><img class="button" src="./img/tokens.jpg" width="400px"></center>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,46 +1,23 @@
 | 
			
		|||
<?xml version="1.0" encoding="iso-8859-1"?>
 | 
			
		||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
			
		||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
			
		||||
	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
 | 
			
		||||
<rect x="337.582" y="77.363" style="fill:#FEDC3D;" width="56.264" height="56.264"/>
 | 
			
		||||
<rect x="61.89" y="77.363" style="fill:#FFF1B1;" width="298.198" height="56.264"/>
 | 
			
		||||
<path style="fill:#4D4D4D;" d="M393.846,0h-33.758v88.615h33.758c9.284,0,16.879-7.596,16.879-16.879V16.879
 | 
			
		||||
	C410.725,7.596,403.13,0,393.846,0z"/>
 | 
			
		||||
<path style="fill:#737373;" d="M376.967,16.879v54.857c0,9.284-7.596,16.879-16.879,16.879H61.89
 | 
			
		||||
	c-9.284,0-16.879-7.596-16.879-16.879V16.879C45.011,7.596,52.607,0,61.89,0h298.198C369.371,0,376.967,7.596,376.967,16.879z"/>
 | 
			
		||||
<line style="fill:none;stroke:#4D4D4D;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="78.769" y1="33.758" x2="228.431" y2="33.758"/>
 | 
			
		||||
<circle style="fill:#4D4D4D;" cx="262.189" cy="33.758" r="8.44"/>
 | 
			
		||||
<rect x="337.582" y="199.736" style="fill:#FEDC3D;" width="56.264" height="56.264"/>
 | 
			
		||||
<rect x="61.89" y="199.736" style="fill:#FFF1B1;" width="298.198" height="56.264"/>
 | 
			
		||||
<path style="fill:#4D4D4D;" d="M393.846,122.374h-33.758v88.615h33.758c9.284,0,16.879-7.596,16.879-16.879v-54.857
 | 
			
		||||
	C410.725,129.969,403.13,122.374,393.846,122.374z"/>
 | 
			
		||||
<path style="fill:#737373;" d="M376.967,139.253v54.857c0,9.284-7.596,16.879-16.879,16.879H61.89
 | 
			
		||||
	c-9.284,0-16.879-7.596-16.879-16.879v-54.857c0-9.284,7.596-16.879,16.879-16.879h298.198
 | 
			
		||||
	C369.371,122.374,376.967,129.969,376.967,139.253z"/>
 | 
			
		||||
<line style="fill:none;stroke:#4D4D4D;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="78.769" y1="156.132" x2="228.431" y2="156.132"/>
 | 
			
		||||
<circle style="fill:#4D4D4D;" cx="262.189" cy="156.132" r="8.44"/>
 | 
			
		||||
<rect x="337.582" y="322.11" style="fill:#FEDC3D;" width="56.264" height="56.264"/>
 | 
			
		||||
<rect x="61.89" y="322.11" style="fill:#FFF1B1;" width="298.198" height="56.264"/>
 | 
			
		||||
<path style="fill:#4D4D4D;" d="M393.846,244.747h-33.758v88.615h33.758c9.284,0,16.879-7.596,16.879-16.879v-54.857
 | 
			
		||||
	C410.725,252.343,403.13,244.747,393.846,244.747z"/>
 | 
			
		||||
<path style="fill:#737373;" d="M376.967,261.626v54.857c0,9.284-7.596,16.879-16.879,16.879H61.89
 | 
			
		||||
	c-9.284,0-16.879-7.596-16.879-16.879v-54.857c0-9.284,7.596-16.879,16.879-16.879h298.198
 | 
			
		||||
	C369.371,244.747,376.967,252.343,376.967,261.626z"/>
 | 
			
		||||
<line style="fill:none;stroke:#4D4D4D;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="78.769" y1="278.505" x2="228.431" y2="278.505"/>
 | 
			
		||||
	 viewBox="0 0 483 483" style="enable-background:new 0 0 483 483;" xml:space="preserve">
 | 
			
		||||
<g>
 | 
			
		||||
	<circle style="fill:#4D4D4D;" cx="262.189" cy="278.505" r="8.44"/>
 | 
			
		||||
	<path style="fill:#4D4D4D;" d="M393.846,367.12h-33.758v88.615h33.758c9.284,0,16.879-7.596,16.879-16.879v-54.857
 | 
			
		||||
		C410.725,374.715,403.13,367.12,393.846,367.12z"/>
 | 
			
		||||
	<rect x="132.669" style="fill:#D8D7DA;" width="123.232" height="38"/>
 | 
			
		||||
	<rect x="194.285" y="38" style="fill:#787680;" width="160" height="80"/>
 | 
			
		||||
	<path style="fill:#ACABB1;" d="M194.285,288.025c22.186-43.793,67.643-73.884,120-73.884c4.602,0,9.15,0.234,13.635,0.687
 | 
			
		||||
		L334.245,118h-139.96V288.025z"/>
 | 
			
		||||
	<path style="fill:#ACABB1;" d="M194.285,443h24.42c-9.795-9.913-18.063-21.335-24.42-33.884V443z"/>
 | 
			
		||||
	<path style="fill:#C6C5CA;" d="M179.856,348.57c0-21.767,5.206-42.339,14.429-60.545V118H54.325l21.23,325h118.73v-33.884
 | 
			
		||||
		C185.062,390.909,179.856,370.337,179.856,348.57z"/>
 | 
			
		||||
	<rect x="34.285" y="38" style="fill:#898890;" width="160" height="80"/>
 | 
			
		||||
	<path style="fill:#FFDA44;" d="M314.285,376.855l-29.427,29.427l-28.284-28.284l29.427-29.427l-29.427-29.427l28.284-28.284
 | 
			
		||||
		l29.427,29.427V214.141c-52.357,0-97.814,30.091-120,73.884c-9.223,18.207-14.429,38.778-14.429,60.545
 | 
			
		||||
		c0,21.767,5.206,42.339,14.429,60.546c6.357,12.549,14.626,23.971,24.42,33.884c24.386,24.68,58.225,40,95.58,40V376.855z"/>
 | 
			
		||||
	<path style="fill:#FFCD00;" d="M327.92,214.828c-4.484-0.454-9.033-0.687-13.635-0.687v106.145c0,0,29.427-29.427,29.427-29.427
 | 
			
		||||
		l28.284,28.284l-29.427,29.427l29.427,29.427l-28.284,28.284l-29.427-29.427c0,0,0,106.145,0,106.145
 | 
			
		||||
		c74.125,0,134.429-60.305,134.429-134.43C448.715,279.048,395.665,221.684,327.92,214.828z"/>
 | 
			
		||||
	<polygon style="fill:#2488FF;" points="256.574,319.144 286.001,348.571 256.574,377.998 284.859,406.282 314.286,376.855 
 | 
			
		||||
		343.713,406.282 371.997,377.998 342.57,348.571 371.997,319.144 343.713,290.859 314.286,320.286 284.859,290.859 	"/>
 | 
			
		||||
</g>
 | 
			
		||||
<path style="fill:#737373;" d="M376.967,383.999v54.857c0,9.284-7.596,16.879-16.879,16.879H61.89
 | 
			
		||||
	c-9.284,0-16.879-7.596-16.879-16.879v-54.857c0-9.284,7.596-16.879,16.879-16.879h298.198
 | 
			
		||||
	C369.371,367.12,376.967,374.715,376.967,383.999z"/>
 | 
			
		||||
<line style="fill:none;stroke:#4D4D4D;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="78.769" y1="400.879" x2="208.176" y2="400.879"/>
 | 
			
		||||
<path style="fill:#FE5F1A;" d="M354.462,286.945V512c62.149,0,112.527-50.379,112.527-112.527S416.611,286.945,354.462,286.945z"/>
 | 
			
		||||
<path style="fill:#FE834D;" d="M354.462,286.945c43.503,0,78.769,50.379,78.769,112.527S397.965,512,354.462,512
 | 
			
		||||
	c-62.149,0-112.527-50.379-112.527-112.527S292.313,286.945,354.462,286.945z"/>
 | 
			
		||||
<path style="fill:#FFFFFF;" d="M406.181,427.322l-27.849-27.849l27.849-27.849c6.592-6.592,6.592-17.279,0-23.87
 | 
			
		||||
	c-6.592-6.592-17.279-6.592-23.87,0l-27.849,27.849l-27.849-27.849c-6.592-6.592-17.279-6.592-23.87,0s-6.592,17.279,0,23.87
 | 
			
		||||
	l27.849,27.849l-27.849,27.849c-6.592,6.592-6.592,17.279,0,23.87c6.592,6.592,17.279,6.592,23.87,0l27.849-27.849l27.849,27.849
 | 
			
		||||
	c6.592,6.592,17.279,6.592,23.87,0C412.773,444.601,412.773,433.914,406.181,427.322z"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
		 Przed Szerokość: | Wysokość: | Rozmiar: 4.0 KiB Po Szerokość: | Wysokość: | Rozmiar: 1.9 KiB  | 
										
											Plik binarny nie jest wyświetlany.
										
									
								
							| 
		 Przed Szerokość: | Wysokość: | Rozmiar: 819 B  | 
										
											Plik binarny nie jest wyświetlany.
										
									
								
							| 
		 Przed Szerokość: | Wysokość: | Rozmiar: 839 B  | 
										
											Plik binarny nie jest wyświetlany.
										
									
								
							| 
		 Po Szerokość: | Wysokość: | Rozmiar: 815 B  | 
| 
						 | 
				
			
			@ -1177,7 +1177,7 @@ function setAdifStartup(checkbox)
 | 
			
		|||
			worker += "<table class='darkTable'>";
 | 
			
		||||
			for ( var i in g_startupLogs )
 | 
			
		||||
			{
 | 
			
		||||
				worker += "<tr><td>"+ g_startupLogs[i].name + "</td><td onclick='removeStartupLog("+i+")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px;cursor:pointer'></td></tr>";
 | 
			
		||||
				worker += "<tr title='"+g_startupLogs[i].file+"'><td>"+ g_startupLogs[i].name + "</td><td onclick='removeStartupLog("+i+")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px;cursor:pointer'></td></tr>";
 | 
			
		||||
			}
 | 
			
		||||
			worker += "</table>";
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,9 +7,11 @@ var validSettings =
 | 
			
		|||
	"alertSettings",
 | 
			
		||||
	"appSettings",
 | 
			
		||||
	"audioSettings",
 | 
			
		||||
	"awardTracker",
 | 
			
		||||
	"bandActivity",
 | 
			
		||||
	"blockedCQ",
 | 
			
		||||
	"blockedCalls",
 | 
			
		||||
	"blockedDxcc",
 | 
			
		||||
	"blockedCQ",
 | 
			
		||||
	"callsignLookups",
 | 
			
		||||
	"classicAlerts",
 | 
			
		||||
	"classicAlertsVersion",
 | 
			
		||||
| 
						 | 
				
			
			@ -19,15 +21,12 @@ var validSettings =
 | 
			
		|||
	"mapMemory",
 | 
			
		||||
	"mapSettings",
 | 
			
		||||
	"msgSettings",
 | 
			
		||||
	"receptionReports",
 | 
			
		||||
	"receptionSettings",
 | 
			
		||||
	"rosterSettings",
 | 
			
		||||
	"savedAlerts",
 | 
			
		||||
	"speechSettings",
 | 
			
		||||
	"startupLogs",
 | 
			
		||||
	"trustedQslSettings",
 | 
			
		||||
	"bandActivity",
 | 
			
		||||
	"awardTracker"
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var def_appSettings = 
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +45,7 @@ var def_appSettings =
 | 
			
		|||
	"gtBandFilter" : "auto",
 | 
			
		||||
	"gtFlagImgSrc" : 0,
 | 
			
		||||
	"gtModeFilter" : "auto",
 | 
			
		||||
	"gtPropFilter" : "mixed",
 | 
			
		||||
	"gtMsgEnable" : true,
 | 
			
		||||
	"gtShareEnable" : true,
 | 
			
		||||
	"heatEnabled" : 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -185,6 +185,7 @@ var def_msgSettings =
 | 
			
		|||
	"msgAwayText" :  "I am away from the shack at the moment"
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var def_receptionSettings = 
 | 
			
		||||
{
 | 
			
		||||
	"lastSequenceNumber" :  "0", // Treat as a string, it's friggin big
 | 
			
		||||
| 
						 | 
				
			
			@ -240,11 +241,11 @@ var def_trustedQslSettings =
 | 
			
		|||
};
 | 
			
		||||
var def_callsignLookups = 
 | 
			
		||||
{
 | 
			
		||||
	"lotwUseEnable" :  false,
 | 
			
		||||
	"lotwWeeklyEnable" :  false,
 | 
			
		||||
	"lotwUseEnable" :  true,
 | 
			
		||||
	"lotwWeeklyEnable" :  true,
 | 
			
		||||
	"lotwLastUpdate" :  0,
 | 
			
		||||
	"eqslUseEnable" :  false,
 | 
			
		||||
	"eqslWeeklyEnable" :  false,
 | 
			
		||||
	"eqslUseEnable" :  true,
 | 
			
		||||
	"eqslWeeklyEnable" :  true,
 | 
			
		||||
	"eqslLastUpdate" :  0,
 | 
			
		||||
	"ulsUseEnable" :  true,
 | 
			
		||||
	"ulsWeeklyEnable" :  true,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
// GridTracker ©2020 N0TTL
 | 
			
		||||
var gtComment1 = "GridTracker is not open source, you may not change, modify or 'borrow' code for your needs that is redistributed in any form without first asking and receiving permission from N0TTL *and* N2VFL";
 | 
			
		||||
var gtComment2 = "Third party libraries and functions used are seperated to third-party.js or their respective lib .js files, the GT close-source directive does not apply to these files of course";
 | 
			
		||||
var gtVersion = 1200819;
 | 
			
		||||
var gtBeta = "r4";
 | 
			
		||||
var gtVersion = 1200821;
 | 
			
		||||
var gtBeta = "";
 | 
			
		||||
 | 
			
		||||
var g_startVersion = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,8 +95,6 @@ function loadAllSettings()
 | 
			
		|||
	g_callsignLookups = loadDefaultsAndMerge("callsignLookups", def_callsignLookups);
 | 
			
		||||
	g_bandActivity =  loadDefaultsAndMerge("bandActivity", def_bandActivity);
 | 
			
		||||
	
 | 
			
		||||
	g_receptionReports = loadObjectIfExists("receptionReports");	
 | 
			
		||||
 | 
			
		||||
	g_startupLogs = loadArrayIfExists("startupLogs");
 | 
			
		||||
	g_mapMemory = loadArrayIfExists("mapMemory");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +109,7 @@ function loadAllSettings()
 | 
			
		|||
		}
 | 
			
		||||
		g_appSettings.mapMemory = JSON.stringify(g_mapMemory);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
loadAllSettings();
 | 
			
		||||
| 
						 | 
				
			
			@ -205,6 +203,8 @@ function saveAndCloseApp()
 | 
			
		|||
{
 | 
			
		||||
		g_closing = true;
 | 
			
		||||
 | 
			
		||||
		saveReceptionReports();
 | 
			
		||||
 | 
			
		||||
		try 
 | 
			
		||||
		{
 | 
			
		||||
			var data = {};
 | 
			
		||||
| 
						 | 
				
			
			@ -218,6 +218,8 @@ function saveAndCloseApp()
 | 
			
		|||
			data.version = gtVersion;
 | 
			
		||||
 | 
			
		||||
			fs.writeFileSync(g_jsonDir + "internal_qso.json", JSON.stringify(data) );	
 | 
			
		||||
			
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		catch (e) 
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -280,11 +282,12 @@ function clearAndReload() {
 | 
			
		|||
 | 
			
		||||
{
 | 
			
		||||
	win.hide();
 | 
			
		||||
	win.setMinimumSize(400, 600);
 | 
			
		||||
	
 | 
			
		||||
	win.on('close', function () {
 | 
			
		||||
		saveAndCloseApp();
 | 
			
		||||
	});
 | 
			
		||||
	win.show();
 | 
			
		||||
	win.setMinimumSize(200, 600);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -431,8 +434,8 @@ var g_countyData = {};
 | 
			
		|||
var g_zipToCounty = {};
 | 
			
		||||
var g_stateToCounty = {};
 | 
			
		||||
var g_cntyToCounty = {};
 | 
			
		||||
var g_ffmaData = {};
 | 
			
		||||
var g_gmaaData = {};
 | 
			
		||||
var g_us48Data = {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var g_startupFunctions = Array();
 | 
			
		||||
| 
						 | 
				
			
			@ -531,19 +534,19 @@ g_trophyImageArray[3] = "./img/wac_trophy.png";
 | 
			
		|||
g_trophyImageArray[4] = "./img/was_trophy.png";
 | 
			
		||||
g_trophyImageArray[5] = "./img/dxcc_trophy.png";
 | 
			
		||||
g_trophyImageArray[6] = "./img/usc_trophy.png";
 | 
			
		||||
g_trophyImageArray[7] = "./img/ffma_trophy.png";
 | 
			
		||||
g_trophyImageArray[8] = "./img/gma_trophy.png";
 | 
			
		||||
g_trophyImageArray[7] = "./img/us48_trophy.png";
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
var g_viewInfo = {};
 | 
			
		||||
g_viewInfo[0] = ["g_qsoGrids","Grids",0,0,0];
 | 
			
		||||
g_viewInfo[1] = ["g_cqZones","CQ Zones",0,0,40];
 | 
			
		||||
g_viewInfo[2] = ["g_ituZones","ITU Zones",0,0,90];
 | 
			
		||||
g_viewInfo[3] = ["g_wacZones","Continents",0,0,7];
 | 
			
		||||
g_viewInfo[4] = ["g_wasZones","U.S. States",0,0,50];
 | 
			
		||||
g_viewInfo[4] = ["g_wasZones","US States",0,0,50];
 | 
			
		||||
g_viewInfo[5] = ["g_worldGeoData","DXCCs",0,0,340];
 | 
			
		||||
g_viewInfo[6] = ["g_countyData", "U.S. Counties",0,0,3220];
 | 
			
		||||
g_viewInfo[7] = ["g_ffmaData", "Fred Fish Memorial Award",0,0,488];
 | 
			
		||||
g_viewInfo[8] = ["g_gmaaData", " AMSAT GridMaster Award",0,0,488];
 | 
			
		||||
g_viewInfo[6] = ["g_countyData", "US Counties",0,0,3220];
 | 
			
		||||
g_viewInfo[7] = ["g_us48Data", "US Continental Grids",0,0,488];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var g_spotImageArray = Array();
 | 
			
		||||
g_spotImageArray[0] = "./img/psk_spots_off.png";
 | 
			
		||||
| 
						 | 
				
			
			@ -580,6 +583,13 @@ function gtModeFilterChanged(selector) {
 | 
			
		|||
	redrawSpots();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function gtPropFilterChanged(selector) {
 | 
			
		||||
	g_appSettings.gtPropFilter = selector.value;
 | 
			
		||||
 | 
			
		||||
	redrawGrids();
 | 
			
		||||
	redrawSpots();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setBandAndModeToAuto() {
 | 
			
		||||
 | 
			
		||||
	g_appSettings.gtModeFilter = g_appSettings.gtBandFilter = gtBandFilter.value = gtModeFilter.value = "auto";
 | 
			
		||||
| 
						 | 
				
			
			@ -1206,7 +1216,7 @@ function addDeDx(finalGrid, finalDXcall, cq, cqdx, locked, finalDEcall, finalRST
 | 
			
		|||
		if (
 | 
			
		||||
			(g_appSettings.gtBandFilter.length == 0 || (g_appSettings.gtBandFilter == 'auto' ? myBand ==
 | 
			
		||||
					band : g_appSettings.gtBandFilter == band)) &&
 | 
			
		||||
			(validateMapMode(mode))) {
 | 
			
		||||
			(validateMapMode(mode)) && validatePropMode(finalPropMode)) {
 | 
			
		||||
			details.rect = qthToQsoBox(finalGrid, hash, cq, cqdx, locked, finalDEcall, worked, didConfirm, band,
 | 
			
		||||
					wspr);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1618,9 +1628,9 @@ function createSpotTipTable(toolElement) {
 | 
			
		|||
	var now = timeNowSec();
 | 
			
		||||
	var myTooltip = document.getElementById("myTooltip");
 | 
			
		||||
	var worker = "";
 | 
			
		||||
	if (toolElement.spot in g_receptionReports) {
 | 
			
		||||
	if (toolElement.spot in g_receptionReports.spots) {
 | 
			
		||||
		g_layerSources["psk-hop"].clear();
 | 
			
		||||
		var report = g_receptionReports[toolElement.spot];
 | 
			
		||||
		var report = g_receptionReports.spots[toolElement.spot];
 | 
			
		||||
 | 
			
		||||
		var LL = squareToLatLongAll(myRawGrid);
 | 
			
		||||
		var Lat = LL.la2 - ((LL.la2 - LL.la1) / 2);
 | 
			
		||||
| 
						 | 
				
			
			@ -2289,7 +2299,7 @@ function registerHotKeys() {
 | 
			
		|||
	registerHotKey("KeyG", toggleGtMap);
 | 
			
		||||
	registerHotKey("KeyH", toggleHeatSpots);
 | 
			
		||||
	registerHotKey("KeyI", showRootInfoBox);
 | 
			
		||||
	registerHotKey("KeyJ", setTrophyOverlay, 8);
 | 
			
		||||
	//registerHotKey("KeyJ", setTrophyOverlay, 8);
 | 
			
		||||
	registerHotKey("KeyK", makeScreenshots);
 | 
			
		||||
	registerHotKey("KeyL", adifLoadDialog);
 | 
			
		||||
	registerHotKey("KeyM", toggleAlertMute);
 | 
			
		||||
| 
						 | 
				
			
			@ -2381,7 +2391,7 @@ var g_currentOverlay = 0;
 | 
			
		|||
 | 
			
		||||
function cycleTrophyOverlay() {
 | 
			
		||||
	g_currentOverlay++;
 | 
			
		||||
	g_currentOverlay %= 9;
 | 
			
		||||
	g_currentOverlay %= 8;
 | 
			
		||||
 | 
			
		||||
	setTrophyOverlay(g_currentOverlay);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2593,7 +2603,7 @@ function setTrophyOverlay(which) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (which == 7) {
 | 
			
		||||
		for (key in g_ffmaData) 
 | 
			
		||||
		for (key in g_us48Data) 
 | 
			
		||||
		{
 | 
			
		||||
			var	LL = squareToLatLong(key);
 | 
			
		||||
			var bounds = [
 | 
			
		||||
| 
						 | 
				
			
			@ -2604,48 +2614,22 @@ function setTrophyOverlay(which) {
 | 
			
		|||
			var boxColor = "#FF000015"
 | 
			
		||||
			var borderColor = "#0000FFFF";
 | 
			
		||||
			var borderWeight = 0.1;
 | 
			
		||||
			if (g_ffmaData[key].confirmed) 
 | 
			
		||||
			if (g_us48Data[key].confirmed) 
 | 
			
		||||
			{
 | 
			
		||||
				boxColor = '#00FF0066';
 | 
			
		||||
				borderWeight = 0.2;
 | 
			
		||||
			} 
 | 
			
		||||
			else if (g_ffmaData[key].worked) 
 | 
			
		||||
			else if (g_us48Data[key].worked) 
 | 
			
		||||
			{
 | 
			
		||||
				boxColor = '#FFFF0066';
 | 
			
		||||
				borderWeight = 0.2;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			g_currentShapes[key] = gridFeature(key, rectangle(bounds), "ffma", boxColor, borderColor, borderWeight);
 | 
			
		||||
			g_currentShapes[key] = gridFeature(key, rectangle(bounds), "us48", boxColor, borderColor, borderWeight);
 | 
			
		||||
			g_layerSources["award"].addFeature(g_currentShapes[key]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (which == 8) {
 | 
			
		||||
		for (key in g_gmaaData) 
 | 
			
		||||
		{
 | 
			
		||||
			var	LL = squareToLatLong(key);
 | 
			
		||||
			var bounds = [
 | 
			
		||||
				[LL.lo1, LL.la1],
 | 
			
		||||
				[LL.lo2, LL.la2]
 | 
			
		||||
			];
 | 
			
		||||
				
 | 
			
		||||
			var boxColor = "#FF000020"
 | 
			
		||||
			var borderColor = "#0000FFFF";
 | 
			
		||||
			var borderWeight = 0.1;
 | 
			
		||||
			if (g_gmaaData[key].confirmed) 
 | 
			
		||||
			{
 | 
			
		||||
				boxColor = '#00FF0066';
 | 
			
		||||
				borderWeight = 0.2;
 | 
			
		||||
			} 
 | 
			
		||||
			else if (g_gmaaData[key].worked) 
 | 
			
		||||
			{
 | 
			
		||||
				boxColor = '#FFFF0066';
 | 
			
		||||
				borderWeight = 0.2;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			g_currentShapes[key] = gridFeature(key, rectangle(bounds), "gmaa", boxColor, borderColor, borderWeight);
 | 
			
		||||
			g_layerSources["award"].addFeature(g_currentShapes[key]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	updateSpotView(true);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2763,28 +2747,9 @@ function trophyOver(feature) {
 | 
			
		|||
		infoObject = g_countyData[name];
 | 
			
		||||
		name = infoObject.geo.properties.n + ", " + infoObject.geo.properties.st;
 | 
			
		||||
	}
 | 
			
		||||
	if (key == "ffma") {
 | 
			
		||||
		trophy = "Fred Fish Memorial Award";
 | 
			
		||||
		infoObject = g_ffmaData[feature.get('grid')];
 | 
			
		||||
		name = feature.get('grid');
 | 
			
		||||
		
 | 
			
		||||
		if (name in g_gridToState) {
 | 
			
		||||
			zone = "";
 | 
			
		||||
			for (var x = 0; x < g_gridToDXCC[name].length; x++) {
 | 
			
		||||
				if (name in g_gridToState) {
 | 
			
		||||
					for (var y = 0; y < g_gridToState[name].length; y++) {
 | 
			
		||||
						if (g_gridToDXCC[name][x] == g_StateData[g_gridToState[name][y]].dxcc && g_gridToDXCC[name][x] == 291) {
 | 
			
		||||
							zone += g_StateData[g_gridToState[name][y]].name + ", ";
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			zone = zone.substr(0,zone.length-2);7
 | 
			
		||||
		}	
 | 
			
		||||
	}
 | 
			
		||||
	if (key == "gmaa") {
 | 
			
		||||
		trophy = "AMSAT GridMaster Award";
 | 
			
		||||
		infoObject = g_gmaaData[feature.get('grid')];
 | 
			
		||||
	if (key == "us48") {
 | 
			
		||||
		trophy = "US Continental Grids";
 | 
			
		||||
		infoObject = g_us48Data[feature.get('grid')];
 | 
			
		||||
		name = feature.get('grid');
 | 
			
		||||
		
 | 
			
		||||
		if (name in g_gridToState) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2802,6 +2767,7 @@ function trophyOver(feature) {
 | 
			
		|||
		}	
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	var worker = "<table>";
 | 
			
		||||
	worker += "<tr><th colspan=2 >" + trophy + "</th></tr>";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3031,7 +2997,7 @@ function mouseOverDataItem(mouseEvent, fromHover) {
 | 
			
		|||
	var top = 0;
 | 
			
		||||
	var noRoomLeft = false;
 | 
			
		||||
	var noRoomRight = false;
 | 
			
		||||
	if (typeof mouseEvent.spot != "undefined" && g_receptionReports[mouseEvent.spot].bearing > 180)
 | 
			
		||||
	if (typeof mouseEvent.spot != "undefined" && g_receptionReports.spots[mouseEvent.spot].bearing > 180)
 | 
			
		||||
		noRoomRight = true;
 | 
			
		||||
	myTooltip.style.left = (getMouseX() + 15) + 'px';
 | 
			
		||||
	top = parseInt((getMouseY() - 20 - ((callListLength / 2) * 25)));
 | 
			
		||||
| 
						 | 
				
			
			@ -3061,7 +3027,7 @@ function mouseMoveDataItem(mouseEvent) {
 | 
			
		|||
	var top = 0;
 | 
			
		||||
	var noRoomLeft = false;
 | 
			
		||||
	var noRoomRight = false;
 | 
			
		||||
	if (typeof mouseEvent.spot != "undefined" && g_receptionReports[mouseEvent.spot].bearing > 180)
 | 
			
		||||
	if (typeof mouseEvent.spot != "undefined" && g_receptionReports.spots[mouseEvent.spot].bearing > 180)
 | 
			
		||||
		noRoomRight = true;
 | 
			
		||||
	myTooltip.style.left = (getMouseX() + 15) + 'px';
 | 
			
		||||
	top = Number(myTooltip.style.top);
 | 
			
		||||
| 
						 | 
				
			
			@ -4010,22 +3976,15 @@ function clearQsoGrids() {
 | 
			
		|||
		g_countyData[key].worked_modes = {};
 | 
			
		||||
		g_countyData[key].confirmed_modes = {};
 | 
			
		||||
	}
 | 
			
		||||
	for (var key in g_ffmaData) {
 | 
			
		||||
		g_ffmaData[key].worked = false;
 | 
			
		||||
		g_ffmaData[key].confirmed = false;
 | 
			
		||||
		g_ffmaData[key].worked_bands = {};
 | 
			
		||||
		g_ffmaData[key].confirmed_bands = {};
 | 
			
		||||
		g_ffmaData[key].worked_modes = {};
 | 
			
		||||
		g_ffmaData[key].confirmed_modes = {};
 | 
			
		||||
	}
 | 
			
		||||
	for (var key in g_gmaaData) {
 | 
			
		||||
		g_gmaaData[key].worked = false;
 | 
			
		||||
		g_gmaaData[key].confirmed = false;
 | 
			
		||||
		g_gmaaData[key].worked_bands = {};
 | 
			
		||||
		g_gmaaData[key].confirmed_bands = {};
 | 
			
		||||
		g_gmaaData[key].worked_modes = {};
 | 
			
		||||
		g_gmaaData[key].confirmed_modes = {};
 | 
			
		||||
	for (var key in g_us48Data) {
 | 
			
		||||
		g_us48Data[key].worked = false;
 | 
			
		||||
		g_us48Data[key].confirmed = false;
 | 
			
		||||
		g_us48Data[key].worked_bands = {};
 | 
			
		||||
		g_us48Data[key].confirmed_bands = {};
 | 
			
		||||
		g_us48Data[key].worked_modes = {};
 | 
			
		||||
		g_us48Data[key].confirmed_modes = {};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function clearCalls() {
 | 
			
		||||
| 
						 | 
				
			
			@ -5179,10 +5138,10 @@ function initiateQso(thisCall) {
 | 
			
		|||
 | 
			
		||||
function spotLookupAndSetCall( spot )
 | 
			
		||||
{
 | 
			
		||||
	var call =  g_receptionReports[spot].call;
 | 
			
		||||
	var grid =  g_receptionReports[spot].grid;
 | 
			
		||||
	var band =  g_receptionReports[spot].band;
 | 
			
		||||
	var mode =  g_receptionReports[spot].mode;
 | 
			
		||||
	var call =  g_receptionReports.spots[spot].call;
 | 
			
		||||
	var grid =  g_receptionReports.spots[spot].grid;
 | 
			
		||||
	var band =  g_receptionReports.spots[spot].band;
 | 
			
		||||
	var mode =  g_receptionReports.spots[spot].mode;
 | 
			
		||||
	for ( var instance in g_instances )
 | 
			
		||||
	{
 | 
			
		||||
		if (  g_instances[instance].valid && g_instances[instance].status.Band == band && g_instances[instance].status.MO == mode ) 
 | 
			
		||||
| 
						 | 
				
			
			@ -8601,6 +8560,14 @@ function createStatTable(title, infoObject, awardName)
 | 
			
		|||
	return wc1Table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function validatePropMode( propMode )
 | 
			
		||||
{
 | 
			
		||||
	if ( g_appSettings.gtPropFilter == "mixed"  )
 | 
			
		||||
		return true;
 | 
			
		||||
	
 | 
			
		||||
	return (g_appSettings.gtPropFilter == propMode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function validateMapMode( mode )
 | 
			
		||||
{
 | 
			
		||||
	if ( g_appSettings.gtModeFilter.length == 0  )
 | 
			
		||||
| 
						 | 
				
			
			@ -8649,118 +8616,10 @@ function redrawGrids() {
 | 
			
		|||
		if ( didConfirm )
 | 
			
		||||
			g_QSLcount++;
 | 
			
		||||
		
 | 
			
		||||
		if (finalGrid.length > 0 ) 
 | 
			
		||||
		{
 | 
			
		||||
			var gridCheck = finalGrid.substr(0, 4);
 | 
			
		||||
			if ( band == "6m" )
 | 
			
		||||
			{
 | 
			
		||||
				if ( gridCheck in g_ffmaData )
 | 
			
		||||
				{
 | 
			
		||||
					if ( g_ffmaData[gridCheck].worked == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_ffmaData[gridCheck].worked = worked;
 | 
			
		||||
					}
 | 
			
		||||
					if (worked)
 | 
			
		||||
					{
 | 
			
		||||
						g_ffmaData[gridCheck].worked_bands["6m"] = ~~g_ffmaData[gridCheck].worked_bands["6m"] + 1;
 | 
			
		||||
						g_ffmaData[gridCheck].worked_modes[mode] = ~~g_ffmaData[gridCheck].worked_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					if ( g_ffmaData[gridCheck].confirmed == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_ffmaData[gridCheck].confirmed = didConfirm;
 | 
			
		||||
					}
 | 
			
		||||
					if (didConfirm)
 | 
			
		||||
					{
 | 
			
		||||
						g_ffmaData[gridCheck].confirmed_bands["6m"] = ~~g_ffmaData[gridCheck].confirmed_bands["6m"] + 1;
 | 
			
		||||
						g_ffmaData[gridCheck].confirmed_modes[mode] = ~~g_ffmaData[gridCheck].confirmed_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				for ( var key in g_QSOhash[i].vucc_grids )
 | 
			
		||||
				{
 | 
			
		||||
					var grid = g_QSOhash[i].vucc_grids[key].substr(0, 4);
 | 
			
		||||
					if ( grid in g_ffmaData )
 | 
			
		||||
					{
 | 
			
		||||
						if ( g_ffmaData[grid].worked == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_ffmaData[grid].worked = worked;
 | 
			
		||||
						}
 | 
			
		||||
						if (worked)
 | 
			
		||||
						{
 | 
			
		||||
							g_ffmaData[grid].worked_bands["6m"] = ~~g_ffmaData[grid].worked_bands["6m"] + 1;
 | 
			
		||||
							g_ffmaData[grid].worked_modes[mode] = ~~g_ffmaData[grid].worked_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						if ( g_ffmaData[grid].confirmed == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_ffmaData[grid].confirmed = didConfirm;
 | 
			
		||||
						}
 | 
			
		||||
						if (didConfirm)
 | 
			
		||||
						{
 | 
			
		||||
							g_ffmaData[grid].confirmed_bands["6m"] = ~~g_ffmaData[grid].confirmed_bands["6m"] + 1;
 | 
			
		||||
							g_ffmaData[grid].confirmed_modes[mode] = ~~g_ffmaData[grid].confirmed_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if ( g_QSOhash[i].propMode == "SAT" )
 | 
			
		||||
			{
 | 
			
		||||
				if ( gridCheck in g_gmaaData )
 | 
			
		||||
				{
 | 
			
		||||
					if ( g_gmaaData[gridCheck].worked == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_gmaaData[gridCheck].worked = worked;
 | 
			
		||||
					}
 | 
			
		||||
					if (worked)
 | 
			
		||||
					{
 | 
			
		||||
						g_gmaaData[gridCheck].worked_bands[band] = ~~g_gmaaData[gridCheck].worked_bands[band] + 1;
 | 
			
		||||
						g_gmaaData[gridCheck].worked_modes[mode] = ~~g_gmaaData[gridCheck].worked_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					if ( g_gmaaData[gridCheck].confirmed == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_gmaaData[gridCheck].confirmed = didConfirm;
 | 
			
		||||
					}
 | 
			
		||||
					if (didConfirm)
 | 
			
		||||
					{
 | 
			
		||||
						g_gmaaData[gridCheck].confirmed_bands[band] = ~~g_gmaaData[gridCheck].confirmed_bands[band] + 1;
 | 
			
		||||
						g_gmaaData[gridCheck].confirmed_modes[mode] = ~~g_gmaaData[gridCheck].confirmed_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				for ( var key in g_QSOhash[i].vucc_grids )
 | 
			
		||||
				{
 | 
			
		||||
					var grid = g_QSOhash[i].vucc_grids[key].substr(0, 4);
 | 
			
		||||
					if ( grid in g_gmaaData )
 | 
			
		||||
					{
 | 
			
		||||
						if ( g_gmaaData[grid].worked == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_gmaaData[grid].worked = worked;
 | 
			
		||||
						}
 | 
			
		||||
						if (worked)
 | 
			
		||||
						{
 | 
			
		||||
							g_gmaaData[grid].worked_bands[band] = ~~g_gmaaData[grid].worked_bands[band] + 1;
 | 
			
		||||
							g_gmaaData[grid].worked_modes[mode] = ~~g_gmaaData[grid].worked_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						if ( g_gmaaData[grid].confirmed == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_gmaaData[grid].confirmed = didConfirm;
 | 
			
		||||
						}
 | 
			
		||||
						if (didConfirm)
 | 
			
		||||
						{
 | 
			
		||||
							g_gmaaData[grid].confirmed_bands[band] = ~~g_gmaaData[grid].confirmed_bands[band] + 1;
 | 
			
		||||
							g_gmaaData[grid].confirmed_modes[mode] = ~~g_gmaaData[grid].confirmed_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
				
 | 
			
		||||
		if ((g_appSettings.gtBandFilter.length == 0 || (g_appSettings.gtBandFilter == 'auto' ? myBand ==
 | 
			
		||||
					g_QSOhash[i].band : g_appSettings.gtBandFilter == g_QSOhash[i].band)) &&
 | 
			
		||||
					validateMapMode(g_QSOhash[i].mode) ) 
 | 
			
		||||
					validateMapMode(g_QSOhash[i].mode) && validatePropMode(g_QSOhash[i].propMode)) 
 | 
			
		||||
			{
 | 
			
		||||
				
 | 
			
		||||
			
 | 
			
		||||
| 
						 | 
				
			
			@ -8871,6 +8730,29 @@ function redrawGrids() {
 | 
			
		|||
			{
 | 
			
		||||
				var gridCheck = finalGrid.substr(0, 4);
 | 
			
		||||
 | 
			
		||||
				if ( finalDxcc == 291 && gridCheck in g_us48Data )
 | 
			
		||||
				{
 | 
			
		||||
					if ( g_us48Data[gridCheck].worked == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_us48Data[gridCheck].worked = worked;
 | 
			
		||||
					}
 | 
			
		||||
					if (worked)
 | 
			
		||||
					{
 | 
			
		||||
						g_us48Data[gridCheck].worked_bands[band] = ~~g_us48Data[gridCheck].worked_bands[band] + 1;
 | 
			
		||||
						g_us48Data[gridCheck].worked_modes[mode] = ~~g_us48Data[gridCheck].worked_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					if ( g_us48Data[gridCheck].confirmed == false  )
 | 
			
		||||
					{
 | 
			
		||||
						g_us48Data[gridCheck].confirmed = didConfirm;
 | 
			
		||||
					}
 | 
			
		||||
					if (didConfirm)
 | 
			
		||||
					{
 | 
			
		||||
						g_us48Data[gridCheck].confirmed_bands[band] = ~~g_us48Data[gridCheck].confirmed_bands[band] + 1;
 | 
			
		||||
						g_us48Data[gridCheck].confirmed_modes[mode] = ~~g_us48Data[gridCheck].confirmed_modes[mode] + 1;
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if (cqz.length > 0) {
 | 
			
		||||
 | 
			
		||||
					if (g_cqZones[cqz].worked == false) {
 | 
			
		||||
| 
						 | 
				
			
			@ -8942,6 +8824,36 @@ function redrawGrids() {
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if ( finalDxcc == 291 )
 | 
			
		||||
			{
 | 
			
		||||
				for ( var key in g_QSOhash[i].vucc_grids )
 | 
			
		||||
				{
 | 
			
		||||
					var grid = g_QSOhash[i].vucc_grids[key].substr(0, 4);
 | 
			
		||||
					if ( grid in g_us48Data )
 | 
			
		||||
					{
 | 
			
		||||
						if ( g_us48Data[grid].worked == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_us48Data[grid].worked = worked;
 | 
			
		||||
						}
 | 
			
		||||
						if (worked)
 | 
			
		||||
						{
 | 
			
		||||
							g_us48Data[grid].worked_bands[band] = ~~g_us48Data[grid].worked_bands[band] + 1;
 | 
			
		||||
							g_us48Data[grid].worked_modes[mode] = ~~g_us48Data[grid].worked_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						if ( g_us48Data[grid].confirmed == false  )
 | 
			
		||||
						{
 | 
			
		||||
							g_us48Data[grid].confirmed = didConfirm;
 | 
			
		||||
						}
 | 
			
		||||
						if (didConfirm)
 | 
			
		||||
						{
 | 
			
		||||
							g_us48Data[grid].confirmed_bands[band] = ~~g_us48Data[grid].confirmed_bands[band] + 1;
 | 
			
		||||
							g_us48Data[grid].confirmed_modes[mode] = ~~g_us48Data[grid].confirmed_modes[mode] + 1;
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -10034,23 +9946,14 @@ function loadMaidenHeadData() {
 | 
			
		|||
				{
 | 
			
		||||
					var sqr = g_worldGeoData[key].mh[mh];
 | 
			
		||||
				
 | 
			
		||||
					g_ffmaData[sqr] = {};
 | 
			
		||||
					g_ffmaData[sqr].name = sqr;
 | 
			
		||||
					g_ffmaData[sqr].worked = false;
 | 
			
		||||
					g_ffmaData[sqr].confirmed = false;
 | 
			
		||||
					g_ffmaData[sqr].worked_bands = {};
 | 
			
		||||
					g_ffmaData[sqr].confirmed_bands = {};
 | 
			
		||||
					g_ffmaData[sqr].worked_modes = {};
 | 
			
		||||
					g_ffmaData[sqr].confirmed_modes = {};
 | 
			
		||||
					
 | 
			
		||||
					g_gmaaData[sqr] = {};
 | 
			
		||||
					g_gmaaData[sqr].name = sqr;
 | 
			
		||||
					g_gmaaData[sqr].worked = false;
 | 
			
		||||
					g_gmaaData[sqr].confirmed = false;
 | 
			
		||||
					g_gmaaData[sqr].worked_bands = {};
 | 
			
		||||
					g_gmaaData[sqr].confirmed_bands = {};
 | 
			
		||||
					g_gmaaData[sqr].worked_modes = {};
 | 
			
		||||
					g_gmaaData[sqr].confirmed_modes = {};
 | 
			
		||||
					g_us48Data[sqr] = {};
 | 
			
		||||
					g_us48Data[sqr].name = sqr;
 | 
			
		||||
					g_us48Data[sqr].worked = false;
 | 
			
		||||
					g_us48Data[sqr].confirmed = false;
 | 
			
		||||
					g_us48Data[sqr].worked_bands = {};
 | 
			
		||||
					g_us48Data[sqr].confirmed_bands = {};
 | 
			
		||||
					g_us48Data[sqr].worked_modes = {};
 | 
			
		||||
					g_us48Data[sqr].confirmed_modes = {};
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
| 
						 | 
				
			
			@ -10846,6 +10749,7 @@ function setPins() {
 | 
			
		|||
function loadViewSettings() {
 | 
			
		||||
	gtBandFilter.value = g_appSettings.gtBandFilter;
 | 
			
		||||
	gtModeFilter.value = g_appSettings.gtModeFilter;
 | 
			
		||||
	gtPropFilter.value = g_appSettings.gtPropFilter;
 | 
			
		||||
	distanceUnit.value = g_appSettings.distanceUnit;
 | 
			
		||||
	N1MMIpInput.value = g_N1MMSettings.ip;
 | 
			
		||||
	N1MMPortInput.value = g_N1MMSettings.port;
 | 
			
		||||
| 
						 | 
				
			
			@ -11204,11 +11108,11 @@ function init()
 | 
			
		|||
		documentsDiv.style.display = "none";
 | 
			
		||||
		startupDiv.style.display = "block";
 | 
			
		||||
		startupStatusDiv.innerHTML = "Starting...";
 | 
			
		||||
		setTimeout(startupEngine, 50);
 | 
			
		||||
		openStatsWindow(false);
 | 
			
		||||
		openLookupWindow(false);
 | 
			
		||||
		openBaWindow(false);
 | 
			
		||||
		openCallRosterWindow(false);
 | 
			
		||||
		setTimeout(startupEngine, 10);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11218,7 +11122,7 @@ function startupEngine()
 | 
			
		|||
		var funcInfo = g_startupTable.shift();
 | 
			
		||||
		funcInfo[0]();
 | 
			
		||||
		startupStatusDiv.innerHTML = funcInfo[1];
 | 
			
		||||
		setTimeout(startupEngine, 50);
 | 
			
		||||
		setTimeout(startupEngine, 10);
 | 
			
		||||
	} else {
 | 
			
		||||
		startupStatusDiv.innerHTML = "Completed";
 | 
			
		||||
		startupAdifLoadCheck();
 | 
			
		||||
| 
						 | 
				
			
			@ -12778,10 +12682,12 @@ function mediaCheck() {
 | 
			
		|||
			delete data;
 | 
			
		||||
			fs.unlinkSync(g_jsonDir + "internal_qso.json");
 | 
			
		||||
		}
 | 
			
		||||
		loadReceptionReports();
 | 
			
		||||
	}
 | 
			
		||||
	catch (e)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -12800,6 +12706,49 @@ function setRosterSpot( enabled )
 | 
			
		|||
	g_rosterSpot = enabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function saveReceptionReports()
 | 
			
		||||
{
 | 
			
		||||
	try {
 | 
			
		||||
		fs.writeFileSync(g_jsonDir + "spots.json", JSON.stringify(g_receptionReports) );	
 | 
			
		||||
	}
 | 
			
		||||
	catch (e)
 | 
			
		||||
	{
 | 
			
		||||
	}	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function loadReceptionReports()
 | 
			
		||||
{
 | 
			
		||||
	
 | 
			
		||||
	try {
 | 
			
		||||
		var clear = true;
 | 
			
		||||
		if (fs.existsSync(g_jsonDir + "spots.json") )
 | 
			
		||||
		{
 | 
			
		||||
			g_receptionReports = JSON.parse(fs.readFileSync(g_jsonDir + "spots.json"));
 | 
			
		||||
			if ( timeNowSec() - g_receptionReports.lastDownloadTimeSec <= 86400 )
 | 
			
		||||
				clear = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if ( clear == true )
 | 
			
		||||
		{
 | 
			
		||||
			g_receptionReports = 
 | 
			
		||||
			{
 | 
			
		||||
				"lastDownloadTimeSec" : 0,
 | 
			
		||||
				"lastSequenceNumber" : "0",
 | 
			
		||||
				"spots" : {}
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (e)
 | 
			
		||||
	{
 | 
			
		||||
		g_receptionReports = 
 | 
			
		||||
		{
 | 
			
		||||
			"lastDownloadTimeSec" : 0,
 | 
			
		||||
			"lastSequenceNumber" : "0",
 | 
			
		||||
			"spots" : {}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pskSpotCheck(timeSec) {
 | 
			
		||||
	if (g_mapSettings.offlineMode == true)
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -12807,28 +12756,27 @@ function pskSpotCheck(timeSec) {
 | 
			
		|||
	if (myDEcall == null || myDEcall == "NOCALL" || myDEcall == "")
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (timeSec - g_receptionSettings.lastDownloadTimeSec > 120 && (g_spotsEnabled || g_rosterSpot) ) {
 | 
			
		||||
		g_receptionSettings.lastDownloadTimeSec = timeSec;
 | 
			
		||||
	if (timeSec - g_receptionReports.lastDownloadTimeSec > 120 && (g_spotsEnabled || g_rosterSpot) ) {
 | 
			
		||||
		g_receptionReports.lastDownloadTimeSec = timeSec;
 | 
			
		||||
		localStorage.receptionSettings = JSON.stringify(g_receptionSettings);
 | 
			
		||||
		spotRefreshDiv.innerHTML = "..refreshing..";
 | 
			
		||||
		getBuffer("https://retrieve.pskreporter.info/query?rronly=1&lastseqno=" + g_receptionSettings.lastSequenceNumber + "&senderCallsign=" + encodeURIComponent(myRawCall) + "&appcontact=" + encodeURIComponent("tag.loomis@gmail.com"),
 | 
			
		||||
		getBuffer("https://retrieve.pskreporter.info/query?rronly=1&lastseqno=" + g_receptionReports.lastSequenceNumber + "&senderCallsign=" + encodeURIComponent(myRawCall) + "&appcontact=" + encodeURIComponent("tag.loomis@gmail.com"),
 | 
			
		||||
			pskSpotResults, null, "https", 443);
 | 
			
		||||
	} else if (g_spotsEnabled) {
 | 
			
		||||
 | 
			
		||||
		spotRefreshDiv.innerHTML = "Refresh: " + Number(120 - (timeSec - g_receptionSettings.lastDownloadTimeSec)).toDHMS();
 | 
			
		||||
		spotRefreshDiv.innerHTML = "Refresh: " + Number(120 - (timeSec - g_receptionReports.lastDownloadTimeSec)).toDHMS();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pskSpotResults(buffer, flag) {
 | 
			
		||||
	var shouldSave = false;
 | 
			
		||||
	var oParser = new DOMParser();
 | 
			
		||||
	var oDOM = oParser.parseFromString(buffer, "text/xml");
 | 
			
		||||
	var result = "";
 | 
			
		||||
	if (oDOM != null) {
 | 
			
		||||
		var json = XML2jsobj(oDOM.documentElement);
 | 
			
		||||
		if (typeof json.lastSequenceNumber != "undefined") {
 | 
			
		||||
			g_receptionSettings.lastSequenceNumber = json.lastSequenceNumber.value;
 | 
			
		||||
			g_receptionReports.lastSequenceNumber = json.lastSequenceNumber.value;
 | 
			
		||||
	
 | 
			
		||||
			if (typeof json.receptionReport != "undefined") {
 | 
			
		||||
				for (var key in json.receptionReport) {
 | 
			
		||||
| 
						 | 
				
			
			@ -12840,20 +12788,20 @@ function pskSpotResults(buffer, flag) {
 | 
			
		|||
						var band = Number(parseInt(json.receptionReport[key].frequency) / 1000000).formatBand();
 | 
			
		||||
						var hash = call + mode + band + grid.substr(0,4);
 | 
			
		||||
 | 
			
		||||
						if (hash in g_receptionReports) {
 | 
			
		||||
							report = g_receptionReports[hash];
 | 
			
		||||
						if (hash in g_receptionReports.spots) {
 | 
			
		||||
							report = g_receptionReports.spots[hash];
 | 
			
		||||
							if (parseInt(json.receptionReport[key].flowStartSeconds) < report.when)
 | 
			
		||||
								continue;
 | 
			
		||||
						} else {
 | 
			
		||||
							report = g_receptionReports[hash] = {};
 | 
			
		||||
							report = g_receptionReports.spots[hash] = {};
 | 
			
		||||
							report.call = call;
 | 
			
		||||
							report.band = band;
 | 
			
		||||
							report.grid = grid;
 | 
			
		||||
							report.mode = mode;
 | 
			
		||||
 | 
			
		||||
						}
 | 
			
		||||
						if (typeof json.receptionReport[key].receiverDXCCCode != "undefined")
 | 
			
		||||
							report.dxcc = callsignToDxcc(json.receptionReport[key].receiverDXCCCode);
 | 
			
		||||
						if (typeof json.receptionReport[key].receiverCallsign != "undefined")
 | 
			
		||||
							report.dxcc = callsignToDxcc(json.receptionReport[key].receiverCallsign);
 | 
			
		||||
						else
 | 
			
		||||
							report.dxcc = -1;
 | 
			
		||||
						report.when = parseInt(json.receptionReport[key].flowStartSeconds);
 | 
			
		||||
| 
						 | 
				
			
			@ -12867,7 +12815,7 @@ function pskSpotResults(buffer, flag) {
 | 
			
		|||
							SNR = 0;
 | 
			
		||||
						report.color = SNR;
 | 
			
		||||
 | 
			
		||||
						shouldSave = true;
 | 
			
		||||
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -12875,12 +12823,10 @@ function pskSpotResults(buffer, flag) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	g_receptionSettings.lastDownloadTimeSec = timeNowSec();
 | 
			
		||||
	g_receptionReports.lastDownloadTimeSec = timeNowSec();
 | 
			
		||||
 | 
			
		||||
	localStorage.receptionSettings = JSON.stringify(g_receptionSettings);
 | 
			
		||||
	if (shouldSave) {
 | 
			
		||||
		localStorage.receptionReports = JSON.stringify(g_receptionReports);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	redrawSpots();
 | 
			
		||||
	if ( g_rosterSpot )
 | 
			
		||||
		goProcessRoster();
 | 
			
		||||
| 
						 | 
				
			
			@ -12909,11 +12855,11 @@ function redrawSpots() {
 | 
			
		|||
		g_layerSources["psk-heat"].addFeature(spot);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (var key in g_receptionReports) {
 | 
			
		||||
		report = g_receptionReports[key];
 | 
			
		||||
	for (var key in g_receptionReports.spots) {
 | 
			
		||||
		report = g_receptionReports.spots[key];
 | 
			
		||||
 | 
			
		||||
		if (now - report.when > 86400) {
 | 
			
		||||
			delete g_receptionReports[key];
 | 
			
		||||
			delete g_receptionReports.spots[key];
 | 
			
		||||
			shouldSave = true;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -12988,7 +12934,7 @@ function redrawSpots() {
 | 
			
		|||
			}
 | 
			
		||||
	}
 | 
			
		||||
	if (shouldSave) {
 | 
			
		||||
		localStorage.receptionReports = JSON.stringify(g_receptionReports);
 | 
			
		||||
		saveReceptionReports();
 | 
			
		||||
	}
 | 
			
		||||
	spotCountDiv.innerHTML = "Spots: " + count;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -13187,9 +13133,9 @@ function setRosterTimeView() {
 | 
			
		|||
 | 
			
		||||
function getSpotTime( hash )
 | 
			
		||||
{
 | 
			
		||||
	if (hash in g_receptionReports) 
 | 
			
		||||
	if (hash in g_receptionReports.spots) 
 | 
			
		||||
	{
 | 
			
		||||
		return g_receptionReports[hash];
 | 
			
		||||
		return g_receptionReports.spots[hash];
 | 
			
		||||
	}
 | 
			
		||||
	else 
 | 
			
		||||
		return null;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ var g_menu = null;
 | 
			
		|||
var g_callMenu = null;
 | 
			
		||||
var g_ageMenu = null;
 | 
			
		||||
var g_callingMenu = null;
 | 
			
		||||
var g_compactMenu = null;
 | 
			
		||||
var g_targetHash = "";
 | 
			
		||||
var g_clearIgnores = null;
 | 
			
		||||
var g_clearIgnoresCall = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -434,7 +435,7 @@ function viewRoster()
 | 
			
		|||
	if ( referenceNeed.value == 6 )
 | 
			
		||||
	{
 | 
			
		||||
		callMode = "all";
 | 
			
		||||
		onlyHits = true;
 | 
			
		||||
		onlyHits = false;
 | 
			
		||||
		isAwardTracker = true;
 | 
			
		||||
		g_rosterSettings.huntNeed = "confirmed";
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -487,6 +488,7 @@ function viewRoster()
 | 
			
		|||
	for ( callHash in callRoster )
 | 
			
		||||
	{
 | 
			
		||||
		var call = callRoster[callHash].DEcall;
 | 
			
		||||
 | 
			
		||||
		callRoster[callHash].tx = true;
 | 
			
		||||
		callRoster[callHash].callObj.shouldAlert = false;
 | 
			
		||||
		callRoster[callHash].callObj.reason = Array();
 | 
			
		||||
| 
						 | 
				
			
			@ -851,7 +853,7 @@ function viewRoster()
 | 
			
		|||
				if ( g_awardTracker[award].enable )
 | 
			
		||||
				{
 | 
			
		||||
					tx = testAward(award, callRoster[callHash].callObj, baseHash );
 | 
			
		||||
					if ( tx ) 
 | 
			
		||||
					if ( tx  ) 
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -873,6 +875,8 @@ function viewRoster()
 | 
			
		|||
	var unconf = "background-clip:content-box;box-shadow: 0 0 8px 3px inset ";
 | 
			
		||||
	for (var callHash in callRoster)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		// Special case check for called station
 | 
			
		||||
		if ( callRoster[callHash].callObj.qrz == true  &&  callRoster[callHash].tx == false )
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -927,6 +931,11 @@ function viewRoster()
 | 
			
		|||
				didWork = true;
 | 
			
		||||
						
 | 
			
		||||
				callConf = unconf + callsign + inversionAlpha + ";";
 | 
			
		||||
				if ( testHash in g_confirmed.call )
 | 
			
		||||
				{
 | 
			
		||||
					callPointer =  "text-decoration: line-through; ";
 | 
			
		||||
					callConf = "";
 | 
			
		||||
				}
 | 
			
		||||
					
 | 
			
		||||
			}
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			@ -952,13 +961,13 @@ function viewRoster()
 | 
			
		|||
					
 | 
			
		||||
					if ( g_rosterSettings.huntNeed == "worked" &&  didWork )
 | 
			
		||||
					{
 | 
			
		||||
						callRoster[testHash].callObj.reason.push("call");
 | 
			
		||||
						callRoster[callHash].callObj.reason.push("call");
 | 
			
		||||
						callConf = unconf + callsign + inversionAlpha + ";"; 
 | 
			
		||||
					}
 | 
			
		||||
					if ( didWork && (g_rosterSettings.huntNeed == "confirmed" &&  !(testHash in g_confirmed.call) ) )
 | 
			
		||||
					{
 | 
			
		||||
						shouldAlert = true; 
 | 
			
		||||
						callRoster[testHash].callObj.reason.push("call");
 | 
			
		||||
						callRoster[callHash].callObj.reason.push("call");
 | 
			
		||||
						callConf = unconf + callsign + inversionAlpha + ";"; 
 | 
			
		||||
					}
 | 
			
		||||
					else if ( didWork && (g_rosterSettings.huntNeed == "confirmed" &&  (testHash in g_confirmed.call) ) )
 | 
			
		||||
| 
						 | 
				
			
			@ -1221,10 +1230,18 @@ function viewRoster()
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newCallList.sort(r_sortFunction[g_rosterSettings.lastSortIndex]);
 | 
			
		||||
	if ( g_rosterSettings.lastSortReverse == 1 )
 | 
			
		||||
	if ( g_rosterSettings.compact == false ) 
 | 
			
		||||
	{
 | 
			
		||||
		newCallList.reverse();
 | 
			
		||||
		newCallList.sort(r_sortFunction[g_rosterSettings.lastSortIndex]);
 | 
			
		||||
		if ( g_rosterSettings.lastSortReverse == 1 )
 | 
			
		||||
		{
 | 
			
		||||
			newCallList.reverse();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		// Age sort for now... make this happen Tag
 | 
			
		||||
		newCallList.sort(r_sortFunction[6]).reverse();
 | 
			
		||||
	}
 | 
			
		||||
			
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			@ -1331,7 +1348,7 @@ function viewRoster()
 | 
			
		|||
		var ituzone = (grid in window.opener.g_gridToITUZone ? window.opener.g_gridToITUZone[grid].join(", ") : "-");
 | 
			
		||||
		var thisCall = newCallList[x].DEcall;
 | 
			
		||||
 | 
			
		||||
		var thisClass = "";
 | 
			
		||||
	
 | 
			
		||||
		if ( thisCall.match("^[A-Z][0-9][A-Z](\/\w+)?$") )
 | 
			
		||||
			newCallList[x].style.callsign = "class='oneByOne'";
 | 
			
		||||
		if ( thisCall == window.opener.g_instances[newCallList[x].instance].status.DXcall )
 | 
			
		||||
| 
						 | 
				
			
			@ -1353,7 +1370,7 @@ function viewRoster()
 | 
			
		|||
 | 
			
		||||
		
 | 
			
		||||
		worker += "<tr id='" + thisCall + newCallList[x].band+newCallList[x].mode + "'>";
 | 
			
		||||
		worker += "<td "+thisClass+" title='Callsign' align=left " +newCallList[x].style.callsign + " onClick='initiateQso(\"" +
 | 
			
		||||
		worker += "<td name='Callsign' align=left " +newCallList[x].style.callsign + " onClick='initiateQso(\"" +
 | 
			
		||||
			 thisCall + newCallList[x].band+newCallList[x].mode + "\")'>" + thisCall.formatCallsign() + "</td>";
 | 
			
		||||
 | 
			
		||||
		if ( showBands )
 | 
			
		||||
| 
						 | 
				
			
			@ -1371,14 +1388,14 @@ function viewRoster()
 | 
			
		|||
		worker += "<td  "+newCallList[x].style.grid+" onClick='centerOn(\"" + grid + "\")' >" + grid + "</td>";
 | 
			
		||||
		if ( g_rosterSettings.columns.Calling )
 | 
			
		||||
		{
 | 
			
		||||
			var lookString = (newCallList[x].CQ?"title='CQ'":"title='Calling'");
 | 
			
		||||
			var lookString = (newCallList[x].CQ?"name='CQ'":"name='Calling'");
 | 
			
		||||
			worker += 	"<td "+newCallList[x].style.calling+" "+lookString+">"+newCallList[x].DXcall.formatCallsign() + "</td>";
 | 
			
		||||
		}
 | 
			
		||||
		if ( g_rosterSettings.columns.Msg )
 | 
			
		||||
			worker += 	"<td>"+newCallList[x].msg+ "</td>";
 | 
			
		||||
 | 
			
		||||
		if ( g_rosterSettings.columns.DXCC )
 | 
			
		||||
			worker += "<td title='DXCC ("+newCallList[x].dxcc+")' "+newCallList[x].style.dxcc+">" + window.opener.g_dxccToAltName[newCallList[x].dxcc] +
 | 
			
		||||
			worker += "<td name='DXCC ("+newCallList[x].dxcc+")' "+newCallList[x].style.dxcc+">" + window.opener.g_dxccToAltName[newCallList[x].dxcc] +
 | 
			
		||||
				" (" + window.opener.g_worldGeoData[window.opener.g_dxccToGeoData[newCallList[x].dxcc]].pp  + ")</td>";
 | 
			
		||||
		if ( g_rosterSettings.columns.Flag )
 | 
			
		||||
			worker += "<td align='center' style='margin:0;padding:0'><img style='padding-top:3px' src='./img/flags/16/" + geo.flag + "'></td>";
 | 
			
		||||
| 
						 | 
				
			
			@ -1462,9 +1479,13 @@ function viewRoster()
 | 
			
		|||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			worker += "<div class='compact'  id='" + thisCall + newCallList[x].band+newCallList[x].mode + "'>";
 | 
			
		||||
		worker += "<div "+thisClass+" title='Callsign' " +newCallList[x].style.callsign + " onClick='initiateQso(\"" +
 | 
			
		||||
			 thisCall + newCallList[x].band+newCallList[x].mode + "\")'>" + thisCall.formatCallsign() + "</div></div>";
 | 
			
		||||
			var tt = newCallList[x].RSTsent + "㏈, " + parseInt(newCallList[x].dt*100) +"ms, " + newCallList[x].delta + "hz" + (newCallList[x].grid.length? ", " + newCallList[x].grid:"") +", " + (timeNowSec() - newCallList[x].age).toDHMS();
 | 
			
		||||
			worker += "<div class='compact' onClick='initiateQso(\"" + thisCall + newCallList[x].band+newCallList[x].mode + "\")' "
 | 
			
		||||
			worker +=  "id='" + thisCall + newCallList[x].band+newCallList[x].mode + "' title='"+tt+"'>";
 | 
			
		||||
			worker += "<div class='compactCallsign' name='Callsign' " +newCallList[x].style.callsign + " >"+ thisCall.formatCallsign() +"</div>";
 | 
			
		||||
			worker += "<div class='compactDXCC' name='DXCC ("+newCallList[x].dxcc+")' "+newCallList[x].style.dxcc+">" + window.opener.g_dxccToAltName[newCallList[x].dxcc] + "</div>";
 | 
			
		||||
			worker += "</div>";
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (  g_rosterSettings.realtime == false )
 | 
			
		||||
| 
						 | 
				
			
			@ -1870,7 +1891,7 @@ function updateAwardList( target = null )
 | 
			
		|||
		var allEndorse = false;
 | 
			
		||||
		
 | 
			
		||||
		var tooltip = g_awards[award.sponsor].awards[award.name].tooltip+ " (" + g_awards[award.sponsor].sponsor + ")\n";
 | 
			
		||||
		tooltip += toTitleCase(award.test.look) + " QSO\n";
 | 
			
		||||
		tooltip += toTitleCase(award.test.qsl_req) + " QSO\n";
 | 
			
		||||
		for ( var mode in award.comp.counts )
 | 
			
		||||
		{
 | 
			
		||||
			tooltip +=  mode + "\n";
 | 
			
		||||
| 
						 | 
				
			
			@ -1910,7 +1931,7 @@ function updateAwardList( target = null )
 | 
			
		|||
		if ( baseCount > 0 && endorseCount == endorseTotal )
 | 
			
		||||
			allEndorse = true;
 | 
			
		||||
		
 | 
			
		||||
		var cell = createCellHtml(row, "<p style='font-size:smaller;'>" +  g_awards[award.sponsor].awards[award.name].tooltip +" - "+award.sponsor );
 | 
			
		||||
		var cell = createCellHtml(row, "<p style='font-size:smaller;'>" +  award.name +" - "+award.sponsor );
 | 
			
		||||
		cell.style.textAlign = "left";
 | 
			
		||||
		cell.style.color = "lightblue";
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			@ -2044,9 +2065,9 @@ function setVisual()
 | 
			
		|||
	
 | 
			
		||||
		huntingTr.style.display = "none";
 | 
			
		||||
		callsignsTr.style.display = "none";
 | 
			
		||||
		huntingMatrixDiv.style.display = "none";
 | 
			
		||||
		awardHunterTr.style.display = "";
 | 
			
		||||
		awardWantedDiv.style.display = "";
 | 
			
		||||
		huntingMatrixDiv.style.display = "";
 | 
			
		||||
		updateAwardList();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
| 
						 | 
				
			
			@ -2199,6 +2220,12 @@ function wantedChanged(element)
 | 
			
		|||
		if ( t in g_rosterSettings.columns )
 | 
			
		||||
		{
 | 
			
		||||
			g_rosterSettings.columns[t] = true;
 | 
			
		||||
 | 
			
		||||
			for (var i = 0; i < g_menu.items.length; ++i) {
 | 
			
		||||
				if ( typeof g_menu.items[i].checked != "undefined" && g_menu.items[i].label == t )
 | 
			
		||||
					g_menu.items[i].checked = true;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
			
 | 
			
		||||
| 
						 | 
				
			
			@ -2643,6 +2670,8 @@ function init()
 | 
			
		|||
	
 | 
			
		||||
 | 
			
		||||
	g_menu = new nw.Menu();
 | 
			
		||||
	g_compactMenu = new nw.Menu();
 | 
			
		||||
	
 | 
			
		||||
	// Bind a callback to item
 | 
			
		||||
	var item = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
| 
						 | 
				
			
			@ -2665,27 +2694,31 @@ function init()
 | 
			
		|||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(item);
 | 
			
		||||
	g_compactMenu.append(item);
 | 
			
		||||
	
 | 
			
		||||
	item = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
	  label: g_rosterSettings.compact? "Roster Mode":"Compact Mode",
 | 
			
		||||
	  label: "Compact Mode",
 | 
			
		||||
	  click: function() {
 | 
			
		||||
		if ( this.label == "Compact Mode" )
 | 
			
		||||
		{
 | 
			
		||||
			this.label = "Roster Mode";
 | 
			
		||||
			g_rosterSettings.compact = true;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			this.label = "Compact Mode";
 | 
			
		||||
			g_rosterSettings.compact = false;
 | 
			
		||||
		}
 | 
			
		||||
		localStorage.rosterSettings = JSON.stringify(g_rosterSettings);
 | 
			
		||||
		resize();
 | 
			
		||||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(item);
 | 
			
		||||
	
 | 
			
		||||
	item = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
	  label: "Roster Mode",
 | 
			
		||||
	  click: function() {
 | 
			
		||||
 | 
			
		||||
			g_rosterSettings.compact = false;
 | 
			
		||||
			localStorage.rosterSettings = JSON.stringify(g_rosterSettings);
 | 
			
		||||
		resize();
 | 
			
		||||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_compactMenu.append(item);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	rosterHead.style.display =  g_rosterSettings.controls?"block":"none";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2756,6 +2789,7 @@ function init()
 | 
			
		|||
	
 | 
			
		||||
	item = new nw.MenuItem({ type: 'separator' });
 | 
			
		||||
	g_menu.append(item);
 | 
			
		||||
	g_compactMenu.append(item);
 | 
			
		||||
	
 | 
			
		||||
	item = new nw.MenuItem({
 | 
			
		||||
	 type: "checkbox", 
 | 
			
		||||
| 
						 | 
				
			
			@ -2808,6 +2842,7 @@ function init()
 | 
			
		|||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(g_clearIgnores);
 | 
			
		||||
	g_compactMenu.append(g_clearIgnores);
 | 
			
		||||
	
 | 
			
		||||
	g_clearIgnoresCall = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
| 
						 | 
				
			
			@ -2861,6 +2896,7 @@ function init()
 | 
			
		|||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(g_clearCQIgnoreMainMenu);
 | 
			
		||||
	g_compactMenu.append(g_clearCQIgnoreMainMenu);
 | 
			
		||||
	
 | 
			
		||||
	g_clearCQIgnore = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
| 
						 | 
				
			
			@ -2913,6 +2949,7 @@ function init()
 | 
			
		|||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(g_clearDxccIgnoreMainMenu);
 | 
			
		||||
	g_compactMenu.append(g_clearDxccIgnoreMainMenu);
 | 
			
		||||
	
 | 
			
		||||
	g_clearDxccIgnore = new nw.MenuItem({
 | 
			
		||||
	 type: "normal", 
 | 
			
		||||
| 
						 | 
				
			
			@ -2935,6 +2972,7 @@ function init()
 | 
			
		|||
	  }
 | 
			
		||||
	});
 | 
			
		||||
	g_menu.append(item);
 | 
			
		||||
	g_compactMenu.append(item);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	item = new nw.MenuItem({
 | 
			
		||||
| 
						 | 
				
			
			@ -3006,35 +3044,60 @@ function init()
 | 
			
		|||
			g_clearCQIgnore.label = "Clear Ignore";
 | 
			
		||||
			g_clearCQIgnore.enabled = false;
 | 
			
		||||
		}
 | 
			
		||||
		if ( typeof ev.target != 'undefined' && typeof ev.target.title != 'undefined' && ev.target.title == "Callsign" )
 | 
			
		||||
		{	
 | 
			
		||||
			g_targetHash =  ev.target.parentNode.id;
 | 
			
		||||
			g_callMenu.popup(ev.x, ev.y);
 | 
			
		||||
		}
 | 
			
		||||
		else if ( typeof ev.target != 'undefined' && typeof ev.target.title != 'undefined' && ev.target.title == "Calling" )
 | 
			
		||||
		{	
 | 
			
		||||
			g_targetHash =  ev.target.parentNode.id;
 | 
			
		||||
			g_callingMenu.popup(ev.x, ev.y);
 | 
			
		||||
		}
 | 
			
		||||
		else if ( typeof ev.target != 'undefined' && typeof ev.target.title != 'undefined' && ev.target.title == "CQ" )
 | 
			
		||||
		{	
 | 
			
		||||
			if (  callRoster[ev.target.parentNode.id].DXcall != "CQ" )
 | 
			
		||||
		if ( typeof ev.target != 'undefined' )
 | 
			
		||||
		{
 | 
			
		||||
			var name = ev.target.getAttribute("name");
 | 
			
		||||
			if ( name == "Callsign" )
 | 
			
		||||
			{
 | 
			
		||||
				g_targetCQ =  ev.target.parentNode.id;
 | 
			
		||||
				g_CQMenu.popup(ev.x, ev.y);
 | 
			
		||||
				g_targetHash =  ev.target.parentNode.id;
 | 
			
		||||
				g_callMenu.popup(ev.x, ev.y);
 | 
			
		||||
			}
 | 
			
		||||
			else if ( name == "Calling" )
 | 
			
		||||
			{
 | 
			
		||||
				g_targetHash =  ev.target.parentNode.id;
 | 
			
		||||
				g_callingMenu.popup(ev.x, ev.y);
 | 
			
		||||
			}
 | 
			
		||||
			else if ( name == "CQ" )
 | 
			
		||||
			{
 | 
			
		||||
				if (  callRoster[ev.target.parentNode.id].DXcall != "CQ" )
 | 
			
		||||
				{
 | 
			
		||||
					g_targetCQ =  ev.target.parentNode.id;
 | 
			
		||||
					g_CQMenu.popup(ev.x, ev.y);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else if ( name && name.startsWith("DXCC")  )
 | 
			
		||||
			{
 | 
			
		||||
				var dxcca = name.split("(");
 | 
			
		||||
				var dxcc = parseInt(dxcca[1]);
 | 
			
		||||
				g_targetDxcc = dxcc;
 | 
			
		||||
				g_dxccMenu.popup(ev.x, ev.y);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if ( g_rosterSettings.compact == false )
 | 
			
		||||
				{
 | 
			
		||||
					g_menu.popup(ev.x, ev.y);
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					g_compactMenu.popup(ev.x, ev.y);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else if ( typeof ev.target != 'undefined' && typeof ev.target.title != 'undefined' && ev.target.title.startsWith("DXCC") )
 | 
			
		||||
		{	
 | 
			
		||||
			var dxcca = ev.target.title.split("(");
 | 
			
		||||
			var dxcc = parseInt(dxcca[1]);
 | 
			
		||||
			g_targetDxcc = dxcc;
 | 
			
		||||
			g_dxccMenu.popup(ev.x, ev.y);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			g_menu.popup(ev.x, ev.y);
 | 
			
		||||
			if ( g_rosterSettings.compact == false )
 | 
			
		||||
			{
 | 
			
		||||
				g_menu.popup(ev.x, ev.y);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				g_compactMenu.popup(ev.x, ev.y);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		return false;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3103,37 +3166,31 @@ function getTypeFromMode(mode)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
function testAward( awardName, obj, baseHash )
 | 
			
		||||
{
 | 
			
		||||
	var rule = g_awardTracker[awardName].rule;
 | 
			
		||||
	var test = g_awardTracker[awardName].test;
 | 
			
		||||
	
 | 
			
		||||
	if ( obj.dxcc < 1 )
 | 
			
		||||
		return false;
 | 
			
		||||
	
 | 
			
		||||
	if ( test.dxcc && rule.dxcc.indexOf(obj.dxcc) == -1 )
 | 
			
		||||
{	
 | 
			
		||||
	if ( g_awardTracker[awardName].test.dxcc && g_awardTracker[awardName].rule.dxcc.indexOf(obj.dxcc) == -1 )
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if ( test.mode && rule.mode.indexOf(obj.mode) == -1 )
 | 
			
		||||
	if ( g_awardTracker[awardName].test.mode && g_awardTracker[awardName].rule.mode.indexOf(obj.mode) == -1 )
 | 
			
		||||
		return false;
 | 
			
		||||
	
 | 
			
		||||
	if ( test.band && rule.band.indexOf(obj.band) == -1 )
 | 
			
		||||
	if ( g_awardTracker[awardName].test.band && g_awardTracker[awardName].rule.band.indexOf(obj.band) == -1 )
 | 
			
		||||
		return false;
 | 
			
		||||
	
 | 
			
		||||
	if ( test.DEcall && rule.call.indexOf(obj.DEcall) == -1 )
 | 
			
		||||
	if ( g_awardTracker[awardName].test.DEcall && g_awardTracker[awardName].rule.call.indexOf(obj.DEcall) == -1 )
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	if ( test.cont && rule.cont.indexOf(obj.cont) == -1 )
 | 
			
		||||
	if ( g_awardTracker[awardName].test.cont && g_awardTracker[awardName].rule.cont.indexOf(obj.cont) == -1 )
 | 
			
		||||
		return false;
 | 
			
		||||
	
 | 
			
		||||
	if ( test.prop && rule.propMode != obj.propMode )
 | 
			
		||||
	if ( g_awardTracker[awardName].test.prop && g_awardTracker[awardName].rule.propMode != obj.propMode )
 | 
			
		||||
		return false;
 | 
			
		||||
	
 | 
			
		||||
	if ( test.sat && rule.satName.indexOf(obj.satName) == -1)
 | 
			
		||||
	if ( g_awardTracker[awardName].test.sat && g_awardTracker[awardName].rule.satName.indexOf(obj.satName) == -1)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return g_awardTypes[rule.type].test(g_awardTracker[awardName], obj, baseHash);
 | 
			
		||||
	
 | 
			
		||||
	return g_awardTypes[g_awardTracker[awardName].rule.type].test(g_awardTracker[awardName], obj, baseHash);	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processAward( awardName )
 | 
			
		||||
{
 | 
			
		||||
	var award = g_awards[g_awardTracker[awardName].sponsor].awards[g_awardTracker[awardName].name];
 | 
			
		||||
| 
						 | 
				
			
			@ -3159,7 +3216,9 @@ function processAward( awardName )
 | 
			
		|||
				g_awards[g_awardTracker[awardName].sponsor].awards[g_awardTracker[awardName].name].rule.qsl_req == "confirmed" : 
 | 
			
		||||
				g_awards[g_awardTracker[awardName].sponsor].qsl_req == "confirmed");
 | 
			
		||||
				
 | 
			
		||||
	test.look = ( ("qsl_req" in g_awards[g_awardTracker[awardName].sponsor].awards[g_awardTracker[awardName].name].rule)? 
 | 
			
		||||
	test.look = "confirmed";
 | 
			
		||||
	
 | 
			
		||||
	test.qsl_req = ( ("qsl_req" in g_awards[g_awardTracker[awardName].sponsor].awards[g_awardTracker[awardName].name].rule)? 
 | 
			
		||||
				g_awards[g_awardTracker[awardName].sponsor].awards[g_awardTracker[awardName].name].rule.qsl_req  : 
 | 
			
		||||
				g_awards[g_awardTracker[awardName].sponsor].qsl_req );
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,8 +103,11 @@ option:disabled
 | 
			
		|||
.controlItem
 | 
			
		||||
{
 | 
			
		||||
	-webkit-appearance: none;
 | 
			
		||||
	margin:2px;
 | 
			
		||||
	padding:2px;
 | 
			
		||||
	margin:0;
 | 
			
		||||
	padding:0;
 | 
			
		||||
	padding-top:1px;
 | 
			
		||||
	margin-top:1px;
 | 
			
		||||
	margin-bottom:1px;
 | 
			
		||||
	border-width:1px;
 | 
			
		||||
	border-color:#AAA;
 | 
			
		||||
	border-style:inset;
 | 
			
		||||
| 
						 | 
				
			
			@ -179,11 +182,11 @@ table.darkTable thead th:first-child {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
.dxCaller {
 | 
			
		||||
	background-clip:content-box;box-shadow: 0 0 8px 3px inset lightgreen;background-color:#000;color:#FF0;
 | 
			
		||||
	background-clip:content-box;box-shadow: 0 0 4px 4px inset #0F0;background-color:#000;color:#FF0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dxCalling {
 | 
			
		||||
	background-clip:content-box;box-shadow: 0 0 8px 3px inset #F00;background-color:#000;color:#FF0;
 | 
			
		||||
	background-clip:content-box;box-shadow: 0 0 4px 4px inset #F00;background-color:#000;color:#FF0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,16 +195,17 @@ table.darkTable thead th:first-child {
 | 
			
		|||
	cursor:pointer;
 | 
			
		||||
	margin:0px;
 | 
			
		||||
	padding:0px;
 | 
			
		||||
	margin-right:1px;
 | 
			
		||||
	margin-bottom:1px;
 | 
			
		||||
	border-width:1px;
 | 
			
		||||
	margin-right:2px;
 | 
			
		||||
	margin-bottom:2px;
 | 
			
		||||
	border-width:2px;
 | 
			
		||||
	border-color:#999;
 | 
			
		||||
	border-style:outset;
 | 
			
		||||
	min-width: 5.5em;
 | 
			
		||||
 | 
			
		||||
	min-width: 9em;
 | 
			
		||||
	min-height: 2em;
 | 
			
		||||
	display:inline-block;
 | 
			
		||||
	color:#EEE;
 | 
			
		||||
	-webkit-transition: border-style;
 | 
			
		||||
	-webkit-border-radius:4px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.compact:active
 | 
			
		||||
| 
						 | 
				
			
			@ -211,4 +215,18 @@ table.darkTable thead th:first-child {
 | 
			
		|||
 | 
			
		||||
.compact:hover {
 | 
			
		||||
	border-color:#FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.compactCallsign {
 | 
			
		||||
	padding:3px;
 | 
			
		||||
	overflow: hidden;
 | 
			
		||||
	white-space: nowrap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.compactDXCC {
 | 
			
		||||
	padding:3px;
 | 
			
		||||
	max-width: 9em;
 | 
			
		||||
	overflow: hidden;
 | 
			
		||||
	white-space: nowrap;
 | 
			
		||||
	text-overflow: ellipsis;
 | 
			
		||||
}
 | 
			
		||||
		Ładowanie…
	
		Reference in New Issue