654 行
14 KiB
JavaScript
654 行
14 KiB
JavaScript
var Bands = {
|
|
b160M: {
|
|
cw: "1.825",
|
|
ssb: "1.890",
|
|
digi: "1.840",
|
|
},
|
|
b80M: {
|
|
cw: "3.532",
|
|
ssb: "3.770",
|
|
digi: "3.573",
|
|
},
|
|
b60M: {
|
|
cw: "5.353",
|
|
ssb: "5.450",
|
|
digi: "5.357",
|
|
},
|
|
b40M: {
|
|
cw: "7.032",
|
|
ssb: "7.100",
|
|
digi: "7.074",
|
|
},
|
|
b30M: {
|
|
cw: "10.110",
|
|
ssb: "10.120",
|
|
digi: "10.136",
|
|
},
|
|
b20M: {
|
|
cw: "14.032",
|
|
ssb: "14.200",
|
|
digi: "14.074",
|
|
},
|
|
b17M: {
|
|
cw: "18.070",
|
|
ssb: "18.120",
|
|
digi: "18.104",
|
|
},
|
|
b15M: {
|
|
cw: "21.032",
|
|
ssb: "21.200",
|
|
digi: "21.074",
|
|
},
|
|
b12M: {
|
|
cw: "24.895",
|
|
ssb: "24.910",
|
|
digi: "24.915",
|
|
},
|
|
b10M: {
|
|
cw: "20.032",
|
|
ssb: "28.200",
|
|
digi: "28.074",
|
|
},
|
|
b6M: {
|
|
cw: "50.090",
|
|
ssb: "50.350",
|
|
digi: "50.313",
|
|
},
|
|
b2M: {
|
|
cw: "144.090",
|
|
ssb: "144.250",
|
|
digi: "144.174",
|
|
},
|
|
b70CM: {
|
|
cw: "432.050",
|
|
ssb: "432.300",
|
|
digi: "432.065",
|
|
},
|
|
};
|
|
|
|
var $textarea = $("textarea");
|
|
var qsodate = "";
|
|
var qsotime = "";
|
|
var band = "";
|
|
var mode = "";
|
|
var freq = "";
|
|
var callsign = "";
|
|
var errors = [];
|
|
var qsoList = [];
|
|
|
|
$('#simpleFleInfoButton').click(function (event) {
|
|
var awardInfoLines = [
|
|
lang_simplefle_info_ln2,
|
|
lang_simplefle_info_ln3,
|
|
lang_simplefle_info_ln4
|
|
];
|
|
var simpleFleInfo = "";
|
|
awardInfoLines.forEach(function (line) {
|
|
simpleFleInfo += line + "<br><br>";
|
|
});
|
|
BootstrapDialog.alert({
|
|
title: "<h4>"+lang_simplefle_info_ln1+"</h4>",
|
|
message: simpleFleInfo,
|
|
});
|
|
});
|
|
|
|
$('#js-syntax').click(function (event) {
|
|
$('#js-syntax').prop("disabled", false);
|
|
$.ajax({
|
|
url: base_url + 'index.php/simplefle/displaySyntax',
|
|
type: 'post',
|
|
success: function (html) {
|
|
BootstrapDialog.alert({
|
|
title: "<h4>"+lang_simplefle_syntax_help_ln1+"</h4>",
|
|
size: BootstrapDialog.SIZE_WIDE,
|
|
nl2br: false,
|
|
message: html,
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
function handleInput() {
|
|
var qsodate = "";
|
|
if ($("#qsodate").val()) {
|
|
qsodate = new Date($("#qsodate").val()).toISOString().split("T")[0];
|
|
} else {
|
|
qsodate = new Date().toISOString().split("T")[0];
|
|
}
|
|
|
|
var operator = $("#operator").val();
|
|
operator = operator.toUpperCase();
|
|
var ownCallsign = $("#station-call").val().toUpperCase();
|
|
ownCallsign = ownCallsign.toUpperCase();
|
|
|
|
var extraQsoDate = qsodate;
|
|
var band = "";
|
|
var mode = "";
|
|
var freq = "";
|
|
var callsign = "";
|
|
var sotaWff = "";
|
|
qsoList = [];
|
|
$("#qsoTable tbody").empty();
|
|
|
|
var text = $textarea.val().trim();
|
|
lines = text.split("\n");
|
|
lines.forEach((row) => {
|
|
var rst_s = null;
|
|
var rst_r = null;
|
|
items = row.split(" ");
|
|
var itemNumber = 0;
|
|
items.forEach((item) => {
|
|
if (item === "") {
|
|
return;
|
|
}
|
|
if (
|
|
item.match(/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/)
|
|
) {
|
|
extraQsoDate = item;
|
|
} else if (
|
|
item.match(/^[0-2][0-9][0-5][0-9]$/) &&
|
|
itemNumber === 0
|
|
) {
|
|
qsotime = item;
|
|
} else if (item.match(/^CW$|^SSB$|^FM$|^AM$|^PSK$|^FT8$/i)) {
|
|
mode = item.toUpperCase();
|
|
} else if (
|
|
item.match(/^[1-9]?\d\d[Mm]$/) ||
|
|
item.toUpperCase() === "70CM"
|
|
) {
|
|
band = item.toUpperCase();
|
|
freq = 0;
|
|
} else if (item.match(/^\d+\.\d+$/)) {
|
|
freq = item;
|
|
band = "";
|
|
} else if (
|
|
item.match(/^[1-9]{1}$/) &&
|
|
qsotime &&
|
|
itemNumber === 0
|
|
) {
|
|
qsotime = qsotime.replace(/.$/, item);
|
|
} else if (
|
|
item.match(/^[0-5][0-9]{1}$/) &&
|
|
qsotime &&
|
|
itemNumber === 0
|
|
) {
|
|
qsotime = qsotime.slice(0, -2) + item;
|
|
} else if (
|
|
item.match(
|
|
/^([A-Z]*[F]{2}-\d{4})|([A-Z]*[A-Z]\/[A-Z]{2}-\d{3})$/i
|
|
)
|
|
) {
|
|
sotaWff = item.toUpperCase();
|
|
} else if (
|
|
item.match(
|
|
/([a-zA-Z0-9]{1,3}[0123456789][a-zA-Z0-9]{0,3}[a-zA-Z])|.*\/([a-zA-Z0-9]{1,3}[0123456789][a-zA-Z0-9]{0,3}[a-zA-Z])|([a-zA-Z0-9]{1,3}[0123456789][a-zA-Z0-9]{0,3}[a-zA-Z])\/.*/
|
|
)
|
|
) {
|
|
callsign = item.toUpperCase();
|
|
} else if (itemNumber > 0 && item.match(/^\d{1,2}$/)) {
|
|
if (rst_s === null) {
|
|
rst_s = item;
|
|
} else {
|
|
rst_r = item;
|
|
}
|
|
}
|
|
|
|
itemNumber = itemNumber + 1;
|
|
});
|
|
|
|
errors = [];
|
|
checkMainFieldsErrors();
|
|
|
|
if (callsign) {
|
|
if (freq === 0) {
|
|
freq = getFreqFromBand(band, mode);
|
|
} else if (band === "") {
|
|
band = getBandFromFreq(freq);
|
|
}
|
|
|
|
if (band === "") {
|
|
addErrorMessage("Band is missing!");
|
|
}
|
|
if (mode === "") {
|
|
addErrorMessage("Mode is missing");
|
|
}
|
|
if (qsotime === "") {
|
|
addErrorMessage("Time is not set!");
|
|
}
|
|
|
|
if (isValidDate(extraQsoDate) === false) {
|
|
addErrorMessage("Invalid date " + extraQsoDate);
|
|
extraQsoDate = qsodate;
|
|
}
|
|
|
|
rst_s = getReportByMode(rst_s, mode);
|
|
rst_r = getReportByMode(rst_r, mode);
|
|
|
|
qsoList.push([
|
|
extraQsoDate,
|
|
qsotime,
|
|
callsign,
|
|
freq,
|
|
band,
|
|
mode,
|
|
rst_s,
|
|
rst_r,
|
|
sotaWff,
|
|
]);
|
|
|
|
const tableRow = $(`<tr>
|
|
<td>${extraQsoDate}</td>
|
|
<td>${qsotime}</td>
|
|
<td>${callsign}</td>
|
|
<td><span data-toggle="tooltip" data-placement="left" title="${freq}">${band}</span></td>
|
|
<td>${mode}</td>
|
|
<td>${rst_s}</td>
|
|
<td>${rst_r}</td>
|
|
<td>${operator}</td>
|
|
<td>${sotaWff}</td>
|
|
</tr>`);
|
|
|
|
$("#qsoTable > tbody:last-child").append(tableRow);
|
|
|
|
localStorage.setItem("tabledata", $("#qsoTable").html());
|
|
localStorage.setItem("my-call", $("#station-call").val());
|
|
localStorage.setItem("operator", $("#operator").val());
|
|
localStorage.setItem("my-sota-wwff", $("#my-sota-wwff").val());
|
|
localStorage.setItem("qso-area", $(".qso-area").val());
|
|
localStorage.setItem("qsodate", $("#qsodate").val());
|
|
localStorage.setItem("my-power", $("#my-power").val());
|
|
localStorage.setItem("my-grid", $("#my-grid").val());
|
|
|
|
callsign = "";
|
|
sotaWff = "";
|
|
}
|
|
|
|
showErrors();
|
|
}); //lines.forEach((row)
|
|
|
|
// Scroll to the bototm of #qsoTableBody (scroll by the value of its scrollheight property)
|
|
$("#qsoTableBody").scrollTop($("#qsoTableBody").get(0).scrollHeight);
|
|
|
|
var qsoCount = qsoList.length;
|
|
if (qsoCount) {
|
|
$(".js-qso-count").html("<strong>Total:</strong> " + qsoCount + " QSO");
|
|
} else {
|
|
$(".js-qso-count").html("");
|
|
}
|
|
|
|
if (errors) {
|
|
$(".js-status").html(errors.join("<br>"));
|
|
}
|
|
}
|
|
|
|
function checkMainFieldsErrors() {
|
|
if ($("#station-call").val() === '-') {
|
|
addErrorMessage("'Station Call' is not selected!");
|
|
}
|
|
|
|
if ($("#operator").val() === "") {
|
|
addErrorMessage("'Operator' field is empty!");
|
|
}
|
|
}
|
|
|
|
$textarea.keydown(function (event) {
|
|
if (event.which == 13) {
|
|
handleInput();
|
|
}
|
|
});
|
|
|
|
$textarea.focus(function () {
|
|
errors = [];
|
|
checkMainFieldsErrors();
|
|
showErrors();
|
|
});
|
|
|
|
function addErrorMessage(errorMessage) {
|
|
errorMessage = '<span class="text-danger">' + errorMessage + "</span>";
|
|
if (errors.includes(errorMessage) == false) {
|
|
errors.push(errorMessage);
|
|
}
|
|
}
|
|
|
|
function isValidDate(d) {
|
|
return new Date(d) !== "Invalid Date" && !isNaN(new Date(d));
|
|
}
|
|
|
|
$(".js-reload-qso").click(function () {
|
|
handleInput();
|
|
});
|
|
|
|
$(".js-empty-qso").click(function () {
|
|
var result = confirm("Do you really want to reset everything?");
|
|
if (result == true) {
|
|
localStorage.removeItem("tabledata");
|
|
localStorage.removeItem("my-call");
|
|
localStorage.removeItem("operator");
|
|
localStorage.removeItem("my-sota-wwff");
|
|
localStorage.removeItem("qso-area");
|
|
localStorage.removeItem("qsodate");
|
|
localStorage.removeItem("my-grid");
|
|
$("#qsodate").val("");
|
|
$("#qsoTable tbody").empty();
|
|
$("#my-sota-wwff").val("");
|
|
$("#station-call").val("");
|
|
$("#operator").val("");
|
|
$(".qso-area").val("");
|
|
$("#my-grid").val("");
|
|
qsoList = [];
|
|
$(".js-qso-count").html("");
|
|
}
|
|
});
|
|
|
|
function showErrors() {
|
|
if (errors) {
|
|
$(".js-status").html(errors.join("<br>"));
|
|
}
|
|
}
|
|
|
|
$(".js-download-qso").click(function () {
|
|
handleInput();
|
|
});
|
|
|
|
|
|
function getBandFromFreq(freq) {
|
|
if (freq > 1.7 && freq < 2) {
|
|
return "160M";
|
|
} else if (freq > 3.4 && freq < 4) {
|
|
return "80M";
|
|
} else if (freq > 6.9 && freq < 7.3) {
|
|
return "40M";
|
|
} else if (freq > 5 && freq < 6) {
|
|
return "60M";
|
|
} else if (freq > 10 && freq < 11) {
|
|
return "30M";
|
|
} else if (freq > 13 && freq < 15) {
|
|
return "20M";
|
|
} else if (freq > 18 && freq < 19) {
|
|
return "17M";
|
|
} else if (freq > 20 && freq < 22) {
|
|
return "15M";
|
|
} else if (freq > 24 && freq < 25) {
|
|
return "12M";
|
|
} else if (freq > 27 && freq < 30) {
|
|
return "10M";
|
|
} else if (freq > 50 && freq < 55) {
|
|
return "6M";
|
|
} else if (freq > 144 && freq < 149) {
|
|
return "2M";
|
|
} else if (freq > 430 && freq < 460) {
|
|
return "70CM";
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
function getFreqFromBand(band, mode) {
|
|
const settingsMode = getSettingsMode(mode.toUpperCase());
|
|
const id = "#" + band.toUpperCase() + settingsMode;
|
|
if ($(id).length) {
|
|
return $(id).val();
|
|
}
|
|
}
|
|
|
|
function getSettingsMode(mode) {
|
|
if (mode === "AM" || mode === "FM" || mode === "SSB") {
|
|
return "SSB";
|
|
}
|
|
|
|
if (mode === "CW") {
|
|
return "CW";
|
|
}
|
|
|
|
return "DIGI";
|
|
}
|
|
|
|
var htmlSettings = "";
|
|
for (const [key, value] of Object.entries(Bands)) {
|
|
htmlSettings = `
|
|
${htmlSettings}
|
|
<div class="row">
|
|
<div class="col-3 mt-4">
|
|
<strong>${key.slice(1)}</strong>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="form-group">
|
|
<label for="${key.slice(1)}CW">CW</label>
|
|
<input type="text" class="form-control text-uppercase" id="${key.slice(
|
|
1
|
|
)}CW" value="${value.cw}">
|
|
</div>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="form-group">
|
|
<label for="${key.slice(1)}SSB">SSB</label>
|
|
<input type="text" class="form-control text-uppercase" id="${key.slice(
|
|
1
|
|
)}SSB" value="${value.ssb}">
|
|
</div>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="form-group">
|
|
<label for="${key.slice(1)}DIGI">DIGI</label>
|
|
<input type="text" class="form-control text-uppercase" id="${key.slice(
|
|
1
|
|
)}DIGI" value="${value.digi}">
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
`;
|
|
}
|
|
$(".js-band-settings").html(htmlSettings);
|
|
|
|
$(".js-download-adif").click(function () {
|
|
var operator = $("#operator").val();
|
|
operator = operator.toUpperCase();
|
|
var ownCallsign = $("#station-call").val().toUpperCase();
|
|
ownCallsign = ownCallsign.toUpperCase();
|
|
var mySotaWwff = $("#my-sota-wwff").val().toUpperCase();
|
|
|
|
var myPower = $("#my-power").val();
|
|
var myGrid = $("#my-grid").val().toUpperCase();
|
|
|
|
const adifHeader = `
|
|
ADIF export from Simple fast log entry by Petr, OK2CQR
|
|
|
|
Internet: https://sfle.ok2cqr.com
|
|
|
|
<ADIF_VER:5>2.2.1
|
|
<PROGRAMID:4>SFLE
|
|
<PROGRAMVERSION:5>0.0.1
|
|
<EOH>
|
|
|
|
`;
|
|
|
|
if (false === isBandModeEntered()) {
|
|
alert("Some QSO do not have band and/or mode defined!");
|
|
|
|
return false;
|
|
}
|
|
|
|
var adif = adifHeader;
|
|
qsoList.forEach((item) => {
|
|
const qsodate = item[0].replace("-", "").replace("-", "");
|
|
qso = getAdifTag("QSO_DATE", qsodate);
|
|
qso = qso + getAdifTag("TIME_ON", item[1].replace(":", ""));
|
|
qso = qso + getAdifTag("CALL", item[2]);
|
|
qso = qso + getAdifTag("FREQ", item[3]);
|
|
qso = qso + getAdifTag("BAND", item[4]);
|
|
qso = qso + getAdifTag("MODE", item[5]);
|
|
|
|
var rst = item[6];
|
|
settingsMode = getSettingsMode(rst);
|
|
if (settingsMode === "SSB") {
|
|
rst = "59";
|
|
}
|
|
qso = qso + getAdifTag("RST_SENT", rst);
|
|
|
|
var rst = item[7];
|
|
settingsMode = getSettingsMode(rst);
|
|
if (settingsMode === "SSB") {
|
|
rst = "59";
|
|
}
|
|
qso = qso + getAdifTag("RST_RCVD", rst);
|
|
|
|
qso = qso + getAdifTag("OPERATOR", operator);
|
|
qso = qso + getAdifTag("STATION_CALLSIGN", ownCallsign);
|
|
|
|
if (isSOTA(mySotaWwff)) {
|
|
qso = qso + getAdifTag("MY_SOTA_REF", mySotaWwff);
|
|
} else if (isWWFF(mySotaWwff)) {
|
|
qso = qso + getAdifTag("MY_SIG", "WWFF");
|
|
qso = qso + getAdifTag("MY_SIG_INFO", mySotaWwff);
|
|
}
|
|
|
|
if (isSOTA(item[8])) {
|
|
qso = qso + getAdifTag("SOTA_REF", item[8]);
|
|
} else if (isWWFF(item[8])) {
|
|
qso = qso + getAdifTag("SIG", "WWFF");
|
|
qso = qso + getAdifTag("SIG_INFO", item[8]);
|
|
}
|
|
|
|
if (myPower) {
|
|
qso = qso + getAdifTag("TX_PWR", myPower);
|
|
}
|
|
|
|
if (myGrid) {
|
|
qso = qso + getAdifTag("MY_GRIDSQUARE", myGrid);
|
|
}
|
|
|
|
qso = qso + "<EOR>";
|
|
|
|
adif = adif + qso + "\n";
|
|
});
|
|
|
|
qsodate = qsoList[0][0].replace("-", "").replace("-", "");
|
|
const filename =
|
|
operator.replace("/", "-") +
|
|
"_" +
|
|
mySotaWwff.replace("/", "-") +
|
|
"_" +
|
|
qsodate +
|
|
".adi";
|
|
download(filename, adif);
|
|
});
|
|
|
|
function isBandModeEntered() {
|
|
let isBandModeOK = true;
|
|
qsoList.forEach((item) => {
|
|
if (item[4] === "" || item[5] === "") {
|
|
isBandModeOK = false;
|
|
}
|
|
});
|
|
|
|
return isBandModeOK;
|
|
}
|
|
|
|
function getAdifTag(tagName, value) {
|
|
return "<" + tagName + ":" + value.length + ">" + value + " ";
|
|
}
|
|
|
|
function getReportByMode(rst, mode) {
|
|
settingsMode = getSettingsMode(mode);
|
|
|
|
if (rst === null) {
|
|
if (settingsMode === "SSB") {
|
|
return "59";
|
|
}
|
|
|
|
return "599";
|
|
}
|
|
|
|
if (settingsMode === "SSB") {
|
|
if (rst.length === 1) {
|
|
return "5" + rst;
|
|
}
|
|
|
|
return rst;
|
|
}
|
|
|
|
if (rst.length === 1) {
|
|
return "5" + rst + "9";
|
|
} else if (rst.length === 2) {
|
|
return rst + "9";
|
|
}
|
|
|
|
return rst;
|
|
}
|
|
|
|
function isSOTA(value) {
|
|
if (value.match(/^[A-Z]*[A-Z]\/[A-Z]{2}-\d{3}$/)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function isWWFF(value) {
|
|
if (value.match(/^[A-Z]*[F]{2}-\d{4}$/)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function download(filename, text) {
|
|
var element = document.createElement("a");
|
|
element.setAttribute(
|
|
"href",
|
|
"data:text/plain;charset=utf-8," + encodeURIComponent(text)
|
|
);
|
|
element.setAttribute("download", filename);
|
|
|
|
element.style.display = "none";
|
|
document.body.appendChild(element);
|
|
|
|
element.click();
|
|
|
|
document.body.removeChild(element);
|
|
}
|
|
|
|
$(document).ready(function () {
|
|
var tabledata = localStorage.getItem("tabledata");
|
|
var mycall = localStorage.getItem("my-call");
|
|
var operator = localStorage.getItem("operator");
|
|
var mysotawwff = localStorage.getItem("my-sota-wwff");
|
|
var qsoarea = localStorage.getItem("qso-area");
|
|
var qsodate = localStorage.getItem("qsodate");
|
|
var myPower = localStorage.getItem("my-power");
|
|
var myGrid = localStorage.getItem("my-grid");
|
|
|
|
if (mycall != null) {
|
|
$("#station-call").val(mycall);
|
|
}
|
|
|
|
if (operator != null) {
|
|
$("#operator").val(operator);
|
|
}
|
|
|
|
if (mysotawwff != null) {
|
|
$("#my-sota-wwff").val(mysotawwff);
|
|
}
|
|
|
|
if (qsoarea != null) {
|
|
$(".qso-area").val(qsoarea);
|
|
}
|
|
|
|
if (qsodate != null) {
|
|
$("#qsodate").val(qsodate);
|
|
}
|
|
|
|
if (myPower != null) {
|
|
$("#my-power").val(myPower);
|
|
}
|
|
|
|
if (myGrid != null) {
|
|
$("#my-grid").val(myGrid);
|
|
}
|
|
|
|
if (tabledata != null) {
|
|
$("#qsoTable").html(tabledata);
|
|
handleInput();
|
|
}
|
|
});
|