| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | var $textarea = $("textarea"); | 
					
						
							|  |  |  | var qsodate = ""; | 
					
						
							|  |  |  | var qsotime = ""; | 
					
						
							|  |  |  | var band = ""; | 
					
						
							|  |  |  | var mode = ""; | 
					
						
							|  |  |  | var freq = ""; | 
					
						
							|  |  |  | var callsign = ""; | 
					
						
							|  |  |  | var errors = []; | 
					
						
							|  |  |  | var qsoList = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | $("#simpleFleInfoButton").click(function (event) { | 
					
						
							|  |  |  | 	var awardInfoLines = [ | 
					
						
							|  |  |  | 		lang_qso_simplefle_info_ln2, | 
					
						
							|  |  |  | 		lang_qso_simplefle_info_ln3, | 
					
						
							|  |  |  | 		lang_qso_simplefle_info_ln4, | 
					
						
							|  |  |  | 	]; | 
					
						
							|  |  |  | 	var simpleFleInfo = ""; | 
					
						
							|  |  |  | 	awardInfoLines.forEach(function (line) { | 
					
						
							|  |  |  | 		simpleFleInfo += line + "<br><br>"; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	BootstrapDialog.alert({ | 
					
						
							|  |  |  | 		title: "<h4>" + lang_qso_simplefle_info_ln1 + "</h4>", | 
					
						
							|  |  |  | 		message: simpleFleInfo, | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | $("#js-syntax").click(function (event) { | 
					
						
							|  |  |  | 	$("#js-syntax").prop("disabled", false); | 
					
						
							|  |  |  | 	$.ajax({ | 
					
						
							| 
									
										
										
										
											2023-11-02 04:43:06 +08:00
										 |  |  | 		url: base_url + "index.php/simplefle/displaySyntax", | 
					
						
							|  |  |  | 		type: "post", | 
					
						
							|  |  |  | 		success: function (html) { | 
					
						
							|  |  |  | 			BootstrapDialog.show({ | 
					
						
							|  |  |  | 				title: "<h4>" + lang_qso_simplefle_syntax_help_title + "</h4>", | 
					
						
							| 
									
										
										
										
											2023-11-02 04:08:21 +08:00
										 |  |  | 				type: BootstrapDialog.TYPE_INFO, | 
					
						
							|  |  |  | 				size: BootstrapDialog.SIZE_WIDE, | 
					
						
							| 
									
										
										
										
											2023-11-02 04:43:06 +08:00
										 |  |  | 				nl2br: false, | 
					
						
							|  |  |  | 				message: html, | 
					
						
							|  |  |  | 				buttons: [ | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						label: lang_qso_simplefle_syntax_help_close_w_sample, | 
					
						
							|  |  |  | 						action: function () { | 
					
						
							|  |  |  | 							BootstrapDialog.confirm({ | 
					
						
							|  |  |  | 								title: lang_general_word_warning, | 
					
						
							|  |  |  | 								message: lang_qso_simplefle_warning_reset, | 
					
						
							|  |  |  | 								type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 								btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 								btnOKLabel: lang_general_word_ok, | 
					
						
							|  |  |  | 								btnOKClass: "btn-warning", | 
					
						
							|  |  |  | 								callback: function (result) { | 
					
						
							|  |  |  | 									if (result) { | 
					
						
							|  |  |  | 										clearSession(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 										const logData = `
 | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | *example-data* | 
					
						
							| 
									
										
										
										
											2023-11-06 20:41:34 +08:00
										 |  |  | date 2023-05-14 | 
					
						
							| 
									
										
										
										
											2023-11-02 04:43:06 +08:00
										 |  |  | 80m cw | 
					
						
							|  |  |  | 1212 m0abc okff-1234 | 
					
						
							|  |  |  | 3 hb9hil | 
					
						
							|  |  |  | 4 ok1tn | 
					
						
							|  |  |  | 20 dl6kva 7 8 | 
					
						
							| 
									
										
										
										
											2023-11-06 20:41:34 +08:00
										 |  |  | 5 dl5cw | 
					
						
							|  |  |  | day ++ | 
					
						
							| 
									
										
										
										
											2023-11-02 04:43:06 +08:00
										 |  |  | ssb | 
					
						
							|  |  |  | 32 ok7wa ol/zl-071 5 8 | 
					
						
							|  |  |  | 33 ok1xxx  4 3 | 
					
						
							|  |  |  | 									`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 										$textarea.val(logData.trim()); | 
					
						
							|  |  |  | 										handleInput(); | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | 										BootstrapDialog.closeAll(); | 
					
						
							| 
									
										
										
										
											2023-11-02 04:43:06 +08:00
										 |  |  | 									} | 
					
						
							|  |  |  | 								}, | 
					
						
							|  |  |  | 							}); | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						label: lang_admin_close, | 
					
						
							|  |  |  | 						cssClass: "btn-primary", | 
					
						
							|  |  |  | 						action: function (dialogItself) { | 
					
						
							|  |  |  | 							dialogItself.close(); | 
					
						
							|  |  |  | 						}, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 				], | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:58:34 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-04 19:45:07 +08:00
										 |  |  | function updateUTCTime() { | 
					
						
							|  |  |  | 	const utcTimeElement = document.getElementById("utc-time"); | 
					
						
							|  |  |  | 	const now = new Date(); | 
					
						
							|  |  |  | 	const utcTimeString = now.toISOString().split("T")[1].split(".")[0]; | 
					
						
							|  |  |  | 	utcTimeElement.textContent = utcTimeString; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 = ""; | 
					
						
							| 
									
										
										
										
											2023-11-02 15:44:47 +08:00
										 |  |  | 	var sotaWwff = ""; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	qsoList = []; | 
					
						
							|  |  |  | 	$("#qsoTable tbody").empty(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var text = $textarea.val().trim(); | 
					
						
							|  |  |  | 	lines = text.split("\n"); | 
					
						
							|  |  |  | 	lines.forEach((row) => { | 
					
						
							|  |  |  | 		var rst_s = null; | 
					
						
							|  |  |  | 		var rst_r = null; | 
					
						
							| 
									
										
										
										
											2023-11-01 00:05:53 +08:00
										 |  |  | 		items = row.startsWith("day ") ? [row] : row.split(" "); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		var itemNumber = 0; | 
					
						
							| 
									
										
										
										
											2023-11-10 04:49:17 +08:00
										 |  |  | 		var freq = 0; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		items.forEach((item) => { | 
					
						
							|  |  |  | 			if (item === "") { | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-11-01 00:05:53 +08:00
										 |  |  | 			if (item.trim().match(/^day (\+)+$/)) { | 
					
						
							|  |  |  | 				var plusCount = item.match(/\+/g).length; | 
					
						
							| 
									
										
										
										
											2023-11-09 07:54:26 +08:00
										 |  |  | 				var originalDate = new Date(extraQsoDate); | 
					
						
							| 
									
										
										
										
											2023-11-01 00:05:53 +08:00
										 |  |  | 				originalDate.setDate(originalDate.getDate() + plusCount); | 
					
						
							|  |  |  | 				extraQsoDate = originalDate.toISOString().split("T")[0]; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			} else if ( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				item.match(/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/) | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				extraQsoDate = item; | 
					
						
							|  |  |  | 			} else if (item.match(/^[0-2][0-9][0-5][0-9]$/)) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				qsotime = item; | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 			} else if ( | 
					
						
							|  |  |  | 				item.match(/^CW$|^SSB$|^LSB$|^USB$|^FM$|^AM$|^PSK$|^FT8$/i) | 
					
						
							|  |  |  | 			) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				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
										 |  |  | 			) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 				band = item; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				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( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 					/^[A-Z0-9]{1,3}\/[A-Z]{2}-\d{3}|[AENOS]*[FNSUACA]-\d{3}|(?!.*FF)[A-Z0-9]{1,3}-\d{4,5}|[A-Z0-9]{1,3}[F]{2}-\d{4}$/i, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				) | 
					
						
							|  |  |  | 			) { | 
					
						
							| 
									
										
										
										
											2023-11-02 15:44:47 +08:00
										 |  |  | 				sotaWwff = item.toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			} else if ( | 
					
						
							|  |  |  | 				item.match( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 					/([a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z])|.*\/([a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z])|([a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z])\/.*/, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				) | 
					
						
							|  |  |  | 			) { | 
					
						
							|  |  |  | 				callsign = item.toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-31 17:26:15 +08:00
										 |  |  | 			} else if (itemNumber > 0 && item.match(/^\d{1,3}$/)) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				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 === "") { | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 				addErrorMessage(lang_qso_simplefle_error_band); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (mode === "") { | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 				addErrorMessage(lang_qso_simplefle_error_mode); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (qsotime === "") { | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 				addErrorMessage(lang_qso_simplefle_error_time); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (isValidDate(extraQsoDate) === false) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				addErrorMessage( | 
					
						
							|  |  |  | 					lang_qso_simplefle_error_date + " " + extraQsoDate, | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 				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, | 
					
						
							| 
									
										
										
										
											2023-11-02 15:44:47 +08:00
										 |  |  | 				sotaWwff, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-02 22:07:57 +08:00
										 |  |  | 			let sotaWwffText = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (isSOTA(sotaWwff)) { | 
					
						
							|  |  |  | 				sotaWwffText = `S: ${sotaWwff}`; | 
					
						
							|  |  |  | 			} else if (isPOTA(sotaWwff)) { | 
					
						
							|  |  |  | 				sotaWwffText = `P: ${sotaWwff}`; | 
					
						
							|  |  |  | 			} else if (isIOTA(sotaWwff)) { | 
					
						
							|  |  |  | 				sotaWwffText = `I: ${sotaWwff}`; | 
					
						
							|  |  |  | 			} else if (isWWFF(sotaWwff)) { | 
					
						
							|  |  |  | 				sotaWwffText = `W: ${sotaWwff}`; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			const tableRow = $(`<tr>
 | 
					
						
							| 
									
										
										
										
											2023-11-02 22:07:57 +08:00
										 |  |  | 			<td>${extraQsoDate}</td> | 
					
						
							|  |  |  | 			<td>${qsotime}</td> | 
					
						
							|  |  |  | 			<td>${callsign}</td> | 
					
						
							| 
									
										
										
										
											2023-11-26 17:00:47 +08:00
										 |  |  | 			<td><span data-bs-toggle="tooltip" data-placement="left" title="${freq}">${band}</span></td> | 
					
						
							| 
									
										
										
										
											2023-11-02 22:07:57 +08:00
										 |  |  | 			<td>${mode}</td> | 
					
						
							|  |  |  | 			<td>${rst_s}</td> | 
					
						
							|  |  |  | 			<td>${rst_r}</td> | 
					
						
							|  |  |  | 			<td>${operator}</td> | 
					
						
							|  |  |  | 			<td>${sotaWwffText}</td> | 
					
						
							|  |  |  | 			</tr>`); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			$("#qsoTable > tbody:last-child").append(tableRow); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_tabledata`, | 
					
						
							|  |  |  | 				$("#qsoTable").html(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_my-call`, | 
					
						
							|  |  |  | 				$("#station-call").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_operator`, | 
					
						
							|  |  |  | 				$("#operator").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_my-sota-wwff`, | 
					
						
							|  |  |  | 				$("#my-sota-wwff").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_qso-area`, | 
					
						
							|  |  |  | 				$(".qso-area").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_qsodate`, | 
					
						
							|  |  |  | 				$("#qsodate").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_my-power`, | 
					
						
							|  |  |  | 				$("#my-power").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			localStorage.setItem( | 
					
						
							|  |  |  | 				`user_${user_id}_my-grid`, | 
					
						
							|  |  |  | 				$("#my-grid").val(), | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			callsign = ""; | 
					
						
							| 
									
										
										
										
											2023-11-02 15:44:47 +08:00
										 |  |  | 			sotaWwff = ""; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		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) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		$(".js-qso-count").html( | 
					
						
							|  |  |  | 			"<strong>" + | 
					
						
							|  |  |  | 				lang_qso_simplefle_qso_list_total + | 
					
						
							|  |  |  | 				":</strong> " + | 
					
						
							|  |  |  | 				qsoCount + | 
					
						
							|  |  |  | 				" " + | 
					
						
							|  |  |  | 				lang_gen_hamradio_qso, | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		$(".js-qso-count").html(""); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (errors) { | 
					
						
							|  |  |  | 		$(".js-status").html(errors.join("<br>")); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function checkMainFieldsErrors() { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 	if ($("#station-call").val() === "-") { | 
					
						
							|  |  |  | 		$("#warningStationCall").show(); | 
					
						
							|  |  |  | 		$("#station-call").css("border", "2px solid rgb(217, 83, 79)"); | 
					
						
							|  |  |  | 		$("#warningStationCall").text(lang_qso_simplefle_error_stationcall); | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		$("#station-call").css("border", ""); | 
					
						
							|  |  |  | 		$("#warningStationCall").hide(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if ($("#operator").val() === "") { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		$("#warningOperatorField").show(); | 
					
						
							|  |  |  | 		$("#operator").css("border", "2px solid rgb(217, 83, 79)"); | 
					
						
							|  |  |  | 		$("#warningOperatorField").text(lang_qso_simplefle_error_operator); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$("#operator").css("border", ""); | 
					
						
							|  |  |  | 		$("#warningOperatorField").hide(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	if ($("textarea").val() === "") { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		$("#textarea").css("border", "2px solid rgb(217, 83, 79)"); | 
					
						
							|  |  |  | 		setTimeout(function () { | 
					
						
							|  |  |  | 			$("#textarea").css("border", ""); | 
					
						
							|  |  |  | 		}, 2000); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$("#textarea").css("border", ""); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $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 () { | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	BootstrapDialog.confirm({ | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 		title: lang_general_word_warning, | 
					
						
							|  |  |  | 		message: lang_qso_simplefle_warning_reset, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 		type: BootstrapDialog.TYPE_DANGER, | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 		btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 		btnOKLabel: lang_general_word_ok, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 		btnOKClass: "btn-warning", | 
					
						
							|  |  |  | 		callback: function (result) { | 
					
						
							|  |  |  | 			if (result) { | 
					
						
							|  |  |  | 				clearSession(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | function clearSession() { | 
					
						
							| 
									
										
										
										
											2023-10-28 03:45:15 +08:00
										 |  |  | 	localStorage.removeItem(`user_${user_id}_tabledata`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_my-call`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_operator`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_my-sota-wwff`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_qso-area`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_qsodate`); | 
					
						
							|  |  |  | 	localStorage.removeItem(`user_${user_id}_my-grid`); | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	$("#qsodate").val(""); | 
					
						
							|  |  |  | 	$("#qsoTable tbody").empty(); | 
					
						
							|  |  |  | 	$("#my-sota-wwff").val(""); | 
					
						
							|  |  |  | 	// $("#station-call").val("");        	Do not clear that?
 | 
					
						
							|  |  |  | 	// $("#operator").val("");				Do not clear that?
 | 
					
						
							|  |  |  | 	$(".qso-area").val(""); | 
					
						
							|  |  |  | 	$("#my-grid").val(""); | 
					
						
							|  |  |  | 	qsoList = []; | 
					
						
							|  |  |  | 	$(".js-qso-count").html(""); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 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) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "160m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 3.4 && freq < 4) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "80m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 6.9 && freq < 7.3) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "40m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 5 && freq < 6) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "60m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 10 && freq < 11) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "30m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 13 && freq < 15) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "20m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 18 && freq < 19) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "17m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 20 && freq < 22) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "15m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 24 && freq < 25) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "12m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 27 && freq < 30) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "10m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 50 && freq < 55) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "6m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 144 && freq < 149) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "2m"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} else if (freq > 430 && freq < 460) { | 
					
						
							| 
									
										
										
										
											2023-10-27 21:57:17 +08:00
										 |  |  | 		return "70cm"; | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ""; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getFreqFromBand(band, mode) { | 
					
						
							| 
									
										
										
										
											2023-11-10 04:49:17 +08:00
										 |  |  | 	var settingsMode = getSettingsMode(mode.toUpperCase()); | 
					
						
							|  |  |  | 	var settingsBand = "b" + band.toUpperCase(); | 
					
						
							|  |  |  | 	var bandData = Bands[settingsBand]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (bandData) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		return bandData[settingsMode] / 1000000; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getSettingsMode(mode) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 	if ( | 
					
						
							|  |  |  | 		mode === "AM" || | 
					
						
							|  |  |  | 		mode === "FM" || | 
					
						
							|  |  |  | 		mode === "SSB" || | 
					
						
							|  |  |  | 		mode === "LSB" || | 
					
						
							|  |  |  | 		mode === "USB" | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		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( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				1, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			)}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( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				1, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			)}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( | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 				1, | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 			)}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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isBandModeEntered() { | 
					
						
							|  |  |  | 	let isBandModeOK = true; | 
					
						
							|  |  |  | 	qsoList.forEach((item) => { | 
					
						
							|  |  |  | 		if (item[4] === "" || item[5] === "") { | 
					
						
							|  |  |  | 			isBandModeOK = false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return isBandModeOK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-09 00:51:26 +08:00
										 |  |  | function isTimeEntered() { | 
					
						
							|  |  |  | 	let isTimeOK = true; | 
					
						
							|  |  |  | 	qsoList.forEach((item) => { | 
					
						
							|  |  |  | 		if (item[1] === "") { | 
					
						
							|  |  |  | 			isTimeOK = false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return isTimeOK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | function isExampleDataEntered() { | 
					
						
							|  |  |  | 	let isExampleData = false; | 
					
						
							|  |  |  | 	if (textarea.value.startsWith("*example-data*")) { | 
					
						
							|  |  |  | 		isExampleData = true; | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | 	return isExampleData; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 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; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-10-31 17:26:15 +08:00
										 |  |  | 		if (rst.length === 3) { | 
					
						
							|  |  |  | 			return rst.slice(0, 2); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return rst; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (rst.length === 1) { | 
					
						
							|  |  |  | 		return "5" + rst + "9"; | 
					
						
							|  |  |  | 	} else if (rst.length === 2) { | 
					
						
							|  |  |  | 		return rst + "9"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return rst; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isSOTA(value) { | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 	if (value.match(/^[A-Z0-9]{1,3}\/[A-Z]{2}-\d{3}$/)) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | function isIOTA(value) { | 
					
						
							|  |  |  | 	if (value.match(/^[AENOS]*[FNSUACA]-\d{3}$/)) { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isPOTA(value) { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:25:21 +08:00
										 |  |  | 	if (value.match(/^(?!.*FF)[A-Z0-9]{1,3}-\d{4,5}$/)) { | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | function isWWFF(value) { | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 	if (value.match(/^[A-Z0-9]{1,3}[F]{2}-\d{4}$/)) { | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $(document).ready(function () { | 
					
						
							| 
									
										
										
										
											2023-11-04 19:45:07 +08:00
										 |  |  | 	setInterval(updateUTCTime, 1000); | 
					
						
							|  |  |  | 	updateUTCTime(); | 
					
						
							| 
									
										
										
										
											2023-10-28 03:45:15 +08:00
										 |  |  | 	var tabledata = localStorage.getItem(`user_${user_id}_tabledata`); | 
					
						
							|  |  |  | 	var mycall = localStorage.getItem(`user_${user_id}_my-call`); | 
					
						
							|  |  |  | 	var operator = localStorage.getItem(`user_${user_id}_operator`); | 
					
						
							|  |  |  | 	var mysotawwff = localStorage.getItem(`user_${user_id}_my-sota-wwff`); | 
					
						
							|  |  |  | 	var qsoarea = localStorage.getItem(`user_${user_id}_qso-area`); | 
					
						
							|  |  |  | 	var qsodate = localStorage.getItem(`user_${user_id}_qsodate`); | 
					
						
							|  |  |  | 	var myPower = localStorage.getItem(`user_${user_id}_my-power`); | 
					
						
							|  |  |  | 	var myGrid = localStorage.getItem(`user_${user_id}_my-grid`); | 
					
						
							| 
									
										
										
										
											2023-10-25 16:02:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-10-27 02:46:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | $(".js-save-to-log").click(function () { | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	if ($("textarea").val() === "") { | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 		$("#textarea").css("border", "2px solid rgb(217, 83, 79)"); | 
					
						
							|  |  |  | 		setTimeout(function () { | 
					
						
							|  |  |  | 			$("#textarea").css("border", ""); | 
					
						
							|  |  |  | 		}, 2000); | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2023-10-28 01:32:21 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (false === isBandModeEntered()) { | 
					
						
							|  |  |  | 		BootstrapDialog.alert({ | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 			title: lang_general_word_warning, | 
					
						
							|  |  |  | 			message: lang_qso_simplefle_warning_missing_band_mode, | 
					
						
							| 
									
										
										
										
											2023-10-28 01:32:21 +08:00
										 |  |  | 			type: BootstrapDialog.TYPE_DANGER, | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 			btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 			btnOKLabel: lang_general_word_ok, | 
					
						
							| 
									
										
										
										
											2023-10-28 01:32:21 +08:00
										 |  |  | 			btnOKClass: "btn-warning", | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-09 00:51:26 +08:00
										 |  |  | 	if (false === isTimeEntered()) { | 
					
						
							|  |  |  | 		BootstrapDialog.alert({ | 
					
						
							|  |  |  | 			title: lang_general_word_warning, | 
					
						
							|  |  |  | 			message: lang_qso_simplefle_warning_missing_time, | 
					
						
							|  |  |  | 			type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 			btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 			btnOKLabel: lang_general_word_ok, | 
					
						
							|  |  |  | 			btnOKClass: "btn-warning", | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-02 15:22:01 +08:00
										 |  |  | 	if (true === isExampleDataEntered()) { | 
					
						
							|  |  |  | 		BootstrapDialog.alert({ | 
					
						
							|  |  |  | 			title: lang_general_word_warning, | 
					
						
							|  |  |  | 			message: lang_qso_simplefle_warning_example_data, | 
					
						
							|  |  |  | 			type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 			btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 			btnOKLabel: lang_general_word_ok, | 
					
						
							|  |  |  | 			btnOKClass: "btn-warning", | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 		handleInput(); | 
					
						
							|  |  |  | 		BootstrapDialog.confirm({ | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 			title: lang_general_word_attention, | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 			message: lang_qso_simplefle_confirm_save_to_log, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 			type: BootstrapDialog.TYPE_INFO, | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 			btnCancelLabel: lang_general_word_cancel, | 
					
						
							|  |  |  | 			btnOKLabel: lang_general_word_ok, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 			btnOKClass: "btn-info", | 
					
						
							|  |  |  | 			callback: function (result) { | 
					
						
							|  |  |  | 				if (result) { | 
					
						
							|  |  |  | 					var operator = $("#operator").val(); | 
					
						
							|  |  |  | 					operator = operator.toUpperCase(); | 
					
						
							|  |  |  | 					var ownCallsign = $("#station-call").val().toUpperCase(); | 
					
						
							|  |  |  | 					ownCallsign = ownCallsign.toUpperCase(); | 
					
						
							| 
									
										
										
										
											2023-10-30 15:53:06 +08:00
										 |  |  | 					// var mySotaWwff = $("#my-sota-wwff").val().toUpperCase();
 | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 15:53:06 +08:00
										 |  |  | 					// var myPower = $("#my-power").val();
 | 
					
						
							|  |  |  | 					// var myGrid = $("#my-grid").val().toUpperCase();
 | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					qsoList.forEach((item) => { | 
					
						
							|  |  |  | 						var callsign = item[2]; | 
					
						
							|  |  |  | 						var rst_rcvd = item[7]; | 
					
						
							|  |  |  | 						var rst_sent = item[6]; | 
					
						
							| 
									
										
										
										
											2023-10-27 18:40:34 +08:00
										 |  |  | 						var start_date = item[0]; | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 						var start_time = | 
					
						
							|  |  |  | 							item[1][0] + | 
					
						
							|  |  |  | 							item[1][1] + | 
					
						
							|  |  |  | 							":" + | 
					
						
							|  |  |  | 							item[1][2] + | 
					
						
							|  |  |  | 							item[1][3]; | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 						var band = item[4]; | 
					
						
							|  |  |  | 						var mode = item[5]; | 
					
						
							| 
									
										
										
										
											2023-11-06 20:26:48 +08:00
										 |  |  | 						var freq_display = item[3] * 1000000; | 
					
						
							| 
									
										
										
										
											2023-10-27 18:40:34 +08:00
										 |  |  | 						var station_profile = $(".station_id").val(); | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 						var sota_ref = ""; | 
					
						
							|  |  |  | 						var iota_ref = ""; | 
					
						
							|  |  |  | 						var pota_ref = ""; | 
					
						
							|  |  |  | 						var wwff_ref = ""; | 
					
						
							| 
									
										
										
										
											2023-11-01 03:50:05 +08:00
										 |  |  | 						if (isSOTA(item[8])) { | 
					
						
							|  |  |  | 							sota_ref = item[8]; | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 						} else if (isIOTA(item[8])) { | 
					
						
							|  |  |  | 							iota_ref = item[8]; | 
					
						
							|  |  |  | 						} else if (isPOTA(item[8])) { | 
					
						
							|  |  |  | 							pota_ref = item[8]; | 
					
						
							| 
									
										
										
										
											2023-11-01 03:50:05 +08:00
										 |  |  | 						} else if (isWWFF(item[8])) { | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 							wwff_ref = item[8]; | 
					
						
							| 
									
										
										
										
											2023-11-01 03:50:05 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2023-10-27 18:40:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						$.ajax({ | 
					
						
							|  |  |  | 							url: base_url + "index.php/qso/saveqso", | 
					
						
							|  |  |  | 							type: "post", | 
					
						
							|  |  |  | 							data: { | 
					
						
							|  |  |  | 								callsign: callsign, | 
					
						
							|  |  |  | 								rst_rcvd: rst_rcvd, | 
					
						
							|  |  |  | 								rst_sent: rst_sent, | 
					
						
							|  |  |  | 								start_date: start_date, | 
					
						
							|  |  |  | 								band: band, | 
					
						
							|  |  |  | 								mode: mode, | 
					
						
							|  |  |  | 								freq_display: freq_display, | 
					
						
							|  |  |  | 								start_time: start_time, | 
					
						
							|  |  |  | 								station_profile: station_profile, | 
					
						
							| 
									
										
										
										
											2023-11-01 03:50:05 +08:00
										 |  |  | 								sota_ref: sota_ref, | 
					
						
							| 
									
										
										
										
											2023-11-01 06:06:49 +08:00
										 |  |  | 								iota_ref: iota_ref, | 
					
						
							|  |  |  | 								pota_ref: pota_ref, | 
					
						
							|  |  |  | 								wwff_ref: wwff_ref, | 
					
						
							| 
									
										
										
										
											2023-11-29 21:26:23 +08:00
										 |  |  | 								isSFLE: true | 
					
						
							| 
									
										
										
										
											2023-10-27 18:40:34 +08:00
										 |  |  | 							}, | 
					
						
							|  |  |  | 							success: function (result) {}, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2023-10-27 18:35:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 					clearSession(); | 
					
						
							|  |  |  | 					BootstrapDialog.alert({ | 
					
						
							| 
									
										
										
										
											2023-10-31 06:52:20 +08:00
										 |  |  | 						title: lang_qso_simplefle_success_save_to_log_header, | 
					
						
							| 
									
										
										
										
											2023-11-11 14:31:07 +08:00
										 |  |  | 						message: lang_qso_simplefle_success_save_to_log, | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2023-10-27 02:46:13 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2023-10-27 04:50:55 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-27 02:46:13 +08:00
										 |  |  | }); |