| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | var callBookProcessingDialog = null; | 
					
						
							|  |  |  | var inCallbookProcessing = false; | 
					
						
							|  |  |  | var inCallbookItemProcessing = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-01 14:58:13 +08:00
										 |  |  | $('#band').change(function () { | 
					
						
							|  |  |  | 	var band = $("#band option:selected").text(); | 
					
						
							|  |  |  | 	if (band != "SAT") { | 
					
						
							|  |  |  | 		$(".sats_dropdown").attr("hidden", true); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$(".sats_dropdown").removeAttr("hidden"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-09 02:12:07 +08:00
										 |  |  | $('#selectPropagation').change(function () { | 
					
						
							|  |  |  | 	var prop_mode = $("#selectPropagation option:selected").text(); | 
					
						
							|  |  |  | 	if (prop_mode != "Satellite") { | 
					
						
							|  |  |  | 		$(".sats_dropdown").attr("hidden", true); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$(".sats_dropdown").removeAttr("hidden"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | function updateRow(qso) { | 
					
						
							|  |  |  | 	let row = $('#qsoID-' + qso.qsoID); | 
					
						
							|  |  |  | 	let cells = row.find('td'); | 
					
						
							|  |  |  | 	let c = 1; | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.qsoDateTime); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.de); | 
					
						
							| 
									
										
										
										
											2023-08-23 17:55:08 +08:00
										 |  |  | 	cells.eq(c++).html('<span class="qso_call"><a id="edit_qso" href="javascript:displayQso('+qso.qsoID+')">'+qso.dx+'</a><span class="qso_icons">' + (qso.callsign == '' ? '' : ' <a href="https://lotw.arrl.org/lotwuser/act?act='+qso.callsign+'" target="_blank"><small id="lotw_info" class="badge badge-success'+qso.lotw_hint+'" data-toggle="tooltip" data-original-title="LoTW User. Last upload was ' + qso.lastupload + '">L</small></a>') + ' <a target="_blank" href="https://www.qrz.com/db/'+qso.dx+'"><img width="16" height="16" src="'+base_url+ 'images/icons/qrz.png" alt="Lookup ' + qso.dx + ' on QRZ.com"></a> <a target="_blank" href="https://www.hamqth.com/'+qso.dx+'"><img width="16" height="16" src="'+base_url+ 'images/icons/hamqth.png" alt="Lookup ' + qso.dx + ' on HamQTH"></a></span></span>'); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	cells.eq(c++).text(qso.mode); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.rstS); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.rstR); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.band); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.deRefs); | 
					
						
							| 
									
										
										
										
											2023-06-27 02:54:36 +08:00
										 |  |  | 	cells.eq(c++).html(qso.dxRefs); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	cells.eq(c++).text(qso.name); | 
					
						
							|  |  |  | 	cells.eq(c++).text(qso.qslVia); | 
					
						
							| 
									
										
										
										
											2023-05-03 00:20:08 +08:00
										 |  |  | 	cells.eq(c++).html(qso.qsl); | 
					
						
							| 
									
										
										
										
											2023-05-03 01:04:12 +08:00
										 |  |  | 	if ($(".eqslconfirmation")[0]){ | 
					
						
							|  |  |  | 		cells.eq(c++).html(qso.eqsl); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-05-08 14:49:24 +08:00
										 |  |  | 	if ($(".lotwconfirmation")[0]){ | 
					
						
							|  |  |  | 		cells.eq(c++).html(qso.lotw); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	cells.eq(c++).text(qso.qslMessage); | 
					
						
							| 
									
										
										
										
											2023-07-01 05:36:35 +08:00
										 |  |  | 	cells.eq(c++).html(qso.dxcc); | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 	cells.eq(c++).text(qso.state); | 
					
						
							| 
									
										
										
										
											2023-07-01 05:36:35 +08:00
										 |  |  | 	cells.eq(c++).html(qso.cqzone); | 
					
						
							| 
									
										
										
										
											2023-06-27 14:36:50 +08:00
										 |  |  | 	cells.eq(c++).html(qso.iota); | 
					
						
							| 
									
										
										
										
											2023-05-03 00:24:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	$('[data-toggle="tooltip"]').tooltip(); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	return row; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function loadQSOTable(rows) { | 
					
						
							|  |  |  | 	var uninitialized = $('#qsoList').filter(function() { | 
					
						
							|  |  |  | 		return !$.fn.DataTable.fnIsDataTable(this); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uninitialized.each(function() { | 
					
						
							| 
									
										
										
										
											2023-05-28 01:05:11 +08:00
										 |  |  | 		$.fn.dataTable.moment(custom_date_format + ' HH:mm'); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		$(this).DataTable({ | 
					
						
							|  |  |  | 			searching: false, | 
					
						
							|  |  |  | 			responsive: false, | 
					
						
							|  |  |  | 			ordering: true, | 
					
						
							| 
									
										
										
										
											2022-12-20 03:33:48 +08:00
										 |  |  | 			"scrollY": window.innerHeight - $('#searchForm').innerHeight() - 250, | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 			"scrollCollapse": true, | 
					
						
							|  |  |  | 			"paging":         false, | 
					
						
							|  |  |  | 			"scrollX": true, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var table = $('#qsoList').DataTable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	table.clear(); | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	for (i = 0; i < rows.length; i++) { | 
					
						
							|  |  |  | 		let qso = rows[i]; | 
					
						
							| 
									
										
										
										
											2023-05-03 01:04:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var data = []; | 
					
						
							|  |  |  | 		data.push('<div class="form-check"><input class="form-check-input" type="checkbox" /></div>'); | 
					
						
							|  |  |  | 		data.push(qso.qsoDateTime); | 
					
						
							|  |  |  | 		data.push(qso.de); | 
					
						
							| 
									
										
										
										
											2023-08-23 17:55:08 +08:00
										 |  |  | 		data.push('<span class="qso_call"><a id="edit_qso" href="javascript:displayQso('+qso.qsoID+')">'+qso.dx+'</a><span class="qso_icons">' + (qso.callsign == '' ? '' : ' <a href="https://lotw.arrl.org/lotwuser/act?act='+qso.callsign+'" target="_blank"><small id="lotw_info" class="badge badge-success'+qso.lotw_hint+'" data-toggle="tooltip" data-original-title="LoTW User. Last upload was ' + qso.lastupload + ' ">L</small></a>') + ' <a target="_blank" href="https://www.qrz.com/db/'+qso.dx+'"><img width="16" height="16" src="'+base_url+ 'images/icons/qrz.png" alt="Lookup ' + qso.dx + ' on QRZ.com"></a> <a target="_blank" href="https://www.hamqth.com/'+qso.dx+'"><img width="16" height="16" src="'+base_url+ 'images/icons/hamqth.png" alt="Lookup ' + qso.dx + ' on HamQTH"></a></span></span>'); | 
					
						
							| 
									
										
										
										
											2023-05-03 01:04:12 +08:00
										 |  |  | 		data.push(qso.mode); | 
					
						
							|  |  |  | 		data.push(qso.rstS); | 
					
						
							|  |  |  | 		data.push(qso.rstR); | 
					
						
							|  |  |  | 		data.push(qso.band); | 
					
						
							|  |  |  | 		data.push(qso.deRefs); | 
					
						
							|  |  |  | 		data.push(qso.dxRefs); | 
					
						
							|  |  |  | 		data.push(qso.name); | 
					
						
							|  |  |  | 		data.push(qso.qslVia); | 
					
						
							|  |  |  | 		data.push(qso.qsl); | 
					
						
							|  |  |  | 		if ($(".eqslconfirmation")[0]){ | 
					
						
							|  |  |  | 			data.push(qso.eqsl); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-05-08 14:49:24 +08:00
										 |  |  | 		if ($(".lotwconfirmation")[0]){ | 
					
						
							|  |  |  | 			data.push(qso.lotw); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-05-03 01:04:12 +08:00
										 |  |  | 		data.push(qso.qslMessage); | 
					
						
							|  |  |  | 		data.push(qso.dxcc+(qso.end == null ? '' : ' <span class="badge badge-danger">Deleted DXCC</span>')); | 
					
						
							|  |  |  | 		data.push(qso.state); | 
					
						
							|  |  |  | 		data.push(qso.cqzone); | 
					
						
							|  |  |  | 		data.push(qso.iota); | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		let createdRow = table.row.add(data).index(); | 
					
						
							|  |  |  | 		table.rows(createdRow).nodes().to$().data('qsoID', qso.qsoID); | 
					
						
							|  |  |  | 		table.row(createdRow).node().id = 'qsoID-' + qso.qsoID; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	table.draw(); | 
					
						
							| 
									
										
										
										
											2023-05-02 20:48:46 +08:00
										 |  |  | 	$('[data-toggle="tooltip"]').tooltip(); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function processNextCallbookItem() { | 
					
						
							|  |  |  | 	if (!inCallbookProcessing) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 	var nElements = elements.length; | 
					
						
							|  |  |  | 	if (nElements == 0) { | 
					
						
							|  |  |  | 		inCallbookProcessing = false; | 
					
						
							|  |  |  | 		callBookProcessingDialog.close(); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	callBookProcessingDialog.setMessage("Retrieving callbook data : " + nElements + " remaining"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unselectQsoID(elements.first().closest('tr').data('qsoID')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$.ajax({ | 
					
						
							|  |  |  | 		url: site_url + '/logbookadvanced/updateFromCallbook', | 
					
						
							|  |  |  | 		type: 'post', | 
					
						
							|  |  |  | 		data: { | 
					
						
							|  |  |  | 			qsoID: elements.first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		dataType: 'json', | 
					
						
							|  |  |  | 		success: function (data) { | 
					
						
							|  |  |  | 			if (data !== []) { | 
					
						
							|  |  |  | 				updateRow(data); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			setTimeout("processNextCallbookItem()", 50); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		error: function (data) { | 
					
						
							|  |  |  | 			setTimeout("processNextCallbookItem()", 50); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function selectQsoID(qsoID) { | 
					
						
							|  |  |  | 	var element = $("#qsoID-" + qsoID); | 
					
						
							|  |  |  | 	element.find("input[type=checkbox]").prop("checked", true); | 
					
						
							| 
									
										
										
										
											2023-04-30 18:22:20 +08:00
										 |  |  | 	element.addClass('activeRow'); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function unselectQsoID(qsoID) { | 
					
						
							|  |  |  | 	var element = $("#qsoID-" + qsoID); | 
					
						
							|  |  |  | 	element.find("input[type=checkbox]").prop("checked", false); | 
					
						
							| 
									
										
										
										
											2023-04-30 18:22:20 +08:00
										 |  |  | 	element.removeClass('activeRow'); | 
					
						
							| 
									
										
										
										
											2022-12-21 05:33:43 +08:00
										 |  |  | 	$('#checkBoxAll').prop("checked", false); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $(document).ready(function () { | 
					
						
							|  |  |  | 	$('#dateFrom').datetimepicker({ | 
					
						
							|  |  |  | 		format: 'DD/MM/YYYY', | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	$('#dateTo').datetimepicker({ | 
					
						
							|  |  |  | 		format: 'DD/MM/YYYY', | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchForm').submit(function (e) { | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | 		var container = L.DomUtil.get('advancedmap'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(container != null){ | 
					
						
							|  |  |  | 			container._leaflet_id = null; | 
					
						
							|  |  |  | 			container.remove(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$("#qsoList").attr("Hidden", false); | 
					
						
							|  |  |  | 		$("#qsoList_wrapper").attr("Hidden", false); | 
					
						
							|  |  |  | 		$("#qsoList_info").attr("Hidden", false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		$('#searchButton').prop("disabled", true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: this.action, | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: { | 
					
						
							|  |  |  | 				dateFrom: this.dateFrom.value, | 
					
						
							|  |  |  | 				dateTo: this.dateTo.value, | 
					
						
							|  |  |  | 				de: this.de.value, | 
					
						
							|  |  |  | 				dx: this.dx.value, | 
					
						
							|  |  |  | 				mode: this.mode.value, | 
					
						
							|  |  |  | 				band: this.band.value, | 
					
						
							|  |  |  | 				qslSent: this.qslSent.value, | 
					
						
							|  |  |  | 				qslReceived: this.qslReceived.value, | 
					
						
							|  |  |  | 				iota: this.iota.value, | 
					
						
							|  |  |  | 				dxcc: this.dxcc.value, | 
					
						
							|  |  |  | 				propmode: this.selectPropagation.value, | 
					
						
							|  |  |  | 				gridsquare: this.gridsquare.value, | 
					
						
							|  |  |  | 				state: this.state.value, | 
					
						
							| 
									
										
										
										
											2023-05-01 14:58:13 +08:00
										 |  |  | 				qsoresults: this.qsoResults.value, | 
					
						
							| 
									
										
										
										
											2023-06-30 00:59:12 +08:00
										 |  |  | 				sats: this.sats.value, | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 				cqzone: this.cqzone.value, | 
					
						
							| 
									
										
										
										
											2023-06-30 00:59:12 +08:00
										 |  |  | 				lotwSent: this.lotwSent.value, | 
					
						
							|  |  |  | 				lotwReceived: this.lotwReceived.value, | 
					
						
							|  |  |  | 				eqslSent: this.eqslSent.value, | 
					
						
							|  |  |  | 				eqslReceived: this.eqslReceived.value, | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 				qslvia: $('[name="qslviainput"]').val(), | 
					
						
							|  |  |  | 				sota: this.sota.value, | 
					
						
							|  |  |  | 				pota: this.pota.value, | 
					
						
							|  |  |  | 				wwff: this.wwff.value, | 
					
						
							| 
									
										
										
										
											2023-08-12 01:13:13 +08:00
										 |  |  | 				qslimages: this.qslimages.value, | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			dataType: 'json', | 
					
						
							|  |  |  | 			success: function (data) { | 
					
						
							|  |  |  | 				$('#searchButton').prop("disabled", false); | 
					
						
							|  |  |  | 				loadQSOTable(data); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			error: function (data) { | 
					
						
							|  |  |  | 				$('#searchButton').prop("disabled", false); | 
					
						
							|  |  |  | 				BootstrapDialog.alert({ | 
					
						
							|  |  |  | 					title: 'ERROR', | 
					
						
							|  |  |  | 					message: 'An error ocurred while making the request', | 
					
						
							|  |  |  | 					type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 					closable: false, | 
					
						
							|  |  |  | 					draggable: false, | 
					
						
							|  |  |  | 					callback: function (result) { | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#qsoList').on('click', 'input[type="checkbox"]', function() { | 
					
						
							|  |  |  | 		if ($(this).is(":checked")) { | 
					
						
							| 
									
										
										
										
											2023-04-30 18:22:20 +08:00
										 |  |  | 			$(this).closest('tr').addClass('activeRow'); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2023-04-30 18:22:20 +08:00
										 |  |  | 			$(this).closest('tr').removeClass('activeRow'); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#btnUpdateFromCallbook').click(function (event) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		inCallbookProcessing = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		callBookProcessingDialog = BootstrapDialog.show({ | 
					
						
							|  |  |  | 			title: "Retrieving callbook data for " + nElements + " QSOs", | 
					
						
							|  |  |  | 			message: "Retrieving callbook data for " + nElements + " QSOs", | 
					
						
							|  |  |  | 			type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 			closable: false, | 
					
						
							|  |  |  | 			draggable: false, | 
					
						
							|  |  |  | 			buttons: [{ | 
					
						
							|  |  |  | 				label: 'Cancel', | 
					
						
							|  |  |  | 				action: function(dialog) { | 
					
						
							|  |  |  | 					inCallbookProcessing = false; | 
					
						
							|  |  |  | 					dialog.close(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}] | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		processNextCallbookItem(); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#deleteQsos').click(function (event) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$('#deleteQsos').prop("disabled", true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var table = $('#qsoList').DataTable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		BootstrapDialog.confirm({ | 
					
						
							|  |  |  | 			title: 'DANGER', | 
					
						
							|  |  |  | 			message: 'Warning! Are you sure you want to delete the marked QSO(s)?' , | 
					
						
							|  |  |  | 			type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 			closable: true, | 
					
						
							|  |  |  | 			draggable: true, | 
					
						
							|  |  |  | 			btnOKClass: 'btn-danger', | 
					
						
							|  |  |  | 			callback: function(result) { | 
					
						
							|  |  |  | 				if(result) { | 
					
						
							|  |  |  | 					elements.each(function() { | 
					
						
							|  |  |  | 						let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 						$.ajax({ | 
					
						
							|  |  |  | 							url: base_url + 'index.php/qso/delete_ajax', | 
					
						
							|  |  |  | 							type: 'post', | 
					
						
							|  |  |  | 							data: {'id': id | 
					
						
							|  |  |  | 							}, | 
					
						
							|  |  |  | 							success: function(data) { | 
					
						
							|  |  |  | 								var row = $("#qsoID-" + id); | 
					
						
							|  |  |  | 								table.row(row).remove().draw(false); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						$('#deleteQsos').prop("disabled", false); | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2023-08-09 03:04:56 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			onhide: function(dialogRef){ | 
					
						
							|  |  |  | 				$('#deleteQsos').prop("disabled", false); | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#exportAdif').click(function (event) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-05-03 21:30:36 +08:00
										 |  |  | 		$('#exportAdif').prop("disabled", true); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		var id_list=[]; | 
					
						
							|  |  |  | 		elements.each(function() { | 
					
						
							|  |  |  | 			let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 			id_list.push(id); | 
					
						
							|  |  |  | 			unselectQsoID(id); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		xhttp = new XMLHttpRequest(); | 
					
						
							|  |  |  | 		xhttp.onreadystatechange = function() { | 
					
						
							|  |  |  | 			var a; | 
					
						
							|  |  |  | 			if (xhttp.readyState === 4 && xhttp.status === 200) { | 
					
						
							|  |  |  | 				// Trick for making downloadable link
 | 
					
						
							|  |  |  | 				a = document.createElement('a'); | 
					
						
							|  |  |  | 				a.href = window.URL.createObjectURL(xhttp.response); | 
					
						
							|  |  |  | 				// Give filename you wish to download
 | 
					
						
							|  |  |  | 				a.download = "logbook_export.adi"; | 
					
						
							|  |  |  | 				a.style.display = 'none'; | 
					
						
							|  |  |  | 				document.body.appendChild(a); | 
					
						
							|  |  |  | 				a.click(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		// Post data to URL which handles post request
 | 
					
						
							|  |  |  | 		xhttp.open("POST", site_url+'/logbookadvanced/export_to_adif', true); | 
					
						
							|  |  |  | 		xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | 
					
						
							|  |  |  | 		// You should set responseType as blob for binary responses
 | 
					
						
							|  |  |  | 		xhttp.responseType = 'blob'; | 
					
						
							| 
									
										
										
										
											2023-05-01 18:35:24 +08:00
										 |  |  | 		xhttp.send("id=" + JSON.stringify(id_list, null, 2)+"&sortorder=" +$('.table').DataTable().order()); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		$('#exportAdif').prop("disabled", false); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#queueBureau').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Q','B', 'queueBureau'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#queueDirect').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Q','D', 'queueDirect'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-23 15:24:48 +08:00
										 |  |  |     $('#queueElectronic').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Q','E', 'queueElectronic'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	$('#sentBureau').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Y','B', 'sentBureau'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#sentDirect').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Y','D', 'sentDirect'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-23 15:24:48 +08:00
										 |  |  |     $('#sentElectronic').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('Y','E', 'sentElectronic'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	$('#dontSend').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('N','', 'dontSend'); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2023-05-03 19:00:01 +08:00
										 |  |  | 	$('#notRequired').click(function (event) { | 
					
						
							|  |  |  | 		handleQsl('I','', 'notRequired'); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 	$('#receivedBureau').click(function (event) { | 
					
						
							| 
									
										
										
										
											2023-06-28 14:27:44 +08:00
										 |  |  | 		handleQslReceived('Y','B', 'receivedBureau'); | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 	$('#receivedDirect').click(function (event) { | 
					
						
							| 
									
										
										
										
											2023-06-28 14:27:44 +08:00
										 |  |  | 		handleQslReceived('Y','D', 'receivedDirect'); | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 	$('#searchGridsquare').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('gridsquare'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchState').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('state'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchIota').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('iota'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchDxcc').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('dxcc'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchCallsign').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('dx'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchCqZone').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('cqzone'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchMode').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('mode'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchBand').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('band'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 	$('#searchSota').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('sota'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchWwff').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('wwff'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchPota').click(function (event) { | 
					
						
							|  |  |  | 		quickSearch('pota'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-12 01:13:13 +08:00
										 |  |  | 	$('#qslSlideshow').click(function (event) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$('#qslSlideshow').prop("disabled", true); | 
					
						
							|  |  |  | 		var id_list=[]; | 
					
						
							|  |  |  | 		elements.each(function() { | 
					
						
							|  |  |  | 			let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 			id_list.push(id); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: base_url + 'index.php/logbookadvanced/qslSlideshow', | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: { | 
					
						
							|  |  |  | 				ids: id_list, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			success: function (html) { | 
					
						
							|  |  |  | 				BootstrapDialog.show({ | 
					
						
							|  |  |  | 					title: 'QSL Card', | 
					
						
							|  |  |  | 					size: BootstrapDialog.SIZE_WIDE, | 
					
						
							|  |  |  | 					cssClass: 'lookup-dialog', | 
					
						
							|  |  |  | 					nl2br: false, | 
					
						
							|  |  |  | 					message: html, | 
					
						
							|  |  |  | 					onshown: function(dialog) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					buttons: [{ | 
					
						
							|  |  |  | 						label: 'Close', | 
					
						
							|  |  |  | 						action: function (dialogItself) { | 
					
						
							|  |  |  | 							$('#qslSlideshow').prop("disabled", false); | 
					
						
							|  |  |  | 							dialogItself.close(); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}], | 
					
						
							|  |  |  | 					onhide: function(dialogRef){ | 
					
						
							|  |  |  | 						$('#qslSlideshow').prop("disabled", false); | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 	function quickSearch(type) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (nElements > 1) { | 
					
						
							| 
									
										
										
										
											2023-07-05 19:03:10 +08:00
										 |  |  | 			BootstrapDialog.alert({ | 
					
						
							|  |  |  | 				title: 'WARNING', | 
					
						
							|  |  |  | 				message: 'Only 1 row can be selected for Quickfilter!', | 
					
						
							|  |  |  | 				type: BootstrapDialog.TYPE_WARNING, | 
					
						
							|  |  |  | 				closable: false, | 
					
						
							|  |  |  | 				draggable: false, | 
					
						
							|  |  |  | 				callback: function (result) { | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-07-05 18:51:49 +08:00
										 |  |  | 		var offset = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!$(".eqslconfirmation")[0]){ | 
					
						
							|  |  |  | 			offset--; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (!$(".lotwconfirmation")[0]){ | 
					
						
							|  |  |  | 			offset--; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 		elements.each(function() { | 
					
						
							|  |  |  | 			var currentRow = $(this).first().closest('tr'); | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 			var col1 = ''; | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 			switch (type) { | 
					
						
							| 
									
										
										
										
											2023-07-05 18:51:49 +08:00
										 |  |  | 				case 'dxcc': 	var tdoffset = (offset + 16); col1 = currentRow.find("td:eq("+tdoffset+")").html(); col1 = col1.match(/\d/g); col1 = col1.join(""); break; | 
					
						
							|  |  |  | 				case 'cqzone': var tdoffset = (offset + 18); col1 = currentRow.find("td:eq("+tdoffset+")").text(); break; | 
					
						
							|  |  |  | 				case 'iota': var tdoffset = (offset + 19); col1 = currentRow.find("td:eq("+tdoffset+")").text(); col1 = col1.trim(); break; | 
					
						
							|  |  |  | 				case 'state': var tdoffset = (offset + 17); col1 = currentRow.find("td:eq("+tdoffset+")").text(); break; | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 				case 'dx': col1 = currentRow.find("td:eq(3)").text(); col1 = col1.match(/^([^\s]+)/gm); break; | 
					
						
							|  |  |  | 				case 'gridsquare': col1 = $(currentRow).find('#dxgrid').text(); col1 = col1.substring(0, 4); break; | 
					
						
							| 
									
										
										
										
											2023-07-07 16:03:52 +08:00
										 |  |  | 				case 'sota': col1 = $(currentRow).find('#dxsota').text(); break; | 
					
						
							|  |  |  | 				case 'wwff': col1 = $(currentRow).find('#dxwwff').text(); break; | 
					
						
							|  |  |  | 				case 'pota': col1 = $(currentRow).find('#dxpota').text(); break; | 
					
						
							| 
									
										
										
										
											2023-07-05 15:29:13 +08:00
										 |  |  | 				case 'mode': col1 = currentRow.find("td:eq(4)").text(); break; | 
					
						
							|  |  |  | 				case 'band': col1 = currentRow.find("td:eq(7)").text(); col1 = col1.match(/\S\w*/); break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (col1.length == 0) return; | 
					
						
							|  |  |  | 			$('#searchForm').trigger("reset"); | 
					
						
							|  |  |  | 			$("#"+type).val(col1); | 
					
						
							|  |  |  | 			$('#searchForm').submit(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 	$('#printLabel').click(function (event) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$('#printLabel').prop("disabled", true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 			url: base_url + 'index.php/logbookadvanced/startAtLabel', | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 			type: 'post', | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 			success: function (html) { | 
					
						
							|  |  |  | 				BootstrapDialog.show({ | 
					
						
							|  |  |  | 					title: 'Start printing at which label?', | 
					
						
							|  |  |  | 					size: BootstrapDialog.SIZE_NORMAL, | 
					
						
							|  |  |  | 					cssClass: 'qso-dialog', | 
					
						
							|  |  |  | 					nl2br: false, | 
					
						
							|  |  |  | 					message: html, | 
					
						
							|  |  |  | 					onshown: function(dialog) { | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					buttons: [{ | 
					
						
							|  |  |  | 						label: 'Close', | 
					
						
							|  |  |  | 						action: function (dialogItself) { | 
					
						
							| 
									
										
										
										
											2023-08-06 03:46:03 +08:00
										 |  |  | 							$('#printLabel').prop("disabled", false); | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 							dialogItself.close(); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2023-08-06 15:58:29 +08:00
										 |  |  | 					}], | 
					
						
							|  |  |  | 					onhide: function(dialogRef){ | 
					
						
							|  |  |  | 						$('#printLabel').prop("disabled", false); | 
					
						
							|  |  |  | 					}, | 
					
						
							| 
									
										
										
										
											2023-06-28 04:22:24 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-06-27 21:03:12 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 02:55:23 +08:00
										 |  |  | 	$('#searchForm').on('reset', function(e) { | 
					
						
							|  |  |  | 		setTimeout(function() { | 
					
						
							|  |  |  | 			$('#searchForm').submit(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	function handleQsl(sent, method, tag) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$('#'+tag).prop("disabled", true); | 
					
						
							|  |  |  | 		var id_list=[]; | 
					
						
							|  |  |  | 		elements.each(function() { | 
					
						
							|  |  |  | 			let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 			id_list.push(id); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: base_url + 'index.php/logbookadvanced/update_qsl', | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: {'id': JSON.stringify(id_list, null, 2), | 
					
						
							|  |  |  | 				'sent' : sent, | 
					
						
							|  |  |  | 				'method' : method | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			success: function(data) { | 
					
						
							|  |  |  | 				if (data !== []) { | 
					
						
							|  |  |  | 					$.each(data, function(k, v) { | 
					
						
							|  |  |  | 						updateRow(this); | 
					
						
							|  |  |  | 						unselectQsoID(this.qsoID); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$('#'+tag).prop("disabled", false); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:27:44 +08:00
										 |  |  | 	function handleQslReceived(sent, method, tag) { | 
					
						
							|  |  |  | 		var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 		var nElements = elements.length; | 
					
						
							|  |  |  | 		if (nElements == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$('#'+tag).prop("disabled", true); | 
					
						
							|  |  |  | 		var id_list=[]; | 
					
						
							|  |  |  | 		elements.each(function() { | 
					
						
							|  |  |  | 			let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 			id_list.push(id); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: base_url + 'index.php/logbookadvanced/update_qsl_received', | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: {'id': JSON.stringify(id_list, null, 2), | 
					
						
							|  |  |  | 				'sent' : sent, | 
					
						
							|  |  |  | 				'method' : method | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			success: function(data) { | 
					
						
							|  |  |  | 				if (data !== []) { | 
					
						
							|  |  |  | 					$.each(data, function(k, v) { | 
					
						
							|  |  |  | 						updateRow(this); | 
					
						
							|  |  |  | 						unselectQsoID(this.qsoID); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$('#'+tag).prop("disabled", false); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	$('#checkBoxAll').change(function (event) { | 
					
						
							|  |  |  | 		if (this.checked) { | 
					
						
							|  |  |  | 			$('#qsoList tbody tr').each(function (i) { | 
					
						
							|  |  |  | 				selectQsoID($(this).data('qsoID')) | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2022-12-21 05:33:43 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 			$('#qsoList tbody tr').each(function (i) { | 
					
						
							|  |  |  | 				unselectQsoID($(this).data('qsoID')) | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('#searchForm').submit(); | 
					
						
							| 
									
										
										
										
											2023-04-27 22:00:02 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function printlabel() { | 
					
						
							|  |  |  | 	var id_list=[]; | 
					
						
							|  |  |  | 	var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 	var nElements = elements.length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	elements.each(function() { | 
					
						
							|  |  |  | 		let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 		id_list.push(id); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	$.ajax({ | 
					
						
							|  |  |  | 		url: base_url + 'index.php/labels/printids', | 
					
						
							|  |  |  | 		type: 'post', | 
					
						
							|  |  |  | 		data: {'id': JSON.stringify(id_list, null, 2), | 
					
						
							| 
									
										
										
										
											2023-08-05 17:42:39 +08:00
										 |  |  | 				'startat': $('#startat').val(), | 
					
						
							|  |  |  | 				'grid': $('#gridlabel')[0].checked, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-01 16:30:05 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		xhr:function(){ | 
					
						
							|  |  |  | 			var xhr = new XMLHttpRequest(); | 
					
						
							|  |  |  | 			xhr.responseType= 'blob' | 
					
						
							|  |  |  | 			return xhr; | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		success: function(data) { | 
					
						
							|  |  |  | 			$.each(BootstrapDialog.dialogs, function(id, dialog){ | 
					
						
							|  |  |  | 				dialog.close(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			if(data){ | 
					
						
							|  |  |  | 				var file = new Blob([data], {type: 'application/pdf'}); | 
					
						
							|  |  |  | 				var fileURL = URL.createObjectURL(file); | 
					
						
							|  |  |  | 				window.open(fileURL); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$.each(id_list, function(k, v) { | 
					
						
							|  |  |  | 				unselectQsoID(this); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			$('#printLabel').prop("disabled", false); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		error: function (data) { | 
					
						
							|  |  |  | 			BootstrapDialog.alert({ | 
					
						
							|  |  |  | 				title: 'ERROR', | 
					
						
							|  |  |  | 				message: 'Something went wrong with label print. Go to labels and check if you have defined a label, and that it is set for print!', | 
					
						
							|  |  |  | 				type: BootstrapDialog.TYPE_DANGER, | 
					
						
							|  |  |  | 				closable: false, | 
					
						
							|  |  |  | 				draggable: false, | 
					
						
							|  |  |  | 				callback: function (result) { | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			$.each(id_list, function(k, v) { | 
					
						
							|  |  |  | 				unselectQsoID(this); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			$('#printLabel').prop("disabled", false); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | function mapQsos(form) { | 
					
						
							|  |  |  | 	$('#mapButton').prop("disabled", true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:18:05 +08:00
										 |  |  | 	var id_list=[]; | 
					
						
							|  |  |  | 	var elements = $('#qsoList tbody input:checked'); | 
					
						
							|  |  |  | 	var nElements = elements.length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	elements.each(function() { | 
					
						
							|  |  |  | 		let id = $(this).first().closest('tr').data('qsoID') | 
					
						
							|  |  |  | 		id_list.push(id); | 
					
						
							| 
									
										
										
										
											2023-08-22 14:39:14 +08:00
										 |  |  | 		unselectQsoID(id); | 
					
						
							| 
									
										
										
										
											2023-08-21 20:18:05 +08:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | 	$("#qsoList").attr("Hidden", true); | 
					
						
							|  |  |  | 	$("#qsoList_wrapper").attr("Hidden", true); | 
					
						
							|  |  |  | 	$("#qsoList_info").attr("Hidden", true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var amap = $('#advancedmap').val(); | 
					
						
							|  |  |  | 	if (amap == undefined) { | 
					
						
							|  |  |  | 		$(".qso_manager").append('<div id="advancedmap"></div>'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:18:05 +08:00
										 |  |  | 	if (id_list.length > 0) { | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: base_url + 'index.php/logbookadvanced/mapSelectedQsos', | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: { | 
					
						
							|  |  |  | 				ids: id_list | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			success: function(data) { | 
					
						
							|  |  |  | 				loadMap(data); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			error: function() { | 
					
						
							|  |  |  | 				$('#mapButton').prop("disabled", false); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$.ajax({ | 
					
						
							|  |  |  | 			url: base_url + 'index.php/logbookadvanced/mapQsos', | 
					
						
							|  |  |  | 			type: 'post', | 
					
						
							|  |  |  | 			data: { | 
					
						
							|  |  |  | 				dateFrom: form.dateFrom.value, | 
					
						
							|  |  |  | 				dateTo: form.dateTo.value, | 
					
						
							|  |  |  | 				de: form.de.value, | 
					
						
							|  |  |  | 				dx: form.dx.value, | 
					
						
							|  |  |  | 				mode: form.mode.value, | 
					
						
							|  |  |  | 				band: form.band.value, | 
					
						
							|  |  |  | 				qslSent: form.qslSent.value, | 
					
						
							|  |  |  | 				qslReceived: form.qslReceived.value, | 
					
						
							|  |  |  | 				iota: form.iota.value, | 
					
						
							|  |  |  | 				dxcc: form.dxcc.value, | 
					
						
							|  |  |  | 				propmode: form.selectPropagation.value, | 
					
						
							|  |  |  | 				gridsquare: form.gridsquare.value, | 
					
						
							|  |  |  | 				state: form.state.value, | 
					
						
							|  |  |  | 				qsoresults: form.qsoResults.value, | 
					
						
							|  |  |  | 				sats: form.sats.value, | 
					
						
							|  |  |  | 				cqzone: form.cqzone.value, | 
					
						
							|  |  |  | 				lotwSent: form.lotwSent.value, | 
					
						
							|  |  |  | 				lotwReceived: form.lotwReceived.value, | 
					
						
							|  |  |  | 				eqslSent: form.eqslSent.value, | 
					
						
							|  |  |  | 				eqslReceived: form.eqslReceived.value, | 
					
						
							|  |  |  | 				qslvia: $('[name="qslviainput"]').val(), | 
					
						
							|  |  |  | 				sota: form.sota.value, | 
					
						
							|  |  |  | 				pota: form.pota.value, | 
					
						
							|  |  |  | 				wwff: form.wwff.value, | 
					
						
							|  |  |  | 				qslimages: form.qslimages.value, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			success: function(data) { | 
					
						
							|  |  |  | 				loadMap(data); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			error: function() { | 
					
						
							|  |  |  | 				$('#mapButton').prop("disabled", false); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function loadMap(data) { | 
					
						
							|  |  |  | 	$('#mapButton').prop("disabled", false); | 
					
						
							|  |  |  | 	var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; | 
					
						
							|  |  |  | 	var osmAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors'; | 
					
						
							|  |  |  | 	// If map is already initialized
 | 
					
						
							|  |  |  | 	var container = L.DomUtil.get('advancedmap'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(container != null){ | 
					
						
							|  |  |  | 		container._leaflet_id = null; | 
					
						
							|  |  |  | 		container.remove(); | 
					
						
							|  |  |  | 		$(".qso_manager").append('<div id="advancedmap"></div>'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var map = new L.Map('advancedmap', { | 
					
						
							|  |  |  | 		fullscreenControl: true, | 
					
						
							|  |  |  | 		fullscreenControlOptions: { | 
					
						
							|  |  |  | 			position: 'topleft' | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	L.tileLayer( | 
					
						
							|  |  |  | 		osmUrl, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			attribution: '© <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>', | 
					
						
							|  |  |  | 			maxZoom: 18, | 
					
						
							|  |  |  | 			zoom: 3, | 
					
						
							|  |  |  |             minZoom: 2, | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	).addTo(map); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	map.setView([30, 0], 1.5); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var maidenhead = L.maidenheadqrb().addTo(map); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 9, attribution: osmAttrib}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	map.addLayer(osm); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-20 02:20:02 +08:00
										 |  |  | 	var linecolor = 'blue'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (isDarkModeTheme()) { | 
					
						
							|  |  |  | 		linecolor = 'red'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | 	var redIcon = L.icon({ | 
					
						
							|  |  |  | 		iconUrl: icon_dot_url, | 
					
						
							|  |  |  | 		iconSize: [10, 10], // size of the icon
 | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var counter = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$.each(data, function(k, v) { | 
					
						
							|  |  |  | 		counter++; | 
					
						
							|  |  |  | 		// Need to fix so that marker is placed at same place as end of line, but this only needs to be done when longitude is < -170
 | 
					
						
							|  |  |  | 		if (this.latlng2[1] < -170) { | 
					
						
							|  |  |  | 			this.latlng2[1] =  parseFloat(this.latlng2[1])+360; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (this.latlng1[1] < -170) { | 
					
						
							|  |  |  | 			this.latlng1[1] =  parseFloat(this.latlng1[1])+360; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var popupmessage = createContentMessage(this); | 
					
						
							|  |  |  | 		var popupmessage2 = createContentMessageDx(this); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var marker = L.marker([this.latlng1[0], this.latlng1[1]], {icon: redIcon}, {closeOnClick: false, autoClose: false}).addTo(map).bindPopup(popupmessage); | 
					
						
							|  |  |  | 		marker.on('mouseover',function(ev) { | 
					
						
							|  |  |  | 			ev.target.openPopup(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var marker2 = L.marker([this.latlng2[0], this.latlng2[1]], {icon: redIcon},{closeOnClick: false, autoClose: false}).addTo(map).bindPopup(popupmessage2);; | 
					
						
							|  |  |  | 		marker2.on('mouseover',function(ev) { | 
					
						
							|  |  |  | 			ev.target.openPopup(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const multiplelines = []; | 
					
						
							|  |  |  | 		multiplelines.push( | 
					
						
							|  |  |  | 			new L.LatLng(this.latlng1[0], this.latlng1[1]), | 
					
						
							|  |  |  | 			new L.LatLng(this.latlng2[0], this.latlng2[1]) | 
					
						
							|  |  |  | 		) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const geodesic = L.geodesic(multiplelines, { | 
					
						
							|  |  |  | 			weight: 1, | 
					
						
							|  |  |  | 			opacity: 1, | 
					
						
							| 
									
										
										
										
											2023-08-20 02:20:02 +08:00
										 |  |  | 			color: linecolor, | 
					
						
							| 
									
										
										
										
											2023-08-19 02:02:47 +08:00
										 |  |  | 			wrap: false, | 
					
						
							|  |  |  | 			steps: 100 | 
					
						
							|  |  |  | 		}).addTo(map); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*Legend specific*/ | 
					
						
							|  |  |  |     var legend = L.control({ position: "topright" }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     legend.onAdd = function(map) { | 
					
						
							|  |  |  |         var div = L.DomUtil.create("div", "legend"); | 
					
						
							|  |  |  |         div.innerHTML += "<h4>" + counter + " QSOs plotted</h4>"; | 
					
						
							|  |  |  |         return div; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     legend.addTo(map); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function createContentMessage(qso) { | 
					
						
							|  |  |  | 		var table = '<table><tbody>' + | 
					
						
							|  |  |  | 		'<tr>' + | 
					
						
							|  |  |  | 		'<td>' + | 
					
						
							|  |  |  | 		'Station callsign: ' + qso.mycallsign + | 
					
						
							|  |  |  | 		"</td></tr>" + | 
					
						
							|  |  |  | 		'<tr>' + | 
					
						
							|  |  |  | 		'<td>' + | 
					
						
							|  |  |  | 		'Gridsquare: ' + qso.mygridsquare + | 
					
						
							|  |  |  | 		"</td></tr>"; | 
					
						
							|  |  |  | 		return (table += "</tbody></table>"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function createContentMessageDx(qso) { | 
					
						
							|  |  |  | 		var table = '<table><tbody>' + | 
					
						
							|  |  |  | 		'<tr>' + | 
					
						
							|  |  |  | 		'<td>Callsign</td>' + | 
					
						
							|  |  |  | 		'<td>' + qso.callsign + '</td>' + | 
					
						
							|  |  |  | 		'</tr>' + | 
					
						
							|  |  |  | 		'<tr>' + | 
					
						
							|  |  |  | 		'<td>Date/time</td>' + | 
					
						
							|  |  |  | 		'<td>' + qso.datetime + '</td>' + | 
					
						
							|  |  |  | 		'</tr>' + | 
					
						
							|  |  |  | 		'<tr>'; | 
					
						
							|  |  |  | 		if (qso.satname != "") { | 
					
						
							|  |  |  | 			table += '<td>Band</td>' + | 
					
						
							|  |  |  | 			'<td>' + qso.satname + '</td>' + | 
					
						
							|  |  |  | 			'</tr>' + | 
					
						
							|  |  |  | 			'<tr>'; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			table += '<td>Band</td>' + | 
					
						
							|  |  |  | 			'<td>' + qso.band + '</td>' + | 
					
						
							|  |  |  | 			'</tr>' + | 
					
						
							|  |  |  | 			'<tr>'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		table += '<td>Mode</td>' + | 
					
						
							|  |  |  | 		'<td>' + qso.mode + '</td>' + | 
					
						
							|  |  |  | 		'</tr>' + | 
					
						
							|  |  |  | 		'<tr>'; | 
					
						
							|  |  |  | 		if (qso.gridsquare != undefined) { | 
					
						
							|  |  |  | 			table += '<td>Gridsquare</td>' + | 
					
						
							|  |  |  | 			'<td>' + qso.gridsquare + '</td>' + | 
					
						
							|  |  |  | 			'</tr>'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (qso.distance != undefined) { | 
					
						
							|  |  |  | 			table += '<td>Distance</td>' + | 
					
						
							|  |  |  | 			'<td>' + qso.distance + '</td>' + | 
					
						
							|  |  |  | 			'</tr>'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (qso.bearing != undefined) { | 
					
						
							|  |  |  | 			table += '<td>Bearing</td>' + | 
					
						
							|  |  |  | 			'<td>' + qso.bearing + '</td>' + | 
					
						
							|  |  |  | 			'</tr>'; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return (table += '</tbody></table>'); | 
					
						
							|  |  |  | 	} |