kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Merge branch 'prettier-to-eslint' into 'master'
Replace Prettier with ESLint See merge request gridtracker.org/gridtracker!40merge-requests/43/head
commit
aae9c21fdd
|
@ -0,0 +1,42 @@
|
|||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
commonjs: true,
|
||||
es6: true,
|
||||
node: true
|
||||
},
|
||||
extends: [
|
||||
"standard"
|
||||
],
|
||||
globals: {
|
||||
Atomics: "readonly",
|
||||
SharedArrayBuffer: "readonly"
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018
|
||||
},
|
||||
rules: {
|
||||
/* See https://eslint.org/docs/rules/ */
|
||||
/* 0: off, 1: warn, 2: error */
|
||||
|
||||
/* Style rules reflecting Tag's preferences */
|
||||
"brace-style": [1, "allman", { allowSingleLine: true }],
|
||||
quotes: [2, "double"],
|
||||
camelcase: 0,
|
||||
semi: 0,
|
||||
"space-before-function-paren": 0,
|
||||
"one-var": 0,
|
||||
|
||||
/* ESLint checks we should consider fixing in the future */
|
||||
eqeqeq: 0,
|
||||
"no-unused-vars": 0,
|
||||
"no-redeclare": 0,
|
||||
"no-undef": 0,
|
||||
"no-array-constructor": 0,
|
||||
"prefer-const": 0,
|
||||
"no-var": 0,
|
||||
"no-extend-native": 0,
|
||||
"prefer-regex-literals": 0,
|
||||
"no-prototype-builtins": 0
|
||||
}
|
||||
};
|
|
@ -1,10 +0,0 @@
|
|||
node_modules/
|
||||
macos/
|
||||
debian/
|
||||
build/
|
||||
package.nw/lib/ol.js
|
||||
package.nw/lib/moment-with-locales.js
|
||||
package.nw/lib/moment-timezone-with-data.js
|
||||
package.nw/lib/datepicker.js
|
||||
package.nw/lib/third-party.js
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"printWidth": 80,
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.html"],
|
||||
"options": {
|
||||
"printWidth": 120
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -13,16 +13,11 @@ among other things.
|
|||
|
||||
### Code Formatting
|
||||
|
||||
We use `prettier` to enforce code formatting rules, and we follow
|
||||
the [JavaScript Standard Style](https://standardjs.com/)
|
||||
We use `eslint` to enforce code formatting rules.
|
||||
|
||||
You can use all kinds of plugins and configurations in your text editor to verify these rules, and even reformat code
|
||||
automatically, but if you want to run on the command line, you can (after running `npm install`) run the
|
||||
`npm run prettier-check` command to verify the formatting of all files, or `npm run prettier-write` to reformat
|
||||
all files to match the standard.
|
||||
|
||||
If you want to know more about why these tools are useful,
|
||||
[watch this talk](https://www.youtube.com/watch?v=kuHfMw8j4xk)
|
||||
`npm run lint-check` command to verify the formatting of all files, or `npm run lint-fix` to reformat all files to match the standard.
|
||||
|
||||
# Developer Environment Setup
|
||||
|
||||
|
|
11
package.json
11
package.json
|
@ -2,13 +2,18 @@
|
|||
"name": "gridtracker-development",
|
||||
"version": "1.0.0",
|
||||
"devDependencies": {
|
||||
"eslint": "^7.15.0",
|
||||
"eslint-config-standard": "^16.0.2",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^4.2.1",
|
||||
"nwjs-builder-phoenix": "^1.15.0",
|
||||
"prettier": "^2.2.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "npm run prettier-check",
|
||||
"prettier-check": "npx prettier --check package.nw",
|
||||
"prettier-write": "npx prettier --write package.nw",
|
||||
"test": "eslint package.nw",
|
||||
"lint-check": "eslint --fix package.nw",
|
||||
"lint-fix": "eslint --fix package.nw",
|
||||
"dist": "build --concurrent --tasks win-x86,win-x64,linux-x86,linux-x64,mac-x64 package.nw",
|
||||
"distsome": "build --debug --tasks linux-x64,mac-x64 package.nw",
|
||||
"start": "run package.nw"
|
||||
|
|
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
|
@ -3,75 +3,94 @@
|
|||
var D2R = Math.PI / 180;
|
||||
var R2D = 180 / Math.PI;
|
||||
|
||||
var Coord = function (lon, lat) {
|
||||
var Coord = function (lon, lat)
|
||||
{
|
||||
this.lon = lon;
|
||||
this.lat = lat;
|
||||
this.x = D2R * lon;
|
||||
this.y = D2R * lat;
|
||||
};
|
||||
|
||||
Coord.prototype.view = function () {
|
||||
Coord.prototype.view = function ()
|
||||
{
|
||||
return String(this.lon).slice(0, 4) + "," + String(this.lat).slice(0, 4);
|
||||
};
|
||||
|
||||
Coord.prototype.antipode = function () {
|
||||
Coord.prototype.antipode = function ()
|
||||
{
|
||||
var anti_lat = -1 * this.lat;
|
||||
var anti_lon = this.lon < 0 ? 180 + this.lon : (180 - this.lon) * -1;
|
||||
return new Coord(anti_lon, anti_lat);
|
||||
};
|
||||
|
||||
var LineString = function () {
|
||||
var LineString = function ()
|
||||
{
|
||||
this.coords = [];
|
||||
this.length = 0;
|
||||
};
|
||||
|
||||
LineString.prototype.move_to = function (coord) {
|
||||
LineString.prototype.move_to = function (coord)
|
||||
{
|
||||
this.length++;
|
||||
this.coords.push(coord);
|
||||
};
|
||||
|
||||
var Arc = function (properties) {
|
||||
var Arc = function (properties)
|
||||
{
|
||||
this.properties = properties || {};
|
||||
this.geometries = [];
|
||||
};
|
||||
|
||||
Arc.prototype.json = function () {
|
||||
if (this.geometries.length <= 0) {
|
||||
Arc.prototype.json = function ()
|
||||
{
|
||||
if (this.geometries.length <= 0)
|
||||
{
|
||||
return {
|
||||
geometry: { type: "LineString", coordinates: null },
|
||||
type: "Feature",
|
||||
properties: this.properties,
|
||||
properties: this.properties
|
||||
};
|
||||
} else if (this.geometries.length == 1) {
|
||||
}
|
||||
else if (this.geometries.length == 1)
|
||||
{
|
||||
return {
|
||||
geometry: { type: "LineString", coordinates: this.geometries[0].coords },
|
||||
type: "Feature",
|
||||
properties: this.properties,
|
||||
properties: this.properties
|
||||
};
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var multiline = [];
|
||||
for (var i = 0; i < this.geometries.length; i++) {
|
||||
for (var i = 0; i < this.geometries.length; i++)
|
||||
{
|
||||
multiline.push(this.geometries[i].coords);
|
||||
}
|
||||
return {
|
||||
geometry: { type: "MultiLineString", coordinates: multiline },
|
||||
type: "Feature",
|
||||
properties: this.properties,
|
||||
properties: this.properties
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// TODO - output proper multilinestring
|
||||
Arc.prototype.wkt = function () {
|
||||
Arc.prototype.wkt = function ()
|
||||
{
|
||||
var wkt_string = "";
|
||||
var wkt = "LINESTRING(";
|
||||
var collect = function (c) {
|
||||
var collect = function (c)
|
||||
{
|
||||
wkt += c[0] + " " + c[1] + ",";
|
||||
};
|
||||
for (var i = 0; i < this.geometries.length; i++) {
|
||||
if (this.geometries[i].coords.length === 0) {
|
||||
for (var i = 0; i < this.geometries.length; i++)
|
||||
{
|
||||
if (this.geometries[i].coords.length === 0)
|
||||
{
|
||||
return "LINESTRING(empty)";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var coords = this.geometries[i].coords;
|
||||
coords.forEach(collect);
|
||||
wkt_string += wkt.substring(0, wkt.length - 1) + ")";
|
||||
|
@ -84,13 +103,16 @@ Arc.prototype.wkt = function () {
|
|||
* http://en.wikipedia.org/wiki/Great-circle_distance
|
||||
*
|
||||
*/
|
||||
var GreatCircle = function (start, end, properties) {
|
||||
if (!start || start.x === undefined || start.y === undefined) {
|
||||
var GreatCircle = function (start, end, properties)
|
||||
{
|
||||
if (!start || start.x === undefined || start.y === undefined)
|
||||
{
|
||||
throw new Error(
|
||||
"GreatCircle constructor expects two args: start and end objects with x and y properties"
|
||||
);
|
||||
}
|
||||
if (!end || end.x === undefined || end.y === undefined) {
|
||||
if (!end || end.x === undefined || end.y === undefined)
|
||||
{
|
||||
throw new Error(
|
||||
"GreatCircle constructor expects two args: start and end objects with x and y properties"
|
||||
);
|
||||
|
@ -108,7 +130,8 @@ var GreatCircle = function (start, end, properties) {
|
|||
Math.pow(Math.sin(w / 2.0), 2);
|
||||
this.g = 2.0 * Math.asin(Math.sqrt(z));
|
||||
|
||||
if (this.g == Math.PI) {
|
||||
if (this.g == Math.PI)
|
||||
{
|
||||
throw new Error(
|
||||
"it appears " +
|
||||
start.view() +
|
||||
|
@ -116,7 +139,9 @@ var GreatCircle = function (start, end, properties) {
|
|||
end.view() +
|
||||
" are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite"
|
||||
);
|
||||
} else if (isNaN(this.g)) {
|
||||
}
|
||||
else if (isNaN(this.g))
|
||||
{
|
||||
throw new Error(
|
||||
"could not calculate great circle between " + start + " and " + end
|
||||
);
|
||||
|
@ -126,7 +151,8 @@ var GreatCircle = function (start, end, properties) {
|
|||
/*
|
||||
* http://williams.best.vwh.net/avform.htm#Intermediate
|
||||
*/
|
||||
GreatCircle.prototype.interpolate = function (f) {
|
||||
GreatCircle.prototype.interpolate = function (f)
|
||||
{
|
||||
var A = Math.sin((1 - f) * this.g) / Math.sin(this.g);
|
||||
var B = Math.sin(f * this.g) / Math.sin(this.g);
|
||||
var x =
|
||||
|
@ -144,14 +170,19 @@ GreatCircle.prototype.interpolate = function (f) {
|
|||
/*
|
||||
* Generate points along the great circle
|
||||
*/
|
||||
GreatCircle.prototype.Arc = function (npoints, options) {
|
||||
GreatCircle.prototype.Arc = function (npoints, options)
|
||||
{
|
||||
var first_pass = [];
|
||||
if (!npoints || npoints <= 2) {
|
||||
if (!npoints || npoints <= 2)
|
||||
{
|
||||
first_pass.push([this.start.lon, this.start.lat]);
|
||||
first_pass.push([this.end.lon, this.end.lat]);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var delta = 1.0 / (npoints - 1);
|
||||
for (var i = 0; i < npoints; ++i) {
|
||||
for (var i = 0; i < npoints; ++i)
|
||||
{
|
||||
var step = delta * i;
|
||||
var pair = this.interpolate(step);
|
||||
first_pass.push(pair);
|
||||
|
@ -173,7 +204,8 @@ GreatCircle.prototype.Arc = function (npoints, options) {
|
|||
var dfDiffSpace = 360 - dfDateLineOffset;
|
||||
|
||||
// https://github.com/OSGeo/gdal/blob/7bfb9c452a59aac958bff0c8386b891edf8154ca/gdal/ogr/ogrgeometryfactory.cpp#L2342
|
||||
for (var j = 1; j < first_pass.length; ++j) {
|
||||
for (var j = 1; j < first_pass.length; ++j)
|
||||
{
|
||||
var dfPrevX = first_pass[j - 1][0];
|
||||
var dfX = first_pass[j][0];
|
||||
var dfDiffLong = Math.abs(dfX - dfPrevX);
|
||||
|
@ -181,20 +213,26 @@ GreatCircle.prototype.Arc = function (npoints, options) {
|
|||
dfDiffLong > dfDiffSpace &&
|
||||
((dfX > dfLeftBorderX && dfPrevX < dfRightBorderX) ||
|
||||
(dfPrevX > dfLeftBorderX && dfX < dfRightBorderX))
|
||||
) {
|
||||
)
|
||||
{
|
||||
bHasBigDiff = true;
|
||||
} else if (dfDiffLong > dfMaxSmallDiffLong) {
|
||||
}
|
||||
else if (dfDiffLong > dfMaxSmallDiffLong)
|
||||
{
|
||||
dfMaxSmallDiffLong = dfDiffLong;
|
||||
}
|
||||
}
|
||||
|
||||
var poMulti = [];
|
||||
if (bHasBigDiff && dfMaxSmallDiffLong < dfDateLineOffset) {
|
||||
if (bHasBigDiff && dfMaxSmallDiffLong < dfDateLineOffset)
|
||||
{
|
||||
var poNewLS = [];
|
||||
poMulti.push(poNewLS);
|
||||
for (var k = 0; k < first_pass.length; ++k) {
|
||||
for (var k = 0; k < first_pass.length; ++k)
|
||||
{
|
||||
var dfX0 = parseFloat(first_pass[k][0]);
|
||||
if (k > 0 && Math.abs(dfX0 - first_pass[k - 1][0]) > dfDiffSpace) {
|
||||
if (k > 0 && Math.abs(dfX0 - first_pass[k - 1][0]) > dfDiffSpace)
|
||||
{
|
||||
var dfX1 = parseFloat(first_pass[k - 1][0]);
|
||||
var dfY1 = parseFloat(first_pass[k - 1][1]);
|
||||
var dfX2 = parseFloat(first_pass[k][0]);
|
||||
|
@ -206,26 +244,30 @@ GreatCircle.prototype.Arc = function (npoints, options) {
|
|||
k + 1 < first_pass.length &&
|
||||
first_pass[k - 1][0] > -180 &&
|
||||
first_pass[k - 1][0] < dfRightBorderX
|
||||
) {
|
||||
)
|
||||
{
|
||||
poNewLS.push([-180, first_pass[k][1]]);
|
||||
k++;
|
||||
poNewLS.push([first_pass[k][0], first_pass[k][1]]);
|
||||
continue;
|
||||
} else if (
|
||||
}
|
||||
else if (
|
||||
dfX1 > dfLeftBorderX &&
|
||||
dfX1 < 180 &&
|
||||
dfX2 == -180 &&
|
||||
k + 1 < first_pass.length &&
|
||||
first_pass[k - 1][0] > dfLeftBorderX &&
|
||||
first_pass[k - 1][0] < 180
|
||||
) {
|
||||
)
|
||||
{
|
||||
poNewLS.push([180, first_pass[k][1]]);
|
||||
k++;
|
||||
poNewLS.push([first_pass[k][0], first_pass[k][1]]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dfX1 < dfRightBorderX && dfX2 > dfLeftBorderX) {
|
||||
if (dfX1 < dfRightBorderX && dfX2 > dfLeftBorderX)
|
||||
{
|
||||
// swap dfX1, dfX2
|
||||
var tmpX = dfX1;
|
||||
dfX1 = dfX2;
|
||||
|
@ -235,59 +277,73 @@ GreatCircle.prototype.Arc = function (npoints, options) {
|
|||
dfY1 = dfY2;
|
||||
dfY2 = tmpY;
|
||||
}
|
||||
if (dfX1 > dfLeftBorderX && dfX2 < dfRightBorderX) {
|
||||
if (dfX1 > dfLeftBorderX && dfX2 < dfRightBorderX)
|
||||
{
|
||||
dfX2 += 360;
|
||||
}
|
||||
|
||||
if (dfX1 <= 180 && dfX2 >= 180 && dfX1 < dfX2) {
|
||||
if (dfX1 <= 180 && dfX2 >= 180 && dfX1 < dfX2)
|
||||
{
|
||||
var dfRatio = (180 - dfX1) / (dfX2 - dfX1);
|
||||
var dfY = dfRatio * dfY2 + (1 - dfRatio) * dfY1;
|
||||
poNewLS.push([
|
||||
first_pass[k - 1][0] > dfLeftBorderX ? 180 : -180,
|
||||
dfY,
|
||||
dfY
|
||||
]);
|
||||
poNewLS = [];
|
||||
poNewLS.push([
|
||||
first_pass[k - 1][0] > dfLeftBorderX ? -180 : 180,
|
||||
dfY,
|
||||
dfY
|
||||
]);
|
||||
poMulti.push(poNewLS);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
poNewLS = [];
|
||||
poMulti.push(poNewLS);
|
||||
}
|
||||
poNewLS.push([dfX0, first_pass[k][1]]);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
poNewLS.push([first_pass[k][0], first_pass[k][1]]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// add normally
|
||||
var poNewLS0 = [];
|
||||
poMulti.push(poNewLS0);
|
||||
for (var l = 0; l < first_pass.length; ++l) {
|
||||
for (var l = 0; l < first_pass.length; ++l)
|
||||
{
|
||||
poNewLS0.push([first_pass[l][0], first_pass[l][1]]);
|
||||
}
|
||||
}
|
||||
|
||||
var arc = new Arc(this.properties);
|
||||
for (var m = 0; m < poMulti.length; ++m) {
|
||||
for (var m = 0; m < poMulti.length; ++m)
|
||||
{
|
||||
var line = new LineString();
|
||||
arc.geometries.push(line);
|
||||
var points = poMulti[m];
|
||||
for (var j0 = 0; j0 < points.length; ++j0) {
|
||||
for (var j0 = 0; j0 < points.length; ++j0)
|
||||
{
|
||||
line.move_to(points[j0]);
|
||||
}
|
||||
}
|
||||
return arc;
|
||||
};
|
||||
|
||||
if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
|
||||
if (typeof module !== "undefined" && typeof module.exports !== "undefined")
|
||||
{
|
||||
// nodejs
|
||||
module.exports.Coord = Coord;
|
||||
module.exports.Arc = Arc;
|
||||
module.exports.GreatCircle = GreatCircle;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// browser
|
||||
var arc = {};
|
||||
arc.Coord = Coord;
|
||||
|
|
|
@ -20,19 +20,26 @@ var g_oqrsFile = "";
|
|||
var g_oqrsWhenDate = 0;
|
||||
var g_oqrsLoadTimer = null;
|
||||
|
||||
function dumpFile(file) {
|
||||
try {
|
||||
function dumpFile(file)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (fs.existsSync(file)) fs.unlinkSync(file);
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
|
||||
function dumpDir(dir) {
|
||||
try {
|
||||
function dumpDir(dir)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (fs.existsSync(dir)) fs.rmdirSync(dir);
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
|
||||
function callsignServicesInit() {
|
||||
function callsignServicesInit()
|
||||
{
|
||||
// Dump old data files we no longer reference
|
||||
dumpFile(g_jsonDir + "uls-callsigns.json");
|
||||
dumpFile(g_jsonDir + "us-callsigns.json");
|
||||
|
@ -48,16 +55,20 @@ function callsignServicesInit() {
|
|||
g_eqslFile = g_NWappData + "eqsl-callsigns.json";
|
||||
g_oqrsFile = g_NWappData + "cloqrs-callsigns.json";
|
||||
|
||||
if (g_callsignLookups.lotwUseEnable) {
|
||||
if (g_callsignLookups.lotwUseEnable)
|
||||
{
|
||||
lotwLoadCallsigns();
|
||||
}
|
||||
if (g_callsignLookups.eqslUseEnable) {
|
||||
if (g_callsignLookups.eqslUseEnable)
|
||||
{
|
||||
eqslLoadCallsigns();
|
||||
}
|
||||
if (g_callsignLookups.ulsUseEnable) {
|
||||
if (g_callsignLookups.ulsUseEnable)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
}
|
||||
if (g_callsignLookups.oqrsUseEnable) {
|
||||
if (g_callsignLookups.oqrsUseEnable)
|
||||
{
|
||||
oqrsLoadCallsigns();
|
||||
}
|
||||
|
||||
|
@ -67,46 +78,59 @@ function callsignServicesInit() {
|
|||
oqrsSettingsDisplay();
|
||||
}
|
||||
|
||||
function saveCallsignSettings() {
|
||||
function saveCallsignSettings()
|
||||
{
|
||||
localStorage.callsignLookups = JSON.stringify(g_callsignLookups);
|
||||
}
|
||||
|
||||
function lotwLoadCallsigns() {
|
||||
function lotwLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - g_callsignLookups.lotwLastUpdate > 86400 * 7)
|
||||
g_callsignLookups.lotwLastUpdate = 0;
|
||||
else {
|
||||
{ g_callsignLookups.lotwLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var lotwWhenTimer = 86400 * 7 - (now - g_callsignLookups.lotwLastUpdate);
|
||||
g_lotwWhenDate = now + lotwWhenTimer;
|
||||
g_lotwLoadTimer = setTimeout(lotwDownload, lotwWhenTimer * 1000);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(g_lotwFile)) {
|
||||
if (!fs.existsSync(g_lotwFile))
|
||||
{
|
||||
g_callsignLookups.lotwLastUpdate = 0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var data = fs.readFileSync(g_lotwFile);
|
||||
g_lotwCallsigns = JSON.parse(data);
|
||||
if (Object.keys(g_lotwCallsigns).length < 100) {
|
||||
if (Object.keys(g_lotwCallsigns).length < 100)
|
||||
{
|
||||
lotwDownload();
|
||||
}
|
||||
}
|
||||
if (g_callsignLookups.lotwLastUpdate == 0) {
|
||||
if (g_callsignLookups.lotwLastUpdate == 0)
|
||||
{
|
||||
lotwDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function lotwSettingsDisplay() {
|
||||
function lotwSettingsDisplay()
|
||||
{
|
||||
lotwUseEnable.checked = g_callsignLookups.lotwUseEnable;
|
||||
|
||||
if (g_callsignLookups.lotwLastUpdate == 0) {
|
||||
if (g_callsignLookups.lotwLastUpdate == 0)
|
||||
{
|
||||
lotwUpdatedTd.innerHTML = "Never";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
lotwUpdatedTd.innerHTML = userTimeString(
|
||||
g_callsignLookups.lotwLastUpdate * 1000
|
||||
);
|
||||
}
|
||||
|
||||
if (!g_callsignLookups.lotwUseEnable) {
|
||||
if (!g_callsignLookups.lotwUseEnable)
|
||||
{
|
||||
if (g_lotwLoadTimer != null) clearTimeout(g_lotwLoadTimer);
|
||||
g_lotwLoadTimer = null;
|
||||
g_lotwCallsigns = Object();
|
||||
|
@ -114,10 +138,12 @@ function lotwSettingsDisplay() {
|
|||
lotwCountTd.innerHTML = Object.keys(g_lotwCallsigns).length;
|
||||
}
|
||||
|
||||
function lotwValuesChanged() {
|
||||
function lotwValuesChanged()
|
||||
{
|
||||
g_callsignLookups.lotwUseEnable = lotwUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (g_callsignLookups.lotwUseEnable == true) {
|
||||
if (g_callsignLookups.lotwUseEnable == true)
|
||||
{
|
||||
lotwLoadCallsigns();
|
||||
}
|
||||
lotwSettingsDisplay();
|
||||
|
@ -127,7 +153,8 @@ function lotwValuesChanged() {
|
|||
if (g_callRosterWindowHandle) g_callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
||||
function lotwDownload(fromSettings) {
|
||||
function lotwDownload(fromSettings)
|
||||
{
|
||||
lotwUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"https://lotw.arrl.org/lotw-user-activity.csv",
|
||||
|
@ -138,15 +165,18 @@ function lotwDownload(fromSettings) {
|
|||
);
|
||||
}
|
||||
|
||||
function processLotwCallsigns(result, flag) {
|
||||
//var result = String(buffer);
|
||||
function processLotwCallsigns(result, flag)
|
||||
{
|
||||
// var result = String(buffer);
|
||||
var lines = Array();
|
||||
lines = result.split("\n");
|
||||
delete result;
|
||||
|
||||
var lotwCallsigns = Object();
|
||||
for (x in lines) {
|
||||
for (x in lines)
|
||||
{
|
||||
var breakout = lines[x].split(",");
|
||||
if (breakout.length == 3) {
|
||||
if (breakout.length == 3)
|
||||
{
|
||||
var dateTime = new Date(
|
||||
Date.UTC(
|
||||
breakout[1].substr(0, 4),
|
||||
|
@ -160,7 +190,7 @@ function processLotwCallsigns(result, flag) {
|
|||
lotwCallsigns[breakout[0]] = parseInt(dateTime.getTime() / 1000) / 86400;
|
||||
}
|
||||
}
|
||||
delete lines;
|
||||
|
||||
g_callsignLookups.lotwLastUpdate = timeNowSec();
|
||||
|
||||
var now = timeNowSec();
|
||||
|
@ -170,7 +200,8 @@ function processLotwCallsigns(result, flag) {
|
|||
g_lotwWhenDate = now + lotwWhenTimer;
|
||||
g_lotwLoadTimer = setTimeout(lotwDownload, lotwWhenTimer * 1000);
|
||||
|
||||
if (Object.keys(lotwCallsigns).length > 100) {
|
||||
if (Object.keys(lotwCallsigns).length > 100)
|
||||
{
|
||||
g_lotwCallsigns = lotwCallsigns;
|
||||
fs.writeFileSync(g_lotwFile, JSON.stringify(g_lotwCallsigns));
|
||||
}
|
||||
|
@ -178,39 +209,50 @@ function processLotwCallsigns(result, flag) {
|
|||
lotwSettingsDisplay();
|
||||
}
|
||||
|
||||
function oqrsLoadCallsigns() {
|
||||
function oqrsLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - g_callsignLookups.oqrsLastUpdate > 86400 * 7)
|
||||
g_callsignLookups.oqrsLastUpdate = 0;
|
||||
else {
|
||||
{ g_callsignLookups.oqrsLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var oqrsWhenTimer = 86400 * 7 - (now - g_callsignLookups.oqrsLastUpdate);
|
||||
g_oqrsWhenDate = now + oqrsWhenTimer;
|
||||
g_oqrsLoadTimer = setTimeout(oqrsDownload, oqrsWhenTimer * 1000);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(g_oqrsFile)) {
|
||||
if (!fs.existsSync(g_oqrsFile))
|
||||
{
|
||||
g_callsignLookups.oqrsLastUpdate = 0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var data = fs.readFileSync(g_oqrsFile);
|
||||
g_oqrsCallsigns = JSON.parse(data);
|
||||
}
|
||||
if (g_callsignLookups.oqrsLastUpdate == 0) {
|
||||
if (g_callsignLookups.oqrsLastUpdate == 0)
|
||||
{
|
||||
oqrsDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function oqrsSettingsDisplay() {
|
||||
function oqrsSettingsDisplay()
|
||||
{
|
||||
oqrsUseEnable.checked = g_callsignLookups.oqrsUseEnable;
|
||||
|
||||
if (g_callsignLookups.oqrsLastUpdate == 0) {
|
||||
if (g_callsignLookups.oqrsLastUpdate == 0)
|
||||
{
|
||||
oqrsUpdatedTd.innerHTML = "Never";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
oqrsUpdatedTd.innerHTML = userTimeString(
|
||||
g_callsignLookups.oqrsLastUpdate * 1000
|
||||
);
|
||||
}
|
||||
|
||||
if (!g_callsignLookups.oqrsUseEnable) {
|
||||
if (!g_callsignLookups.oqrsUseEnable)
|
||||
{
|
||||
if (g_oqrsLoadTimer != null) clearTimeout(g_oqrsLoadTimer);
|
||||
g_oqrsLoadTimer = null;
|
||||
g_oqrsCallsigns = Object();
|
||||
|
@ -218,10 +260,12 @@ function oqrsSettingsDisplay() {
|
|||
oqrsCountTd.innerHTML = Object.keys(g_oqrsCallsigns).length;
|
||||
}
|
||||
|
||||
function oqrsValuesChanged() {
|
||||
function oqrsValuesChanged()
|
||||
{
|
||||
g_callsignLookups.oqrsUseEnable = oqrsUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (g_callsignLookups.oqrsUseEnable == true) {
|
||||
if (g_callsignLookups.oqrsUseEnable == true)
|
||||
{
|
||||
oqrsLoadCallsigns();
|
||||
}
|
||||
oqrsSettingsDisplay();
|
||||
|
@ -231,7 +275,8 @@ function oqrsValuesChanged() {
|
|||
if (g_callRosterWindowHandle) g_callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
||||
function oqrsDownload(fromSettings) {
|
||||
function oqrsDownload(fromSettings)
|
||||
{
|
||||
oqrsUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"http://app.gridtracker.org/callsigns/clublog.json",
|
||||
|
@ -242,7 +287,8 @@ function oqrsDownload(fromSettings) {
|
|||
);
|
||||
}
|
||||
|
||||
function processoqrsCallsigns(buffer, flag) {
|
||||
function processoqrsCallsigns(buffer, flag)
|
||||
{
|
||||
g_oqrsCallsigns = JSON.parse(buffer);
|
||||
|
||||
g_callsignLookups.oqrsLastUpdate = timeNowSec();
|
||||
|
@ -258,39 +304,50 @@ function processoqrsCallsigns(buffer, flag) {
|
|||
oqrsSettingsDisplay();
|
||||
}
|
||||
|
||||
function eqslLoadCallsigns() {
|
||||
function eqslLoadCallsigns()
|
||||
{
|
||||
var now = timeNowSec();
|
||||
if (now - g_callsignLookups.eqslLastUpdate > 86400 * 7)
|
||||
g_callsignLookups.eqslLastUpdate = 0;
|
||||
else {
|
||||
{ g_callsignLookups.eqslLastUpdate = 0; }
|
||||
else
|
||||
{
|
||||
var eqslWhenTimer = 86400 * 7 - (now - g_callsignLookups.eqslLastUpdate);
|
||||
g_eqslWhenDate = now + eqslWhenTimer;
|
||||
g_eqslLoadTimer = setTimeout(eqslDownload, eqslWhenTimer * 1000);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(g_eqslFile)) {
|
||||
if (!fs.existsSync(g_eqslFile))
|
||||
{
|
||||
g_callsignLookups.eqslLastUpdate = 0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var data = fs.readFileSync(g_eqslFile);
|
||||
g_eqslCallsigns = JSON.parse(data);
|
||||
}
|
||||
if (g_callsignLookups.eqslLastUpdate == 0) {
|
||||
if (g_callsignLookups.eqslLastUpdate == 0)
|
||||
{
|
||||
eqslDownload();
|
||||
}
|
||||
}
|
||||
|
||||
function eqslSettingsDisplay() {
|
||||
function eqslSettingsDisplay()
|
||||
{
|
||||
eqslUseEnable.checked = g_callsignLookups.eqslUseEnable;
|
||||
|
||||
if (g_callsignLookups.eqslLastUpdate == 0) {
|
||||
if (g_callsignLookups.eqslLastUpdate == 0)
|
||||
{
|
||||
eqslUpdatedTd.innerHTML = "Never";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
eqslUpdatedTd.innerHTML = userTimeString(
|
||||
g_callsignLookups.eqslLastUpdate * 1000
|
||||
);
|
||||
}
|
||||
|
||||
if (!g_callsignLookups.eqslUseEnable) {
|
||||
if (!g_callsignLookups.eqslUseEnable)
|
||||
{
|
||||
if (g_eqslLoadTimer != null) clearTimeout(g_eqslLoadTimer);
|
||||
g_eqslLoadTimer = null;
|
||||
g_eqslCallsigns = Object();
|
||||
|
@ -298,10 +355,12 @@ function eqslSettingsDisplay() {
|
|||
eqslCountTd.innerHTML = Object.keys(g_eqslCallsigns).length;
|
||||
}
|
||||
|
||||
function eqslValuesChanged() {
|
||||
function eqslValuesChanged()
|
||||
{
|
||||
g_callsignLookups.eqslUseEnable = eqslUseEnable.checked;
|
||||
saveCallsignSettings();
|
||||
if (g_callsignLookups.eqslUseEnable == true) {
|
||||
if (g_callsignLookups.eqslUseEnable == true)
|
||||
{
|
||||
eqslLoadCallsigns();
|
||||
}
|
||||
eqslSettingsDisplay();
|
||||
|
@ -311,7 +370,8 @@ function eqslValuesChanged() {
|
|||
if (g_callRosterWindowHandle) g_callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
||||
function eqslDownload(fromSettings) {
|
||||
function eqslDownload(fromSettings)
|
||||
{
|
||||
eqslUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
getBuffer(
|
||||
"https://www.eqsl.cc/qslcard/DownloadedFiles/AGMemberList.txt",
|
||||
|
@ -322,12 +382,14 @@ function eqslDownload(fromSettings) {
|
|||
);
|
||||
}
|
||||
|
||||
function processeqslCallsigns(buffer, flag) {
|
||||
function processeqslCallsigns(buffer, flag)
|
||||
{
|
||||
var result = String(buffer);
|
||||
var lines = Array();
|
||||
lines = result.split("\n");
|
||||
g_eqslCallsigns = Object();
|
||||
for (x in lines) {
|
||||
for (x in lines)
|
||||
{
|
||||
g_eqslCallsigns[lines[x].trim()] = true;
|
||||
}
|
||||
g_callsignLookups.eqslLastUpdate = timeNowSec();
|
||||
|
@ -340,20 +402,23 @@ function processeqslCallsigns(buffer, flag) {
|
|||
g_eqslLoadTimer = setTimeout(eqslDownload, eqslWhenTimer * 1000);
|
||||
|
||||
if (Object.keys(g_eqslCallsigns).length > 10000)
|
||||
fs.writeFileSync(g_eqslFile, JSON.stringify(g_eqslCallsigns));
|
||||
{ fs.writeFileSync(g_eqslFile, JSON.stringify(g_eqslCallsigns)); }
|
||||
|
||||
eqslSettingsDisplay();
|
||||
}
|
||||
|
||||
function ulsLoadCallsigns() {
|
||||
if (g_ulsLoadTimer != null) {
|
||||
function ulsLoadCallsigns()
|
||||
{
|
||||
if (g_ulsLoadTimer != null)
|
||||
{
|
||||
clearTimeout(g_ulsLoadTimer);
|
||||
g_ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
var now = timeNowSec();
|
||||
if (now - g_callsignLookups.ulsLastUpdate > 86400 * 7) ulsDownload();
|
||||
else {
|
||||
else
|
||||
{
|
||||
var ulsWhenTimer = 86400 * 7 - (now - g_callsignLookups.ulsLastUpdate);
|
||||
g_ulsWhenDate = now + ulsWhenTimer;
|
||||
g_ulsLoadTimer = setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
|
@ -361,28 +426,39 @@ function ulsLoadCallsigns() {
|
|||
}
|
||||
}
|
||||
|
||||
function updateQSO() {
|
||||
if (g_ulsCallsignsCount > 0) {
|
||||
for (hash in g_QSOhash) {
|
||||
function updateQSO()
|
||||
{
|
||||
if (g_ulsCallsignsCount > 0)
|
||||
{
|
||||
for (hash in g_QSOhash)
|
||||
{
|
||||
var details = g_QSOhash[hash];
|
||||
var lookupCall = false;
|
||||
|
||||
if (
|
||||
(details.cnty == null || details.state == null) &&
|
||||
isKnownCallsignDXCC(details.dxcc)
|
||||
) {
|
||||
)
|
||||
{
|
||||
// Do County Lookup
|
||||
lookupCall = true;
|
||||
} else if (details.cnty != null && isKnownCallsignUSplus(details.dxcc)) {
|
||||
if (!(details.cnty in g_cntyToCounty)) {
|
||||
if (details.cnty.indexOf(",") == -1) {
|
||||
}
|
||||
else if (details.cnty != null && isKnownCallsignUSplus(details.dxcc))
|
||||
{
|
||||
if (!(details.cnty in g_cntyToCounty))
|
||||
{
|
||||
if (details.cnty.indexOf(",") == -1)
|
||||
{
|
||||
if (!(details.state + "," + details.cnty in g_cntyToCounty))
|
||||
lookupCall = true;
|
||||
} else lookupCall = true;
|
||||
{ lookupCall = true; }
|
||||
}
|
||||
else lookupCall = true;
|
||||
}
|
||||
}
|
||||
if (lookupCall) {
|
||||
if (g_callsignLookups.ulsUseEnable) {
|
||||
if (lookupCall)
|
||||
{
|
||||
if (g_callsignLookups.ulsUseEnable)
|
||||
{
|
||||
lookupUsCallsign(details, true);
|
||||
}
|
||||
}
|
||||
|
@ -390,16 +466,20 @@ function updateQSO() {
|
|||
}
|
||||
}
|
||||
|
||||
function updateCallsignCount() {
|
||||
g_ulsDatabase.transaction(function (tx) {
|
||||
function updateCallsignCount()
|
||||
{
|
||||
g_ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (tx, results) {
|
||||
function (tx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1) {
|
||||
g_ulsCallsignsCount = results.rows[0]["cnt"];
|
||||
if (len == 1)
|
||||
{
|
||||
g_ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = g_ulsCallsignsCount;
|
||||
|
||||
updateQSO();
|
||||
|
@ -410,18 +490,23 @@ function updateCallsignCount() {
|
|||
});
|
||||
}
|
||||
|
||||
function ulsSettingsDisplay() {
|
||||
function ulsSettingsDisplay()
|
||||
{
|
||||
ulsUseEnable.checked = g_callsignLookups.ulsUseEnable;
|
||||
|
||||
if (g_callsignLookups.ulsLastUpdate == 0) {
|
||||
if (g_callsignLookups.ulsLastUpdate == 0)
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "Never";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = userTimeString(
|
||||
g_callsignLookups.ulsLastUpdate * 1000
|
||||
);
|
||||
}
|
||||
|
||||
if (!g_callsignLookups.ulsUseEnable) {
|
||||
if (!g_callsignLookups.ulsUseEnable)
|
||||
{
|
||||
if (g_ulsLoadTimer != null) clearTimeout(g_ulsLoadTimer);
|
||||
g_ulsLoadTimer = null;
|
||||
g_ulsCallsignsCount = 0;
|
||||
|
@ -429,12 +514,16 @@ function ulsSettingsDisplay() {
|
|||
}
|
||||
}
|
||||
|
||||
function ulsValuesChanged() {
|
||||
function ulsValuesChanged()
|
||||
{
|
||||
g_callsignLookups.ulsUseEnable = ulsUseEnable.checked;
|
||||
|
||||
if (g_callsignLookups.ulsUseEnable == true) {
|
||||
if (g_callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
resetULSDatabase();
|
||||
ulsCountTd.innerHTML = 0;
|
||||
}
|
||||
|
@ -445,7 +534,8 @@ function ulsValuesChanged() {
|
|||
if (g_callRosterWindowHandle) g_callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
||||
function ulsDownload() {
|
||||
function ulsDownload()
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
ulsCountTd.innerHTML = 0;
|
||||
getChunkedBuffer(
|
||||
|
@ -465,48 +555,58 @@ function getChunkedBuffer(
|
|||
port,
|
||||
cookie,
|
||||
errorHandler
|
||||
) {
|
||||
)
|
||||
{
|
||||
var url = require("url");
|
||||
var http = require(mode);
|
||||
var fileBuffer = null;
|
||||
var options = null;
|
||||
if (cookie != null) {
|
||||
if (cookie != null)
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host,
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path,
|
||||
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
||||
headers: {
|
||||
Cookie: cookie,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
options = {
|
||||
host: url.parse(file_url).host,
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path,
|
||||
Cookie: cookie
|
||||
}
|
||||
};
|
||||
}
|
||||
http.get(options, function (res) {
|
||||
else
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path // eslint-disable-line node/no-deprecated-api
|
||||
};
|
||||
}
|
||||
http.get(options, function (res)
|
||||
{
|
||||
var fsize = res.headers["content-length"];
|
||||
var fread = 0;
|
||||
var cookies = null;
|
||||
if (typeof res.headers["set-cookie"] != "undefined")
|
||||
cookies = res.headers["set-cookie"];
|
||||
{ cookies = res.headers["set-cookie"]; }
|
||||
res
|
||||
.on("data", function (data) {
|
||||
.on("data", function (data)
|
||||
{
|
||||
var isEnd = false;
|
||||
fread += data.length;
|
||||
if (fread == fsize) isEnd = true;
|
||||
if (fileBuffer == null) {
|
||||
if (fileBuffer == null)
|
||||
{
|
||||
fileBuffer = callback(data, flag, cookies, true, isEnd);
|
||||
} else {
|
||||
fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd); // eslint-disable-line node/no-callback-literal
|
||||
}
|
||||
})
|
||||
.on("end", function () {})
|
||||
.on("error", function (e) {
|
||||
.on("error", function (e)
|
||||
{
|
||||
console.error("Got error: " + e.message);
|
||||
});
|
||||
});
|
||||
|
@ -519,35 +619,45 @@ var g_ulsDatabase = openDatabase(
|
|||
50 * 1024 * 1024
|
||||
);
|
||||
|
||||
g_ulsDatabase.transaction(function (tx) {
|
||||
g_ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"CREATE TABLE IF NOT EXISTS calls ( callsign TEXT PRIMARY KEY, zip, state)"
|
||||
);
|
||||
});
|
||||
|
||||
function resetULSDatabase() {
|
||||
function resetULSDatabase()
|
||||
{
|
||||
g_callsignLookups.ulsLastUpdate = 0;
|
||||
g_ulsCallsignsCount = 0;
|
||||
}
|
||||
|
||||
function processulsCallsigns(data, flag, cookies, starting, finished) {
|
||||
function processulsCallsigns(data, flag, cookies, starting, finished)
|
||||
{
|
||||
var buffer = String(data);
|
||||
var returnBuffer = "";
|
||||
|
||||
if (buffer && buffer.length > 0) {
|
||||
if (buffer && buffer.length > 0)
|
||||
{
|
||||
var lines = null;
|
||||
|
||||
if (buffer[buffer.length - 1] == "\n") {
|
||||
if (buffer[buffer.length - 1] == "\n")
|
||||
{
|
||||
lines = buffer.split("\n");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
var lastIndex = buffer.lastIndexOf("\n");
|
||||
returnBuffer = buffer.substring(lastIndex);
|
||||
lines = buffer.substring(0, lastIndex).split("\n");
|
||||
}
|
||||
|
||||
if (lines.length > 0) {
|
||||
g_ulsDatabase.transaction(function (tx) {
|
||||
if (starting == true) {
|
||||
if (lines.length > 0)
|
||||
{
|
||||
g_ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
if (starting == true)
|
||||
{
|
||||
if (g_ulsLoadTimer != null) clearTimeout(g_ulsLoadTimer);
|
||||
g_ulsLoadTimer = null;
|
||||
g_ulsWhenDate = 0;
|
||||
|
@ -555,42 +665,47 @@ function processulsCallsigns(data, flag, cookies, starting, finished) {
|
|||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
tx.executeSql("delete from calls");
|
||||
}
|
||||
for (var x in lines) {
|
||||
if (lines[x].length) {
|
||||
for (var x in lines)
|
||||
{
|
||||
if (lines[x].length)
|
||||
{
|
||||
++g_ulsCallsignsCount;
|
||||
tx.executeSql(
|
||||
"INSERT INTO calls (rowid, callsign, zip, state) VALUES (" +
|
||||
g_ulsCallsignsCount +
|
||||
',"' +
|
||||
",\"" +
|
||||
lines[x].substr(7) +
|
||||
'","' +
|
||||
"\",\"" +
|
||||
lines[x].substr(0, 5) +
|
||||
'","' +
|
||||
"\",\"" +
|
||||
lines[x].substr(5, 2) +
|
||||
'")'
|
||||
"\")"
|
||||
);
|
||||
if (g_ulsCallsignsCount % 10000 == 0) {
|
||||
if (g_ulsCallsignsCount % 10000 == 0)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results) {
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1) {
|
||||
ulsCountTd.innerHTML = results.rows[0]["cnt"];
|
||||
if (len == 1)
|
||||
{
|
||||
ulsCountTd.innerHTML = results.rows[0].cnt;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
delete lines;
|
||||
lines = null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (finished == true) {
|
||||
if (finished == true)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
||||
if (g_ulsLoadTimer != null) clearTimeout(g_ulsLoadTimer);
|
||||
|
@ -599,15 +714,18 @@ function processulsCallsigns(data, flag, cookies, starting, finished) {
|
|||
g_ulsWhenDate = ulsWhenTimer + now;
|
||||
g_ulsLoadTimer = setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
|
||||
g_ulsDatabase.transaction(function (tx) {
|
||||
g_ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results) {
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1) {
|
||||
g_ulsCallsignsCount = results.rows[0]["cnt"];
|
||||
if (len == 1)
|
||||
{
|
||||
g_ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = g_ulsCallsignsCount;
|
||||
g_callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
@ -619,50 +737,64 @@ function processulsCallsigns(data, flag, cookies, starting, finished) {
|
|||
});
|
||||
}
|
||||
|
||||
return Buffer(returnBuffer);
|
||||
return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api
|
||||
}
|
||||
|
||||
function lookupUsCallsign(object, writeState = false) {
|
||||
g_ulsDatabase.transaction(function (tx) {
|
||||
var qry = 'SELECT * FROM calls where callsign = "' + object.DEcall + '"';
|
||||
function lookupUsCallsign(object, writeState = false)
|
||||
{
|
||||
g_ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
var qry = "SELECT * FROM calls where callsign = \"" + object.DEcall + "\"";
|
||||
tx.executeSql(
|
||||
qry,
|
||||
[],
|
||||
function (tx, results) {
|
||||
function (tx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1) {
|
||||
if (object.state == null) {
|
||||
if (object.dxcc == 1) {
|
||||
object.state = "CA-" + results.rows[0]["state"];
|
||||
} else {
|
||||
object.state = "US-" + results.rows[0]["state"];
|
||||
if (len == 1)
|
||||
{
|
||||
if (object.state == null)
|
||||
{
|
||||
if (object.dxcc == 1)
|
||||
{
|
||||
object.state = "CA-" + results.rows[0].state;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.state = "US-" + results.rows[0].state;
|
||||
}
|
||||
if (writeState) setState(object);
|
||||
}
|
||||
object.zipcode = String(results.rows[0]["zip"]);
|
||||
if (object.cnty == null) {
|
||||
object.zipcode = String(results.rows[0].zip);
|
||||
if (object.cnty == null)
|
||||
{
|
||||
let request = g_Idb
|
||||
.transaction(["lookups"], "readwrite")
|
||||
.objectStore("lookups")
|
||||
.get(object.DEcall);
|
||||
|
||||
request.onsuccess = function (event) {
|
||||
if (request.result) {
|
||||
request.onsuccess = function (event)
|
||||
{
|
||||
if (request.result)
|
||||
{
|
||||
object.cnty = request.result.cnty;
|
||||
object.qual = true;
|
||||
}
|
||||
|
||||
if (object.cnty == null && object.zipcode in g_zipToCounty) {
|
||||
if (object.cnty == null && object.zipcode in g_zipToCounty)
|
||||
{
|
||||
var counties = g_zipToCounty[object.zipcode];
|
||||
if (counties.length > 1) object.qual = false;
|
||||
else object.qual = true;
|
||||
object.cnty = counties[0];
|
||||
} else object.qual = false;
|
||||
}
|
||||
else object.qual = false;
|
||||
if (writeState) setState(object);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
request.onerror = function (event)
|
||||
{
|
||||
object.qual = false;
|
||||
if (writeState) setState(object);
|
||||
};
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
var picker = {
|
||||
attach : function (opt) {
|
||||
attach: function (opt)
|
||||
{
|
||||
// attach() : attach datepicker to target
|
||||
// opt : options (object)
|
||||
// target : datepicker will populate this field
|
||||
|
@ -10,47 +11,50 @@ var picker = {
|
|||
// (A) Create new datepicker
|
||||
var dp = document.createElement("div");
|
||||
dp.dataset.target = opt.target;
|
||||
dp.dataset.fire = opt.fire;
|
||||
dp.dataset.fire = opt.fire;
|
||||
dp.dataset.startmon = opt.startmon ? "1" : "0";
|
||||
dp.classList.add("picker");
|
||||
if (opt.disableday) {
|
||||
if (opt.disableday)
|
||||
{
|
||||
dp.dataset.disableday = JSON.stringify(opt.disableday);
|
||||
}
|
||||
|
||||
// (B) Default to current month + year
|
||||
// ! NOTE: UTC+0 !
|
||||
var today = new Date(),
|
||||
thisMonth = today.getUTCMonth(), // Note: Jan is 0
|
||||
thisYear = today.getUTCFullYear(),
|
||||
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||
thisMonth = today.getUTCMonth(), // Note: Jan is 0
|
||||
thisYear = today.getUTCFullYear(),
|
||||
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||
|
||||
// (C) Month select
|
||||
var select = document.createElement("select"),
|
||||
option = null;
|
||||
option = null;
|
||||
select.classList.add("picker-m");
|
||||
for (var mth in months) {
|
||||
for (var mth in months)
|
||||
{
|
||||
option = document.createElement("option");
|
||||
option.value = parseInt(mth) + 1;
|
||||
option.text = months[mth];
|
||||
select.appendChild(option);
|
||||
}
|
||||
select.selectedIndex = thisMonth;
|
||||
select.addEventListener("change", function(){ picker.draw(this); });
|
||||
select.addEventListener("change", function() { picker.draw(this); });
|
||||
dp.appendChild(select);
|
||||
|
||||
// (D) Year select
|
||||
var yRange = 100; // Year range to show, I.E. from thisYear-yRange to thisYear+yRange
|
||||
select = document.createElement("select");
|
||||
select.classList.add("picker-y");
|
||||
for (var y = thisYear-yRange; y < thisYear+20; y++) {
|
||||
for (var y = thisYear - yRange; y < thisYear + 20; y++)
|
||||
{
|
||||
option = document.createElement("option");
|
||||
option.value = y;
|
||||
option.text = y;
|
||||
select.appendChild(option);
|
||||
}
|
||||
select.selectedIndex = yRange;
|
||||
select.addEventListener("change", function(){ picker.draw(this); });
|
||||
select.addEventListener("change", function() { picker.draw(this); });
|
||||
dp.appendChild(select);
|
||||
|
||||
// (E) Day select
|
||||
|
@ -62,10 +66,12 @@ var picker = {
|
|||
picker.draw(select);
|
||||
|
||||
// (F1) Popup datepicker
|
||||
if (opt.container==1) {
|
||||
if (opt.container == 1)
|
||||
{
|
||||
// Mark this as a "popup"
|
||||
var uniqueID = 0;
|
||||
while (document.getElementById("picker-" + uniqueID) != null) {
|
||||
while (document.getElementById("picker-" + uniqueID) != null)
|
||||
{
|
||||
uniqueID = Math.floor(Math.random() * (100 - 2)) + 1;
|
||||
}
|
||||
dp.dataset.popup = "1";
|
||||
|
@ -80,11 +86,14 @@ var picker = {
|
|||
// Attach onclick to show/hide datepicker
|
||||
var target = document.getElementById(opt.target);
|
||||
target.dataset.dp = uniqueID;
|
||||
target.onfocus = function () {
|
||||
target.onfocus = function ()
|
||||
{
|
||||
document.getElementById("picker-" + this.dataset.dp).classList.add("show");
|
||||
};
|
||||
wrapper.addEventListener("click", function (evt) {
|
||||
if (evt.target.classList.contains("picker-wrap")) {
|
||||
wrapper.addEventListener("click", function (evt)
|
||||
{
|
||||
if (evt.target.classList.contains("picker-wrap"))
|
||||
{
|
||||
this.classList.remove("show");
|
||||
}
|
||||
});
|
||||
|
@ -94,82 +103,93 @@ var picker = {
|
|||
}
|
||||
|
||||
// (F2) Inline datepicker
|
||||
else {
|
||||
else
|
||||
{
|
||||
document.getElementById(opt.container).appendChild(dp);
|
||||
}
|
||||
},
|
||||
|
||||
draw : function (el) {
|
||||
draw: function (el)
|
||||
{
|
||||
// draw() : draw the days in month
|
||||
// el : HTML reference to either year or month selector
|
||||
|
||||
// (A) Get date picker components
|
||||
var parent = el.parentElement,
|
||||
year = parent.getElementsByClassName("picker-y")[0].value,
|
||||
month = parent.getElementsByClassName("picker-m")[0].value,
|
||||
days = parent.getElementsByClassName("picker-d")[0];
|
||||
year = parent.getElementsByClassName("picker-y")[0].value,
|
||||
month = parent.getElementsByClassName("picker-m")[0].value,
|
||||
days = parent.getElementsByClassName("picker-d")[0];
|
||||
|
||||
// (B) Date range calculation
|
||||
// ! NOTE: UTC+0 !
|
||||
var daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate(),
|
||||
startDay = new Date(Date.UTC(year, month-1, 1)).getUTCDay(), // Note: Sun = 0
|
||||
endDay = new Date(Date.UTC(year, month-1, daysInMonth)).getUTCDay(),
|
||||
startDay = startDay==0 ? 7 : startDay,
|
||||
endDay = endDay==0 ? 7 : endDay;
|
||||
startDay = new Date(Date.UTC(year, month - 1, 1)).getUTCDay(), // Note: Sun = 0
|
||||
endDay = new Date(Date.UTC(year, month - 1, daysInMonth)).getUTCDay(),
|
||||
startDay = startDay == 0 ? 7 : startDay,
|
||||
endDay = endDay == 0 ? 7 : endDay;
|
||||
|
||||
// (C) Generate date squares (in array first)
|
||||
var squares = [],
|
||||
disableday = null;
|
||||
if (parent.dataset.disableday) {
|
||||
disableday = null;
|
||||
if (parent.dataset.disableday)
|
||||
{
|
||||
disableday = JSON.parse(parent.dataset.disableday);
|
||||
}
|
||||
|
||||
// (C1) Empty squares before first day of month
|
||||
if (parent.dataset.startmon=="1" && startDay!=1) {
|
||||
for (var i=1; i<startDay; i++) { squares.push("B"); }
|
||||
if (parent.dataset.startmon == "1" && startDay != 1)
|
||||
{
|
||||
for (var i = 1; i < startDay; i++) { squares.push("B"); }
|
||||
}
|
||||
if (parent.dataset.startmon=="0" && startDay!=7) {
|
||||
for (var i=0; i<startDay; i++) { squares.push("B"); }
|
||||
if (parent.dataset.startmon == "0" && startDay != 7)
|
||||
{
|
||||
for (var i = 0; i < startDay; i++) { squares.push("B"); }
|
||||
}
|
||||
|
||||
// (C2) Days of month
|
||||
// All days enabled, just add
|
||||
if (disableday==null) {
|
||||
for (var i=1; i<=daysInMonth; i++) { squares.push([i, false]); }
|
||||
if (disableday == null)
|
||||
{
|
||||
for (var i = 1; i <= daysInMonth; i++) { squares.push([i, false]); }
|
||||
}
|
||||
// Some days disabled
|
||||
else {
|
||||
else
|
||||
{
|
||||
var thisday = startDay;
|
||||
for (var i=1; i<=daysInMonth; i++) {
|
||||
for (var i = 1; i <= daysInMonth; i++)
|
||||
{
|
||||
// Check if day is disabled
|
||||
var disabled = disableday.includes(thisday);
|
||||
// Day of month, disabled
|
||||
squares.push([i, disabled]);
|
||||
// Next day
|
||||
thisday++;
|
||||
if (thisday==8) { thisday = 1; }
|
||||
if (thisday == 8) { thisday = 1; }
|
||||
}
|
||||
}
|
||||
|
||||
// (C2) Empty squares after last day of month
|
||||
if (parent.dataset.startmon=="1" && endDay!=7) {
|
||||
for (var i=endDay; i<7; i++) { squares.push("B"); }
|
||||
if (parent.dataset.startmon == "1" && endDay != 7)
|
||||
{
|
||||
for (var i = endDay; i < 7; i++) { squares.push("B"); }
|
||||
}
|
||||
if (parent.dataset.startmon=="0" && endDay!=6) {
|
||||
for (var i=endDay; i<(endDay==7?13:6); i++) { squares.push("B"); }
|
||||
if (parent.dataset.startmon == "0" && endDay != 6)
|
||||
{
|
||||
for (var i = endDay; i < (endDay == 7 ? 13 : 6); i++) { squares.push("B"); }
|
||||
}
|
||||
|
||||
// (D) Draw HTML
|
||||
var daynames = ["Mon", "Tue", "Wed", "Thur", "Fri", "Sat"];
|
||||
if (parent.dataset.startmon=="1") { daynames.push("Sun"); }
|
||||
if (parent.dataset.startmon == "1") { daynames.push("Sun"); }
|
||||
else { daynames.unshift("Sun"); }
|
||||
|
||||
// (D1) Header
|
||||
var table = document.createElement("table"),
|
||||
row = table.insertRow()
|
||||
cell = null;
|
||||
row = table.insertRow()
|
||||
cell = null;
|
||||
row.classList.add("picker-d-h");
|
||||
for (let d of daynames) {
|
||||
for (let d of daynames)
|
||||
{
|
||||
cell = row.insertCell();
|
||||
cell.innerHTML = d;
|
||||
}
|
||||
|
@ -177,21 +197,27 @@ var picker = {
|
|||
// (D2) Date cells
|
||||
var total = squares.length;
|
||||
row = table.insertRow();
|
||||
for (var i=0; i<total; i++) {
|
||||
if (i!=total && i%7==0) { row = table.insertRow(); }
|
||||
for (var i = 0; i < total; i++)
|
||||
{
|
||||
if (i != total && i % 7 == 0) { row = table.insertRow(); }
|
||||
cell = row.insertCell();
|
||||
if (squares[i] == "B") {
|
||||
if (squares[i] == "B")
|
||||
{
|
||||
cell.classList.add("picker-d-b");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
cell.innerHTML = squares[i][0];
|
||||
// Not allowed to choose this day
|
||||
if (squares[i][1]) {
|
||||
if (squares[i][1])
|
||||
{
|
||||
cell.classList.add("picker-d-dd");
|
||||
}
|
||||
// Allowed to choose this day
|
||||
else {
|
||||
else
|
||||
{
|
||||
cell.classList.add("picker-d-d");
|
||||
cell.addEventListener("click", function(){ picker.pick(this); });
|
||||
cell.addEventListener("click", function() { picker.pick(this); });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -201,38 +227,41 @@ var picker = {
|
|||
days.appendChild(table);
|
||||
},
|
||||
|
||||
pick : function (el) {
|
||||
pick: function (el)
|
||||
{
|
||||
// pick() : choose a date
|
||||
// el : HTML reference to selected date cell
|
||||
|
||||
// (A) Get all components
|
||||
var parent = el.parentElement;
|
||||
while (!parent.classList.contains("picker")) {
|
||||
while (!parent.classList.contains("picker"))
|
||||
{
|
||||
parent = parent.parentElement;
|
||||
}
|
||||
|
||||
// (B) Get full selected year month day
|
||||
var year = parent.getElementsByClassName("picker-y")[0].value,
|
||||
month = parent.getElementsByClassName("picker-m")[0].value,
|
||||
day = el.innerHTML;
|
||||
month = parent.getElementsByClassName("picker-m")[0].value,
|
||||
day = el.innerHTML;
|
||||
|
||||
// YYYY-MM-DD Format
|
||||
// ! CHANGE FORMAT HERE IF YOU WANT !
|
||||
if (parseInt(month)<10) { month = "0" + month; }
|
||||
if (parseInt(day)<10) { day = "0" + day; }
|
||||
if (parseInt(month) < 10) { month = "0" + month; }
|
||||
if (parseInt(day) < 10) { day = "0" + day; }
|
||||
var fullDate = year + "-" + month + "-" + day;
|
||||
|
||||
// (C) Update selected date
|
||||
document.getElementById(parent.dataset.target).value = fullDate;
|
||||
|
||||
if ( parent.dataset.fire.length > 0 )
|
||||
{
|
||||
window[parent.dataset.fire]();
|
||||
}
|
||||
if (parent.dataset.fire.length > 0)
|
||||
{
|
||||
window[parent.dataset.fire]();
|
||||
}
|
||||
|
||||
// (D) Popup only - close the popup
|
||||
if (parent.dataset.popup == "1") {
|
||||
if (parent.dataset.popup == "1")
|
||||
{
|
||||
document.getElementById("picker-" + parent.dataset.dpid).classList.remove("show");
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
@ -26,7 +26,7 @@ var validSettings = [
|
|||
"speechSettings",
|
||||
"startupLogs",
|
||||
"trustedQslSettings",
|
||||
"screenSettings",
|
||||
"screenSettings"
|
||||
];
|
||||
|
||||
var def_appSettings = {
|
||||
|
@ -88,7 +88,7 @@ var def_appSettings = {
|
|||
workingCallsigns: {},
|
||||
workingDateEnable: false,
|
||||
workingDate: 0,
|
||||
gtSpotEnable: true,
|
||||
gtSpotEnable: true
|
||||
};
|
||||
|
||||
var def_mapSettings = {
|
||||
|
@ -125,7 +125,7 @@ var def_mapSettings = {
|
|||
trafficDecode: true,
|
||||
usNexrad: false,
|
||||
zoom: 4,
|
||||
mapTrans: 0.5,
|
||||
mapTrans: 0.5
|
||||
};
|
||||
|
||||
var def_adifLogSettings = {
|
||||
|
@ -134,7 +134,7 @@ var def_adifLogSettings = {
|
|||
buttonClubCheckBox: false,
|
||||
buttonLOTWCheckBox: false,
|
||||
buttonQRZCheckBox: false,
|
||||
buttonPsk24CheckBox: true,
|
||||
buttonPsk24CheckBox: true
|
||||
},
|
||||
startup: {
|
||||
loadAdifCheckBox: false,
|
||||
|
@ -142,7 +142,7 @@ var def_adifLogSettings = {
|
|||
loadQRZCheckBox: false,
|
||||
loadLOTWCheckBox: false,
|
||||
loadClubCheckBox: false,
|
||||
loadGTCheckBox: true,
|
||||
loadGTCheckBox: true
|
||||
},
|
||||
qsolog: {
|
||||
logQRZqsoCheckBox: false,
|
||||
|
@ -151,10 +151,10 @@ var def_adifLogSettings = {
|
|||
logHRDLOGqsoCheckBox: false,
|
||||
logClubqsoCheckBox: false,
|
||||
logCloudlogQSOCheckBox: false,
|
||||
logeQSLQSOCheckBox: false,
|
||||
logeQSLQSOCheckBox: false
|
||||
},
|
||||
nickname: {
|
||||
nicknameeQSLCheckBox: false,
|
||||
nicknameeQSLCheckBox: false
|
||||
},
|
||||
text: {
|
||||
lotwLogin: "",
|
||||
|
@ -171,9 +171,9 @@ var def_adifLogSettings = {
|
|||
CloudlogAPI: "",
|
||||
eQSLUser: "",
|
||||
eQSLPassword: "",
|
||||
eQSLNickname: "",
|
||||
eQSLNickname: ""
|
||||
},
|
||||
downloads: {},
|
||||
downloads: {}
|
||||
};
|
||||
|
||||
var def_msgSettings = {
|
||||
|
@ -183,7 +183,7 @@ var def_msgSettings = {
|
|||
msgFrequencySelect: 0,
|
||||
msgActionSelect: 0,
|
||||
msgAwaySelect: 0,
|
||||
msgAwayText: "I am away from the shack at the moment",
|
||||
msgAwayText: "I am away from the shack at the moment"
|
||||
};
|
||||
|
||||
var def_receptionSettings = {
|
||||
|
@ -194,39 +194,39 @@ var def_receptionSettings = {
|
|||
pathColor: -1,
|
||||
pathNightColor: 361,
|
||||
spotWidth: 0.8,
|
||||
mergeSpots: false,
|
||||
mergeSpots: false
|
||||
};
|
||||
|
||||
var def_N1MMSettings = {
|
||||
enable: false,
|
||||
port: 2333,
|
||||
ip: "127.0.0.1",
|
||||
ip: "127.0.0.1"
|
||||
};
|
||||
var def_log4OMSettings = {
|
||||
enable: false,
|
||||
port: 2236,
|
||||
ip: "127.0.0.1",
|
||||
ip: "127.0.0.1"
|
||||
};
|
||||
var def_dxkLogSettings = {
|
||||
enable: false,
|
||||
port: 52000,
|
||||
ip: "127.0.0.1",
|
||||
ip: "127.0.0.1"
|
||||
};
|
||||
var def_HRDLogbookLogSettings = {
|
||||
enable: false,
|
||||
port: 7826,
|
||||
ip: "127.0.0.1",
|
||||
ip: "127.0.0.1"
|
||||
};
|
||||
var def_acLogSettings = {
|
||||
enable: false,
|
||||
port: 1100,
|
||||
ip: "127.0.0.1",
|
||||
ip: "127.0.0.1"
|
||||
};
|
||||
var def_trustedQslSettings = {
|
||||
stationFile: "",
|
||||
stationFileValid: false,
|
||||
binaryFile: "",
|
||||
binaryFileValid: false,
|
||||
binaryFileValid: false
|
||||
};
|
||||
var def_callsignLookups = {
|
||||
lotwUseEnable: true,
|
||||
|
@ -240,10 +240,10 @@ var def_callsignLookups = {
|
|||
ulsLastUpdate: 0,
|
||||
oqrsUseEnable: false,
|
||||
oqrsWeeklyEnable: false,
|
||||
oqrsLastUpdate: 0,
|
||||
oqrsLastUpdate: 0
|
||||
};
|
||||
|
||||
var def_bandActivity = {
|
||||
lastUpdate: {},
|
||||
lines: {},
|
||||
lines: {}
|
||||
};
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
function hooray() {
|
||||
function hooray()
|
||||
{
|
||||
var SCREEN_WIDTH = window.innerWidth,
|
||||
SCREEN_HEIGHT = window.innerHeight,
|
||||
mousePos = {
|
||||
x: 400,
|
||||
y: 300,
|
||||
y: 300
|
||||
},
|
||||
// create canvas
|
||||
canvas = document.createElement("canvas"),
|
||||
|
@ -14,7 +15,8 @@ function hooray() {
|
|||
colorCode = 0;
|
||||
|
||||
// init
|
||||
$(document).ready(function () {
|
||||
$(document).ready(function ()
|
||||
{
|
||||
document.body.appendChild(canvas);
|
||||
canvas.width = SCREEN_WIDTH;
|
||||
canvas.height = SCREEN_HEIGHT;
|
||||
|
@ -23,27 +25,33 @@ function hooray() {
|
|||
});
|
||||
|
||||
// update mouse position
|
||||
$(document).mousemove(function (e) {
|
||||
$(document).mousemove(function (e)
|
||||
{
|
||||
e.preventDefault();
|
||||
mousePos = {
|
||||
x: e.clientX,
|
||||
y: e.clientY,
|
||||
y: e.clientY
|
||||
};
|
||||
});
|
||||
|
||||
// launch more rockets!!!
|
||||
$(document).mousedown(function (e) {
|
||||
for (var i = 0; i < 5; i++) {
|
||||
$(document).mousedown(function (e)
|
||||
{
|
||||
for (var i = 0; i < 5; i++)
|
||||
{
|
||||
launchFrom((Math.random() * SCREEN_WIDTH * 2) / 3 + SCREEN_WIDTH / 6);
|
||||
}
|
||||
});
|
||||
|
||||
function launch() {
|
||||
function launch()
|
||||
{
|
||||
launchFrom(mousePos.x);
|
||||
}
|
||||
|
||||
function launchFrom(x) {
|
||||
if (rockets.length < 10) {
|
||||
function launchFrom(x)
|
||||
{
|
||||
if (rockets.length < 10)
|
||||
{
|
||||
var rocket = new Rocket(x);
|
||||
rocket.explosionColor = Math.floor((Math.random() * 360) / 10) * 10;
|
||||
rocket.vel.y = Math.random() * -3 - 4;
|
||||
|
@ -55,12 +63,15 @@ function hooray() {
|
|||
}
|
||||
}
|
||||
|
||||
function loop() {
|
||||
function loop()
|
||||
{
|
||||
// update screen size
|
||||
if (SCREEN_WIDTH != window.innerWidth) {
|
||||
if (SCREEN_WIDTH != window.innerWidth)
|
||||
{
|
||||
canvas.width = SCREEN_WIDTH = window.innerWidth;
|
||||
}
|
||||
if (SCREEN_HEIGHT != window.innerHeight) {
|
||||
if (SCREEN_HEIGHT != window.innerHeight)
|
||||
{
|
||||
canvas.height = SCREEN_HEIGHT = window.innerHeight;
|
||||
}
|
||||
|
||||
|
@ -70,7 +81,8 @@ function hooray() {
|
|||
|
||||
var existingRockets = [];
|
||||
|
||||
for (var i = 0; i < rockets.length; i++) {
|
||||
for (var i = 0; i < rockets.length; i++)
|
||||
{
|
||||
// update and render
|
||||
rockets[i].update();
|
||||
rockets[i].render(context);
|
||||
|
@ -98,9 +110,12 @@ function hooray() {
|
|||
rockets[i].vel.y >= 0 ||
|
||||
distance < 50 ||
|
||||
randomChance
|
||||
) {
|
||||
)
|
||||
{
|
||||
rockets[i].explode();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
existingRockets.push(rockets[i]);
|
||||
}
|
||||
}
|
||||
|
@ -109,11 +124,13 @@ function hooray() {
|
|||
|
||||
var existingParticles = [];
|
||||
|
||||
for (var i = 0; i < particles.length; i++) {
|
||||
for (var i = 0; i < particles.length; i++)
|
||||
{
|
||||
particles[i].update();
|
||||
|
||||
// render and save particles that can be rendered
|
||||
if (particles[i].exists()) {
|
||||
if (particles[i].exists())
|
||||
{
|
||||
particles[i].render(context);
|
||||
existingParticles.push(particles[i]);
|
||||
}
|
||||
|
@ -122,19 +139,21 @@ function hooray() {
|
|||
// update array with existing particles - old particles should be garbage collected
|
||||
particles = existingParticles;
|
||||
|
||||
while (particles.length > MAX_PARTICLES) {
|
||||
while (particles.length > MAX_PARTICLES)
|
||||
{
|
||||
particles.shift();
|
||||
}
|
||||
}
|
||||
|
||||
function Particle(pos) {
|
||||
function Particle(pos)
|
||||
{
|
||||
this.pos = {
|
||||
x: pos ? pos.x : 0,
|
||||
y: pos ? pos.y : 0,
|
||||
y: pos ? pos.y : 0
|
||||
};
|
||||
this.vel = {
|
||||
x: 0,
|
||||
y: 0,
|
||||
y: 0
|
||||
};
|
||||
this.shrink = 0.97;
|
||||
this.size = 2;
|
||||
|
@ -149,7 +168,8 @@ function hooray() {
|
|||
this.color = 0;
|
||||
}
|
||||
|
||||
Particle.prototype.update = function () {
|
||||
Particle.prototype.update = function ()
|
||||
{
|
||||
// apply resistance
|
||||
this.vel.x *= this.resistance;
|
||||
this.vel.y *= this.resistance;
|
||||
|
@ -168,8 +188,10 @@ function hooray() {
|
|||
this.alpha -= this.fade;
|
||||
};
|
||||
|
||||
Particle.prototype.render = function (c) {
|
||||
if (!this.exists()) {
|
||||
Particle.prototype.render = function (c)
|
||||
{
|
||||
if (!this.exists())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -206,16 +228,18 @@ function hooray() {
|
|||
c.restore();
|
||||
};
|
||||
|
||||
Particle.prototype.exists = function () {
|
||||
Particle.prototype.exists = function ()
|
||||
{
|
||||
return this.alpha >= 0.1 && this.size >= 1;
|
||||
};
|
||||
|
||||
function Rocket(x) {
|
||||
function Rocket(x)
|
||||
{
|
||||
Particle.apply(this, [
|
||||
{
|
||||
x: x,
|
||||
y: SCREEN_HEIGHT,
|
||||
},
|
||||
y: SCREEN_HEIGHT
|
||||
}
|
||||
]);
|
||||
|
||||
this.explosionColor = 0;
|
||||
|
@ -224,10 +248,12 @@ function hooray() {
|
|||
Rocket.prototype = new Particle();
|
||||
Rocket.prototype.constructor = Rocket;
|
||||
|
||||
Rocket.prototype.explode = function () {
|
||||
Rocket.prototype.explode = function ()
|
||||
{
|
||||
var count = Math.random() * 10 + 80;
|
||||
|
||||
for (var i = 0; i < count; i++) {
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var particle = new Particle(this.pos);
|
||||
var angle = Math.random() * Math.PI * 2;
|
||||
|
||||
|
@ -250,8 +276,10 @@ function hooray() {
|
|||
}
|
||||
};
|
||||
|
||||
Rocket.prototype.render = function (c) {
|
||||
if (!this.exists()) {
|
||||
Rocket.prototype.render = function (c)
|
||||
{
|
||||
if (!this.exists())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
7738
package.nw/lib/gt.js
7738
package.nw/lib/gt.js
Plik diff jest za duży
Load Diff
|
@ -9,7 +9,7 @@ var g_chatRecvFunctions = {
|
|||
info: gtChatUpdateCall,
|
||||
drop: gtChatRemoveCall,
|
||||
mesg: gtChatMessage,
|
||||
o: gtSpotMessage,
|
||||
o: gtSpotMessage
|
||||
};
|
||||
|
||||
var ChatState = Object();
|
||||
|
@ -30,7 +30,7 @@ var g_gtStateToFunction = {
|
|||
3: gtChatSendUUID,
|
||||
4: gtStatusCheck,
|
||||
5: gtInError,
|
||||
6: gtClosedSocket,
|
||||
6: gtClosedSocket
|
||||
};
|
||||
|
||||
var g_gtChatSocket = null;
|
||||
|
@ -55,69 +55,84 @@ var myRoom = 0;
|
|||
var g_gtChatlistChangeCount = 0;
|
||||
var g_gtCurrentMessageCount = 0;
|
||||
|
||||
function gtConnectChat() {
|
||||
if (g_gtChatSocket != null) {
|
||||
function gtConnectChat()
|
||||
{
|
||||
if (g_gtChatSocket != null)
|
||||
{
|
||||
// we should start over
|
||||
g_gtState = ChatState.error;
|
||||
return;
|
||||
}
|
||||
|
||||
var rnd = parseInt(Math.random() * 10) + 18260;
|
||||
try {
|
||||
try
|
||||
{
|
||||
g_gtState = ChatState.connecting;
|
||||
g_gtChatSocket = new WebSocket("wss://tagloomis.com:" + rnd);
|
||||
} catch (e) {
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
g_gtState = ChatState.error;
|
||||
return;
|
||||
}
|
||||
|
||||
g_gtChatSocket.onopen = function () {
|
||||
g_gtChatSocket.onopen = function ()
|
||||
{
|
||||
g_gtState = ChatState.connected;
|
||||
};
|
||||
|
||||
g_gtChatSocket.onmessage = function (evt) {
|
||||
if (g_appSettings.gtShareEnable == true) {
|
||||
g_gtChatSocket.onmessage = function (evt)
|
||||
{
|
||||
if (g_appSettings.gtShareEnable == true)
|
||||
{
|
||||
var jsmesg = false;
|
||||
try {
|
||||
try
|
||||
{
|
||||
jsmesg = JSON.parse(evt.data);
|
||||
} catch (err) {
|
||||
}
|
||||
catch (err)
|
||||
{
|
||||
// bad message, dumping client
|
||||
g_gtState = ChatState.error;
|
||||
return;
|
||||
}
|
||||
if (typeof jsmesg.type == "undefined") {
|
||||
if (typeof jsmesg.type == "undefined")
|
||||
{
|
||||
g_gtState = ChatState.error;
|
||||
delete jsmesg;
|
||||
return;
|
||||
}
|
||||
|
||||
if (jsmesg.type in g_chatRecvFunctions) {
|
||||
if (jsmesg.type in g_chatRecvFunctions)
|
||||
{
|
||||
g_chatRecvFunctions[jsmesg.type](jsmesg);
|
||||
delete jsmesg;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
g_gtState = ChatState.error;
|
||||
delete jsmesg;
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
g_gtChatSocket.onerror = function () {
|
||||
g_gtChatSocket.onerror = function ()
|
||||
{
|
||||
g_gtState = ChatState.error;
|
||||
};
|
||||
|
||||
g_gtChatSocket.onclose = function () {
|
||||
g_gtChatSocket.onclose = function ()
|
||||
{
|
||||
g_gtState = ChatState.closed;
|
||||
};
|
||||
}
|
||||
|
||||
function gtConnecting() {}
|
||||
|
||||
function gtInError() {
|
||||
function gtInError()
|
||||
{
|
||||
closeGtSocket();
|
||||
}
|
||||
|
||||
function gtChatSendClose() {
|
||||
function gtChatSendClose()
|
||||
{
|
||||
msg = Object();
|
||||
msg.type = "close";
|
||||
msg.uuid = g_appSettings.chatUUID;
|
||||
|
@ -125,71 +140,91 @@ function gtChatSendClose() {
|
|||
sendGtJson(JSON.stringify(msg));
|
||||
}
|
||||
|
||||
function closeGtSocket() {
|
||||
if (g_gtChatSocket != null) {
|
||||
function closeGtSocket()
|
||||
{
|
||||
if (g_gtChatSocket != null)
|
||||
{
|
||||
gtChatSendClose();
|
||||
|
||||
if (g_gtChatSocket.readyState != WebSocket.CLOSED) g_gtChatSocket.close();
|
||||
|
||||
if (g_gtChatSocket.readyState === WebSocket.CLOSED) {
|
||||
delete g_gtChatSocket;
|
||||
if (g_gtChatSocket.readyState === WebSocket.CLOSED)
|
||||
{
|
||||
g_gtChatSocket = null;
|
||||
g_gtState = ChatState.none;
|
||||
}
|
||||
} else g_gtState = ChatState.none;
|
||||
}
|
||||
else g_gtState = ChatState.none;
|
||||
}
|
||||
|
||||
function gtClosedSocket() {
|
||||
delete g_gtChatSocket;
|
||||
function gtClosedSocket()
|
||||
{
|
||||
g_gtChatSocket = null;
|
||||
g_gtState = ChatState.none;
|
||||
}
|
||||
|
||||
function gtCanConnect() {
|
||||
function gtCanConnect()
|
||||
{
|
||||
g_gtState = ChatState.connect;
|
||||
}
|
||||
|
||||
function gtSetIdle() {
|
||||
function gtSetIdle()
|
||||
{
|
||||
g_gtStatusCount = 0;
|
||||
g_gtNeedUsersList = true;
|
||||
g_gtState = ChatState.idle;
|
||||
g_lastGtStatus = "";
|
||||
}
|
||||
|
||||
function gtStatusCheck() {
|
||||
if (g_gtStatusCount > 0) {
|
||||
function gtStatusCheck()
|
||||
{
|
||||
if (g_gtStatusCount > 0)
|
||||
{
|
||||
g_gtStatusCount--;
|
||||
}
|
||||
if (g_gtStatusCount == 0 || g_gtLiveStatusUpdate == true) {
|
||||
if (g_gtLiveStatusUpdate == true) {
|
||||
if (g_gtStatusCount == 0 || g_gtLiveStatusUpdate == true)
|
||||
{
|
||||
if (g_gtLiveStatusUpdate == true)
|
||||
{
|
||||
g_gtLiveStatusUpdate = false;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
g_lastGtStatus = "";
|
||||
g_gtStatusCount = g_gtStatusTime;
|
||||
}
|
||||
gtChatSendStatus();
|
||||
}
|
||||
if (g_gtNeedUsersList == true) {
|
||||
if (g_gtNeedUsersList == true)
|
||||
{
|
||||
g_gtNeedUsersList = false;
|
||||
gtChatGetList();
|
||||
}
|
||||
}
|
||||
|
||||
function sendGtJson(json) {
|
||||
if (g_gtChatSocket != null) {
|
||||
if (g_gtChatSocket.readyState === WebSocket.OPEN) {
|
||||
function sendGtJson(json)
|
||||
{
|
||||
if (g_gtChatSocket != null)
|
||||
{
|
||||
if (g_gtChatSocket.readyState === WebSocket.OPEN)
|
||||
{
|
||||
g_gtChatSocket.send(json);
|
||||
} else {
|
||||
if (g_gtChatSocket.readyState === WebSocket.CLOSED) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_gtChatSocket.readyState === WebSocket.CLOSED)
|
||||
{
|
||||
g_gtState = ChatState.closed;
|
||||
}
|
||||
}
|
||||
} else g_gtState = ChatState.closed;
|
||||
}
|
||||
else g_gtState = ChatState.closed;
|
||||
}
|
||||
|
||||
var g_lastGtStatus = "";
|
||||
|
||||
function gtChatSendStatus() {
|
||||
function gtChatSendStatus()
|
||||
{
|
||||
var msg = Object();
|
||||
msg.type = "status";
|
||||
msg.uuid = g_appSettings.chatUUID;
|
||||
|
@ -203,13 +238,15 @@ function gtChatSendStatus() {
|
|||
msg.o = g_appSettings.gtSpotEnable == true ? 1 : 0;
|
||||
msg = JSON.stringify(msg);
|
||||
|
||||
if (msg != g_lastGtStatus) {
|
||||
if (msg != g_lastGtStatus)
|
||||
{
|
||||
sendGtJson(msg);
|
||||
g_lastGtStatus = msg;
|
||||
}
|
||||
}
|
||||
|
||||
function gtChatSendSpots(spotsObject) {
|
||||
function gtChatSendSpots(spotsObject)
|
||||
{
|
||||
var msg = Object();
|
||||
msg.type = "o";
|
||||
msg.uuid = g_appSettings.chatUUID;
|
||||
|
@ -218,23 +255,29 @@ function gtChatSendSpots(spotsObject) {
|
|||
sendGtJson(msg);
|
||||
}
|
||||
|
||||
function gtChatRemoveCall(jsmesg) {
|
||||
function gtChatRemoveCall(jsmesg)
|
||||
{
|
||||
var id = jsmesg.id;
|
||||
if (id in g_gtIdToCid) {
|
||||
if (id in g_gtIdToCid)
|
||||
{
|
||||
var cid = g_gtIdToCid[id];
|
||||
if (cid in g_gtFlagPins) {
|
||||
if (cid in g_gtFlagPins)
|
||||
{
|
||||
delete g_gtFlagPins[cid].ids[id];
|
||||
if (Object.keys(g_gtFlagPins[cid].ids).length == 0) {
|
||||
if (g_gtFlagPins[cid].pin != null) {
|
||||
if (Object.keys(g_gtFlagPins[cid].ids).length == 0)
|
||||
{
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
// remove pin from map here
|
||||
if (g_layerSources["gtflags"].hasFeature(g_gtFlagPins[cid].pin))
|
||||
g_layerSources["gtflags"].removeFeature(g_gtFlagPins[cid].pin);
|
||||
if (g_layerSources.gtflags.hasFeature(g_gtFlagPins[cid].pin))
|
||||
{ g_layerSources.gtflags.removeFeature(g_gtFlagPins[cid].pin); }
|
||||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
g_gtFlagPins[cid].live = false;
|
||||
notifyNoChat(cid);
|
||||
if (!(cid in g_gtMessages)) {
|
||||
if (!(cid in g_gtMessages))
|
||||
{
|
||||
delete g_gtCallsigns[g_gtFlagPins[cid].call];
|
||||
delete g_gtFlagPins[cid];
|
||||
}
|
||||
|
@ -246,21 +289,26 @@ function gtChatRemoveCall(jsmesg) {
|
|||
}
|
||||
}
|
||||
|
||||
function gtChatUpdateCall(jsmesg) {
|
||||
function gtChatUpdateCall(jsmesg)
|
||||
{
|
||||
var id = jsmesg.id;
|
||||
var cid = jsmesg.cid;
|
||||
|
||||
if (cid in g_gtFlagPins) {
|
||||
if (cid in g_gtFlagPins)
|
||||
{
|
||||
g_gtFlagPins[cid].ids[id] = true;
|
||||
// Did they move grid location?
|
||||
if (g_gtFlagPins[cid].pin != null) {
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
// remove pin from map here
|
||||
if (g_layerSources["gtflags"].hasFeature(g_gtFlagPins[cid].pin))
|
||||
g_layerSources["gtflags"].removeFeature(g_gtFlagPins[cid].pin);
|
||||
if (g_layerSources.gtflags.hasFeature(g_gtFlagPins[cid].pin))
|
||||
{ g_layerSources.gtflags.removeFeature(g_gtFlagPins[cid].pin); }
|
||||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
g_gtFlagPins[cid] = Object();
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
|
||||
|
@ -280,17 +328,19 @@ function gtChatUpdateCall(jsmesg) {
|
|||
g_gtFlagPins[cid].dxcc = callsignToDxcc(jsmesg.call);
|
||||
g_gtFlagPins[cid].live = true;
|
||||
// Make a pin here
|
||||
if (g_gtFlagPins[cid].pin == null) {
|
||||
if (g_gtFlagPins[cid].pin == null)
|
||||
{
|
||||
makeGtPin(g_gtFlagPins[cid]);
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
g_layerSources["gtflags"].addFeature(g_gtFlagPins[cid].pin);
|
||||
{ g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin); }
|
||||
}
|
||||
g_gtChatlistChangeCount++;
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call] = cid;
|
||||
updateChatWindow();
|
||||
}
|
||||
|
||||
function gtChatGetList() {
|
||||
function gtChatGetList()
|
||||
{
|
||||
msg = Object();
|
||||
msg.type = "list";
|
||||
msg.uuid = g_appSettings.chatUUID;
|
||||
|
@ -298,10 +348,13 @@ function gtChatGetList() {
|
|||
sendGtJson(JSON.stringify(msg));
|
||||
}
|
||||
|
||||
function redrawPins() {
|
||||
function redrawPins()
|
||||
{
|
||||
clearGtFlags();
|
||||
for (cid in g_gtFlagPins) {
|
||||
if (g_gtFlagPins[cid].pin != null) {
|
||||
for (cid in g_gtFlagPins)
|
||||
{
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
|
@ -309,15 +362,18 @@ function redrawPins() {
|
|||
makeGtPin(g_gtFlagPins[cid]);
|
||||
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
g_layerSources["gtflags"].addFeature(g_gtFlagPins[cid].pin);
|
||||
{ g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin); }
|
||||
}
|
||||
}
|
||||
|
||||
function makeGtPin(obj) {
|
||||
try {
|
||||
if (obj.pin) {
|
||||
if (g_layerSources["gtflags"].hasFeature(obj.pin))
|
||||
g_layerSources["gtflags"].removeFeature(obj.pin);
|
||||
function makeGtPin(obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (obj.pin)
|
||||
{
|
||||
if (g_layerSources.gtflags.hasFeature(obj.pin))
|
||||
{ g_layerSources.gtflags.removeFeature(obj.pin); }
|
||||
delete obj.pin;
|
||||
obj.pin = null;
|
||||
}
|
||||
|
@ -332,38 +388,47 @@ function makeGtPin(obj) {
|
|||
g_appSettings.gtFlagImgSrc == 2 &&
|
||||
(obj.mode != myMode || obj.band != myBand)
|
||||
)
|
||||
return;
|
||||
{ return; }
|
||||
|
||||
var LL = squareToLatLongAll(obj.grid);
|
||||
var myLonLat = [
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2
|
||||
];
|
||||
|
||||
obj.pin = iconFeature(ol.proj.fromLonLat(myLonLat), g_gtFlagIcon, 100);
|
||||
obj.pin.key = obj.cid;
|
||||
obj.pin.isGtFlag = true;
|
||||
obj.pin.size = 1;
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
|
||||
function gtChatNewList(jsmesg) {
|
||||
function gtChatNewList(jsmesg)
|
||||
{
|
||||
clearGtFlags();
|
||||
|
||||
for (cid in g_gtFlagPins) {
|
||||
for (var cid in g_gtFlagPins)
|
||||
{
|
||||
g_gtFlagPins[cid].live = false;
|
||||
if (!(cid in g_gtMessages)) {
|
||||
if (!(cid in g_gtMessages))
|
||||
{
|
||||
delete g_gtFlagPins[cid];
|
||||
}
|
||||
}
|
||||
|
||||
for (key in jsmesg.data.calls) {
|
||||
for (var key in jsmesg.data.calls)
|
||||
{
|
||||
var cid = jsmesg.data.cid[key];
|
||||
var id = jsmesg.data.id[key];
|
||||
if (id != myChatId) {
|
||||
if (cid in g_gtFlagPins) {
|
||||
if (id != myChatId)
|
||||
{
|
||||
if (cid in g_gtFlagPins)
|
||||
{
|
||||
g_gtFlagPins[cid].ids[id] = true;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
g_gtFlagPins[cid] = Object();
|
||||
g_gtFlagPins[cid].ids = Object();
|
||||
g_gtFlagPins[cid].ids[id] = true;
|
||||
|
@ -384,7 +449,7 @@ function gtChatNewList(jsmesg) {
|
|||
g_gtCallsigns[g_gtFlagPins[cid].call] = cid;
|
||||
makeGtPin(g_gtFlagPins[cid]);
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
g_layerSources["gtflags"].addFeature(g_gtFlagPins[cid].pin);
|
||||
{ g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin); }
|
||||
}
|
||||
}
|
||||
g_gtChatlistChangeCount++;
|
||||
|
@ -392,19 +457,23 @@ function gtChatNewList(jsmesg) {
|
|||
updateChatWindow();
|
||||
}
|
||||
|
||||
function appendToHistory(cid, jsmesg) {
|
||||
if (!(cid in g_gtMessages)) {
|
||||
function appendToHistory(cid, jsmesg)
|
||||
{
|
||||
if (!(cid in g_gtMessages))
|
||||
{
|
||||
g_gtMessages[cid] = Object();
|
||||
g_gtMessages[cid].history = Array();
|
||||
}
|
||||
|
||||
g_gtMessages[cid].history.push(jsmesg);
|
||||
while (g_gtMessages[cid].history.length > g_gtMaxChatMessages) {
|
||||
while (g_gtMessages[cid].history.length > g_gtMaxChatMessages)
|
||||
{
|
||||
g_gtMessages[cid].history.shift();
|
||||
}
|
||||
}
|
||||
|
||||
function htmlEntities(str) {
|
||||
function htmlEntities(str)
|
||||
{
|
||||
return String(str)
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
|
@ -412,25 +481,32 @@ function htmlEntities(str) {
|
|||
.replace(/"/g, """);
|
||||
}
|
||||
|
||||
function gtChatMessage(jsmesg) {
|
||||
if (g_appSettings.gtMsgEnable == true) {
|
||||
function gtChatMessage(jsmesg)
|
||||
{
|
||||
if (g_appSettings.gtMsgEnable == true)
|
||||
{
|
||||
var cid = jsmesg.cid;
|
||||
jsmesg.when = Date.now();
|
||||
try {
|
||||
jsmesg.msg = new Buffer.from(jsmesg.msg, "base64").toString("utf8");
|
||||
try
|
||||
{
|
||||
jsmesg.msg = new Buffer.from(jsmesg.msg, "base64").toString("utf8"); // eslint-disable-line new-cap
|
||||
jsmesg.msg = htmlEntities(jsmesg.msg);
|
||||
} catch (e) {
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
jsmesg.msg = "Corrupt message recieved";
|
||||
}
|
||||
|
||||
if (jsmesg.call != null && jsmesg.call != "" && jsmesg.call != "NOCALL") {
|
||||
if (jsmesg.call != null && jsmesg.call != "" && jsmesg.call != "NOCALL")
|
||||
{
|
||||
appendToHistory(cid, jsmesg);
|
||||
g_gtUnread[cid] = true;
|
||||
g_gtCurrentMessageCount++;
|
||||
|
||||
if (newChatMessage(cid, jsmesg) == false) alertChatMessage();
|
||||
|
||||
if (g_msgSettings.msgAwaySelect == 1 && !(cid in g_gtSentAwayToCid)) {
|
||||
if (g_msgSettings.msgAwaySelect == 1 && !(cid in g_gtSentAwayToCid))
|
||||
{
|
||||
g_gtSentAwayToCid[cid] = true;
|
||||
gtSendMessage(
|
||||
"Away message [ " + g_msgSettings.msgAwayText + " ]",
|
||||
|
@ -441,12 +517,13 @@ function gtChatMessage(jsmesg) {
|
|||
}
|
||||
}
|
||||
|
||||
function gtSendMessage(message, who) {
|
||||
function gtSendMessage(message, who)
|
||||
{
|
||||
msg = Object();
|
||||
msg.type = "mesg";
|
||||
msg.uuid = g_appSettings.chatUUID;
|
||||
msg.cid = who;
|
||||
msg.msg = new Buffer.from(message).toString("base64");
|
||||
msg.msg = new Buffer.from(message).toString("base64"); // eslint-disable-line new-cap
|
||||
sendGtJson(JSON.stringify(msg));
|
||||
msg.msg = htmlEntities(message);
|
||||
msg.id = 0;
|
||||
|
@ -454,7 +531,8 @@ function gtSendMessage(message, who) {
|
|||
appendToHistory(who, msg);
|
||||
}
|
||||
|
||||
function gtChatSendUUID() {
|
||||
function gtChatSendUUID()
|
||||
{
|
||||
var msg = Object();
|
||||
msg.type = "uuid";
|
||||
if (g_appSettings.chatUUID != "") msg.uuid = g_appSettings.chatUUID;
|
||||
|
@ -463,7 +541,8 @@ function gtChatSendUUID() {
|
|||
sendGtJson(JSON.stringify(msg));
|
||||
}
|
||||
|
||||
function gtChatSetUUID(jsmesg) {
|
||||
function gtChatSetUUID(jsmesg)
|
||||
{
|
||||
g_appSettings.chatUUID = jsmesg.uuid;
|
||||
myChatId = jsmesg.id;
|
||||
|
||||
|
@ -472,93 +551,126 @@ function gtChatSetUUID(jsmesg) {
|
|||
g_gtState = ChatState.status;
|
||||
}
|
||||
|
||||
function gtChatStateMachine() {
|
||||
function gtChatStateMachine()
|
||||
{
|
||||
if (
|
||||
g_appSettings.gtShareEnable == true &&
|
||||
g_mapSettings.offlineMode == false
|
||||
) {
|
||||
)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
g_gtStateToFunction[g_gtState]();
|
||||
|
||||
if (Object.keys(g_gtUnread).length > 0 && now % 2 == 0) {
|
||||
if (Object.keys(g_gtUnread).length > 0 && now % 2 == 0)
|
||||
{
|
||||
msgImg.style.webkitFilter = "invert(1)";
|
||||
} else msgImg.style.webkitFilter = "";
|
||||
}
|
||||
else msgImg.style.webkitFilter = "";
|
||||
|
||||
if (
|
||||
g_msgSettings.msgFrequencySelect > 0 &&
|
||||
Object.keys(g_gtUnread).length > 0
|
||||
) {
|
||||
if (now - g_lastChatMsgAlert > g_msgSettings.msgFrequencySelect * 60) {
|
||||
)
|
||||
{
|
||||
if (now - g_lastChatMsgAlert > g_msgSettings.msgFrequencySelect * 60)
|
||||
{
|
||||
alertChatMessage();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
closeGtSocket();
|
||||
g_gtChatlistChangeCount = 0;
|
||||
g_lastGtStatus = "";
|
||||
}
|
||||
}
|
||||
|
||||
function gtSpotMessage(jsmesg) {
|
||||
function gtSpotMessage(jsmesg)
|
||||
{
|
||||
addNewOAMSSpot(jsmesg.cid, jsmesg.db);
|
||||
}
|
||||
|
||||
function gtChatSystemInit() {
|
||||
function gtChatSystemInit()
|
||||
{
|
||||
g_gtEngineInterval = setInterval(gtChatStateMachine, 1000);
|
||||
}
|
||||
|
||||
function showGtFlags() {
|
||||
if (g_appSettings.gtFlagImgSrc > 0) {
|
||||
if (g_mapSettings.offlineMode == false) {
|
||||
function showGtFlags()
|
||||
{
|
||||
if (g_appSettings.gtFlagImgSrc > 0)
|
||||
{
|
||||
if (g_mapSettings.offlineMode == false)
|
||||
{
|
||||
redrawPins();
|
||||
g_layerVectors["gtflags"].setVisible(true);
|
||||
} else {
|
||||
g_layerVectors["gtflags"].setVisible(false);
|
||||
g_layerVectors.gtflags.setVisible(true);
|
||||
}
|
||||
} else g_layerVectors["gtflags"].setVisible(false);
|
||||
else
|
||||
{
|
||||
g_layerVectors.gtflags.setVisible(false);
|
||||
}
|
||||
}
|
||||
else g_layerVectors.gtflags.setVisible(false);
|
||||
}
|
||||
|
||||
function clearGtFlags() {
|
||||
g_layerSources["gtflags"].clear();
|
||||
function clearGtFlags()
|
||||
{
|
||||
g_layerSources.gtflags.clear();
|
||||
}
|
||||
|
||||
function toggleGtMap() {
|
||||
function toggleGtMap()
|
||||
{
|
||||
g_appSettings.gtFlagImgSrc += 1;
|
||||
g_appSettings.gtFlagImgSrc %= 3;
|
||||
gtFlagImg.src = g_gtFlagImageArray[g_appSettings.gtFlagImgSrc];
|
||||
if (g_spotsEnabled == 1 && g_receptionSettings.mergeSpots == false) return;
|
||||
if (g_appSettings.gtFlagImgSrc > 0) {
|
||||
if (g_appSettings.gtFlagImgSrc > 0)
|
||||
{
|
||||
redrawPins();
|
||||
g_layerVectors["gtflags"].setVisible(true);
|
||||
} else {
|
||||
g_layerVectors["gtflags"].setVisible(false);
|
||||
g_layerVectors.gtflags.setVisible(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_layerVectors.gtflags.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
function notifyNoChat(id) {
|
||||
if (g_chatWindowHandle != null) {
|
||||
try {
|
||||
function notifyNoChat(id)
|
||||
{
|
||||
if (g_chatWindowHandle != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
g_chatWindowHandle.window.notifyNoChat(id);
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function updateChatWindow() {
|
||||
if (g_chatWindowHandle != null) {
|
||||
try {
|
||||
function updateChatWindow()
|
||||
{
|
||||
if (g_chatWindowHandle != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
g_chatWindowHandle.window.updateEverything();
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function newChatMessage(id, jsmesg) {
|
||||
function newChatMessage(id, jsmesg)
|
||||
{
|
||||
var hasFocus = false;
|
||||
if (g_msgSettings.msgActionSelect == 1) showMessaging();
|
||||
|
||||
if (g_chatWindowHandle != null) {
|
||||
try {
|
||||
if (g_chatWindowHandle != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
hasFocus = g_chatWindowHandle.window.newChatMessage(id, jsmesg);
|
||||
} catch (e) {}
|
||||
}
|
||||
catch (e) {}
|
||||
updateChatWindow();
|
||||
}
|
||||
return hasFocus;
|
||||
|
@ -566,16 +678,17 @@ function newChatMessage(id, jsmesg) {
|
|||
|
||||
var g_lastChatMsgAlert = 0;
|
||||
|
||||
function alertChatMessage() {
|
||||
function alertChatMessage()
|
||||
{
|
||||
if (g_msgSettings.msgAlertSelect == 1)
|
||||
{
|
||||
if (g_msgSettings.msgAlertSelect == 1) {
|
||||
// Text to speech
|
||||
speakAlertString(g_msgSettings.msgAlertWord);
|
||||
}
|
||||
if (g_msgSettings.msgAlertSelect == 2) {
|
||||
// Audible
|
||||
playAlertMediaFile(g_msgSettings.msgAlertMedia);
|
||||
}
|
||||
g_lastChatMsgAlert = timeNowSec();
|
||||
// Text to speech
|
||||
speakAlertString(g_msgSettings.msgAlertWord);
|
||||
}
|
||||
if (g_msgSettings.msgAlertSelect == 2)
|
||||
{
|
||||
// Audible
|
||||
playAlertMediaFile(g_msgSettings.msgAlertMedia);
|
||||
}
|
||||
g_lastChatMsgAlert = timeNowSec();
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
/* eslint-disable */
|
||||
|
||||
//! moment-timezone.js
|
||||
//! version : 0.5.31
|
||||
//! Copyright (c) JS Foundation and other contributors
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
/* eslint-disable */
|
||||
|
||||
;(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -3,7 +3,8 @@
|
|||
// See LICENSE for more information.
|
||||
|
||||
// Incoming is already float fixed ( 14.037 ) for 14,037,000hz
|
||||
Number.prototype.formatBand = function () {
|
||||
Number.prototype.formatBand = function ()
|
||||
{
|
||||
var freq = this;
|
||||
var bands = [
|
||||
"OOB",
|
||||
|
@ -73,7 +74,7 @@ Number.prototype.formatBand = function () {
|
|||
224,
|
||||
"1.5m",
|
||||
225,
|
||||
"1.5m",
|
||||
"1.5m"
|
||||
];
|
||||
|
||||
var newFreq = parseInt(freq);
|
||||
|
@ -87,12 +88,14 @@ Number.prototype.formatBand = function () {
|
|||
else return "OOB";
|
||||
};
|
||||
|
||||
Number.prototype.formatMhz = function (n, x) {
|
||||
Number.prototype.formatMhz = function (n, x)
|
||||
{
|
||||
var re = "\\d(?=(\\d{" + (x || 3) + "})+" + (n > 0 ? "\\." : "$") + ")";
|
||||
return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, "g"), "$&.");
|
||||
};
|
||||
|
||||
Number.prototype.formatSignalReport = function () {
|
||||
Number.prototype.formatSignalReport = function ()
|
||||
{
|
||||
var val = this;
|
||||
var report = String();
|
||||
|
||||
|
@ -101,12 +104,14 @@ Number.prototype.formatSignalReport = function () {
|
|||
return report;
|
||||
};
|
||||
|
||||
String.prototype.formatCallsign = function () {
|
||||
String.prototype.formatCallsign = function ()
|
||||
{
|
||||
var re = new RegExp("0", "g");
|
||||
return this.replace(re, "Ø");
|
||||
};
|
||||
|
||||
Number.prototype.toDHMS = function () {
|
||||
Number.prototype.toDHMS = function ()
|
||||
{
|
||||
var seconds = this;
|
||||
var days = Math.floor(seconds / (3600 * 24));
|
||||
seconds -= days * 3600 * 24;
|
||||
|
@ -124,7 +129,8 @@ Number.prototype.toDHMS = function () {
|
|||
return val;
|
||||
};
|
||||
|
||||
Number.prototype.toDHM = function () {
|
||||
Number.prototype.toDHM = function ()
|
||||
{
|
||||
var seconds = this;
|
||||
var days = Math.floor(seconds / (3600 * 24));
|
||||
seconds -= days * 3600 * 24;
|
||||
|
@ -140,7 +146,8 @@ Number.prototype.toDHM = function () {
|
|||
return val;
|
||||
};
|
||||
|
||||
Number.prototype.toYM = function () {
|
||||
Number.prototype.toYM = function ()
|
||||
{
|
||||
var months = this;
|
||||
var years = parseInt(Math.floor(months / 12));
|
||||
months -= years * 12;
|
||||
|
@ -151,7 +158,8 @@ Number.prototype.toYM = function () {
|
|||
return total == "" ? "any" : total;
|
||||
};
|
||||
|
||||
Number.prototype.toHMS = function () {
|
||||
Number.prototype.toHMS = function ()
|
||||
{
|
||||
var seconds = this;
|
||||
var days = Math.floor(seconds / (3600 * 24));
|
||||
seconds -= days * 3600 * 24;
|
||||
|
@ -167,20 +175,25 @@ Number.prototype.toHMS = function () {
|
|||
return val;
|
||||
};
|
||||
|
||||
String.prototype.toProperCase = function () {
|
||||
return this.replace(/\w\S*/g, function (txt) {
|
||||
String.prototype.toProperCase = function ()
|
||||
{
|
||||
return this.replace(/\w\S*/g, function (txt)
|
||||
{
|
||||
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
|
||||
});
|
||||
};
|
||||
|
||||
Number.prototype.pad = function (size) {
|
||||
Number.prototype.pad = function (size)
|
||||
{
|
||||
var s = String(this);
|
||||
while (s.length < (size || 2)) {
|
||||
while (s.length < (size || 2))
|
||||
{
|
||||
s = "0" + s;
|
||||
}
|
||||
return s;
|
||||
};
|
||||
|
||||
String.prototype.replaceAll = function (str1, str2) {
|
||||
String.prototype.replaceAll = function (str1, str2)
|
||||
{
|
||||
return this.split(str1).join(str2);
|
||||
};
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -8,7 +8,8 @@ var g_screenLost = false;
|
|||
var g_windowInfo = {};
|
||||
var g_initialScreenCount = nw.Screen.screens.length;
|
||||
|
||||
function setWindowInfo() {
|
||||
function setWindowInfo()
|
||||
{
|
||||
// if we've lost a screen, stop saving our info
|
||||
if (g_screenLost) return;
|
||||
var win = nw.Window.get();
|
||||
|
@ -20,24 +21,29 @@ function setWindowInfo() {
|
|||
g_windowInfo = windowInfo;
|
||||
}
|
||||
|
||||
function clearAllScreenTimers() {
|
||||
if (g_windowMoveTimer != null) {
|
||||
function clearAllScreenTimers()
|
||||
{
|
||||
if (g_windowMoveTimer != null)
|
||||
{
|
||||
clearTimeout(g_windowMoveTimer);
|
||||
g_windowMoveTimer = null;
|
||||
}
|
||||
if (g_windowResizeTimer != null) {
|
||||
if (g_windowResizeTimer != null)
|
||||
{
|
||||
clearTimeout(g_windowResizeTimer);
|
||||
g_windowResizeTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
var screenCB = {
|
||||
onDisplayAdded: function (screen) {
|
||||
onDisplayAdded: function (screen)
|
||||
{
|
||||
clearAllScreenTimers();
|
||||
if (
|
||||
g_screenLost == true &&
|
||||
g_initialScreenCount == nw.Screen.screens.length
|
||||
) {
|
||||
)
|
||||
{
|
||||
// Lets restore the position now
|
||||
var win = nw.Window.get();
|
||||
win.x = g_windowInfo.x;
|
||||
|
@ -48,15 +54,18 @@ var screenCB = {
|
|||
}
|
||||
},
|
||||
|
||||
onDisplayRemoved: function (screen) {
|
||||
onDisplayRemoved: function (screen)
|
||||
{
|
||||
clearAllScreenTimers();
|
||||
if (g_initialScreenCount != nw.Screen.screens.length) {
|
||||
if (g_initialScreenCount != nw.Screen.screens.length)
|
||||
{
|
||||
g_screenLost = true;
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
function saveScreenSettings() {
|
||||
function saveScreenSettings()
|
||||
{
|
||||
var setting = { showing: g_isShowing, zoomLevel: s_zoomLevel };
|
||||
|
||||
s_screenSettings = JSON.parse(localStorage.screenSettings);
|
||||
|
@ -71,18 +80,22 @@ nw.Screen.on("displayRemoved", screenCB.onDisplayRemoved);
|
|||
|
||||
var g_isShowing = false;
|
||||
|
||||
nw.Window.get().on("loaded", function () {
|
||||
nw.Window.get().on("loaded", function ()
|
||||
{
|
||||
s_title = document.title.substr(0, 16).trim();
|
||||
g_isShowing = false;
|
||||
if (typeof localStorage.screenSettings == "undefined") {
|
||||
if (typeof localStorage.screenSettings == "undefined")
|
||||
{
|
||||
localStorage.screenSettings = "{}";
|
||||
}
|
||||
s_screenSettings = JSON.parse(localStorage.screenSettings);
|
||||
|
||||
if (!(s_title in s_screenSettings)) {
|
||||
if (!(s_title in s_screenSettings))
|
||||
{
|
||||
saveScreenSettings();
|
||||
}
|
||||
if (!("zoomLevel" in s_screenSettings[s_title])) {
|
||||
if (!("zoomLevel" in s_screenSettings[s_title]))
|
||||
{
|
||||
saveScreenSettings();
|
||||
}
|
||||
g_isShowing = s_screenSettings[s_title].showing;
|
||||
|
@ -98,16 +111,20 @@ nw.Window.get().on("loaded", function () {
|
|||
});
|
||||
|
||||
var g_windowMoveTimer = null;
|
||||
nw.Window.get().on("move", function (x, y) {
|
||||
if (g_windowMoveTimer != null) {
|
||||
nw.Window.get().on("move", function (x, y)
|
||||
{
|
||||
if (g_windowMoveTimer != null)
|
||||
{
|
||||
clearTimeout(g_windowMoveTimer);
|
||||
}
|
||||
g_windowMoveTimer = setTimeout(setWindowInfo, 1000);
|
||||
});
|
||||
|
||||
var g_windowResizeTimer = null;
|
||||
nw.Window.get().on("resize", function (w, h) {
|
||||
if (g_windowResizeTimer != null) {
|
||||
nw.Window.get().on("resize", function (w, h)
|
||||
{
|
||||
if (g_windowResizeTimer != null)
|
||||
{
|
||||
clearTimeout(g_windowResizeTimer);
|
||||
}
|
||||
g_windowResizeTimer = setTimeout(setWindowInfo, 1000);
|
||||
|
@ -119,31 +136,37 @@ var g_zoomKeys = {
|
|||
NumpadAdd: increaseZoom,
|
||||
Equal: increaseZoom,
|
||||
Numpad0: resetZoom,
|
||||
Digit0: resetZoom,
|
||||
Digit0: resetZoom
|
||||
};
|
||||
|
||||
function onZoomControlDown(event) {
|
||||
if (event.ctrlKey) {
|
||||
if (event.code in g_zoomKeys) {
|
||||
function onZoomControlDown(event)
|
||||
{
|
||||
if (event.ctrlKey)
|
||||
{
|
||||
if (event.code in g_zoomKeys)
|
||||
{
|
||||
g_zoomKeys[event.code]();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reduceZoom() {
|
||||
function reduceZoom()
|
||||
{
|
||||
s_zoomLevel -= 0.2;
|
||||
nw.Window.get().zoomLevel = s_zoomLevel;
|
||||
saveScreenSettings();
|
||||
}
|
||||
|
||||
function increaseZoom() {
|
||||
function increaseZoom()
|
||||
{
|
||||
s_zoomLevel += 0.2;
|
||||
nw.Window.get().zoomLevel = s_zoomLevel;
|
||||
|
||||
saveScreenSettings();
|
||||
}
|
||||
|
||||
function resetZoom() {
|
||||
function resetZoom()
|
||||
{
|
||||
s_zoomLevel = 0;
|
||||
nw.Window.get().zoomLevel = s_zoomLevel;
|
||||
saveScreenSettings();
|
||||
|
|
|
@ -1,23 +1,27 @@
|
|||
/**
|
||||
|
||||
**/
|
||||
(function (global, factory) {
|
||||
(function (global, factory)
|
||||
{
|
||||
typeof exports === "object" && typeof module !== "undefined"
|
||||
? (module.exports = factory())
|
||||
: typeof define === "function" && define.amd
|
||||
? define(factory)
|
||||
: (global.GeoJSONTerminator = factory());
|
||||
})(this, function () {
|
||||
? define(factory)
|
||||
: (global.GeoJSONTerminator = factory());
|
||||
})(this, function ()
|
||||
{
|
||||
"use strict";
|
||||
|
||||
function julian(date) {
|
||||
function julian(date)
|
||||
{
|
||||
/* Calculate the present UTC Julian Date. Function is valid after
|
||||
* the beginning of the UNIX epoch 1970-01-01 and ignores leap
|
||||
* seconds. */
|
||||
return date / 86400000 + 2440587.5;
|
||||
}
|
||||
|
||||
function GMST(julianDay) {
|
||||
function GMST(julianDay)
|
||||
{
|
||||
/* Calculate Greenwich Mean Sidereal Time according to
|
||||
http://aa.usno.navy.mil/faq/docs/GAST.php */
|
||||
var d = julianDay - 2451545.0;
|
||||
|
@ -25,25 +29,29 @@
|
|||
return (18.697374558 + 24.06570982441908 * d) % 24;
|
||||
}
|
||||
|
||||
class Terminator {
|
||||
constructor(options = { resolution: 1 }) {
|
||||
class Terminator
|
||||
{
|
||||
constructor(options = { resolution: 1 })
|
||||
{
|
||||
this.options = options;
|
||||
this.version = "0.1.0";
|
||||
this._R2D = 180 / Math.PI;
|
||||
this._D2R = Math.PI / 180;
|
||||
//this.options.resolution = options.resolution || this.options.resolution;
|
||||
// this.options.resolution = options.resolution || this.options.resolution;
|
||||
// this.options.time = options.time;
|
||||
var latLngs = this._compute(this.options.time);
|
||||
return this._toGeoJSON(latLngs);
|
||||
}
|
||||
|
||||
setTime(date) {
|
||||
setTime(date)
|
||||
{
|
||||
this.options.time = date;
|
||||
var latLngs = this._compute(date);
|
||||
return this._toGeoJSON(latLngs);
|
||||
}
|
||||
|
||||
_toGeoJSON(latLngs) {
|
||||
_toGeoJSON(latLngs)
|
||||
{
|
||||
/* Return 'pseudo' GeoJSON representation of the coordinates
|
||||
Why 'pseudo'?
|
||||
Coordinates longitude range go from -360 to 360
|
||||
|
@ -61,19 +69,21 @@
|
|||
type: "Polygon",
|
||||
coordinates: [
|
||||
[
|
||||
...latLngs.map((latLng) => {
|
||||
...latLngs.map((latLng) =>
|
||||
{
|
||||
return [latLng[1], latLng[0]];
|
||||
}),
|
||||
[latLngs[0][1], latLngs[0][0]],
|
||||
[latLngs[0][1], latLngs[0][0]]
|
||||
]
|
||||
.slice()
|
||||
.reverse(),
|
||||
],
|
||||
},
|
||||
.reverse()
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
_sunEclipticPosition(julianDay) {
|
||||
_sunEclipticPosition(julianDay)
|
||||
{
|
||||
/* Compute the position of the Sun in ecliptic coordinates at
|
||||
julianDay. Following
|
||||
http://en.wikipedia.org/wiki/Position_of_the_Sun */
|
||||
|
@ -94,7 +104,8 @@
|
|||
return { lambda: lambda };
|
||||
}
|
||||
|
||||
_eclipticObliquity(julianDay) {
|
||||
_eclipticObliquity(julianDay)
|
||||
{
|
||||
// Following the short term expression in
|
||||
// http://en.wikipedia.org/wiki/Axial_tilt#Obliquity_of_the_ecliptic_.28Earth.27s_axial_tilt.29
|
||||
var n = julianDay - 2451545.0;
|
||||
|
@ -111,10 +122,14 @@
|
|||
T * (0.576e-6 / 3600 - (T * 4.34e-8) / 3600))));
|
||||
return epsilon;
|
||||
}
|
||||
_jday(date) {
|
||||
|
||||
_jday(date)
|
||||
{
|
||||
return date.getTime() / 86400000.0 + 2440587.5;
|
||||
}
|
||||
_calculatePositionOfSun(date) {
|
||||
|
||||
_calculatePositionOfSun(date)
|
||||
{
|
||||
date = date instanceof Date ? date : new Date();
|
||||
|
||||
var rad = 0.017453292519943295;
|
||||
|
@ -175,7 +190,8 @@
|
|||
return [lng, lat];
|
||||
}
|
||||
|
||||
_sunEquatorialPosition(sunEclLng, eclObliq) {
|
||||
_sunEquatorialPosition(sunEclLng, eclObliq)
|
||||
{
|
||||
/* Compute the Sun's equatorial position from its ecliptic
|
||||
* position. Inputs are expected in degrees. Outputs are in
|
||||
* degrees as well. */
|
||||
|
@ -195,14 +211,16 @@
|
|||
return { alpha: alpha, delta: delta };
|
||||
}
|
||||
|
||||
_hourAngle(lng, sunPos, gst) {
|
||||
_hourAngle(lng, sunPos, gst)
|
||||
{
|
||||
/* Compute the hour angle of the sun for a longitude on
|
||||
* Earth. Return the hour angle in degrees. */
|
||||
var lst = gst + lng / 15;
|
||||
return lst * 15 - sunPos.alpha;
|
||||
}
|
||||
|
||||
_latitude(ha, sunPos) {
|
||||
_latitude(ha, sunPos)
|
||||
{
|
||||
/* For a given hour angle and sun position, compute the
|
||||
* latitude of the terminator in degrees. */
|
||||
var lat =
|
||||
|
@ -212,7 +230,8 @@
|
|||
return lat;
|
||||
}
|
||||
|
||||
_compute(time) {
|
||||
_compute(time)
|
||||
{
|
||||
var today = time ? new Date(time) : new Date();
|
||||
var julianDay = julian(today);
|
||||
var gst = GMST(julianDay);
|
||||
|
@ -222,22 +241,27 @@
|
|||
var sunEclPos = this._sunEclipticPosition(julianDay);
|
||||
var eclObliq = this._eclipticObliquity(julianDay);
|
||||
var sunEqPos = this._sunEquatorialPosition(sunEclPos.lambda, eclObliq);
|
||||
for (var i = 0; i <= 720 * this.options.resolution; i++) {
|
||||
for (var i = 0; i <= 720 * this.options.resolution; i++)
|
||||
{
|
||||
var lng = startMinus + i / this.options.resolution;
|
||||
var ha = this._hourAngle(lng, sunEqPos, gst);
|
||||
latLng[i + 1] = [this._latitude(ha, sunEqPos), lng];
|
||||
}
|
||||
if (sunEqPos.delta < 0) {
|
||||
if (sunEqPos.delta < 0)
|
||||
{
|
||||
latLng[0] = [90, startMinus];
|
||||
latLng[latLng.length] = [90, 360];
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
latLng[0] = [-90, startMinus];
|
||||
latLng[latLng.length] = [-90, 360];
|
||||
}
|
||||
return latLng;
|
||||
}
|
||||
}
|
||||
function terminator(options) {
|
||||
function terminator(options)
|
||||
{
|
||||
return new Terminator(options);
|
||||
}
|
||||
|
||||
|
@ -248,35 +272,37 @@ var dayNight = {
|
|||
map: null,
|
||||
vectorLayer: null,
|
||||
|
||||
init: function (map) {
|
||||
init: function (map)
|
||||
{
|
||||
this.map = map;
|
||||
|
||||
var geoJSON = new GeoJSONTerminator();
|
||||
|
||||
this.vectorSource = new ol.source.Vector({
|
||||
features: new ol.format.GeoJSON().readFeatures(geoJSON, {
|
||||
featureProjection: "EPSG:3857",
|
||||
}),
|
||||
featureProjection: "EPSG:3857"
|
||||
})
|
||||
});
|
||||
|
||||
this.vectorLayer = new ol.layer.Vector({
|
||||
source: this.vectorSource,
|
||||
style: new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: "rgb(0,0,0)",
|
||||
color: "rgb(0,0,0)"
|
||||
}),
|
||||
stroke: null,
|
||||
stroke: null
|
||||
}),
|
||||
opacity: Number(g_mapSettings.shadow),
|
||||
zIndex: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
this.map.getLayers().insertAt(1, this.vectorLayer);
|
||||
},
|
||||
refresh: function () {
|
||||
refresh: function ()
|
||||
{
|
||||
var circleStyle = new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: "rgb(0,0,0)",
|
||||
}),
|
||||
color: "rgb(0,0,0)"
|
||||
})
|
||||
});
|
||||
this.vectorLayer.setStyle(circleStyle);
|
||||
this.vectorLayer.setOpacity(Number(g_mapSettings.shadow));
|
||||
|
@ -284,24 +310,27 @@ var dayNight = {
|
|||
|
||||
this.vectorSource.addFeature(
|
||||
new ol.format.GeoJSON().readFeature(new GeoJSONTerminator(), {
|
||||
featureProjection: "EPSG:3857",
|
||||
featureProjection: "EPSG:3857"
|
||||
})
|
||||
);
|
||||
var point = ol.proj.fromLonLat([g_myLon, g_myLat]);
|
||||
var arr = this.vectorSource.getFeaturesAtCoordinate(point);
|
||||
return arr.length > 0 ? true : false;
|
||||
return arr.length > 0;
|
||||
},
|
||||
|
||||
show: function () {
|
||||
show: function ()
|
||||
{
|
||||
this.vectorLayer.setVisible(true);
|
||||
return this.refresh();
|
||||
},
|
||||
hide: function () {
|
||||
hide: function ()
|
||||
{
|
||||
this.vectorLayer.setVisible(false);
|
||||
},
|
||||
isVisible: function () {
|
||||
isVisible: function ()
|
||||
{
|
||||
return this.vectorLayer.getVisible();
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
var moonLayer = {
|
||||
|
@ -309,7 +338,8 @@ var moonLayer = {
|
|||
vectorLayer: null,
|
||||
icon: null,
|
||||
pin: null,
|
||||
init: function (map) {
|
||||
init: function (map)
|
||||
{
|
||||
this.map = map;
|
||||
|
||||
this.icon = new ol.style.Icon({
|
||||
|
@ -318,7 +348,7 @@ var moonLayer = {
|
|||
anchorXUnits: "pixels",
|
||||
anchor: [255, 255],
|
||||
scale: 0.1,
|
||||
opacity: 0.5,
|
||||
opacity: 0.5
|
||||
});
|
||||
|
||||
this.pin = iconFeature(
|
||||
|
@ -331,16 +361,18 @@ var moonLayer = {
|
|||
|
||||
this.vectorLayer = new ol.layer.Vector({
|
||||
source: this.vectorSource,
|
||||
zIndex: 30,
|
||||
zIndex: 30
|
||||
});
|
||||
this.map.getLayers().insertAt(1, this.vectorLayer);
|
||||
},
|
||||
future: function (now) {
|
||||
future: function (now)
|
||||
{
|
||||
var r = 0;
|
||||
var x = 25;
|
||||
var i = 3600;
|
||||
var data = Array();
|
||||
for (r = 0; r < x; r++) {
|
||||
for (r = 0; r < x; r++)
|
||||
{
|
||||
data.push(subLunar(now + r * i).ll);
|
||||
}
|
||||
line = [];
|
||||
|
@ -348,16 +380,22 @@ var moonLayer = {
|
|||
var lonOff = 0;
|
||||
var lastc = 0;
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
for (var i = 0; i < data.length; i++)
|
||||
{
|
||||
var c = data[i];
|
||||
if (isNaN(c[0])) {
|
||||
if (isNaN(c[0]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (Math.abs(lastc - c[0]) > 270) {
|
||||
if (Math.abs(lastc - c[0]) > 270)
|
||||
{
|
||||
// Wrapped
|
||||
if (c[0] < lastc) {
|
||||
if (c[0] < lastc)
|
||||
{
|
||||
lonOff += 360;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
lonOff -= 360;
|
||||
}
|
||||
}
|
||||
|
@ -365,7 +403,8 @@ var moonLayer = {
|
|||
line.push(ol.proj.fromLonLat([c[0] + lonOff, c[1]]));
|
||||
}
|
||||
|
||||
if (line.length == 0) {
|
||||
if (line.length == 0)
|
||||
{
|
||||
line.push(ol.proj.fromLonLat(start));
|
||||
}
|
||||
|
||||
|
@ -374,18 +413,20 @@ var moonLayer = {
|
|||
|
||||
feature.setStyle(
|
||||
new ol.style.Style({
|
||||
stroke: new ol.style.Stroke({ color: "#FFF", width: 1 }),
|
||||
stroke: new ol.style.Stroke({ color: "#FFF", width: 1 })
|
||||
})
|
||||
);
|
||||
|
||||
return feature;
|
||||
},
|
||||
refresh: function () {
|
||||
refresh: function ()
|
||||
{
|
||||
this.vectorSource.clear();
|
||||
if (g_appSettings.moonTrack == 1) {
|
||||
if (g_appSettings.moonTrack == 1)
|
||||
{
|
||||
now = timeNowSec();
|
||||
if (g_appSettings.moonPath == 1)
|
||||
this.vectorSource.addFeature(this.future(now));
|
||||
{ this.vectorSource.addFeature(this.future(now)); }
|
||||
this.pin = iconFeature(
|
||||
ol.proj.fromLonLat(subLunar(now).ll),
|
||||
this.icon,
|
||||
|
@ -396,16 +437,19 @@ var moonLayer = {
|
|||
}
|
||||
},
|
||||
|
||||
show: function () {
|
||||
show: function ()
|
||||
{
|
||||
this.refresh();
|
||||
this.vectorLayer.setVisible(true);
|
||||
lunaButonImg.style.webkitFilter = "brightness(100%)";
|
||||
},
|
||||
hide: function () {
|
||||
hide: function ()
|
||||
{
|
||||
this.vectorLayer.setVisible(false);
|
||||
lunaButonImg.style.webkitFilter = "brightness(50%)";
|
||||
},
|
||||
isVisible: function () {
|
||||
isVisible: function ()
|
||||
{
|
||||
return this.vectorLayer.getVisible();
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -2,29 +2,35 @@
|
|||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
|
||||
document.oncontextmenu = function (event) {
|
||||
document.oncontextmenu = function (event)
|
||||
{
|
||||
event.preventDefault();
|
||||
};
|
||||
|
||||
document.addEventListener("dragover", function (event) {
|
||||
document.addEventListener("dragover", function (event)
|
||||
{
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
document.addEventListener("drop", function (event) {
|
||||
document.addEventListener("drop", function (event)
|
||||
{
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
function openInfoTab(evt, tabName, callFunc, callObj) {
|
||||
function openInfoTab(evt, tabName, callFunc, callObj)
|
||||
{
|
||||
// Declare all variables
|
||||
var i, infoTabcontent, infoTablinks;
|
||||
// Get all elements with class="infoTabcontent" and hide them
|
||||
infoTabcontent = document.getElementsByClassName("infoTabcontent");
|
||||
for (i = 0; i < infoTabcontent.length; i++) {
|
||||
for (i = 0; i < infoTabcontent.length; i++)
|
||||
{
|
||||
infoTabcontent[i].style.display = "none";
|
||||
}
|
||||
// Get all elements with class="infoTablinks" and remove the class "active"
|
||||
infoTablinks = document.getElementsByClassName("infoTablinks");
|
||||
for (i = 0; i < infoTablinks.length; i++) {
|
||||
for (i = 0; i < infoTablinks.length; i++)
|
||||
{
|
||||
infoTablinks[i].className = infoTablinks[i].className.replace(
|
||||
" active",
|
||||
""
|
||||
|
@ -34,13 +40,16 @@ function openInfoTab(evt, tabName, callFunc, callObj) {
|
|||
|
||||
document.getElementById(tabName).style.display = "block";
|
||||
if (typeof evt.currentTarget != "undefined")
|
||||
evt.currentTarget.className += " active";
|
||||
{ evt.currentTarget.className += " active"; }
|
||||
else evt.className += " active";
|
||||
|
||||
if (callFunc) {
|
||||
if (typeof window.opener.window[callFunc] != "undefined") {
|
||||
if (callFunc)
|
||||
{
|
||||
if (typeof window.opener.window[callFunc] != "undefined")
|
||||
{
|
||||
var caller = window.opener.window[callFunc];
|
||||
if (caller) {
|
||||
if (caller)
|
||||
{
|
||||
if (callObj) caller(callObj);
|
||||
else caller();
|
||||
}
|
||||
|
@ -48,47 +57,60 @@ function openInfoTab(evt, tabName, callFunc, callObj) {
|
|||
}
|
||||
}
|
||||
|
||||
function resetSearch() {
|
||||
function resetSearch()
|
||||
{
|
||||
window.opener.resetSearch();
|
||||
}
|
||||
|
||||
function lookupCallsign(callsign) {
|
||||
function lookupCallsign(callsign)
|
||||
{
|
||||
window.opener.lookupCallsign(callsign);
|
||||
}
|
||||
|
||||
function appendToChild(elementString, object, onInputString, defaultValue) {
|
||||
function appendToChild(elementString, object, onInputString, defaultValue)
|
||||
{
|
||||
window[elementString].appendChild(object);
|
||||
object.oninput = window.opener[onInputString];
|
||||
object.value = defaultValue;
|
||||
}
|
||||
|
||||
function statsFocus(selection) {
|
||||
function statsFocus(selection)
|
||||
{
|
||||
var which = document.getElementById(selection);
|
||||
if (which != null) {
|
||||
if (which != null)
|
||||
{
|
||||
which.focus();
|
||||
which.selectionStart = which.selectionEnd = which.value.length;
|
||||
}
|
||||
}
|
||||
|
||||
function ValidateCallsign(inputText, validDiv) {
|
||||
if (inputText.value.length > 0) {
|
||||
function ValidateCallsign(inputText, validDiv)
|
||||
{
|
||||
if (inputText.value.length > 0)
|
||||
{
|
||||
var passed = false;
|
||||
inputText.value = inputText.value.toUpperCase();
|
||||
if (/\d/.test(inputText.value) || /[A-Z]/.test(inputText.value)) {
|
||||
if (/\d/.test(inputText.value) || /[A-Z]/.test(inputText.value))
|
||||
{
|
||||
passed = true;
|
||||
}
|
||||
if (passed) {
|
||||
if (passed)
|
||||
{
|
||||
inputText.style.color = "#FF0";
|
||||
inputText.style.backgroundColor = "green";
|
||||
if (validDiv) validDiv.innerHTML = "Valid!";
|
||||
return true;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
inputText.style.color = "#000";
|
||||
inputText.style.backgroundColor = "yellow";
|
||||
if (validDiv) validDiv.innerHTML = "Invalid!";
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
inputText.style.color = "#000";
|
||||
inputText.style.backgroundColor = "yellow";
|
||||
if (validDiv) validDiv.innerHTML = "Invalid!";
|
||||
|
@ -96,79 +118,103 @@ function ValidateCallsign(inputText, validDiv) {
|
|||
}
|
||||
}
|
||||
|
||||
function validateCallByElement(elementString) {
|
||||
function validateCallByElement(elementString)
|
||||
{
|
||||
ValidateCallsign(window[elementString], null);
|
||||
}
|
||||
|
||||
function init() {
|
||||
function init()
|
||||
{
|
||||
openInfoTab(event, "workedBoxDiv", "showWorkedBox");
|
||||
}
|
||||
|
||||
function addTextToClipboard(data) {
|
||||
function addTextToClipboard(data)
|
||||
{
|
||||
navigator.clipboard.writeText(data);
|
||||
}
|
||||
|
||||
function setClipboardFromLookup() {
|
||||
if (window.opener.g_lastLookupAddress) {
|
||||
function setClipboardFromLookup()
|
||||
{
|
||||
if (window.opener.g_lastLookupAddress)
|
||||
{
|
||||
addTextToClipboard(window.opener.g_lastLookupAddress);
|
||||
}
|
||||
}
|
||||
|
||||
function resizeWorked() {
|
||||
function resizeWorked()
|
||||
{
|
||||
workedListDiv.style.height = window.innerHeight - 63 - 6 + "px";
|
||||
}
|
||||
|
||||
function Resize() {
|
||||
if (statBoxDiv.style.display == "block") {
|
||||
function Resize()
|
||||
{
|
||||
if (statBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showStatBox(true);
|
||||
}
|
||||
if (workedBoxDiv.style.display == "block") {
|
||||
if (workedBoxDiv.style.display == "block")
|
||||
{
|
||||
resizeWorked();
|
||||
}
|
||||
if (callsignBoxDiv.style.display == "block") {
|
||||
if (callsignBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showCallsignBox(true);
|
||||
}
|
||||
if (dxccBoxDiv.style.display == "block") {
|
||||
if (dxccBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showDXCCsBox();
|
||||
}
|
||||
if (cqzoneBoxDiv.style.display == "block") {
|
||||
if (cqzoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showCQzoneBox();
|
||||
}
|
||||
if (ituzoneBoxDiv.style.display == "block") {
|
||||
if (ituzoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showITUzoneBox();
|
||||
}
|
||||
if (waswaczoneBoxDiv.style.display == "block") {
|
||||
if (waswaczoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWASWACzoneBox();
|
||||
}
|
||||
if (wpxBoxDiv.style.display == "block") {
|
||||
if (wpxBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWPXBox(true);
|
||||
}
|
||||
if (decodeLastDiv.style.display == "block") {
|
||||
if (decodeLastDiv.style.display == "block")
|
||||
{
|
||||
decodeLastListDiv.style.height = window.innerHeight - 63 + 26 + "px";
|
||||
}
|
||||
}
|
||||
|
||||
function reloadInfo(bandOrMode) {
|
||||
if (statBoxDiv.style.display == "block") {
|
||||
function reloadInfo(bandOrMode)
|
||||
{
|
||||
if (statBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showStatBox(false);
|
||||
}
|
||||
if (callsignBoxDiv.style.display == "block") {
|
||||
if (callsignBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showCallsignBox(false);
|
||||
}
|
||||
if (dxccBoxDiv.style.display == "block") {
|
||||
if (dxccBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showDXCCsBox();
|
||||
}
|
||||
if (wpxBoxDiv.style.display == "block") {
|
||||
if (wpxBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWPXBox();
|
||||
}
|
||||
|
||||
if (cqzoneBoxDiv.style.display == "block") {
|
||||
if (cqzoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showCQzoneBox();
|
||||
}
|
||||
if (ituzoneBoxDiv.style.display == "block") {
|
||||
if (ituzoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showITUzoneBox();
|
||||
}
|
||||
if (waswaczoneBoxDiv.style.display == "block") {
|
||||
if (waswaczoneBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWASWACzoneBox();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
/* eslint-disable */
|
||||
|
||||
// HamGridSquare.js
|
||||
// Copyright 2014 Paul Brewer KI6CQ
|
||||
// License: MIT License http://opensource.org/licenses/MIT
|
||||
|
|
Ładowanie…
Reference in New Issue