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) {
    var awardInfoLines = [
        lang_simplefle_syntax_help_ln2,
        lang_simplefle_syntax_help_ln3,
        lang_simplefle_syntax_help_ln4
    ];
    var simpleFleSyntaxHelp = "";
    awardInfoLines.forEach(function (line) {
        simpleFleSyntaxHelp += line + "
";
    });
    BootstrapDialog.alert({
        title: ""+lang_simplefle_syntax_help_ln1+"
",
        message: simpleFleSyntaxHelp,
    });
});
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 = $(`
          | ${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}
      
    `;
}
$(".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();
	}
});