2020-09-28 16:35:59 +00:00
// GridTracker ©2020 N0TTL
2020-08-19 16:55:41 +00:00
var fs = require ( 'fs' ) ;
2020-09-06 23:50:53 +00:00
2020-08-19 17:01:51 +00:00
var callRoster = { } ;
var g _blockedCalls = { } ;
var g _blockedCQ = { } ;
var g _blockedDxcc = { } ;
var g _scriptReport = { } ;
var g _worked = { } ;
var g _confirmed = { } ;
var g _modes = { } ;
var g _modes _phone = { } ;
var g _currentUSCallsigns = null ;
var r _currentUSState = "" ;
var r _currentDXCCs = - 1 ;
var r _callsignManifest = null ;
var g _rosterSettings = { } ;
var g _day = 0 ;
var g _menu = null ;
var g _callMenu = null ;
var g _ageMenu = null ;
var g _callingMenu = null ;
2020-08-22 00:35:49 +00:00
var g _compactMenu = null ;
2020-08-19 17:01:51 +00:00
var g _targetHash = "" ;
var g _clearIgnores = null ;
var g _clearIgnoresCall = null ;
var g _dxccMenu = null ;
var g _targetDxcc = - 1 ;
var g _clearDxccIgnore = null ;
var g _clearDxccIgnoreMainMenu = null ;
var g _CQMenu = null ;
var g _targetCQ = "" ;
var g _clearCQIgnore = null ;
var g _clearCQIgnoreMainMenu = null ;
var g _timerInterval = null ;
var g _regFocus = false ;
var g _awards = { } ;
var g _awardTypes = { } ;
var g _awardTracker = { } ;
2020-08-26 02:38:51 +00:00
var g _callsignDatabaseDXCC = { } ;
var g _callsignDatabaseUS = { }
var g _callsignDatabaseUSplus = { } ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
var g _modeColors = { } ;
g _modeColors [ "FT4" ] = '1111FF' ;
g _modeColors [ "FT8" ] = '11FF11' ;
g _modeColors [ "JT4" ] = 'EE1111' ;
g _modeColors [ "JT9" ] = '7CFC00' ;
g _modeColors [ "JT65" ] = 'E550E5' ;
g _modeColors [ "QRA64" ] = 'FF00FF' ;
g _modeColors [ "MSK144" ] = '4949FF' ;
2020-08-19 16:55:41 +00:00
var g _defaultSettings =
{
"callsign" : "all" ,
"hunting" : "dxcc" ,
"huntNeed" : "confirmed" ,
"requireGrid" : true ,
"wantMaxDT" : false ,
"wantMinDB" : false ,
"wantMinFreq" : false ,
"wantMaxFreq" : false ,
"maxDT" : 0.5 ,
"minDb" : - 25 ,
"minFreq" : 0 ,
"maxFreq" : 3500 ,
"noMyDxcc" : false ,
"onlyMyDxcc" : false ,
2020-08-19 17:01:51 +00:00
"noMsg" : false ,
"noMsgValue" : "CQ RU" ,
"onlyMsg" : false ,
"onlyMsgValue" : "CQ FD" ,
2020-08-19 16:55:41 +00:00
"cqOnly" : true ,
"usesLoTW" : false ,
"maxLoTW" : 27 ,
"useseQSL" : false ,
"usesOQRS" : false ,
"onlySpot" : false ,
"allOnlyNew" : false ,
"useRegex" : false ,
"callsignRegex" : "" ,
"realtime" : false ,
"wanted" : {
"huntCallsign" : false ,
"huntGrid" : true ,
"huntDXCC" : true ,
2020-08-19 17:01:51 +00:00
"huntCQz" : false ,
"huntITUz" : false ,
"huntState" : false ,
"huntCounty" : false ,
"huntCont" : false ,
"huntPX" : false ,
2020-08-19 16:55:41 +00:00
"huntQRZ" : true ,
"huntOAMS" : false
} ,
"columns" : {
2020-09-04 23:14:05 +00:00
"Band" : false ,
"Mode" : false ,
2020-08-19 16:55:41 +00:00
"Calling" : true ,
"Msg" : false ,
"DXCC" : true ,
"Flag" : true ,
2020-08-19 17:01:51 +00:00
"State" : true ,
"County" : true ,
"Cont" : true ,
2020-08-19 16:55:41 +00:00
"dB" : true ,
2020-08-19 17:01:51 +00:00
"Freq" : false ,
"DT" : false ,
"Dist" : false ,
2020-08-19 16:55:41 +00:00
"Azim" : true ,
2020-08-19 17:01:51 +00:00
"CQz" : false ,
"ITUz" : false ,
"PX" : true ,
2020-08-19 16:55:41 +00:00
"LoTW" : false ,
"eQSL" : false ,
"OQRS" : false ,
"Spot" : false ,
"Life" : false ,
"OAMS" : true ,
"Age" : true
} ,
"reference" : 0 ,
"controls" : true ,
2020-08-19 17:01:51 +00:00
"compact" : false ,
2020-08-19 16:55:41 +00:00
"settingProfiles" : false ,
"lastSortIndex" : 6 ,
"lastSortReverse" : 1
}
2020-08-19 17:01:51 +00:00
document . addEventListener ( "dragover" , function ( event )
{
event . preventDefault ( ) ;
} ) ;
document . addEventListener ( "drop" , function ( event )
{
event . preventDefault ( ) ;
} ) ;
window . addEventListener ( "message" , receiveMessage , false ) ;
if ( typeof localStorage . blockedCQ == 'undefined' )
{
localStorage . blockedCQ = "{}" ;
}
if ( typeof localStorage . awardTracker == 'undefined' )
{
localStorage . awardTracker = "{}" ;
g _rosterSettings = { } ;
writeRosterSettings ( ) ;
}
g _awardTracker = JSON . parse ( localStorage . awardTracker ) ;
if ( typeof localStorage . blockedCalls != 'undefined' )
{
g _blockedCalls = JSON . parse ( localStorage . blockedCalls ) ;
g _blockedCQ = JSON . parse ( localStorage . blockedCQ ) ;
g _blockedDxcc = JSON . parse ( localStorage . blockedDxcc ) ;
}
function storeBlocks ( )
{
localStorage . blockedCalls = JSON . stringify ( g _blockedCalls ) ;
localStorage . blockedCQ = JSON . stringify ( g _blockedCQ ) ;
localStorage . blockedDxcc = JSON . stringify ( g _blockedDxcc ) ;
}
function storeAwardTracker ( )
{
localStorage . awardTracker = JSON . stringify ( g _awardTracker ) ;
}
2020-08-19 16:55:41 +00:00
function loadSettings ( )
{
var readSettings = { } ;
if ( typeof localStorage . rosterSettings != "undefined" )
{
readSettings = JSON . parse ( localStorage . rosterSettings ) ;
}
g _rosterSettings = deepmerge ( g _defaultSettings , readSettings ) ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
if ( "GT" in g _rosterSettings . columns )
delete g _rosterSettings . columns . GT ;
writeRosterSettings ( ) ;
}
function writeRosterSettings ( )
{
localStorage . rosterSettings = JSON . stringify ( g _rosterSettings ) ;
}
2020-08-26 02:38:51 +00:00
function isKnownCallsignDXCC ( dxcc )
{
if ( dxcc in g _callsignDatabaseDXCC )
return true ;
return false ;
}
function isKnownCallsignUS ( dxcc )
{
if ( dxcc in g _callsignDatabaseUS )
return true ;
return false ;
}
function isKnownCallsignUSplus ( dxcc )
{
if ( dxcc in g _callsignDatabaseUSplus )
return true ;
return false ;
}
2020-08-19 16:55:41 +00:00
function timeNowSec ( )
{
return parseInt ( Date . now ( ) / 1000 ) ;
}
function lockNewWindows ( )
{
if ( typeof nw != 'undefined' )
{
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 ( ) ;
} ) ;
}
}
2020-08-19 17:01:51 +00:00
function myCallCompare ( a , b )
{
2020-08-19 16:55:41 +00:00
return a . DEcall . localeCompare ( b . DEcall ) ;
}
function myGridCompare ( a , b )
{
var gridA = ( a . grid ? a . grid : "0" ) ;
var gridB = ( b . grid ? b . grid : "0" ) ;
if ( gridA > gridB )
return 1 ;
if ( gridA < gridB )
return - 1 ;
return 0 ;
}
function myDxccCompare ( a , b )
{
return window . opener . myDxccCompare ( a , b ) ;
}
function myTimeCompare ( a , b )
{
if ( a . age > b . age )
return 1 ;
if ( a . age < b . age )
return - 1 ;
return 0 ;
}
function myLifeCompare ( a , b )
{
if ( a . life > b . life )
return 1 ;
if ( a . life < b . life )
return - 1 ;
return 0 ;
}
function mySpotCompare ( a , b )
{
2020-08-19 17:01:51 +00:00
if ( a . spot . when > b . spot . when )
2020-08-19 16:55:41 +00:00
return 1 ;
2020-08-19 17:01:51 +00:00
if ( a . spot . when < b . spot . when )
2020-08-19 16:55:41 +00:00
return - 1 ;
return 0 ;
}
function myDbCompare ( a , b )
{
if ( a . RSTsent > b . RSTsent )
return 1 ;
if ( a . RSTsent < b . RSTsent )
return - 1 ;
return 0 ;
}
function myFreqCompare ( a , b )
{
if ( a . delta > b . delta )
return 1 ;
if ( a . delta < b . delta )
return - 1 ;
return 0 ;
}
function myDTCompare ( a , b )
{
if ( a . dt > b . dt )
return 1 ;
if ( a . dt < b . dt )
return - 1 ;
return 0 ;
}
function myDistanceCompare ( a , b )
{
if ( a . distance > b . distance )
return 1 ;
if ( a . distance < b . distance )
return - 1 ;
return 0 ;
}
function myHeadingCompare ( a , b )
{
if ( a . heading > b . heading )
return 1 ;
if ( a . heading < b . heading )
return - 1 ;
return 0 ;
}
function myStateCompare ( a , b )
{
if ( a . state == null ) return 1 ;
if ( b . state == null ) return - 1 ;
if ( a . state > b . state )
return 1 ;
if ( a . state < b . state )
return - 1 ;
return 0 ;
}
function myCQCompare ( a , b )
{
return a . DXcall . localeCompare ( b . DXcall ) ;
}
function myWPXCompare ( a , b )
{
2020-08-19 17:01:51 +00:00
if ( a . px == null ) return 1 ;
if ( b . px == null ) return - 1 ;
if ( a . px > b . px )
return 1 ;
if ( a . px < b . px )
return - 1 ;
return 0 ;
}
function myCntyCompare ( a , b )
{
if ( a . cnty == null ) return 1 ;
if ( b . cnty == null ) return - 1 ;
if ( a . cnty . substr ( 3 ) > b . cnty . substr ( 3 ) )
2020-08-19 16:55:41 +00:00
return 1 ;
2020-08-19 17:01:51 +00:00
if ( a . cnty . substr ( 3 ) < b . cnty . substr ( 3 ) )
2020-08-19 16:55:41 +00:00
return - 1 ;
return 0 ;
}
2020-08-19 17:01:51 +00:00
function myContCompare ( a , b )
{
if ( a . cont == null ) return 1 ;
if ( b . cont == null ) return - 1 ;
if ( a . cont > b . cont )
return 1 ;
if ( a . cont < b . cont )
return - 1 ;
return 0 ;
}
2020-08-19 16:55:41 +00:00
function myGTCompare ( a , b )
{
if ( a . style . gt != 0 && b . style . gt == 0 )
return 1 ;
if ( a . style . gt == 0 && b . style . gt != 0 )
return - 1 ;
return 0 ;
}
2020-08-19 17:01:51 +00:00
var r _sortFunction = [ myCallCompare , myGridCompare , myDbCompare , myDTCompare , myFreqCompare , myDxccCompare , myTimeCompare , myDistanceCompare , myHeadingCompare , myStateCompare , myCQCompare , myWPXCompare , myLifeCompare , mySpotCompare , myGTCompare , myCntyCompare , myContCompare ] ;
2020-08-19 16:55:41 +00:00
function showRosterBox ( sortIndex )
{
if ( g _rosterSettings . lastSortIndex != sortIndex )
{
g _rosterSettings . lastSortIndex = sortIndex ;
g _rosterSettings . lastSortReverse = 0 ;
}
else
{
g _rosterSettings . lastSortReverse ^= 1 ;
}
writeRosterSettings ( ) ;
window . opener . goProcessRoster ( ) ;
}
2020-08-19 17:01:51 +00:00
function hashMaker ( band , mode )
2020-08-19 16:55:41 +00:00
{
//"Current Band & Mode"
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . reference == 0 || g _rosterSettings . reference == 6 )
2020-08-19 16:55:41 +00:00
return band + mode ;
//"Current Band, Any Mode"
if ( g _rosterSettings . reference == 1 )
return band ;
//"Current Band, Any Digi Mode"
if ( g _rosterSettings . reference == 2 )
return band + "dg" ;
//"Current Mode, Any Band"
if ( g _rosterSettings . reference == 3 )
return mode ;
//"Any Band, Any Mode"
if ( g _rosterSettings . reference == 4 )
return "" ;
//"Any Band, Any Digi Mode"
if ( g _rosterSettings . reference == 5 )
return "dg" ;
}
2020-08-19 17:01:51 +00:00
function processRoster ( roster )
2020-08-19 16:55:41 +00:00
{
callRoster = roster ;
viewRoster ( ) ;
}
function viewRoster ( )
{
var bands = Object ( ) ;
var modes = Object ( ) ;
var callMode = g _rosterSettings . callsign ;
var onlyHits = false ;
2020-08-19 17:01:51 +00:00
var isAwardTracker = false ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
if ( callMode == "hits" )
{
callMode = "all" ;
onlyHits = true ;
}
2020-08-19 17:01:51 +00:00
if ( referenceNeed . value == 6 )
{
callMode = "all" ;
2020-08-22 00:35:49 +00:00
onlyHits = false ;
2020-08-19 17:01:51 +00:00
isAwardTracker = true ;
g _rosterSettings . huntNeed = "confirmed" ;
2020-08-26 02:38:51 +00:00
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
var canMsg = ( window . opener . g _mapSettings . offlineMode == false && window . opener . g _appSettings . gtShareEnable == "true" && window . opener . g _appSettings . gtMsgEnable == "true" ) ;
if ( window . opener . g _callsignLookups . lotwUseEnable == true )
{
usesLoTWDiv . style . display = "inline-block" ;
if ( g _rosterSettings . usesLoTW == true )
{
maxLoTW . style . display = "inline-block" ;
maxLoTWView . style . display = "inline-block" ;
}
else
{
maxLoTW . style . display = "none" ;
maxLoTWView . style . display = "none" ;
}
}
else
{
usesLoTWDiv . style . display = "none" ;
maxLoTW . style . display = "none" ;
maxLoTWView . style . display = "none" ;
}
if ( window . opener . g _callsignLookups . eqslUseEnable == true )
useseQSLDiv . style . display = "block" ;
else
useseQSLDiv . style . display = "none" ;
if ( window . opener . g _callsignLookups . oqrsUseEnable == true )
usesOQRSDiv . style . display = "block" ;
else
usesOQRSDiv . style . display = "none" ;
if ( g _rosterSettings . columns . Spot == true )
onlySpotDiv . style . display = "block" ;
else
onlySpotDiv . style . display = "none" ;
if ( callMode == "all" )
allOnlyNewDiv . style . display = "block" ;
else
allOnlyNewDiv . style . display = "none" ;
var now = timeNowSec ( ) ;
for ( callHash in callRoster )
{
var call = callRoster [ callHash ] . DEcall ;
2020-08-22 00:35:49 +00:00
2020-08-19 16:55:41 +00:00
callRoster [ callHash ] . tx = true ;
callRoster [ callHash ] . callObj . shouldAlert = false ;
callRoster [ callHash ] . callObj . reason = Array ( ) ;
2020-08-31 23:19:57 +00:00
callRoster [ callHash ] . callObj . awardReason = "Callsign" ;
2020-08-19 16:55:41 +00:00
if ( now - callRoster [ callHash ] . callObj . age > window . opener . g _mapSettings . rosterTime )
{
callRoster [ callHash ] . tx = false ;
callRoster [ callHash ] . alerted = false ;
callRoster [ callHash ] . callObj . qrz = false ;
callRoster [ callHash ] . callObj . reset = true ;
continue ;
}
if ( window . opener . g _instances [ callRoster [ callHash ] . callObj . instance ] . crEnable == false )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( call in g _blockedCalls )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( callRoster [ callHash ] . DXcall + " from All" in g _blockedCQ || callRoster [ callHash ] . DXcall + " from " + window . opener . g _dxccToAltName [ callRoster [ callHash ] . callObj . dxcc ] in g _blockedCQ )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( callRoster [ callHash ] . callObj . dxcc in g _blockedDxcc )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . cqOnly == true && callRoster [ callHash ] . callObj . CQ == false )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . useRegex && g _rosterSettings . callsignRegex . length > 0 )
{
try
{
if ( ! ( call . match ( g _rosterSettings . callsignRegex ) ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
catch ( e )
{
}
}
if ( g _rosterSettings . requireGrid == true && callRoster [ callHash ] . callObj . grid . length != 4 )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . wantMinDB == true && callRoster [ callHash ] . message . SR < g _rosterSettings . minDb )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . wantMaxDT == true && Math . abs ( callRoster [ callHash ] . message . DT ) > g _rosterSettings . maxDT )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . wantMinFreq == true && callRoster [ callHash ] . message . DF < g _rosterSettings . minFreq )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . wantMaxFreq == true && callRoster [ callHash ] . message . DF > g _rosterSettings . maxFreq )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . noMsg == true )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
try
{
if ( callRoster [ callHash ] . callObj . msg . match ( g _rosterSettings . noMsgValue ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
catch ( e )
{
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . onlyMsg == true )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
try
{
if ( ! ( callRoster [ callHash ] . callObj . msg . match ( g _rosterSettings . onlyMsgValue ) ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
catch ( e )
{
}
2020-08-19 16:55:41 +00:00
}
if ( callRoster [ callHash ] . callObj . dxcc == window . opener . g _myDXCC )
{
if ( g _rosterSettings . noMyDxcc == true )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
else
{
if ( g _rosterSettings . onlyMyDxcc == true )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( window . opener . g _callsignLookups . lotwUseEnable == true && g _rosterSettings . usesLoTW == true )
{
if ( ! ( call in window . opener . g _lotwCallsigns ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( window . opener . g _callsignLookups . eqslUseEnable == true && g _rosterSettings . useseQSL == true )
{
if ( ! ( call in window . opener . g _eqslCallsigns ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( window . opener . g _callsignLookups . oqrsUseEnable == true && g _rosterSettings . usesOQRS == true )
{
if ( ! ( call in window . opener . g _oqrsCallsigns ) )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( callMode != "all" )
{
if ( callRoster [ callHash ] . DXcall == "CQ DX" && callRoster [ callHash ] . callObj . dxcc == window . opener . g _myDXCC )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
{
var hash = call + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( callMode == "worked" && hash in g _worked . call )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( callMode == "confirmed" && hash in g _confirmed . call )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( g _rosterSettings . hunting == "grid" )
{
var hash = callRoster [ callHash ] . callObj . grid . substr ( 0 , 4 ) + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( g _rosterSettings . huntNeed == "worked" && hash in g _worked . grid )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && hash in g _confirmed . grid )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( callRoster [ callHash ] . callObj . grid . length == 0 )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
if ( g _rosterSettings . hunting == "dxcc" )
{
var hash = String ( callRoster [ callHash ] . callObj . dxcc ) + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( g _rosterSettings . huntNeed == "worked" & hash in g _worked . dxcc )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && hash in g _confirmed . dxcc )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
if ( g _rosterSettings . hunting == "dxccs" && r _currentDXCCs != - 1 )
{
if ( callRoster [ callHash ] . callObj . dxcc != r _currentDXCCs )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
if ( g _rosterSettings . hunting == "wpx" )
{
2020-08-19 17:01:51 +00:00
if ( String ( callRoster [ callHash ] . callObj . px ) == null )
2020-08-19 16:55:41 +00:00
{
callRoster [ callHash ] . tx = false ;
continue ;
}
2020-08-19 17:01:51 +00:00
var hash = String ( callRoster [ callHash ] . callObj . px ) + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . huntNeed == "worked" & hash in g _worked . px )
2020-08-19 16:55:41 +00:00
{
callRoster [ callHash ] . tx = false ;
continue ;
}
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . huntNeed == "confirmed" && hash in g _confirmed . px )
2020-08-19 16:55:41 +00:00
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
if ( g _rosterSettings . hunting == "cq" )
{
var workedTotal = confirmedTotal = callRoster [ callHash ] . callObj . cqza . length ;
if ( workedTotal == 0 )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
var workedFound = confirmedFound = 0 ;
for ( index in callRoster [ callHash ] . callObj . cqza )
{
var hash = callRoster [ callHash ] . callObj . cqza [ index ] + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( hash in g _worked . cqz )
workedFound ++ ;
if ( hash in g _confirmed . cqz )
confirmedFound ++ ;
}
if ( g _rosterSettings . huntNeed == "worked" && workedFound == workedTotal )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && confirmedFound == confirmedTotal )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
if ( g _rosterSettings . hunting == "itu" )
{
var workedTotal = confirmedTotal = callRoster [ callHash ] . callObj . ituza . length ;
if ( workedTotal == 0 )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
var workedFound = confirmedFound = 0 ;
for ( index in callRoster [ callHash ] . callObj . ituza )
{
var hash = callRoster [ callHash ] . callObj . ituza [ index ] + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( hash in g _worked . ituz )
workedFound ++ ;
if ( hash in g _confirmed . ituz )
confirmedFound ++ ;
}
if ( g _rosterSettings . huntNeed == "worked" && workedFound == workedTotal )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && confirmedFound == confirmedTotal )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( callRoster [ callHash ] . callObj . grid . length == 0 )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
if ( g _rosterSettings . hunting == "usstates" && window . opener . g _callsignLookups . ulsUseEnable == true )
{
var state = callRoster [ callHash ] . callObj . state ;
var finalDxcc = callRoster [ callHash ] . callObj . dxcc ;
if ( finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 )
{
if ( state in window . opener . g _StateData )
{
var hash = state + hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
if ( g _rosterSettings . huntNeed == "worked" && hash in g _worked . state )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && hash in g _confirmed . state )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
}
else
callRoster [ callHash ] . tx = false ;
}
else
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( g _rosterSettings . hunting == "usstate" && g _currentUSCallsigns )
{
if ( call in g _currentUSCallsigns )
{
}
else
{
callRoster [ callHash ] . tx = false ;
continue ;
}
continue ;
}
}
2020-08-19 17:01:51 +00:00
if ( isAwardTracker )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var tx = false ;
var baseHash = hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
for ( var award in g _awardTracker )
{
if ( g _awardTracker [ award ] . enable )
{
tx = testAward ( award , callRoster [ callHash ] . callObj , baseHash ) ;
2020-08-22 00:35:49 +00:00
if ( tx )
2020-08-31 23:19:57 +00:00
{
var x = g _awardTracker [ award ] ;
callRoster [ callHash ] . callObj . awardReason = g _awards [ x . sponsor ] . awards [ x . name ] . tooltip + " (" + g _awards [ x . sponsor ] . sponsor + ")" ;
2020-08-19 17:01:51 +00:00
break ;
2020-08-31 23:19:57 +00:00
}
2020-08-19 17:01:51 +00:00
}
}
callRoster [ callHash ] . tx = tx ;
2020-08-19 16:55:41 +00:00
}
}
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
var hasGtPin = false ;
var newCallList = Array ( ) ;
var inversionAlpha = "DD" ;
var row = "#000000" ;
var bold = "#000000;text-shadow: 0px 0px 1px black;" ;
var unconf = "background-clip:content-box;box-shadow: 0 0 8px 3px inset " ;
for ( var callHash in callRoster )
{
2020-08-22 00:35:49 +00:00
2020-08-19 16:55:41 +00:00
// Special case check for called station
if ( callRoster [ callHash ] . callObj . qrz == true && callRoster [ callHash ] . tx == false )
{
// The instance has to be enabled
if ( window . opener . g _instances [ callRoster [ callHash ] . callObj . instance ] . crEnable == true )
{
// Calling us, but we wouldn't normally display
2020-09-22 16:51:16 +00:00
// If they are not ignored or we're in a QSO with them, var it through
2020-08-19 16:55:41 +00:00
if ( ( ! ( callRoster [ callHash ] . DEcall in g _blockedCalls ) && ! ( callRoster [ callHash ] . callObj . dxcc in g _blockedDxcc ) ) ||
window . opener . g _instances [ callRoster [ callHash ] . callObj . instance ] . status . DXcall == callRoster [ callHash ] . DEcall )
{
callRoster [ callHash ] . tx = true ;
}
}
}
if ( callRoster [ callHash ] . callObj . dxcc != - 1 && callRoster [ callHash ] . tx == true )
{
var workHash = hashMaker ( callRoster [ callHash ] . callObj . band , callRoster [ callHash ] . callObj . mode ) ;
var call = callRoster [ callHash ] . DEcall ;
2020-08-19 17:01:51 +00:00
var testHash = call + workHash ;
2020-08-19 16:55:41 +00:00
var colorObject = Object ( ) ;
var callPointer = ( callRoster [ callHash ] . callObj . CQ == true ? "cursor:pointer" : "" ) ;
var didWork = false ;
var callsign = "#FFFF00" ;
var grid = "#00FFFF" ;
var calling = "#90EE90" ;
var dxcc = "#FFA500" ;
2020-08-19 17:01:51 +00:00
var state = "#90EE90" ;
var cnty = "#CCDD00" ;
var cont = "#00DDDD" ;
var cqz = "#DDDDDD" ;
var ituz = "#DDDDDD" ;
2020-08-19 16:55:41 +00:00
var wpx = "#FFFF00" ;
hasGtPin = false ;
shouldAlert = false ;
2020-08-19 17:01:51 +00:00
var callsignBg , gridBg , callingBg , dxccBg , stateBg , cntyBg , contBg , cqzBg , ituzBg , wpxBg , gtBg ;
var callConf , gridConf , callingConf , dxccConf , stateConf , cntyConf , contConf , cqzConf , ituzConf , wpxConf ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
callsignBg = gridBg = callingBg = dxccBg = stateBg = cntyBg = contBg = cqzBg = ituzBg = wpxBg = gtBg = row ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
callConf = gridConf = callingConf = dxccConf = stateConf = cntyConf = contConf = cqzConf = ituzConf = wpxConf = "" ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
if ( testHash in g _worked . call )
2020-08-19 16:55:41 +00:00
{
didWork = true ;
2020-08-19 17:01:51 +00:00
callConf = unconf + callsign + inversionAlpha + ";" ;
2020-08-22 00:35:49 +00:00
if ( testHash in g _confirmed . call )
{
callPointer = "text-decoration: line-through; " ;
callConf = "" ;
}
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
if ( call in window . opener . g _gtCallsigns && window . opener . g _gtCallsigns [ call ] in window . opener . g _gtFlagPins && window . opener . g _gtFlagPins [ window . opener . g _gtCallsigns [ call ] ] . canmsg == true )
2020-08-19 16:55:41 +00:00
{
// grab the CID
colorObject . gt = window . opener . g _gtCallsigns [ call ] ;
hasGtPin = true ;
}
else
colorObject . gt = 0 ;
if ( callMode == "all" )
{
if ( allOnlyNew . checked == true && didWork && callRoster [ callHash ] . callObj . qrz == false )
{
callRoster [ callHash ] . tx = false ;
continue ;
}
if ( huntCallsign . checked == true )
{
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . huntNeed == "worked" && didWork )
{
2020-08-22 00:35:49 +00:00
callRoster [ callHash ] . callObj . reason . push ( "call" ) ;
2020-08-19 17:01:51 +00:00
callConf = unconf + callsign + inversionAlpha + ";" ;
}
if ( didWork && ( g _rosterSettings . huntNeed == "confirmed" && ! ( testHash in g _confirmed . call ) ) )
{
shouldAlert = true ;
2020-08-22 00:35:49 +00:00
callRoster [ callHash ] . callObj . reason . push ( "call" ) ;
2020-08-19 17:01:51 +00:00
callConf = unconf + callsign + inversionAlpha + ";" ;
}
else if ( didWork && ( g _rosterSettings . huntNeed == "confirmed" && ( testHash in g _confirmed . call ) ) )
{
callConf = "" ;
}
else if ( ! didWork )
{
shouldAlert = true ;
callConf = "" ;
callsignBg = callsign + inversionAlpha ;
callsign = bold ;
}
2020-08-19 16:55:41 +00:00
}
if ( huntQRZ . checked == true && callRoster [ callHash ] . callObj . qrz == true )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "qrz" ) ;
}
if ( huntOAMS . checked == true && hasGtPin == true )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "oams" ) ;
}
if ( huntGrid . checked == true && callRoster [ callHash ] . callObj . grid . length > 1 )
{
var hash = callRoster [ callHash ] . callObj . grid . substr ( 0 , 4 ) + workHash ;
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . grid ) ) ||
( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . grid ) ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "grid" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . grid ) )
{
gridConf = unconf + grid + inversionAlpha + ";" ;
}
else
{
gridBg = grid + inversionAlpha ;
grid = bold ;
}
}
}
if ( huntDXCC . checked == true )
{
var hash = String ( callRoster [ callHash ] . callObj . dxcc ) + workHash ;
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . dxcc ) ) ||
( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . dxcc ) ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "dxcc" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . dxcc ) )
{
dxccConf = unconf + dxcc + inversionAlpha + ";" ;
}
else
{
dxccBg = dxcc + inversionAlpha ;
dxcc = bold ;
}
}
}
2020-08-19 17:01:51 +00:00
if ( huntState . checked == true && window . opener . g _callsignLookups . ulsUseEnable == true )
2020-08-19 16:55:41 +00:00
{
var stateSearch = callRoster [ callHash ] . callObj . state ;
var finalDxcc = callRoster [ callHash ] . callObj . dxcc ;
if ( finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 )
{
if ( stateSearch in window . opener . g _StateData )
{
var hash = stateSearch + workHash ;
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . state ) ) || ( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . state ) ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "usstates" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . state ) )
{
stateConf = unconf + state + inversionAlpha + ";" ;
}
else
{
stateBg = state + inversionAlpha ;
state = bold ;
}
}
}
}
}
2020-08-19 17:01:51 +00:00
if ( huntCounty . checked == true && window . opener . g _callsignLookups . ulsUseEnable == true )
{
var finalDxcc = callRoster [ callHash ] . callObj . dxcc ;
2020-08-26 02:38:51 +00:00
if ( callRoster [ callHash ] . callObj . cnty && ( finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202 ) && callRoster [ callHash ] . callObj . cnty . length > 0 )
2020-08-19 17:01:51 +00:00
{
var hash = callRoster [ callHash ] . callObj . cnty + workHash ;
2020-09-06 23:50:53 +00:00
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . cnty ) ) || ( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . cnty ) ) || callRoster [ callHash ] . callObj . qual == false )
2020-08-19 17:01:51 +00:00
{
2020-09-06 23:50:53 +00:00
if ( callRoster [ callHash ] . callObj . qual == false )
2020-08-19 17:01:51 +00:00
{
2020-09-22 16:51:16 +00:00
var counties = window . opener . g _zipToCounty [ callRoster [ callHash ] . callObj . zipcode ] ;
2020-09-06 23:50:53 +00:00
var foundHit = false ;
2020-09-22 16:51:16 +00:00
for ( var cnt in counties )
2020-09-06 23:50:53 +00:00
{
2020-09-22 16:51:16 +00:00
var hh = counties [ cnt ] + workHash ;
2020-09-06 23:50:53 +00:00
callRoster [ callHash ] . callObj . cnty = counties [ cnt ] ;
if ( g _rosterSettings . huntNeed == "worked" && ! ( hh in g _worked . cnty ) )
{
foundHit = true ;
break ;
}
if ( g _rosterSettings . huntNeed == "confirmed" && ! ( hh in g _confirmed . cnty ) )
{
foundHit = true ;
break ;
}
}
if ( foundHit )
shouldAlert = true ;
2020-08-19 17:01:51 +00:00
}
2020-09-06 23:50:53 +00:00
else
2020-08-19 17:01:51 +00:00
{
2020-09-06 23:50:53 +00:00
shouldAlert = true ;
}
if ( shouldAlert )
{
callRoster [ callHash ] . callObj . reason . push ( "uscnty" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . cnty ) )
{
cntyConf = unconf + cnty + inversionAlpha + ";" ;
}
else
{
cntyBg = cnty + inversionAlpha ;
cnty = bold ;
}
2020-08-19 17:01:51 +00:00
}
}
}
}
if ( huntCQz . checked == true )
2020-08-19 16:55:41 +00:00
{
var workedTotal = confirmedTotal = callRoster [ callHash ] . callObj . cqza . length ;
var workedFound = confirmedFound = 0 ;
for ( index in callRoster [ callHash ] . callObj . cqza )
{
var hash = callRoster [ callHash ] . callObj . cqza [ index ] + workHash ;
if ( hash in g _worked . cqz )
workedFound ++ ;
if ( hash in g _confirmed . cqz )
confirmedFound ++ ;
}
if ( ( g _rosterSettings . huntNeed == "worked" && workedFound != workedTotal ) || ( g _rosterSettings . huntNeed == "confirmed" && confirmedFound != confirmedTotal ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "cq" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && workedFound == workedTotal )
{
cqzConf = unconf + cqz + inversionAlpha + ";" ;
}
else
{
cqzBg = cqz + inversionAlpha ;
cqz = bold ;
}
}
}
2020-08-19 17:01:51 +00:00
if ( huntITUz . checked == true )
2020-08-19 16:55:41 +00:00
{
var workedTotal = confirmedTotal = callRoster [ callHash ] . callObj . ituza . length ;
var workedFound = confirmedFound = 0 ;
for ( index in callRoster [ callHash ] . callObj . ituza )
{
var hash = callRoster [ callHash ] . callObj . ituza [ index ] + workHash ;
if ( hash in g _worked . ituz )
workedFound ++ ;
if ( hash in g _confirmed . ituz )
confirmedFound ++ ;
}
if ( ( g _rosterSettings . huntNeed == "worked" && workedFound != workedTotal ) || ( g _rosterSettings . huntNeed == "confirmed" && confirmedFound != confirmedTotal ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "itu" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && workedFound == workedTotal )
{
ituzConf = unconf + ituz + inversionAlpha + ";" ;
}
else
{
ituzBg = ituz + inversionAlpha ;
ituz = bold ;
}
}
}
2020-08-19 17:01:51 +00:00
if ( huntPX . checked == true && callRoster [ callHash ] . callObj . px )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var hash = String ( callRoster [ callHash ] . callObj . px ) + workHash ;
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . px ) ) ||
( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . px ) ) )
2020-08-19 16:55:41 +00:00
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "wpx" ) ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . px ) )
2020-08-19 16:55:41 +00:00
{
wpxConf = unconf + wpx + inversionAlpha + ";" ;
}
else
{
wpxBg = wpx + inversionAlpha ;
wpx = bold ;
}
}
}
2020-08-19 17:01:51 +00:00
if ( huntCont . checked == true && callRoster [ callHash ] . callObj . cont )
{
var hash = String ( callRoster [ callHash ] . callObj . cont ) + workHash ;
if ( ( g _rosterSettings . huntNeed == "worked" && ! ( hash in g _worked . cont ) ) ||
( g _rosterSettings . huntNeed == "confirmed" && ! ( hash in g _confirmed . cont ) ) )
{
shouldAlert = true ;
callRoster [ callHash ] . callObj . reason . push ( "cont" ) ;
if ( g _rosterSettings . huntNeed == "confirmed" && ( hash in g _worked . cont ) )
{
contConf = unconf + cont + inversionAlpha + ";" ;
}
else
{
contBg = cont + inversionAlpha ;
cont = bold ;
}
}
}
2020-08-19 16:55:41 +00:00
}
if ( callRoster [ callHash ] . callObj . DXcall == window . opener . myDEcall )
{ callingBg = "#0000FF" + inversionAlpha ; calling = "#FFFF00;text-shadow: 0px 0px 2px #FFFF00" }
else if ( callRoster [ callHash ] . callObj . CQ == true && g _rosterSettings . cqOnly == false )
{ callingBg = calling + inversionAlpha ; calling = bold ; }
2020-08-19 17:01:51 +00:00
colorObject . callsign = "style='" + callConf + "background-color:" + callsignBg + ";color:" + callsign + ";" + callPointer + "'" ;
2020-08-19 16:55:41 +00:00
colorObject . grid = "style='" + gridConf + "background-color:" + gridBg + ";color:" + grid + ";cursor:pointer'" ;
colorObject . calling = "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'" ;
colorObject . dxcc = "style='" + dxccConf + "background-color:" + dxccBg + ";color:" + dxcc + "'" ;
colorObject . state = "style='" + stateConf + "background-color:" + stateBg + ";color:" + state + "'" ;
2020-08-19 17:01:51 +00:00
colorObject . cnty = "style='" + cntyConf + "background-color:" + cntyBg + ";color:" + cnty + "'" ;
colorObject . cont = "style='" + contConf + "background-color:" + contBg + ";color:" + cont + "'" ;
2020-08-19 16:55:41 +00:00
colorObject . cqz = "style='" + cqzConf + "background-color:" + cqzBg + ";color:" + cqz + "'" ;
colorObject . ituz = "style='" + ituzConf + "background-color:" + ituzBg + ";color:" + ituz + "'" ;
2020-08-19 17:01:51 +00:00
colorObject . px = "style='" + wpxConf + "background-color:" + wpxBg + ";color:" + wpx + "'" ;
2020-08-19 16:55:41 +00:00
if ( didWork && shouldAlert )
shouldAlert = false ;
callRoster [ callHash ] . callObj . shouldAlert = shouldAlert ;
callRoster [ callHash ] . callObj . style = colorObject ;
if ( g _rosterSettings . columns . Spot )
2020-08-19 17:01:51 +00:00
{
callRoster [ callHash ] . callObj . spot = window . opener . getSpotTime ( callRoster [ callHash ] . callObj . DEcall + callRoster [ callHash ] . callObj . mode + callRoster [ callHash ] . callObj . band + callRoster [ callHash ] . callObj . grid ) ;
if ( callRoster [ callHash ] . callObj . spot == null )
{
callRoster [ callHash ] . callObj . spot = { "when" : 0 , "snr" : 0 } ;
}
}
2020-08-19 16:55:41 +00:00
else
2020-08-19 17:01:51 +00:00
callRoster [ callHash ] . callObj . spot = { "when" : 0 , "snr" : 0 } ;
2020-08-19 16:55:41 +00:00
modes [ callRoster [ callHash ] . callObj . mode ] = true ;
bands [ callRoster [ callHash ] . callObj . band ] = true ;
newCallList . push ( callRoster [ callHash ] . callObj ) ;
}
}
2020-08-22 00:35:49 +00:00
if ( g _rosterSettings . compact == false )
2020-08-19 16:55:41 +00:00
{
2020-08-22 00:35:49 +00:00
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 ( ) ;
2020-08-19 16:55:41 +00:00
}
2020-09-04 23:14:05 +00:00
var showBands = ( Object . keys ( bands ) . length > 1 ? true : false ) || g _rosterSettings . columns . Band ;
var showModes = ( Object . keys ( modes ) . length > 1 ? true : false ) || g _rosterSettings . columns . Mode ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
var worker = ""
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . compact == false )
{
2020-08-30 05:38:38 +00:00
worker = "<table id='callTable' class='rosterTable' align=left>" ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
2020-08-30 05:38:38 +00:00
worker += "<thead><th style='cursor:pointer;' onclick='showRosterBox(0);' align=left>Callsign</th>" ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
if ( showBands )
{
2020-08-30 05:38:38 +00:00
worker += "<th onclick='' >Band</th>" ;
2020-08-19 17:01:51 +00:00
}
if ( showModes )
{
2020-08-30 05:38:38 +00:00
worker += "<th onclick='' >Mode</th>" ;
2020-08-19 17:01:51 +00:00
}
worker += "<th style='cursor:pointer;' onclick='showRosterBox(1);' >Grid</th>" ;
if ( g _rosterSettings . columns . Calling )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(10);' >Calling</th>" ;
if ( g _rosterSettings . columns . Msg )
worker += "<th >Msg</th>" ;
if ( g _rosterSettings . columns . DXCC )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(5);' >DXCC</th>" ;
if ( g _rosterSettings . columns . Flag )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(5);' >Flag</th>" ;
if ( g _rosterSettings . columns . State )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(9);' >State</th>" ;
if ( g _rosterSettings . columns . County )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(15);' >County</th>" ;
if ( g _rosterSettings . columns . Cont )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(16);' >Cont</th>" ;
if ( g _rosterSettings . columns . dB )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(2);' >dB</th>" ;
if ( g _rosterSettings . columns . Freq )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(4);' >Freq</th>" ;
if ( g _rosterSettings . columns . DT )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(3);' >DT</th>" ;
if ( g _rosterSettings . columns . Dist )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(7);' >Dist(" + window . opener . distanceUnit . value . toLowerCase ( ) + ")</th>" ;
if ( g _rosterSettings . columns . Azim )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(8);' >Azim</th>" ;
if ( g _rosterSettings . columns . CQz )
worker += "<th>CQz</th>" ;
if ( g _rosterSettings . columns . ITUz )
worker += "<th>ITUz</th>" ;
if ( g _rosterSettings . columns . PX )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(11);'>PX</th>" ;
if ( window . opener . g _callsignLookups . lotwUseEnable == true && g _rosterSettings . columns . LoTW )
worker += "<th >LoTW</th>" ;
if ( window . opener . g _callsignLookups . eqslUseEnable == true && g _rosterSettings . columns . eQSL )
worker += "<th >eQSL</th>" ;
if ( window . opener . g _callsignLookups . oqrsUseEnable == true && g _rosterSettings . columns . OQRS )
worker += "<th >OQRS</th>" ;
if ( g _rosterSettings . columns . Spot )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(13);' >Spot</th>" ;
if ( g _rosterSettings . columns . Life )
worker += "<th style='cursor:pointer;' onclick='showRosterBox(12);' >Life</th>" ;
if ( g _rosterSettings . columns . OAMS )
worker += "<th title='Off-Air Message User' style='cursor:pointer;' onclick='showRosterBox(14);'>OAM</th>" ;
if ( g _rosterSettings . columns . Age )
2020-08-30 05:38:38 +00:00
worker += "<th style='cursor:pointer;' onclick='showRosterBox(6);' >Age</th></thead>" ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
else
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
worker = '<div id="buttonsDiv" style="margin-left:0px;white-space:normal;">' ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
var shouldAlert = 0 ;
2020-08-19 16:55:41 +00:00
for ( var x in newCallList )
{
if ( newCallList [ x ] . shouldAlert == false && onlyHits == true && newCallList [ x ] . qrz == false )
continue ;
var spotString = "" ;
2020-08-19 17:01:51 +00:00
var spotSnr = null ;
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . columns . Spot && newCallList [ x ] . qrz == false )
{
spotString = getSpotString ( newCallList [ x ] ) ;
2020-08-19 17:01:51 +00:00
if ( spotString != "" )
spotSnr = newCallList [ x ] . spot . snr ;
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . onlySpot && spotString == "" )
continue ;
}
var grid = ( newCallList [ x ] . grid . length > 1 ? newCallList [ x ] . grid . substr ( 0 , 4 ) : "-" ) ;
var geo = window . opener . g _worldGeoData [ window . opener . g _dxccToGeoData [ newCallList [ x ] . dxcc ] ] ;
var cqzone = ( grid in window . opener . g _gridToCQZone ? window . opener . g _gridToCQZone [ grid ] . join ( ", " ) : "-" ) ;
var ituzone = ( grid in window . opener . g _gridToITUZone ? window . opener . g _gridToITUZone [ grid ] . join ( ", " ) : "-" ) ;
var thisCall = newCallList [ x ] . DEcall ;
2020-08-22 00:35:49 +00:00
2020-08-19 16:55:41 +00:00
if ( thisCall . match ( "^[A-Z][0-9][A-Z](\/\w+)?$" ) )
2020-08-19 17:01:51 +00:00
newCallList [ x ] . style . callsign = "class='oneByOne'" ;
2020-08-19 16:55:41 +00:00
if ( thisCall == window . opener . g _instances [ newCallList [ x ] . instance ] . status . DXcall )
{
if ( window . opener . g _instances [ newCallList [ x ] . instance ] . status . TxEnabled == 1 )
{
2020-08-19 17:01:51 +00:00
newCallList [ x ] . style . callsign = "class='dxCalling'" ;
2020-08-19 16:55:41 +00:00
}
else
{
2020-08-19 17:01:51 +00:00
newCallList [ x ] . style . callsign = "class='dxCaller'" ;
2020-08-19 16:55:41 +00:00
}
}
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . compact == false )
{
2020-09-06 23:50:53 +00:00
var thisHash = thisCall + newCallList [ x ] . band + newCallList [ x ] . mode ;
2020-08-19 17:01:51 +00:00
2020-09-06 23:50:53 +00:00
worker += "<tbody><tr id='" + thisHash + "'>" ;
2020-08-31 23:19:57 +00:00
worker += "<td title='" + newCallList [ x ] . awardReason + "' name='Callsign' align=left " + newCallList [ x ] . style . callsign + " onClick='initiateQso(\"" +
2020-08-19 16:55:41 +00:00
thisCall + newCallList [ x ] . band + newCallList [ x ] . mode + "\")'>" + thisCall . formatCallsign ( ) + "</td>" ;
if ( showBands )
{
worker += "<td style='color:#" + window . opener . g _pskColors [ newCallList [ x ] . band ] + "' >" + newCallList [ x ] . band + "</td>" ;
}
if ( showModes )
{
var color = "888888" ;
if ( newCallList [ x ] . mode in g _modeColors )
color = g _modeColors [ newCallList [ x ] . mode ] ;
worker += "<td style='color:#" + color + "' >" + newCallList [ x ] . mode + "</td>" ;
}
worker += "<td " + newCallList [ x ] . style . grid + " onClick='centerOn(\"" + grid + "\")' >" + grid + "</td>" ;
if ( g _rosterSettings . columns . Calling )
{
2020-08-22 00:35:49 +00:00
var lookString = ( newCallList [ x ] . CQ ? "name='CQ'" : "name='Calling'" ) ;
2020-08-19 16:55:41 +00:00
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 )
2020-08-22 00:35:49 +00:00
worker += "<td name='DXCC (" + newCallList [ x ] . dxcc + ")' " + newCallList [ x ] . style . dxcc + ">" + window . opener . g _dxccToAltName [ newCallList [ x ] . dxcc ] +
2020-08-19 16:55:41 +00:00
" (" + 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>" ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . columns . State )
worker += "<td align='center' " + newCallList [ x ] . style . state + " >" + ( newCallList [ x ] . state ? newCallList [ x ] . state . substr ( 3 ) : "" ) + "</td>" ;
if ( g _rosterSettings . columns . County )
2020-09-06 23:50:53 +00:00
worker += "<td align='center' " + newCallList [ x ] . style . cnty + " " + ( newCallList [ x ] . cnty ? ( newCallList [ x ] . qual ? "" : "onClick='window.opener.lookupCallsign(\"" + thisCall + "\",\"" + grid + "\")'" ) : "" ) + ">" + ( newCallList [ x ] . cnty ? ( newCallList [ x ] . qual ? "" : "~ " ) + window . opener . g _cntyToCounty [ newCallList [ x ] . cnty ] + ( newCallList [ x ] . qual ? "" : " ~" ) : "" ) + "</td>" ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . columns . Cont )
worker += "<td align='center' " + newCallList [ x ] . style . cont + " >" + ( newCallList [ x ] . cont ? newCallList [ x ] . cont : "" ) + "</td>" ;
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . columns . dB )
worker += "<td style='color:#DD44DD'><b>" + newCallList [ x ] . RSTsent + "</b></td>" ;
if ( g _rosterSettings . columns . Freq )
worker += "<td style='color:#00FF00'>" + newCallList [ x ] . delta + "</td>" ;
if ( g _rosterSettings . columns . DT )
worker += "<td style='color:#1E90FF'>" + newCallList [ x ] . dt + "</td>" ;
if ( g _rosterSettings . columns . Dist )
worker += "<td style='color:cyan'>" + parseInt ( newCallList [ x ] . distance * MyCircle . validateRadius ( window . opener . distanceUnit . value ) ) + "</td>" ;
if ( g _rosterSettings . columns . Azim )
worker += "<td style='color:yellow'>" + parseInt ( newCallList [ x ] . heading ) + "</td>" ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . columns . CQz )
2020-08-19 16:55:41 +00:00
worker += "<td " + newCallList [ x ] . style . cqz + ">" + newCallList [ x ] . cqza . join ( "," ) + "</td>" ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . columns . ITUz )
2020-08-19 16:55:41 +00:00
worker += "<td " + newCallList [ x ] . style . ituz + ">" + newCallList [ x ] . ituza . join ( "," ) + "</td>" ;
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . columns . PX )
worker += "<td " + newCallList [ x ] . style . px + ">" + ( newCallList [ x ] . px ? newCallList [ x ] . px : '' ) + "</td>" ;
2020-08-19 16:55:41 +00:00
if ( window . opener . g _callsignLookups . lotwUseEnable == true && g _rosterSettings . columns . LoTW )
{
if ( thisCall in window . opener . g _lotwCallsigns )
{
if ( g _rosterSettings . maxLoTW < 27 )
{
2020-08-26 20:17:55 +00:00
var months = ( g _day - window . opener . g _lotwCallsigns [ thisCall ] ) / 30 ;
2020-08-19 16:55:41 +00:00
if ( months > g _rosterSettings . maxLoTW )
worker += "<td style='color:yellow' align='center' title='Has not uploaded a QSO in " + Number ( months ) . toYM ( ) + "'>?</td>" ;
else
2020-08-26 20:17:55 +00:00
worker += "<td style='color:#0F0' align='center' title=' Last Upload " + window . opener . userDayString ( window . opener . g _lotwCallsigns [ thisCall ] * 86400000 ) + "'>✔</td>" ;
2020-08-19 16:55:41 +00:00
}
else
2020-08-26 20:17:55 +00:00
worker += "<td style='color:#0F0' align='center' title=' Last Upload " + window . opener . userDayString ( window . opener . g _lotwCallsigns [ thisCall ] * 86400000 ) + "'>✔</td>" ;
2020-08-19 16:55:41 +00:00
}
else
worker += "<td></td>" ;
}
if ( window . opener . g _callsignLookups . eqslUseEnable == true && g _rosterSettings . columns . eQSL )
worker += "<td style='color:#0F0;' align='center'>" + ( thisCall in window . opener . g _eqslCallsigns ? "✔" : "" ) + "</td>" ;
if ( window . opener . g _callsignLookups . oqrsUseEnable == true && g _rosterSettings . columns . OQRS )
worker += "<td style='color:#0F0;' align='center'>" + ( thisCall in window . opener . g _oqrsCallsigns ? "✔" : "" ) + "</td>" ;
if ( g _rosterSettings . columns . Spot )
2020-08-19 17:01:51 +00:00
worker += "<td style='color:#EEE;' class='spotCol' id='sp" + thisCall + newCallList [ x ] . band + newCallList [ x ] . mode + "' " + ( spotSnr ? "title='" + spotSnr + "'" : "" ) + ">" + spotString + "</td>" ;
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . columns . Life )
2020-08-19 17:01:51 +00:00
worker += "<td style='color:#EEE;' class='lifeCol' id='lm" + thisCall + newCallList [ x ] . band + newCallList [ x ] . mode + "'>" + ( timeNowSec ( ) - newCallList [ x ] . life ) . toDHMS ( ) + "</td>" ;
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . columns . OAMS )
{
if ( newCallList [ x ] . style . gt != 0 )
{
if ( newCallList [ x ] . reason . includes ( "oams" ) )
{
worker += "<td align='center' style='margin:0;padding:0;cursor:pointer;background-clip:content-box;box-shadow: 0 0 4px 4px inset #2222FFFF;' onClick='openChatToCid(\"" + newCallList [ x ] . style . gt + "\")'><img height='16px' style='' src='./img/gt_chat.png'></td>" ;
}
else
{
worker += "<td align='center' style='margin:0;padding:0;cursor:pointer;' onClick='openChatToCid(\"" + newCallList [ x ] . style . gt + "\")'><img height='16px' style='' src='./img/gt_chat.png'></td>" ;
}
}
else
worker += "<td></td>" ;
}
if ( g _rosterSettings . columns . Age )
2020-08-19 17:01:51 +00:00
worker += "<td style='color:#EEE' class='timeCol' id='tm" + thisCall + newCallList [ x ] . band + newCallList [ x ] . mode + "'>" + ( timeNowSec ( ) - newCallList [ x ] . age ) . toDHMS ( ) + "</td>" ;
2020-08-19 16:55:41 +00:00
2020-08-30 05:38:38 +00:00
worker += "</tr></tbody>" ;
2020-08-19 17:01:51 +00:00
}
else
{
2020-08-22 00:35:49 +00:00
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>" ;
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
if ( g _rosterSettings . realtime == false )
{
var call = newCallList [ x ] . DEcall ;
g _scriptReport [ call ] = Object . assign ( { } , newCallList [ x ] ) ;
g _scriptReport [ call ] . dxccName = window . opener . g _dxccToAltName [ newCallList [ x ] . dxcc ] ;
g _scriptReport [ call ] . distance = parseInt ( newCallList [ x ] . distance * MyCircle . validateRadius ( window . opener . distanceUnit . value ) ) ;
delete g _scriptReport [ call ] . DEcall ;
g _scriptReport [ call ] . rect = null ;
delete g _scriptReport [ call ] . rect ;
delete g _scriptReport [ call ] . style ;
delete g _scriptReport [ call ] . wspr ;
delete g _scriptReport [ call ] . qso ;
delete g _scriptReport [ call ] . instance ;
if ( callMode != "all" )
{
g _scriptReport [ call ] . shouldAlert = true ;
g _scriptReport [ call ] . reason . push ( g _rosterSettings . hunting ) ;
}
}
if ( newCallList [ x ] . alerted == false && callMode == "all" && newCallList [ x ] . shouldAlert == true )
{
newCallList [ x ] . alerted = true ;
shouldAlert ++ ;
}
else if ( newCallList [ x ] . alerted == false && callMode != "all" )
{
newCallList [ x ] . alerted = true ;
shouldAlert ++ ;
}
newCallList [ x ] . shouldAlert = false ;
}
2020-08-19 17:01:51 +00:00
if ( g _rosterSettings . compact == false )
{
worker += "</table>" ;
rosterTable . innerHTML = worker ;
callTable . style . width = ( parseInt ( window . innerWidth ) - 6 ) + "px" ;
}
else
{
rosterTable . innerHTML = worker + "</div>" ;
buttonsDiv . style . width = ( parseInt ( window . innerWidth ) - 6 ) + "px" ;
}
2020-08-19 16:55:41 +00:00
var dirPath = window . opener . g _scriptDir ;
var scriptExists = false ;
var script = "cr-alert.sh" ;
try
{
if ( fs . existsSync ( dirPath ) )
{
if ( window . opener . g _platform == "windows" )
{
script = "cr-alert.bat" ;
}
if ( fs . existsSync ( dirPath + script ) && g _rosterSettings . realtime == false )
{
scriptExists = true ;
scriptIcon . innerHTML = "<div class='buttonScript' onclick='window.opener.toggleCRScript();'>" + ( window . opener . g _crScript == 1 ? "<font color='lightgreen'>Script Enabled</font>" : "<font color='yellow'>Script Disabled</font>" ) + "</div>" ;
scriptIcon . style . display = "block" ;
}
else
{
scriptIcon . style . display = "none" ;
}
}
}
catch ( e )
{
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
}
if ( shouldAlert > 0 )
{
2020-08-19 17:01:51 +00:00
if ( window . opener . g _classicAlerts . huntRoster == true )
2020-08-19 16:55:41 +00:00
{
var notify = window . opener . huntRosterNotify . value ;
if ( notify == "0" )
{
var media = window . opener . huntRosterNotifyMedia . value ;
if ( media != "none" )
window . opener . playAlertMediaFile ( media ) ;
}
else if ( notify == "1" )
{
window . opener . speakAlertString ( window . opener . huntRosterNotifyWord . value ) ;
}
}
if ( g _rosterSettings . realtime == false && scriptExists && window . opener . g _crScript == 1 )
{
try
{
fs . writeFileSync ( dirPath + "cr-alert.json" , JSON . stringify ( g _scriptReport , null , 2 ) ) ;
var thisProc = dirPath + script ;
var cp = require ( 'child_process' ) ;
var child = cp . spawn ( thisProc , [ ] , {
detached : true ,
cwd : dirPath . slice ( 0 , - 1 ) ,
stdio : [ 'ignore' , 'ignore' , 'ignore' ]
} ) ;
child . unref ( ) ;
}
catch ( e )
{
conosle . log ( e ) ;
}
g _scriptReport = Object ( ) ;
}
else
g _scriptReport = Object ( ) ;
}
}
function realtimeRoster ( )
{
var now = timeNowSec ( ) ;
g _day = now / 86400 ;
if ( g _rosterSettings . realtime == false )
return ;
var timeCols = document . getElementsByClassName ( "timeCol" ) ;
for ( var x in timeCols )
{
if ( typeof timeCols [ x ] . id != 'undefined' )
{
var when = now - callRoster [ timeCols [ x ] . id . substr ( 2 ) ] . callObj . age ;
timeCols [ x ] . innerHTML = when . toDHMS ( ) ;
}
}
var lifeCols = document . getElementsByClassName ( "lifeCol" ) ;
for ( var x in lifeCols )
{
if ( typeof lifeCols [ x ] . id != 'undefined' )
{
var when = now - callRoster [ lifeCols [ x ] . id . substr ( 2 ) ] . callObj . life ;
lifeCols [ x ] . innerHTML = when . toDHMS ( ) ;
}
}
if ( g _rosterSettings . columns . Spot )
{
var spotCols = document . getElementsByClassName ( "spotCol" ) ;
for ( var x in spotCols )
{
if ( typeof spotCols [ x ] . id != 'undefined' )
{
spotCols [ x ] . innerHTML = getSpotString ( callRoster [ spotCols [ x ] . id . substr ( 2 ) ] . callObj ) ;
if ( g _rosterSettings . onlySpot && spotCols [ x ] . innerHTML == "" )
{
viewRoster ( ) ;
return ;
}
}
}
}
}
2020-08-19 17:01:51 +00:00
function getSpotString ( callObj )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( callObj . spot && callObj . spot . when > 0 )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
when = timeNowSec ( ) - callObj . spot . when ;
2020-08-19 16:55:41 +00:00
if ( when <= window . opener . g _receptionSettings . viewHistoryTimeSec )
return parseInt ( when ) . toDHMS ( ) ;
}
return "" ;
}
2020-08-19 17:01:51 +00:00
function openChatToCid ( cid )
2020-08-19 16:55:41 +00:00
{
2020-09-06 23:50:53 +00:00
window . opener . showMessaging ( true , cid ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function initiateQso ( thisHash )
2020-08-19 16:55:41 +00:00
{
window . opener . initiateQso ( thisHash ) ;
}
2020-08-19 17:01:51 +00:00
function callLookup ( thisHash , grid )
2020-08-19 16:55:41 +00:00
{
2020-09-06 23:50:53 +00:00
window . opener . startLookup ( callRoster [ thisHash ] . DEcall , callRoster [ thisHash ] . grid ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function callingLookup ( thisHash , grid )
2020-08-19 16:55:41 +00:00
{
var thisCall = callRoster [ thisHash ] . DXcall ;
window . opener . startLookup ( thisCall , grid ) ;
}
2020-08-19 17:01:51 +00:00
function callGenMessage ( thisHash , grid )
2020-08-19 16:55:41 +00:00
{
var thisCall = callRoster [ thisHash ] . DEcall ;
var instance = callRoster [ thisHash ] . callObj . instance ;
window . opener . startGenMessages ( thisCall , grid , instance ) ;
}
2020-08-19 17:01:51 +00:00
function callingGenMessage ( thisHash , grid )
2020-08-19 16:55:41 +00:00
{
var thisCall = callRoster [ thisHash ] . DXcall ;
var instance = callRoster [ thisHash ] . callObj . instance ;
window . opener . startGenMessages ( thisCall , grid , instance ) ;
}
2020-08-19 17:01:51 +00:00
function centerOn ( grid )
2020-08-19 16:55:41 +00:00
{
window . opener . centerOn ( grid ) ;
}
2020-08-19 17:01:51 +00:00
function instanceChange ( what )
2020-08-19 16:55:41 +00:00
{
window . opener . g _instances [ what . id ] . crEnable = what . checked ;
window . opener . goProcessRoster ( ) ;
}
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
function updateInstances ( )
{
if ( window . opener . g _instancesIndex . length > 1 )
{
var instances = window . opener . g _instances ;
var worker = "" ;
var keys = Object . keys ( instances ) . sort ( ) ;
for ( var key in keys )
{
var inst = keys [ key ] ;
var sp = inst . split ( " - " ) ;
var shortInst = sp [ sp . length - 1 ] . substring ( 0 , 18 ) ;
var color = "blue" ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
if ( instances [ inst ] . open == false )
{
color = "purple" ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
worker += "<div class='button' style='margin:1px;padding:2px;display:inline-block;background-color:" + color + ";;border-width:1px' ><input type='checkbox' id='" + inst + "' onchange='instanceChange(this);' " + ( instances [ inst ] . crEnable ? "checked" : "" ) + " >" + shortInst + "</div>" ;
2020-08-19 16:55:41 +00:00
}
instancesDiv . innerHTML = worker ;
instancesDiv . style . display = "block" ;
}
else
instancesDiv . style . display = "none" ;
}
2020-08-19 17:01:51 +00:00
function processStatus ( newMessage )
2020-08-19 16:55:41 +00:00
{
if ( newMessage . Transmitting == 0 ) // Not Transmitting
{
if ( newMessage . Decoding == 1 ) // Decoding
{
txrxdec . style . backgroundColor = 'Blue' ;
txrxdec . style . borderColor = 'Cyan' ;
txrxdec . innerHTML = "DECODE" ;
}
else
{
txrxdec . style . backgroundColor = 'Green' ;
txrxdec . style . borderColor = 'GreenYellow' ;
txrxdec . innerHTML = "RECEIVE" ;
}
}
else
{
txrxdec . style . backgroundColor = 'Red' ;
txrxdec . style . borderColor = 'Orange' ;
txrxdec . innerHTML = "TRANSMIT" ;
}
}
2020-08-19 17:01:51 +00:00
function toTitleCase ( str ) {
return str . replace ( /\w\S*/g , function ( txt ) {
return txt . charAt ( 0 ) . toUpperCase ( ) + txt . substr ( 1 ) . toLowerCase ( ) ;
} ) ;
}
function newOption ( value , text ) {
if ( typeof text == 'undefined' )
text = value ;
var option = document . createElement ( "option" ) ;
option . value = value ;
option . text = text ;
return option ;
}
function createSelectOptions ( selectElementString , selectNameDefault , forObject , altName = null , defaultValue = null , checkSponsor = null )
{
var selector = document . getElementById ( selectElementString ) ;
selector . innerHTML = '' ;
var option = document . createElement ( "option" ) ;
option . value = defaultValue ;
option . text = selectNameDefault ;
option . selected = true ;
option . disabled = true ;
option . style . display = "none" ;
selector . appendChild ( option ) ;
var obj = null ;
if ( forObject )
{
obj = Object . keys ( forObject ) . sort ( ) ;
}
for ( var k in obj )
{
var opt = obj [ k ] ;
var option = document . createElement ( "option" ) ;
option . value = opt ;
option . text = ( altName ? forObject [ opt ] [ altName ] : opt ) ;
if ( checkSponsor && ( opt + "-" + checkSponsor in g _awardTracker ) )
option . disabled = true ;
selector . appendChild ( option ) ;
}
}
function awardSponsorChanged ( )
{
awardName . style . display = "" ;
createSelectOptions ( "awardName" , "Select Award" , g _awards [ awardSponsor . value ] . awards , "name" , null , awardSponsor . value ) ;
}
function awardNameChanged ( )
{
var awardToAdd = newAwardTrackerObject ( awardSponsor . value , awardName . value , true ) ;
var hash = awardToAdd . name + "-" + awardToAdd . sponsor ;
if ( ! ( hash in g _awardTracker ) )
{
g _awardTracker [ hash ] = awardToAdd ;
storeAwardTracker ( ) ;
processAward ( hash ) ;
updateAwardList ( hash ) ;
window . opener . goProcessRoster ( ) ;
}
createSelectOptions ( "awardName" , "Select Award" , g _awards [ awardToAdd . sponsor ] . awards , "name" , null , awardToAdd . sponsor ) ;
}
function updateAwardList ( target = null )
{
var worker = '<table id="awardTable" class="awardTableCSS" style="padding:0;margin:0;margin-top:-5px;" >' ;
worker += "<tr style='font-size:smaller'>" ;
worker += "<td align='left'>" ;
worker += "Name" ;
worker += "</td>" ;
worker += "<td>" ;
worker += "Award" ;
worker += "</td>" ;
worker += "<td>" ;
worker += "Track" ;
worker += "</td>" ;
worker += "<td>" ;
worker += "" ;
worker += "</td>" ;
worker += "</tr>" ;
worker += "</table>" ;
awardWantedDiv . innerHTML = worker ;
var keys = Object . keys ( g _awardTracker ) . sort ( ) ;
for ( var key in keys )
{
var award = g _awardTracker [ keys [ key ] ] ;
var rule = g _awards [ award . sponsor ] . awards [ award . name ] . rule ;
var row = awardTable . insertRow ( ) ;
row . id = keys [ key ] ;
var baseAward = false ;
var baseCount = 0 ;
var endorseCount = 0 ;
var endorseTotal = 0 ;
var allEndorse = false ;
var tooltip = g _awards [ award . sponsor ] . awards [ award . name ] . tooltip + " (" + g _awards [ award . sponsor ] . sponsor + ")\n" ;
2020-08-22 00:35:49 +00:00
tooltip += toTitleCase ( award . test . qsl _req ) + " QSO\n" ;
2020-08-19 17:01:51 +00:00
for ( var mode in award . comp . counts )
{
tooltip += mode + "\n" ;
for ( var count in award . comp . counts [ mode ] )
{
endorseTotal ++ ;
if ( award . comp . counts [ mode ] [ count ] . per == 100 )
{
baseAward = true ;
endorseCount ++ ;
}
if ( award . comp . counts [ mode ] [ count ] . num > baseCount )
baseCount = award . comp . counts [ mode ] [ count ] . num ;
tooltip += "\t" + award . comp . counts [ mode ] [ count ] . num + "/" + count + " (" + award . comp . counts [ mode ] [ count ] . per + "%)\n" ;
var wrk = "" ;
if ( Object . keys ( award . comp . endorse ) . length > 0 )
{
for ( var band in award . comp . endorse [ mode ] )
{
endorseTotal ++ ;
if ( award . comp . endorse [ mode ] [ band ] [ count ] == true )
{
endorseCount ++ ;
wrk += band + " " ;
}
}
}
if ( wrk . length > 0 )
{
tooltip += "\t\t" + wrk + "\n" ;
}
}
}
if ( baseCount > 0 && endorseCount == endorseTotal )
allEndorse = true ;
2020-08-22 00:35:49 +00:00
var cell = createCellHtml ( row , "<p style='font-size:smaller;'>" + award . name + " - " + award . sponsor ) ;
2020-08-19 17:01:51 +00:00
cell . style . textAlign = "left" ;
cell . style . color = "lightblue" ;
createCellHtml ( row , "<p style='margin:0;' >" + ( allEndorse ? "<img src='./img/award-trophy.svg' height='18px'>" : baseAward ? "<img src='./img/award-medal.svg' height='16px'>" : baseCount > 0 ? "<img src='./img/award-tally.svg' height='16px'>" : "<img src='./img/award-empty.svg' height='14px'>" ) , tooltip ) ;
createCell ( row , "enable" , award . enable , award . enable , "Toggle Tracking" , true ) ;
createCellHtml ( row , "<p title='Remove Tracker' onclick='deleteAwardTracker(this)' style='margin:0;cursor:pointer;'><img src='./img/award-delete.svg' height='16px'>" ) ;
}
}
function deleteAwardTracker ( sender )
{
var id = sender . parentNode . parentNode . id ;
delete g _awardTracker [ id ] ;
storeAwardTracker ( ) ;
resetAwardAdd ( ) ;
updateAwardList ( ) ;
window . opener . goProcessRoster ( ) ;
}
function awardCheckboxChanged ( sender )
{
var awardId = sender . target . parentNode . parentNode . id ;
g _awardTracker [ sender . target . parentNode . parentNode . id ] [ sender . target . name ] = sender . target . checked ;
storeAwardTracker ( ) ;
window . opener . goProcessRoster ( ) ;
}
function awardValueChanged ( sender )
{
var awardId = sender . target . parentNode . parentNode . id ;
g _awardTracker [ sender . target . parentNode . parentNode . id ] [ sender . target . name ] = sender . target . value ;
storeAwardTracker ( ) ;
window . opener . goProcessRoster ( ) ;
}
function createCell ( row , target , value , data = null , title = null , checkbox = false )
{
var cell = row . insertCell ( ) ;
if ( data == null )
cell . innerHTML = value ;
if ( title )
cell . title = title ;
if ( checkbox )
{
var x = document . createElement ( "INPUT" ) ;
x . setAttribute ( "type" , "checkbox" ) ;
x . checked = value ;
x . name = target ;
x . addEventListener ( "change" , awardCheckboxChanged ) ;
cell . appendChild ( x ) ;
}
else if ( data )
{
cell . appendChild ( createAwardSelector ( cell , target , value , data ) ) ;
}
return cell ;
}
function createCellHtml ( row , html , title = null )
{
var cell = row . insertCell ( ) ;
cell . innerHTML = html ;
if ( title )
cell . title = title ;
return cell ;
}
function createAwardSelector ( cell , target , value , forObject )
{
var selector = document . createElement ( "select" ) ;
selector . name = target ;
selector . value = value ;
selector . disabled = ( forObject . length == 1 ? true : false ) ;
selector . style . margin = "0px" ;
selector . style . padding = "1px" ;
if ( selector . disabled )
selector . style . cursor = "auto" ;
selector . addEventListener ( "change" , awardValueChanged ) ;
for ( var opt in forObject )
{
var option = document . createElement ( "option" ) ;
option . value = forObject [ opt ] ;
if ( option . value == "Phone" || option . value == "CW" )
option . disabled = true ;
option . text = forObject [ opt ] ;
selector . appendChild ( option ) ;
}
return selector ;
}
function resetAwardAdd ( )
{
awardName . style . display = "none" ;
createSelectOptions ( "awardName" , "Select Award" , null ) ;
createSelectOptions ( "awardSponsor" , "Select Sponsor" , g _awards , "sponsor" ) ;
}
function openAwardPopup ( )
{
awardHunterDiv . style . zIndex = 100 ;
resetAwardAdd ( ) ;
}
function closeAwardPopup ( )
{
awardHunterDiv . style . zIndex = - 1 ;
resetAwardAdd ( ) ;
}
2020-08-19 16:55:41 +00:00
function setVisual ( )
{
huntNeedTd . style . display = "none" ;
huntStateTd . style . display = "none" ;
huntDXCCsTd . style . display = "none" ;
2020-08-19 17:01:51 +00:00
// Award Hunter
if ( referenceNeed . value == 6 )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
/ * f o r ( k e y i n g _ r o s t e r S e t t i n g s . w a n t e d )
{
document . getElementById ( key ) . checked = true ;
var t = key . replace ( "hunt" , "" ) ;
if ( t in g _rosterSettings . columns )
g _rosterSettings . columns [ t ] = true ;
} * /
huntingTr . style . display = "none" ;
callsignsTr . style . display = "none" ;
awardHunterTr . style . display = "" ;
awardWantedDiv . style . display = "" ;
2020-08-22 00:35:49 +00:00
huntingMatrixDiv . style . display = "" ;
2020-08-19 17:01:51 +00:00
updateAwardList ( ) ;
2020-08-19 16:55:41 +00:00
}
else
{
2020-08-19 17:01:51 +00:00
for ( key in g _rosterSettings . wanted )
2020-08-19 17:35:28 +00:00
{
if ( document . getElementById ( key ) )
document . getElementById ( key ) . checked = g _rosterSettings . wanted [ key ] ;
}
2020-08-30 05:38:38 +00:00
2020-08-19 17:01:51 +00:00
awardHunterTr . style . display = "none" ;
awardWantedDiv . style . display = "none" ;
huntingTr . style . display = "" ;
callsignsTr . style . display = "" ;
closeAwardPopup ( ) ;
if ( callsignNeed . value == "all" || callsignNeed . value == "hits" )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
huntingMatrixDiv . style . display = "" ;
2020-08-19 16:55:41 +00:00
huntNeedTd . style . display = "block" ;
2020-08-19 17:01:51 +00:00
huntModeTd . style . display = "none" ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
else
2020-08-19 16:55:41 +00:00
{
2020-08-30 05:38:38 +00:00
huntingMatrixDiv . style . display = "none" ;
2020-08-19 17:01:51 +00:00
huntModeTd . style . display = "block" ;
if ( huntMode . value != "callsign" && huntMode . value != "usstate" && huntMode . value != "dxccs" )
{
huntNeedTd . style . display = "block" ;
}
if ( huntMode . value == "usstate" )
{
huntStateTd . style . display = "block" ;
}
if ( huntMode . value == "usstates" )
{
huntNeedTd . style . display = "block" ;
}
if ( huntMode . value == "dxccs" )
{
huntDXCCsTd . style . display = "block" ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
}
if ( wantMaxDT . checked == true )
{
maxDT . style . display = "block" ;
maxDTView . style . display = "block" ;
}
else
{
maxDT . style . display = "none" ;
maxDTView . style . display = "none" ;
}
if ( wantMinDB . checked == true )
{
minDb . style . display = "block" ;
minDbView . style . display = "block" ;
}
else
{
minDb . style . display = "none" ;
minDbView . style . display = "none" ;
}
if ( wantMinFreq . checked == true )
{
minFreq . style . display = "block" ;
minFreqView . style . display = "block" ;
}
else
{
minFreq . style . display = "none" ;
minFreqView . style . display = "none" ;
}
if ( wantMaxFreq . checked == true )
{
maxFreq . style . display = "block" ;
maxFreqView . style . display = "block" ;
}
else
{
maxFreq . style . display = "none" ;
maxFreqView . style . display = "none" ;
}
if ( useRegex . checked == true )
{
callsignRegex . style . display = "inline-block" ;
}
else
{
callsignRegex . style . display = "none" ;
}
if ( window . opener . g _callsignLookups . lotwUseEnable == true )
{
usesLoTWDiv . style . display = "inline-block" ;
if ( g _rosterSettings . usesLoTW == true )
{
maxLoTW . style . display = "inline-block" ;
maxLoTWView . style . display = "inline-block" ;
}
else
{
maxLoTW . style . display = "none" ;
maxLoTWView . style . display = "none" ;
}
}
else
{
usesLoTWDiv . style . display = "none" ;
maxLoTW . style . display = "none" ;
maxLoTWView . style . display = "none" ;
}
if ( window . opener . g _callsignLookups . eqslUseEnable == true )
useseQSLDiv . style . display = "block" ;
else
useseQSLDiv . style . display = "none" ;
if ( window . opener . g _callsignLookups . oqrsUseEnable == true )
usesOQRSDiv . style . display = "block" ;
else
usesOQRSDiv . style . display = "none" ;
if ( g _rosterSettings . columns . Spot == true )
onlySpotDiv . style . display = "block" ;
else
onlySpotDiv . style . display = "none" ;
if ( g _rosterSettings . callsign == "all" || g _rosterSettings . callsign == "hits" )
allOnlyNewDiv . style . display = "block" ;
else
allOnlyNewDiv . style . display = "none" ;
resize ( ) ;
}
2020-08-19 17:01:51 +00:00
function wantedChanged ( element )
{
2020-08-19 16:55:41 +00:00
g _rosterSettings . wanted [ element . id ] = element . checked ;
2020-08-19 17:01:51 +00:00
if ( element . checked == true )
{
var t = element . id . replace ( "hunt" , "" ) ;
if ( t in g _rosterSettings . columns )
{
g _rosterSettings . columns [ t ] = true ;
2020-08-22 00:35:49 +00:00
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 ;
}
2020-08-19 17:01:51 +00:00
}
}
2020-08-19 16:55:41 +00:00
writeRosterSettings ( ) ;
g _scriptReport = Object ( ) ;
for ( var callHash in window . opener . g _callRoster )
{
window . opener . g _callRoster [ callHash ] . callObj . alerted = false ;
}
window . opener . goProcessRoster ( ) ;
}
function valuesChanged ( )
{
setVisual ( ) ;
g _rosterSettings . callsign = callsignNeed . value ;
g _rosterSettings . hunting = huntMode . value ;
g _rosterSettings . huntNeed = huntNeed . value ;
g _rosterSettings . requireGrid = wantGrid . checked ;
g _rosterSettings . wantMaxDT = wantMaxDT . checked ;
g _rosterSettings . wantMinDB = wantMinDB . checked ;
g _rosterSettings . wantMinFreq = wantMinFreq . checked ;
g _rosterSettings . wantMaxFreq = wantMaxFreq . checked ;
maxDTView . innerHTML = g _rosterSettings . maxDT = maxDT . value ;
minDbView . innerHTML = g _rosterSettings . minDb = minDb . value ;
minFreqView . innerHTML = g _rosterSettings . minFreq = minFreq . value ;
maxFreqView . innerHTML = g _rosterSettings . maxFreq = maxFreq . value ;
g _rosterSettings . maxLoTW = maxLoTW . value ;
maxLoTWView . innerHTML = ( g _rosterSettings . maxLoTW < 27 ) ? Number ( g _rosterSettings . maxLoTW ) . toYM ( ) : "<b>∞</b>" ;
g _rosterSettings . maxLoTW = maxLoTW . value ;
g _rosterSettings . cqOnly = cqOnly . checked ;
g _rosterSettings . noMyDxcc = noMyDxcc . checked ;
g _rosterSettings . onlyMyDxcc = onlyMyDxcc . checked ;
2020-08-19 17:01:51 +00:00
if ( noMsg . checked && onlyMsg . checked && noMsgValue . value == onlyMsgValue . value )
{
if ( g _rosterSettings . noMsg )
noMsg . checked = false ;
else
onlyMsg . checked = false ;
}
g _rosterSettings . noMsg = noMsg . checked ;
g _rosterSettings . onlyMsg = onlyMsg . checked ;
g _rosterSettings . noMsgValue = noMsgValue . value ;
g _rosterSettings . onlyMsgValue = onlyMsgValue . value ;
2020-08-19 16:55:41 +00:00
g _rosterSettings . usesLoTW = usesLoTW . checked ;
g _rosterSettings . useseQSL = useseQSL . checked ;
g _rosterSettings . usesOQRS = usesOQRS . checked ;
g _rosterSettings . onlySpot = onlySpot . checked ;
g _rosterSettings . reference = referenceNeed . value ;
g _rosterSettings . allOnlyNew = allOnlyNew . checked ;
g _rosterSettings . useRegex = useRegex . checked ;
g _rosterSettings . callsignRegex = callsignRegex . value ;
writeRosterSettings ( ) ;
g _scriptReport = Object ( ) ;
for ( var callHash in window . opener . g _callRoster )
window . opener . g _callRoster [ callHash ] . callObj . alerted = false ;
window . opener . goProcessRoster ( ) ;
}
function getBuffer ( file _url , callback , flag , mode , port , cookie )
{
var url = require ( 'url' ) ;
var http = require ( mode ) ;
var fileBuffer = null ;
var options = null ;
if ( cookie != null )
{
options = {
host : url . parse ( file _url ) . host ,
port : port ,
path : url . parse ( file _url ) . path ,
headers :
{
'Cookie' : cookie
}
} ;
}
else
{
options = {
host : url . parse ( file _url ) . host ,
port : port ,
path : url . parse ( file _url ) . path
} ;
}
http . get ( options , function ( res )
{
var fsize = res . headers [ 'content-length' ] ;
var cookies = null ;
if ( typeof res . headers [ 'set-cookie' ] != 'undefined' )
cookies = res . headers [ 'set-cookie' ] ;
res . on ( 'data' , function ( data )
{
if ( fileBuffer == null )
fileBuffer = data ;
else
fileBuffer += data ;
} ) . on ( 'end' , function ( )
{
if ( typeof callback === "function" )
{
// Call it, since we have confirmed it is callable
callback ( fileBuffer , flag , cookies ) ;
}
} ) . on ( 'error' , function ( ) { } ) ;
} ) ;
}
function callsignResult ( buffer , flag )
{
var rawData = JSON . parse ( buffer ) ;
r _currentUSState = flag ;
g _currentUSCallsigns = Object ( ) ;
for ( key in rawData . c )
g _currentUSCallsigns [ rawData . c [ key ] ] = true ;
window . opener . goProcessRoster ( ) ;
}
function stateChangedValue ( what )
{
if ( r _currentUSState != stateSelect . value && stateSelect . value != "" )
{
r _currentUSState = stateSelect . value ;
if ( window . opener . g _mapSettings . offlineMode == false )
{
var callState = r _currentUSState . replace ( "CN-" , "" ) ; ;
getBuffer ( "https://tagloomis.com/gt/callsigns/" + callState + ".callsigns.json" , callsignResult , r _currentUSState , "https" , 443 ) ;
}
else
{
window . opener . goProcessRoster ( ) ;
r _currentUSState = "" ;
g _currentUSCallsigns = null ;
stateSelect . value = "" ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
return ;
}
}
if ( stateSelect . value == "" )
{
r _currentUSState = "" ;
g _currentUSCallsigns = null ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
window . opener . goProcessRoster ( ) ;
}
}
function DXCCsChangedValue ( what )
{
r _currentDXCCs = DXCCsSelect . value ;
window . opener . goProcessRoster ( ) ;
}
function initDXCCSelector ( )
{
var items = Object . keys ( window . opener . g _dxccToAltName ) . sort ( function ( a , b ) { return window . opener . g _dxccToAltName [ a ] . localeCompare ( window . opener . g _dxccToAltName [ b ] ) } ) ;
var newSelect = document . getElementById ( "DXCCsSelect" ) ;
for ( var i in items )
{
var key = items [ i ] ;
if ( window . opener . g _worldGeoData [ window . opener . g _dxccToGeoData [ key ] ] . geo != "deleted" )
{
var option = document . createElement ( "option" ) ;
option . value = key ;
option . text = window . opener . g _dxccToAltName [ key ] + " (" + window . opener . g _worldGeoData [ window . opener . g _dxccToGeoData [ key ] ] . pp + ")" ;
newSelect . appendChild ( option ) ;
}
}
newSelect . oninput = DXCCsChangedValue ;
}
function manifestResult ( buffer , flag )
{
r _callsignManifest = JSON . parse ( buffer ) ;
var newSelect = document . getElementById ( "stateSelect" ) ;
for ( key in r _callsignManifest . cnt )
{
var option = document . createElement ( "option" ) ;
if ( window . opener . g _enums [ key ] )
{
option . value = key ;
option . text = window . opener . g _enums [ key ] ;
}
else
{
option . value = "CN-" + key ;
option . text = window . opener . g _enums [ "CN-" + key ] ;
}
newSelect . appendChild ( option ) ;
}
newSelect . oninput = stateChangedValue ;
}
function receiveMessage ( event )
{
}
2020-08-19 17:01:51 +00:00
var g _tracker = { } ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function updateWorked ( )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
g _worked = window . opener . g _tracker . worked ;
g _confirmed = window . opener . g _tracker . confirmed ;
g _modes = window . opener . g _modes ;
g _modes _phone = window . opener . g _modes _phone ;
g _tracker = window . opener . g _tracker ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
processAllAwardTrackers ( ) ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function deleteCallsignIgnore ( key )
{
delete g _blockedCalls [ key ] ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function deleteDxccIgnore ( key )
{
delete g _blockedDxcc [ key ] ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function deleteCQIgnore ( key )
{
delete g _blockedCQ [ key ] ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function clearAllCallsignIgnores ( )
{
g _blockedCalls = Object ( ) ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
function clearAllDxccIgnores ( )
{
g _blockedDxcc = Object ( ) ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
function clearAllCQIgnores ( )
{
g _blockedCQ = Object ( ) ;
storeBlocks ( ) ;
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
function closeEditIgnores ( )
{
mainCallRoster . style . display = "block" ;
editView . style . display = "none" ;
}
function openIgnoreEdit ( )
{
mainCallRoster . style . display = "none" ;
editView . style . display = "inline-block" ;
var worker = "" ;
var clearString = "<th>none</th>" ;
{
if ( Object . keys ( g _blockedCalls ) . length > 0 )
clearString = "<th style='cursor:pointer;' onclick='clearAllCallsignIgnores()'>Clear All</th>" ;
worker +=
"<div style='margin:10px;padding:0px;vertical-align:top;display:inline-block;margin-right:2px;overflow:auto;overflow-x:hidden;height:" + ( window . innerHeight - 135 ) +
"px;'><table class='darkTable' align=center><tr><th align=left>Callsigns</th>" + clearString + "</tr>" ;
Object . keys ( g _blockedCalls ) . sort ( ) . forEach ( function ( key , i ) {
worker += "<tr><td align=left style='color:#FFFF00;' >" + key + "</td><td style='cursor:pointer;' onclick='deleteCallsignIgnore(\"" + key + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>" ;
} ) ;
worker += "</table></div>" ;
}
{
clearString = "<th>none</th>" ;
if ( Object . keys ( g _blockedCQ ) . length > 0 )
clearString = "<th style='cursor:pointer;' onclick='clearAllCQIgnores()'>Clear All</th>" ;
worker +=
"<div style='margin:10px;padding:0px;vertical-align:top;display:inline-block;margin-right:2px;overflow:auto;overflow-x:hidden;height:" + ( window . innerHeight - 135 ) +
"px;'><table class='darkTable' align=center><tr><th align=left>CQ</th>" + clearString + "</tr>" ;
Object . keys ( g _blockedCQ ) . sort ( ) . forEach ( function ( key , i ) {
worker += "<tr><td align=left style='color:cyan;' >" + key + "</td><td style='cursor:pointer;' onclick='deleteCQIgnore(\"" + key + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>" ;
} ) ;
worker += "</table></div>" ;
}
{
clearString = "<th>none</th>" ;
if ( Object . keys ( g _blockedDxcc ) . length > 0 )
clearString = "<th style='cursor:pointer;' onclick='clearAllDxccIgnores()'>Clear All</th>" ;
worker +=
"<div style='margin:10px;vertical-align:top;display:inline-block;overflow:auto;overflow-x:hidden;height:" +
( window . innerHeight - 135 ) +
"px;'><table class='darkTable' align=center><tr><th align=left>DXCCs</th>" + clearString + "</tr>" ;
Object . keys ( g _blockedDxcc ) . sort ( ) . forEach ( function ( key , i ) {
worker += "<tr><td align=left style='color:#FFA500' >" + window . opener . g _dxccToAltName [ key ] +
" (" + window . opener . g _worldGeoData [ window . opener . g _dxccToGeoData [ key ] ] . pp + ")</td><td style='cursor:pointer;' onclick='deleteDxccIgnore(\"" + key + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>" ;
} ) ;
worker += "</table></div>" ;
}
editTables . innerHTML = worker ;
}
function onMyKeyDown ( event )
{
2020-09-22 16:51:16 +00:00
if ( ! g _regFocus )
2020-08-19 17:01:51 +00:00
{
window . opener . onMyKeyDown ( event ) ;
}
}
function checkForEnter ( ele )
{
if ( event . key === 'Enter' ) {
ele . blur ( ) ;
}
}
function resize ( )
{
rosterTable . style . height = window . innerHeight - ( rosterHead . clientHeight + 8 ) ;
awardWantedDiv . style . height = exceptionDiv . clientHeight ;
if ( typeof callTable != 'undefined' )
callTable . style . width = ( parseInt ( window . innerWidth ) - 6 ) + "px" ;
if ( editView . style . display == "inline-block" )
openIgnoreEdit ( ) ;
window . opener . goProcessRoster ( ) ;
}
function init ( )
{
2020-08-26 02:38:51 +00:00
g _callsignDatabaseDXCC = window . opener . g _callsignDatabaseDXCC ;
g _callsignDatabaseUS = window . opener . g _callsignDatabaseUS
g _callsignDatabaseUSplus = window . opener . g _callsignDatabaseUSplus ;
2020-08-19 17:01:51 +00:00
loadAwardJson ( ) ;
updateWorked ( ) ;
//addAllAwards();
window . addEventListener ( "message" , receiveMessage , false ) ;
lockNewWindows ( ) ;
if ( window . opener . g _mapSettings . offlineMode == false )
getBuffer ( "https://tagloomis.com/gt/callsigns/manifest.json" , manifestResult , null , "https" , 443 ) ;
loadSettings ( ) ;
window . opener . setRosterSpot ( g _rosterSettings . columns . Spot ) ;
for ( key in g _rosterSettings . wanted )
2020-08-19 17:35:28 +00:00
{
if ( document . getElementById ( key ) )
document . getElementById ( key ) . checked = g _rosterSettings . wanted [ key ] ;
}
2020-08-19 17:01:51 +00:00
g _menu = new nw . Menu ( ) ;
2020-08-22 00:35:49 +00:00
g _compactMenu = new nw . Menu ( ) ;
2020-08-19 17:01:51 +00:00
// Bind a callback to item
var item = new nw . MenuItem ( {
type : "normal" ,
label : g _rosterSettings . controls ? "Hide Controls" : "Show Controls" ,
2020-08-19 16:55:41 +00:00
click : function ( ) {
if ( this . label == "Hide Controls" )
{
this . label = "Show Controls" ;
rosterHead . style . display = "none" ;
g _rosterSettings . controls = false ;
}
else
{
this . label = "Hide Controls" ;
rosterHead . style . display = "block" ;
g _rosterSettings . controls = true ;
}
2020-08-26 02:38:51 +00:00
g _compactMenu . items [ 0 ] . label = g _rosterSettings . controls ? "Hide Controls" : "Show Controls" ;
2020-08-19 16:55:41 +00:00
localStorage . rosterSettings = JSON . stringify ( g _rosterSettings ) ;
resize ( ) ;
}
} ) ;
g _menu . append ( item ) ;
2020-08-26 02:38:51 +00:00
item = new nw . MenuItem ( {
type : "normal" ,
label : g _rosterSettings . controls ? "Hide Controls" : "Show Controls" ,
click : function ( ) {
if ( this . label == "Hide Controls" )
{
this . label = "Show Controls" ;
rosterHead . style . display = "none" ;
g _rosterSettings . controls = false ;
}
else
{
this . label = "Hide Controls" ;
rosterHead . style . display = "block" ;
g _rosterSettings . controls = true ;
}
g _menu . items [ 0 ] . label = g _rosterSettings . controls ? "Hide Controls" : "Show Controls" ;
localStorage . rosterSettings = JSON . stringify ( g _rosterSettings ) ;
resize ( ) ;
}
} ) ;
2020-08-22 00:35:49 +00:00
g _compactMenu . append ( item ) ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
item = new nw . MenuItem ( {
type : "normal" ,
2020-08-22 00:35:49 +00:00
label : "Compact Mode" ,
2020-08-19 17:01:51 +00:00
click : function ( ) {
g _rosterSettings . compact = true ;
localStorage . rosterSettings = JSON . stringify ( g _rosterSettings ) ;
resize ( ) ;
}
} ) ;
g _menu . append ( item ) ;
2020-08-22 00:35:49 +00:00
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 ) ;
2020-08-19 17:01:51 +00:00
2020-08-19 16:55:41 +00:00
rosterHead . style . display = g _rosterSettings . controls ? "block" : "none" ;
g _callMenu = new nw . Menu ( ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Lookup" ,
click : function ( ) {
callLookup ( g _targetHash , "" ) ;
}
} ) ;
2020-09-06 23:50:53 +00:00
2020-08-19 16:55:41 +00:00
g _callMenu . append ( item ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Gen Msgs" ,
click : function ( ) {
callGenMessage ( g _targetHash , "" ) ;
}
} ) ;
g _callMenu . append ( item ) ;
item = new nw . MenuItem ( { type : 'separator' } ) ;
g _callMenu . append ( item ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Ignore Call" ,
click : function ( ) {
var thisCall = callRoster [ g _targetHash ] . DEcall ;
g _blockedCalls [ thisCall ] = true ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _callMenu . append ( item ) ;
g _callingMenu = new nw . Menu ( ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Lookup" ,
click : function ( ) {
callingLookup ( g _targetHash , "" ) ;
}
} ) ;
g _callingMenu . append ( item ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Gen Msgs" ,
click : function ( ) {
callingGenMessage ( g _targetHash , "" ) ;
}
} ) ;
g _callingMenu . append ( item ) ;
item = new nw . MenuItem ( { type : 'separator' } ) ;
g _menu . append ( item ) ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
item = new nw . MenuItem ( {
type : "checkbox" ,
label : "Realtime" ,
checked : g _rosterSettings . realtime ,
click : function ( ) {
g _rosterSettings . realtime = this . checked ;
writeRosterSettings ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _menu . append ( item ) ;
item = new nw . MenuItem ( { type : 'separator' } ) ;
g _menu . append ( item ) ;
for ( var key in g _rosterSettings . columns )
{
var itemx = new nw . MenuItem ( {
type : "checkbox" ,
label : key ,
checked : g _rosterSettings . columns [ key ] ,
click : function ( ) {
g _rosterSettings . columns [ this . label ] = this . checked ;
if ( this . label == "Spot" )
window . opener . setRosterSpot ( g _rosterSettings . columns . Spot ) ;
writeRosterSettings ( ) ;
window . opener . goProcessRoster ( ) ;
resize ( ) ;
}
} ) ;
g _menu . append ( itemx ) ;
}
item = new nw . MenuItem ( { type : 'separator' } ) ;
g _menu . append ( item ) ;
g _clearIgnores = new nw . MenuItem ( {
type : "normal" ,
label : "Clear Call Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedCalls = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _menu . append ( g _clearIgnores ) ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
g _clearIgnoresCall = new nw . MenuItem ( {
type : "normal" ,
label : "Clear Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedCalls = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _callMenu . append ( g _clearIgnoresCall ) ;
g _CQMenu = new nw . Menu ( ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Ignore CQ from DXCC" ,
click : function ( ) {
g _blockedCQ [ callRoster [ g _targetCQ ] . DXcall + " from " + window . opener . g _dxccToAltName [ callRoster [ g _targetCQ ] . callObj . dxcc ] ] = true ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _CQMenu . append ( item ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Ignore CQ from All" ,
click : function ( ) {
g _blockedCQ [ callRoster [ g _targetCQ ] . DXcall + " from All" ] = true ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _CQMenu . append ( item ) ;
g _clearCQIgnoreMainMenu = new nw . MenuItem ( {
type : "normal" ,
label : "Clear CQ Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedCQ = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _menu . append ( g _clearCQIgnoreMainMenu ) ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
g _clearCQIgnore = new nw . MenuItem ( {
type : "normal" ,
label : "Clear Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedCQ = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _CQMenu . append ( g _clearCQIgnore ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Edit Ignores" ,
enabled : true ,
click : function ( ) {
openIgnoreEdit ( ) ;
}
} ) ;
g _CQMenu . append ( item ) ;
g _dxccMenu = new nw . Menu ( ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Ignore DXCC" ,
click : function ( ) {
g _blockedDxcc [ g _targetDxcc ] = true ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _dxccMenu . append ( item ) ;
g _clearDxccIgnoreMainMenu = new nw . MenuItem ( {
type : "normal" ,
label : "Clear DXCC Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedDxcc = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _menu . append ( g _clearDxccIgnoreMainMenu ) ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
g _clearDxccIgnore = new nw . MenuItem ( {
type : "normal" ,
label : "Clear Ignore" ,
enabled : false ,
click : function ( ) {
g _blockedDxcc = Object ( ) ;
storeBlocks ( ) ;
window . opener . goProcessRoster ( ) ;
}
} ) ;
g _dxccMenu . append ( g _clearDxccIgnore ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Edit Ignores" ,
enabled : true ,
click : function ( ) {
openIgnoreEdit ( ) ;
}
} ) ;
g _menu . append ( item ) ;
2020-08-26 02:38:51 +00:00
2020-08-19 16:55:41 +00:00
item = new nw . MenuItem ( {
type : "normal" ,
label : "Edit Ignores" ,
enabled : true ,
click : function ( ) {
openIgnoreEdit ( ) ;
}
} ) ;
g _callMenu . append ( item ) ;
item = new nw . MenuItem ( {
type : "normal" ,
label : "Edit Ignores" ,
enabled : true ,
click : function ( ) {
openIgnoreEdit ( ) ;
}
} ) ;
g _dxccMenu . append ( item ) ;
document . body . addEventListener ( 'contextmenu' , function ( ev ) {
ev . preventDefault ( ) ;
if ( editView . style . display == "inline-block" )
return false ;
var len = Object . keys ( g _blockedCalls ) . length ;
if ( len > 0 )
{
g _clearIgnores . enabled = true ;
g _clearIgnores . label = "Clear Call Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
g _clearIgnoresCall . enabled = true ;
g _clearIgnoresCall . label = "Clear Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
}
else
{
g _clearIgnores . label = "Clear Call Ignore" ;
g _clearIgnores . enabled = false ;
g _clearIgnoresCall . label = "Clear Ignore" ;
g _clearIgnoresCall . enabled = false ;
}
len = Object . keys ( g _blockedDxcc ) . length ;
if ( len > 0 )
{
g _clearDxccIgnoreMainMenu . enabled = true ;
g _clearDxccIgnoreMainMenu . label = "Clear DXCC Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
g _clearDxccIgnore . enabled = true ;
g _clearDxccIgnore . label = "Clear Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
}
else
{
g _clearDxccIgnoreMainMenu . label = "Clear DXCC Ignore" ;
g _clearDxccIgnoreMainMenu . enabled = false ;
g _clearDxccIgnore . label = "Clear Ignore" ;
g _clearDxccIgnore . enabled = false ;
}
len = Object . keys ( g _blockedCQ ) . length ;
if ( len > 0 )
{
g _clearCQIgnoreMainMenu . enabled = true ;
g _clearCQIgnoreMainMenu . label = "Clear CQ Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
g _clearCQIgnore . enabled = true ;
g _clearCQIgnore . label = "Clear Ignore" + ( ( len > 1 ) ? "s (" + len + ")" : "" ) ;
}
else
{
g _clearCQIgnoreMainMenu . label = "Clear CQ Ignore" ;
g _clearCQIgnoreMainMenu . enabled = false ;
g _clearCQIgnore . label = "Clear Ignore" ;
g _clearCQIgnore . enabled = false ;
}
2020-08-22 00:35:49 +00:00
if ( typeof ev . target != 'undefined' )
{
var name = ev . target . getAttribute ( "name" ) ;
if ( name == "Callsign" )
2020-08-19 16:55:41 +00:00
{
2020-08-22 00:35:49 +00:00
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 ) ;
}
2020-08-19 16:55:41 +00:00
}
}
else
{
2020-08-22 00:35:49 +00:00
if ( g _rosterSettings . compact == false )
{
g _menu . popup ( ev . x , ev . y ) ;
}
else
{
g _compactMenu . popup ( ev . x , ev . y ) ;
}
2020-08-19 16:55:41 +00:00
}
2020-08-22 00:35:49 +00:00
2020-08-19 16:55:41 +00:00
return false ;
} ) ;
callsignNeed . value = g _rosterSettings . callsign ;
huntMode . value = g _rosterSettings . hunting ;
huntNeed . value = g _rosterSettings . huntNeed ;
wantGrid . checked = g _rosterSettings . requireGrid ;
wantMaxDT . checked = g _rosterSettings . wantMaxDT ;
wantMinDB . checked = g _rosterSettings . wantMinDB ;
wantMinFreq . checked = g _rosterSettings . wantMinFreq ;
wantMaxFreq . checked = g _rosterSettings . wantMaxFreq ;
maxDTView . innerHTML = maxDT . value = g _rosterSettings . maxDT ;
minDbView . innerHTML = minDb . value = g _rosterSettings . minDb ;
minFreqView . innerHTML = minFreq . value = g _rosterSettings . minFreq ;
maxFreqView . innerHTML = maxFreq . value = g _rosterSettings . maxFreq ;
maxLoTW . value = g _rosterSettings . maxLoTW ;
maxLoTWView . innerHTML = ( maxLoTW . value < 27 ) ? Number ( maxLoTW . value ) . toYM ( ) : "<b>∞</b>" ;
cqOnly . checked = g _rosterSettings . cqOnly ;
noMyDxcc . checked = g _rosterSettings . noMyDxcc ;
onlyMyDxcc . checked = g _rosterSettings . onlyMyDxcc ;
2020-08-19 17:01:51 +00:00
noMsg . checked = g _rosterSettings . noMsg ;
onlyMsg . checked = g _rosterSettings . onlyMsg ;
noMsgValue . value = g _rosterSettings . noMsgValue ;
onlyMsgValue . value = g _rosterSettings . onlyMsgValue ;
2020-08-19 16:55:41 +00:00
usesLoTW . checked = g _rosterSettings . usesLoTW ;
useseQSL . checked = g _rosterSettings . useseQSL ;
onlySpot . checked = g _rosterSettings . onlySpot ;
usesOQRS . checked = g _rosterSettings . usesOQRS ;
referenceNeed . value = g _rosterSettings . reference ;
allOnlyNew . checked = g _rosterSettings . allOnlyNew ;
useRegex . checked = g _rosterSettings . useRegex ;
callsignRegex . value = g _rosterSettings . callsignRegex ;
setVisual ( ) ;
document . addEventListener ( 'keydown' , onMyKeyDown , false ) ;
initDXCCSelector ( ) ;
g _timerInterval = setInterval ( realtimeRoster , 1000 ) ;
updateInstances ( ) ;
}
2020-08-19 17:01:51 +00:00
function getTypeFromMode ( mode )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( mode in g _modes )
{
if ( g _modes [ mode ] == true )
return "Digital" ;
else if ( g _modes _phone [ mode ] == true )
return "Phone" ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
}
return "" ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function testAward ( awardName , obj , baseHash )
2020-08-22 00:35:49 +00:00
{
if ( g _awardTracker [ awardName ] . test . dxcc && g _awardTracker [ awardName ] . rule . dxcc . indexOf ( obj . dxcc ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . mode && g _awardTracker [ awardName ] . rule . mode . indexOf ( obj . mode ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . band && g _awardTracker [ awardName ] . rule . band . indexOf ( obj . band ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . DEcall && g _awardTracker [ awardName ] . rule . call . indexOf ( obj . DEcall ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . cont && g _awardTracker [ awardName ] . rule . cont . indexOf ( obj . cont ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . prop && g _awardTracker [ awardName ] . rule . propMode != obj . propMode )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-22 00:35:49 +00:00
if ( g _awardTracker [ awardName ] . test . sat && g _awardTracker [ awardName ] . rule . satName . indexOf ( obj . satName ) == - 1 )
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
2020-08-22 00:35:49 +00:00
return g _awardTypes [ g _awardTracker [ awardName ] . rule . type ] . test ( g _awardTracker [ awardName ] , obj , baseHash ) ;
2020-08-19 17:01:51 +00:00
}
2020-08-22 00:35:49 +00:00
2020-08-19 17:01:51 +00:00
function processAward ( awardName )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var award = g _awards [ g _awardTracker [ awardName ] . sponsor ] . awards [ g _awardTracker [ awardName ] . name ] ;
g _awardTracker [ awardName ] . rule = award . rule ;
var test = g _awardTracker [ awardName ] . test = { } ;
var mode = award . rule . mode . slice ( ) ;
var Index = mode . indexOf ( "Mixed" ) ;
if ( Index > - 1 )
mode . splice ( Index , 1 ) ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
Index = mode . indexOf ( "Digital" ) ;
if ( Index > - 1 )
mode . splice ( Index , 1 ) ;
Index = mode . indexOf ( "Phone" ) ;
if ( Index > - 1 )
mode . splice ( Index , 1 ) ;
test . mode = ( mode . length > 0 ) ;
test . confirmed = ( ( "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 == "confirmed" :
g _awards [ g _awardTracker [ awardName ] . sponsor ] . qsl _req == "confirmed" ) ;
2020-08-22 00:35:49 +00:00
test . look = "confirmed" ;
test . qsl _req = ( ( "qsl_req" in g _awards [ g _awardTracker [ awardName ] . sponsor ] . awards [ g _awardTracker [ awardName ] . name ] . rule ) ?
2020-08-19 17:01:51 +00:00
g _awards [ g _awardTracker [ awardName ] . sponsor ] . awards [ g _awardTracker [ awardName ] . name ] . rule . qsl _req :
g _awards [ g _awardTracker [ awardName ] . sponsor ] . qsl _req ) ;
test . DEcall = ( "call" in award . rule ) ;
test . band = ( "band" in award . rule && award . rule . band . indexOf ( "Mixed" ) == - 1 ) ;
test . dxcc = ( "dxcc" in award . rule ) ;
test . cont = ( "cont" in award . rule ) ;
test . prop = ( "propMode" in award . rule ) ;
test . sat = ( "satName" in award . rule ) ;
g _awardTracker [ awardName ] . stat = { } ;
for ( var i in window . opener . g _QSOhash )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var obj = window . opener . g _QSOhash [ i ] ;
if ( test . confirmed && ! obj . confirmed )
continue ;
if ( obj . dxcc < 1 )
continue ;
if ( test . dxcc && award . rule . dxcc . indexOf ( obj . dxcc ) == - 1 )
continue ;
if ( test . mode && award . rule . mode . indexOf ( obj . mode ) == - 1 )
continue ;
if ( test . band && award . rule . band . indexOf ( obj . band ) == - 1 )
continue ;
if ( test . DEcall && award . rule . call . indexOf ( obj . DEcall ) == - 1 )
continue ;
if ( test . cont && award . rule . cont . indexOf ( obj . cont ) == - 1 )
continue ;
if ( test . prop && award . rule . propMode != obj . propMode )
continue ;
if ( test . sat && award . rule . satName . indexOf ( obj . satName ) == - 1 )
continue ;
g _awardTypes [ award . rule . type ] . score ( g _awardTracker [ awardName ] , obj ) ;
}
g _awardTracker [ awardName ] . comp = g _awardTypes [ award . rule . type ] . compile ( g _awardTracker [ awardName ] , g _awardTracker [ awardName ] . stat ) ;
g _awardTracker [ awardName ] . stat = { } ;
}
function newAwardCountObject ( )
{
var statCountObject = { } ;
statCountObject . bands = { } ;
statCountObject . bands [ "Mixed" ] = { } ;
statCountObject . bands [ "Digital" ] = { } ;
statCountObject . bands [ "Phone" ] = { } ;
statCountObject . modes = { } ;
statCountObject . modes [ "Mixed" ] = { } ;
statCountObject . modes [ "Digital" ] = { } ;
statCountObject . modes [ "Phone" ] = { } ;
statCountObject . unique = null ;
return statCountObject ;
}
function workAwardObject ( obj , band , mode , isDigital , isPhone , unique = null )
{
obj . bands [ "Mixed" ] [ band ] = ~ ~ obj . bands [ "Mixed" ] [ band ] + 1 ;
if ( ! ( mode in obj . bands ) )
obj . bands [ mode ] = { } ;
obj . bands [ mode ] [ band ] = ~ ~ obj . bands [ mode ] [ band ] + 1 ;
obj . modes [ "Mixed" ] [ mode ] = ~ ~ obj . modes [ "Mixed" ] [ mode ] + 1 ;
if ( isDigital )
{
obj . bands [ "Digital" ] [ band ] = ~ ~ obj . bands [ "Digital" ] [ band ] + 1 ;
obj . modes [ "Digital" ] [ mode ] = ~ ~ obj . modes [ "Digital" ] [ mode ] + 1 ;
}
if ( isPhone )
{
obj . bands [ "Phone" ] [ band ] = ~ ~ obj . bands [ "Phone" ] [ band ] + 1 ;
obj . modes [ "Phone" ] [ mode ] = ~ ~ obj . modes [ "Phone" ] [ mode ] + 1 ;
}
if ( unique )
{
if ( obj . unique == null )
obj . unique = { } ;
if ( ! ( unique in obj . unique ) )
obj . unique [ unique ] = newAwardCountObject ( ) ;
workAwardObject ( obj . unique [ unique ] , band , mode , isDigital , isPhone ) ;
}
return true ;
}
function buildAwardTypeHandlers ( )
{
g _awardTypes =
{
"IOTA" : { "name" : "Islands On The Air" } ,
"call" : { "name" : "Callsign" } ,
"callarea" : { "name" : "Call Area" } ,
"calls2dxcc" : { "name" : "Stations per DXCC" } ,
"cnty" : { "name" : "County" } ,
"cont" : { "name" : "Continents" } ,
"cont5" : { "name" : "5 Continents" } ,
"cont52band" : { "name" : "5 Continents per Band" } ,
"cqz" : { "name" : "CQ Zone" } ,
"dxcc" : { "name" : "DXCC" } ,
"grids" : { "name" : "Grids" } ,
"numsfx" : { "name" : "Call Area + Suffix" } ,
"px" : { "name" : "Prefix" } ,
"pxa" : { "name" : "Prefixes" } ,
"pxplus" : { "name" : "Special Calls" } ,
"sfx" : { "name" : "Suffix" } ,
"states" : { "name" : "States" } ,
"cont2band" : { "name" : "Continents per Band" } ,
"calls2band" : { "name" : "Stations per Band" } ,
"dxcc2band" : { "name" : "DXCC per Band" } ,
"states2band" : { "name" : "States per Band" }
} ;
g _awardTypes [ "IOTA" ] . score = scoreAIOTA ;
g _awardTypes [ "call" ] . score = scoreAcall ;
g _awardTypes [ "callarea" ] . score = scoreAcallarea ;
g _awardTypes [ "calls2dxcc" ] . score = scoreAcalls2dxcc ;
g _awardTypes [ "cnty" ] . score = scoreAcnty ;
g _awardTypes [ "cont" ] . score = scoreAcont ;
g _awardTypes [ "cont5" ] . score = scoreAcont5 ;
g _awardTypes [ "cont52band" ] . score = scoreAcont52band ;
g _awardTypes [ "cqz" ] . score = scoreAcqz ;
g _awardTypes [ "dxcc" ] . score = scoreAdxcc ;
g _awardTypes [ "grids" ] . score = scoreAgrids ;
g _awardTypes [ "numsfx" ] . score = scoreAnumsfx ;
g _awardTypes [ "px" ] . score = scoreApx ;
g _awardTypes [ "pxa" ] . score = scoreApxa ;
g _awardTypes [ "pxplus" ] . score = scoreApxplus ;
g _awardTypes [ "sfx" ] . score = scoreAsfx ;
g _awardTypes [ "states" ] . score = scoreAstates ;
g _awardTypes [ "cont2band" ] . score = scoreAcont2band ;
g _awardTypes [ "calls2band" ] . score = scoreAcalls2band ;
g _awardTypes [ "dxcc2band" ] . score = scoreAdxcc2band ;
g _awardTypes [ "states2band" ] . score = scoreAstates2band ;
g _awardTypes [ "IOTA" ] . test = testAIOTA ;
g _awardTypes [ "call" ] . test = testAcall ;
g _awardTypes [ "callarea" ] . test = testAcallarea ;
g _awardTypes [ "calls2dxcc" ] . test = testAcalls2dxcc ;
g _awardTypes [ "cnty" ] . test = testAcnty ;
g _awardTypes [ "cont" ] . test = testAcont ;
g _awardTypes [ "cont5" ] . test = testAcont5 ;
g _awardTypes [ "cont52band" ] . test = testAcont52band ;
g _awardTypes [ "cqz" ] . test = testAcqz ;
g _awardTypes [ "dxcc" ] . test = testAdxcc ;
g _awardTypes [ "grids" ] . test = testAgrids ;
g _awardTypes [ "numsfx" ] . test = testAnumsfx ;
g _awardTypes [ "px" ] . test = testApx ;
g _awardTypes [ "pxa" ] . test = testApxa ;
g _awardTypes [ "pxplus" ] . test = testApxplus ;
g _awardTypes [ "sfx" ] . test = testAsfx ;
g _awardTypes [ "states" ] . test = testAstates ;
g _awardTypes [ "cont2band" ] . test = testAcont2band ;
g _awardTypes [ "calls2band" ] . test = testAcalls2band ;
g _awardTypes [ "dxcc2band" ] . test = testAdxcc2band ;
g _awardTypes [ "states2band" ] . test = testAstates2band ;
g _awardTypes [ "IOTA" ] . compile = singleCompile ;
g _awardTypes [ "call" ] . compile = singleCompile ;
g _awardTypes [ "callarea" ] . compile = singleCompile ;
g _awardTypes [ "calls2dxcc" ] . compile = doubleCompile ;
g _awardTypes [ "cnty" ] . compile = singleCompile ;
g _awardTypes [ "cont" ] . compile = singleCompile ;
g _awardTypes [ "cont5" ] . compile = singleCompile ;
g _awardTypes [ "cont52band" ] . compile = doubleCompile ;
g _awardTypes [ "cqz" ] . compile = singleCompile ;
g _awardTypes [ "dxcc" ] . compile = singleCompile ;
g _awardTypes [ "grids" ] . compile = singleCompile ;
g _awardTypes [ "numsfx" ] . compile = singleCompile ;
g _awardTypes [ "px" ] . compile = singleCompile ;
g _awardTypes [ "pxa" ] . compile = singleCompile ;
g _awardTypes [ "pxplus" ] . compile = singleCompile ;
g _awardTypes [ "sfx" ] . compile = singleCompile ;
g _awardTypes [ "states" ] . compile = singleCompile ;
g _awardTypes [ "cont2band" ] . compile = doubleCompile ;
g _awardTypes [ "calls2band" ] . compile = doubleCompile ;
g _awardTypes [ "dxcc2band" ] . compile = doubleCompile ;
g _awardTypes [ "states2band" ] . compile = doubleCompile ;
}
function scoreAstates ( award , obj )
{
if ( obj . state )
{
if ( ! ( obj . state in award . stat ) )
award . stat [ obj . state ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . state ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
function testAstates ( award , obj , baseHash )
{
if ( obj . state && obj . state + baseHash in g _tracker [ award . test . look ] . state )
{
return false ;
}
return true ;
}
function scoreAstates2band ( award , obj )
{
if ( obj . state )
{
if ( ! ( obj . band in award . stat ) )
award . stat [ obj . band ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . band ] , obj . band , obj . mode , obj . digital , obj . phone , obj . state ) ;
}
return false ;
}
function testAstates2band ( award , obj , baseHash )
{
if ( obj . state && obj . state + baseHash in g _tracker [ award . test . look ] . state )
{
return false ;
}
return true ;
}
function scoreAdxcc ( award , obj )
{
if ( ! ( obj . dxcc in award . stat ) )
award . stat [ obj . dxcc ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . dxcc ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
function testAdxcc ( award , obj , baseHash )
{
if ( String ( obj . dxcc ) + baseHash in g _tracker [ award . test . look ] . dxcc )
{
return false ;
}
return true ;
}
function scoreAcont ( award , obj )
{
if ( obj . cont )
{
var cont = obj . cont ;
if ( cont == "AN" )
cont = "OC" ;
if ( ! ( cont in award . stat ) )
award . stat [ cont ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ cont ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
function testAcont ( award , obj , baseHash )
{
if ( obj . cont )
{
var cont = obj . cont ;
if ( cont == "AN" )
cont = "OC" ;
if ( cont + baseHash in g _tracker [ award . test . look ] . cont )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
return false ;
}
}
return true ;
}
function scoreAcont5 ( award , obj , baseHash )
{
if ( obj . cont )
{
var cont = obj . cont ;
if ( cont == "NA" || cont == "SA" )
cont = "AM" ;
if ( cont == "AN" )
cont = "OC" ;
if ( ! ( cont in award . stat ) )
award . stat [ cont ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ cont ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
function testAcont5 ( award , obj , baseHash )
{
if ( obj . cont )
{
var cont = obj . cont ;
if ( cont == "NA" || cont == "SA" )
cont = "AM" ;
if ( cont == "AN" )
cont = "OC" ;
if ( cont + baseHash in g _tracker [ award . test . look ] . cont )
{
return false ;
2020-08-19 16:55:41 +00:00
}
}
2020-08-19 17:01:51 +00:00
return true ;
}
function scoreAcont2band ( award , obj )
{
if ( ! ( obj . band in award . stat ) )
award . stat [ obj . band ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . band ] , obj . band , obj . mode , obj . digital , obj . phone , obj . cont ) ;
}
function testAcont2band ( award , obj , baseHash )
{
if ( obj . cont )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var cont = obj . cont ;
if ( cont == "AN" )
cont = "OC" ;
if ( cont + baseHash in g _tracker [ award . test . look ] . cont )
{
return false ;
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
return true ;
}
function scoreAcont52band ( award , obj )
{
if ( obj . cont )
{
var cont = obj . cont ;
if ( cont == "NA" || cont == "SA" )
cont = "AM" ;
if ( cont == "AN" )
cont = "OC" ;
if ( ! ( obj . band in award . stat ) )
award . stat [ obj . band ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . band ] , obj . band , obj . mode , obj . digital , obj . phone , cont ) ;
}
return false ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function testAcont52band ( award , obj , baseHash )
{
if ( obj . cont )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var cont = obj . cont ;
if ( cont == "NA" || cont == "SA" )
cont = "AM" ;
if ( cont == "AN" )
cont = "OC" ;
if ( cont + baseHash in g _tracker [ award . test . look ] . cont )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
}
}
2020-08-19 17:01:51 +00:00
return true ;
}
function scoreAgrids ( award , obj )
{
if ( obj . grid )
{
var grid = obj . grid . substr ( 0 , 4 ) ;
if ( ! ( grid in award . stat ) )
award . stat [ grid ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ grid ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
return false ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function testAgrids ( award , obj , baseHash )
{
if ( obj . grid && obj . grid + baseHash in g _tracker [ award . test . look ] . grid )
{
return false ;
}
return true ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function scoreAcnty ( award , obj )
{
if ( obj . cnty )
{
if ( ! ( obj . cnty in award . stat ) )
award . stat [ obj . cnty ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . cnty ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function testAcnty ( award , obj , baseHash )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( obj . cnty && obj . cnty + baseHash in g _tracker [ award . test . look ] . cnty )
{
return false ;
}
return true ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function scoreAcall ( award , obj )
{
var call = obj . DEcall ;
if ( call . indexOf ( "/" ) > - 1 )
{
if ( call . endsWith ( "/MM" ) )
return false ;
call = call . replace ( "/P" , "" ) . replace ( "/R" , "" ) . replace ( "/QRP" ) ;
}
if ( ! ( call in award . stat ) )
award . stat [ call ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ call ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
function testAcall ( award , obj , baseHash )
{
if ( obj . DEcall . indexOf ( "/" ) > - 1 && obj . DEcall . endsWith ( "/MM" ) )
return false ;
if ( obj . DEcall + baseHash in g _tracker [ award . test . look ] . call )
{
return false ;
}
return true ;
}
function scoreAIOTA ( award , obj )
{
if ( obj . IOTA )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
if ( "IOTA" in test . rule && test . rule . IOTA . indexOf ( obj . IOTA ) == - 1 )
return false ;
if ( ! ( obj . IOTA in award . stat ) )
award . stat [ obj . IOTA ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . IOTA ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
// NO IOTA YET
function testAIOTA ( award , obj , baseHash )
{
/ * i f ( o b j . I O T A )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
if ( "IOTA" in test . rule && test . rule . IOTA . indexOf ( obj . IOTA ) == - 1 )
return false ;
} * /
return false ;
}
function scoreAcallarea ( award , obj )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( obj . zone != null )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
if ( "zone" in test . rule && test . rule . zone . indexOf ( obj . zone ) == - 1 )
return false ;
if ( ! ( obj . zone in award . stat ) )
award . stat [ obj . zone ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . zone ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function testAcallarea ( award , obj , baseHash )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( obj . zone != null )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
if ( "zone" in test . rule && test . rule . zone . indexOf ( obj . zone ) == - 1 )
return false ;
}
return true ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function scoreApx ( award , obj )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( obj . px )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var px = obj . px ;
if ( "px" in test . rule )
{
px = px . substr ( 0 , test . rule . px [ 0 ] . length ) ;
if ( test . rule . px . indexOf ( px ) == - 1 )
return false ;
}
if ( ! ( px in award . stat ) )
award . stat [ px ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ px ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function testApx ( award , obj , baseHash )
{
if ( obj . px )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var px = obj . px ;
if ( "px" in test . rule )
{
px = px . substr ( 0 , test . rule . px [ 0 ] . length ) ;
if ( test . rule . px . indexOf ( px ) == - 1 )
return false ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
if ( String ( obj . px ) + baseHash in g _tracker [ award . test . look ] . px )
{
return false ;
}
}
return true ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function scoreApxa ( award , obj )
{
if ( obj . px )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
for ( var i in test . rule . pxa )
{
if ( test . rule . pxa [ i ] . indexOf ( obj . px ) > - 1 )
{
if ( ! ( i in award . stat ) )
award . stat [ i ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ i ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
}
}
return false ;
}
function testApxa ( award , obj , baseHash )
{
if ( obj . px )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
for ( var i in test . rule . pxa )
{
if ( test . rule . pxa [ i ] . indexOf ( obj . px ) > - 1 )
{
2020-08-26 02:38:51 +00:00
if ( String ( obj . px ) + baseHash in g _tracker [ award . test . look ] . px )
{
return false ;
}
else
{
return true ;
}
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
}
2020-08-26 02:38:51 +00:00
return false ;
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function scoreAsfx ( award , obj )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var suf = obj . DEcall . replace ( obj . px , "" ) ;
for ( var i in test . rule . sfx )
{
for ( var s in test . rule . sfx [ i ] )
{
if ( suf . indexOf ( test . rule . sfx [ i ] [ s ] ) == 0 )
{
if ( ! ( i in award . stat ) )
award . stat [ i ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ i ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
return false ;
}
function testAsfx ( award , obj , baseHash )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var suf = obj . DEcall . replace ( obj . px , "" ) ;
for ( var i in test . rule . sfx )
{
for ( var s in test . rule . sfx [ i ] )
{
if ( suf . indexOf ( test . rule . sfx [ i ] [ s ] ) == 0 )
{
return false ;
}
}
}
return true ;
}
function scoreAcalls2dxcc ( award , obj )
{
if ( ! ( obj . dxcc in award . stat ) )
award . stat [ obj . dxcc ] = newAwardCountObject ( ) ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
return workAwardObject ( award . stat [ obj . dxcc ] , obj . band , obj . mode , obj . digital , obj . phone , obj . DEcall ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function testAcalls2dxcc ( award , obj , baseHash )
{
if ( obj . DEcall + baseHash in g _tracker [ award . test . look ] . call )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
return true ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function scoreAcalls2band ( award , obj )
{
if ( ! ( obj . band in award . stat ) )
award . stat [ obj . band ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . band ] , obj . band , obj . mode , obj . digital , obj . phone , obj . DEcall ) ;
}
function testAcalls2band ( award , obj , baseHash )
{
if ( obj . DEcall + baseHash in g _tracker [ award . test . look ] . call )
{
return false ;
}
return true ;
}
function scoreAdxcc2band ( award , obj )
{
if ( ! ( obj . band in award . stat ) )
award . stat [ obj . band ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . band ] , obj . band , obj . mode , obj . digital , obj . phone , obj . dxcc ) ;
}
function testAdxcc2band ( award , obj , baseHash )
{
if ( String ( obj . dxcc ) + baseHash in g _tracker [ award . test . look ] . dxcc )
{
return false ;
}
return true ;
}
function scoreAcqz ( award , obj )
{
if ( obj . cqz )
{
if ( ! ( obj . cqz in award . stat ) )
award . stat [ obj . cqz ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ obj . cqz ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
return false ;
}
function testAcqz ( award , obj , baseHash )
{
2020-09-01 00:31:25 +00:00
if ( obj . cqza )
2020-08-19 17:01:51 +00:00
{
2020-09-01 00:31:25 +00:00
var x = 0 ;
for ( var z in obj . cqza )
{
if ( obj . cqza [ z ] + baseHash in g _tracker [ award . test . look ] . cqz )
x ++ ;
}
if ( obj . cqza . length == x )
return false ;
2020-08-19 17:01:51 +00:00
}
return true ;
}
function scoreAnumsfx ( award , obj )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var px = obj . px . substr ( 0 , obj . px . length - 1 ) ;
var suf = obj . DEcall . replace ( px , "" ) ;
suf = suf . substr ( 0 , test . rule . numsfx [ 0 ] [ 0 ] . length ) ;
for ( var i in test . rule . numsfx )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
for ( var s in test . rule . numsfx [ i ] )
{
if ( suf . indexOf ( test . rule . numsfx [ i ] [ s ] ) == 0 )
{
if ( ! ( i in award . stat ) )
award . stat [ i ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ i ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function testAnumsfx ( award , obj )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var px = obj . px . substr ( 0 , obj . px . length - 1 ) ;
var suf = obj . DEcall . replace ( px , "" ) ;
suf = suf . substr ( 0 , test . rule . numsfx [ 0 ] [ 0 ] . length ) ;
for ( var i in test . rule . numsfx )
{
for ( var s in test . rule . numsfx [ i ] )
{
if ( suf . indexOf ( test . rule . numsfx [ i ] [ s ] ) == 0 )
{
return false ;
}
}
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
return true ;
}
function scoreApxplus ( award , obj )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
if ( test . rule . pxplus )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
for ( var i in test . rule . pxplus )
{
if ( obj . DEcall . indexOf ( test . rule . pxplus [ i ] ) == 0 )
{
if ( ! ( i in award . stat ) )
award . stat [ i ] = newAwardCountObject ( ) ;
return workAwardObject ( award . stat [ i ] , obj . band , obj . mode , obj . digital , obj . phone ) ;
}
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
return false ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function testApxplus ( award , obj )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
if ( test . rule . pxplus )
{
for ( var i in test . rule . pxplus )
{
if ( obj . DEcall . indexOf ( test . rule . pxplus [ i ] ) == 0 )
{
return false ;
}
}
}
return true ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function loadAwardJson ( )
{
g _awards = { } ;
var fs = require ( 'fs' ) ;
if ( fs . existsSync ( "./data/awards.json" ) )
{
fileBuf = fs . readFileSync ( "./data/awards.json" ) ;
try {
g _awards = JSON . parse ( fileBuf ) ;
//fs.writeFileSync("./data/awards.json", JSON.stringify(g_awards,null,2));
for ( var sp in g _awards )
{
for ( var aw in g _awards [ sp ] . awards )
{
if ( ! ( "unique" in g _awards [ sp ] . awards [ aw ] . rule ) )
g _awards [ sp ] . awards [ aw ] . rule . unique = 1 ;
if ( g _awards [ sp ] . awards [ aw ] . rule . band [ 0 ] == "Mixed" )
{
g _awards [ sp ] . awards [ aw ] . rule . band . shift ( ) ;
}
if ( g _awards [ sp ] . awards [ aw ] . rule . band . length == 0 )
{
g _awards [ sp ] . awards [ aw ] . rule . band = [ ] ;
for ( var key in g _awards [ sp ] . mixed )
{
g _awards [ sp ] . awards [ aw ] . rule . band . push ( g _awards [ sp ] . mixed [ key ] ) ;
}
}
if ( g _awards [ sp ] . awards [ aw ] . rule . endorse . length == 1 && g _awards [ sp ] . awards [ aw ] . rule . endorse [ 0 ] == "Mixed" )
{
g _awards [ sp ] . awards [ aw ] . rule . endorse = [ ] ;
for ( var key in g _awards [ sp ] . mixed )
{
g _awards [ sp ] . awards [ aw ] . rule . endorse . push ( g _awards [ sp ] . mixed [ key ] ) ;
}
}
}
}
buildAwardTypeHandlers ( ) ;
}
catch ( e ) {
alert ( "Core awards.json : " + ( e ) ) ;
g _awards = { } ;
}
delete filebuf ;
}
else
alert ( "Missing core awards.json" ) ;
}
function processAllAwardTrackers ( )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
for ( var tracker in g _awardTracker )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
if ( ! ( g _awardTracker [ tracker ] . sponsor in g _awards ) )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
delete g _awardTracker [ tracker ] ;
continue ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
if ( ! ( g _awardTracker [ tracker ] . name in g _awards [ g _awardTracker [ tracker ] . sponsor ] . awards ) )
{
delete g _awardTracker [ tracker ] ;
continue ;
}
processAward ( tracker ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
updateAwardList ( ) ;
}
function newAwardTrackerObject ( sponsor , award , enable )
{
var newAward = { } ;
newAward . sponsor = sponsor ;
newAward . name = award ;
newAward . enable = enable ;
newAward . mode = g _awards [ sponsor ] . awards [ award ] . rule . mode [ 0 ] ;
newAward . band = g _awards [ sponsor ] . awards [ award ] . rule . band [ 0 ] ;
newAward . count = g _awards [ sponsor ] . awards [ award ] . rule . count [ 0 ] ,
newAward . stat = { } ;
newAward . comp = { } ;
newAward . test = { } ;
return newAward ;
}
function addAllAwards ( )
{
for ( var sponsor in g _awards )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
for ( var award in g _awards [ sponsor ] . awards )
{
var awardToAdd = newAwardTrackerObject ( sponsor , award , true ) ;
var hash = awardToAdd . name + "-" + awardToAdd . sponsor ;
if ( ! ( hash in g _awardTracker ) )
{
g _awardTracker [ hash ] = awardToAdd ;
processAward ( hash ) ;
storeAwardTracker ( ) ;
}
}
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
updateAwardList ( ) ;
window . opener . goProcessRoster ( ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function delAllAwards ( )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
g _awardTracker = { } ;
storeAwardTracker ( ) ;
updateAwardList ( ) ;
window . opener . goProcessRoster ( ) ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function newCompileCountObject ( )
2020-08-19 16:55:41 +00:00
{
2020-08-19 17:01:51 +00:00
var compileCountObject = { } ;
compileCountObject . bands = { } ;
compileCountObject . modes = { } ;
compileCountObject . endorse = { } ;
compileCountObject . counts = { } ;
return compileCountObject ;
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
function singleCompile ( award , obj )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var rule = test . rule ;
var comp = newCompileCountObject ( ) ;
for ( var mode in rule . mode )
{
comp . modes [ rule . mode [ mode ] ] = 0 ;
comp . bands [ rule . mode [ mode ] ] = { } ;
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
for ( var band in rule . band )
{
comp . bands [ rule . mode [ mode ] ] [ rule . band [ band ] ] = 0 ;
}
for ( var key in obj )
{
if ( rule . mode [ mode ] in obj [ key ] . bands && Object . keys ( obj [ key ] . bands [ rule . mode [ mode ] ] ) . length )
{
comp . modes [ rule . mode [ mode ] ] += 1 ;
for ( var band in rule . band )
{
if ( rule . band [ band ] in obj [ key ] . bands [ rule . mode [ mode ] ] )
comp . bands [ rule . mode [ mode ] ] [ rule . band [ band ] ] += 1 ;
}
}
}
}
2020-08-19 16:55:41 +00:00
2020-08-19 17:01:51 +00:00
for ( var mode in comp . modes )
{
comp . endorse [ mode ] = { } ;
comp . counts [ mode ] = { } ;
for ( var cnts in rule . count )
{
comp . counts [ mode ] [ rule . count [ cnts ] ] = { "num" : comp . modes [ mode ] , "per" : parseInt ( Math . min ( 100 , ( comp . modes [ mode ] / rule . count [ cnts ] ) * 100.0 ) ) } ;
}
for ( var endorse in rule . endorse )
{
comp . endorse [ mode ] [ rule . endorse [ endorse ] ] = { }
for ( var cnts in rule . count )
{
comp . endorse [ mode ] [ rule . endorse [ endorse ] ] [ rule . count [ cnts ] ] = ( comp . bands [ mode ] [ rule . endorse [ endorse ] ] >= rule . count [ cnts ] ) ;
}
}
}
return comp ;
2020-08-19 16:55:41 +00:00
}
2020-08-19 17:01:51 +00:00
function doubleCompile ( award , firstLevel )
{
var test = g _awards [ award . sponsor ] . awards [ award . name ] ;
var rule = test . rule ;
for ( var k in firstLevel )
{
firstLevel [ k ] . bands = { } ;
//firstLevel[k].modes = {};
var obj = singleCompile ( award , firstLevel [ k ] . unique ) ;
for ( var mode in obj . bands )
{
for ( var cnt in test . rule . count )
{
if ( obj . counts [ mode ] [ test . rule . count [ cnt ] ] . num >= test . rule . unique )
for ( var band in obj . bands [ mode ] )
{
if ( ! ( mode in firstLevel [ k ] . bands ) )
firstLevel [ k ] . bands [ mode ] = { } ;
if ( obj . bands [ mode ] [ band ] > 0 )
firstLevel [ k ] . bands [ mode ] [ band ] = ~ ~ firstLevel [ k ] . bands [ mode ] [ band ] + 1 ;
}
}
}
/ * f o r ( v a r m o d e i n o b j . m o d e s )
{
if ( ! ( mode in firstLevel [ k ] . modes ) )
firstLevel [ k ] . modes [ mode ] = 0 ;
if ( obj . modes [ mode ] > 0 )
firstLevel [ k ] . modes [ mode ] += 1 ;
} * /
delete firstLevel [ k ] . unique ;
firstLevel [ k ] . unique = null ;
}
return singleCompile ( award , firstLevel ) ;
2020-09-04 23:14:05 +00:00
}