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 + "

"; }); BootstrapDialog.alert({ title: "

"+lang_simplefle_info_ln1+"

", 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: "

"+lang_simplefle_syntax_help_title+"

", 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(/^[0-9]{1,4}(?:m|cm|mm)$/) || item.match(/^(sat)$/) ) { 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 = $(` ${extraQsoDate} ${qsotime} ${callsign} ${band} ${mode} ${rst_s} ${rst_r} ${operator} ${sotaWff} `); $("#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("Total: " + qsoCount + " QSO"); } else { $(".js-qso-count").html(""); } if (errors) { $(".js-status").html(errors.join("
")); } } 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 = '' + errorMessage + ""; 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("
")); } } $(".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}
${key.slice(1)}
`; } $(".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 2.2.1 SFLE 0.0.1 `; 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 + ""; 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(); } });