| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 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 = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:58:34 +08:00
										 |  |  | $('#simpleFleInfoButton').click(function (event) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |     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, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:58:34 +08:00
										 |  |  | $('#js-syntax').click(function (event) { | 
					
						
							| 
									
										
										
										
											2023-10-26 20:06:54 +08:00
										 |  |  |     $('#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>", | 
					
						
							| 
									
										
										
										
											2023-10-26 20:21:33 +08:00
										 |  |  |                 size: BootstrapDialog.SIZE_WIDE, | 
					
						
							| 
									
										
										
										
											2023-10-26 20:06:54 +08:00
										 |  |  |                 nl2br: false, | 
					
						
							|  |  |  |                 message: html, | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-10-25 16:58:34 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 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(); | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 	var ownCallsign = $("#station-call").val().toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	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 ( | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  | 				item.match(/^[0-9]{1,4}(?:m|cm|mm)$/) || | 
					
						
							|  |  |  | 				item.match(/^(sat)$/) | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			) { | 
					
						
							|  |  |  | 				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()); | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 			localStorage.setItem("my-call", $("#station-call").val()); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			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() { | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 	if ($("#station-call").val() === '-') { | 
					
						
							|  |  |  | 		addErrorMessage("'Station Call' is not selected!"); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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(""); | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 		$("#station-call").val(""); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		$("#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}"> | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |         </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}"> | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |         </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}"> | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |       </div> | 
					
						
							|  |  |  |     `;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | $(".js-band-settings").html(htmlSettings); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $(".js-download-adif").click(function () { | 
					
						
							|  |  |  | 	var operator = $("#operator").val(); | 
					
						
							|  |  |  | 	operator = operator.toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 	var ownCallsign = $("#station-call").val().toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	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 | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |   Internet: https://sfle.ok2cqr.com
 | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |   <ADIF_VER:5>2.2.1 | 
					
						
							|  |  |  |   <PROGRAMID:4>SFLE | 
					
						
							|  |  |  |   <PROGRAMVERSION:5>0.0.1 | 
					
						
							|  |  |  |   <EOH> | 
					
						
							| 
									
										
										
										
											2023-10-26 21:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  |   `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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) { | 
					
						
							| 
									
										
										
										
											2023-10-25 21:14:53 +08:00
										 |  |  | 		$("#station-call").val(mycall); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); |