var callBookProcessingDialog = null;
var inCallbookProcessing = false;
var inCallbookItemProcessing = false;
$('#band').change(function () {
	var band = $("#band option:selected").text();
	if (band != "SAT") {
		$(".sats_dropdown").attr("hidden", true);
	} else {
		$(".sats_dropdown").removeAttr("hidden");
	}
});
$('#selectPropagation').change(function () {
	var prop_mode = $("#selectPropagation option:selected").text();
	if (prop_mode != "Satellite") {
		$(".sats_dropdown").attr("hidden", true);
	} else {
		$(".sats_dropdown").removeAttr("hidden");
	}
});
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);
	cells.eq(c++).html(''+qso.dx+'' + (qso.callsign == '' ? '' : ' L') + '  
  ');
	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);
	cells.eq(c++).html(qso.dxRefs);
	cells.eq(c++).text(qso.name);
	cells.eq(c++).text(qso.qslVia);
	cells.eq(c++).html(qso.qsl);
	if ($(".eqslconfirmation")[0]){
		cells.eq(c++).html(qso.eqsl);
	}
	if ($(".lotwconfirmation")[0]){
		cells.eq(c++).html(qso.lotw);
	}
	cells.eq(c++).text(qso.qslMessage);
	cells.eq(c++).html(qso.dxcc);
	cells.eq(c++).text(qso.state);
	cells.eq(c++).html(qso.cqzone);
	cells.eq(c++).html(qso.iota);
	$('[data-toggle="tooltip"]').tooltip();
	return row;
}
function loadQSOTable(rows) {
	var uninitialized = $('#qsoList').filter(function() {
		return !$.fn.DataTable.fnIsDataTable(this);
	});
	uninitialized.each(function() {
		$.fn.dataTable.moment(custom_date_format + ' HH:mm');
		$(this).DataTable({
			searching: false,
			responsive: false,
			ordering: true,
			"scrollY": window.innerHeight - $('#searchForm').innerHeight() - 250,
			"scrollCollapse": true,
			"paging":         false,
			"scrollX": true,
		});
	});
	var table = $('#qsoList').DataTable();
	table.clear();
	for (i = 0; i < rows.length; i++) {
		let qso = rows[i];
		var data = [];
		data.push('
');
	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);
	cells.eq(c++).html(qso.dxRefs);
	cells.eq(c++).text(qso.name);
	cells.eq(c++).text(qso.qslVia);
	cells.eq(c++).html(qso.qsl);
	if ($(".eqslconfirmation")[0]){
		cells.eq(c++).html(qso.eqsl);
	}
	if ($(".lotwconfirmation")[0]){
		cells.eq(c++).html(qso.lotw);
	}
	cells.eq(c++).text(qso.qslMessage);
	cells.eq(c++).html(qso.dxcc);
	cells.eq(c++).text(qso.state);
	cells.eq(c++).html(qso.cqzone);
	cells.eq(c++).html(qso.iota);
	$('[data-toggle="tooltip"]').tooltip();
	return row;
}
function loadQSOTable(rows) {
	var uninitialized = $('#qsoList').filter(function() {
		return !$.fn.DataTable.fnIsDataTable(this);
	});
	uninitialized.each(function() {
		$.fn.dataTable.moment(custom_date_format + ' HH:mm');
		$(this).DataTable({
			searching: false,
			responsive: false,
			ordering: true,
			"scrollY": window.innerHeight - $('#searchForm').innerHeight() - 250,
			"scrollCollapse": true,
			"paging":         false,
			"scrollX": true,
		});
	});
	var table = $('#qsoList').DataTable();
	table.clear();
	for (i = 0; i < rows.length; i++) {
		let qso = rows[i];
		var data = [];
		data.push('
');
		data.push(qso.qsoDateTime);
		data.push(qso.de);
		data.push(''+qso.dx+'' + (qso.callsign == '' ? '' : ' L') + '  
  ');
		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);
		}
		if ($(".lotwconfirmation")[0]){
			data.push(qso.lotw);
		}
		data.push(qso.qslMessage);
		data.push(qso.dxcc+(qso.end == null ? '' : ' Deleted DXCC'));
		data.push(qso.state);
		data.push(qso.cqzone);
		data.push(qso.iota);
		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();
	$('[data-toggle="tooltip"]').tooltip();
}
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);
	element.addClass('activeRow');
}
function unselectQsoID(qsoID) {
	var element = $("#qsoID-" + qsoID);
	element.find("input[type=checkbox]").prop("checked", false);
	element.removeClass('activeRow');
	$('#checkBoxAll').prop("checked", false);
}
$(document).ready(function () {
	$('#dateFrom').datetimepicker({
		format: 'DD/MM/YYYY',
	});
	$('#dateTo').datetimepicker({
		format: 'DD/MM/YYYY',
	});
	$('#searchForm').submit(function (e) {
		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);
		$('#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,
				qsoresults: this.qsoResults.value,
				sats: this.sats.value,
				cqzone: this.cqzone.value,
				lotwSent: this.lotwSent.value,
				lotwReceived: this.lotwReceived.value,
				eqslSent: this.eqslSent.value,
				eqslReceived: this.eqslReceived.value,
				qslvia: $('[name="qslviainput"]').val(),
				sota: this.sota.value,
				pota: this.pota.value,
				wwff: this.wwff.value,
				qslimages: this.qslimages.value,
			},
			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")) {
			$(this).closest('tr').addClass('activeRow');
		} else {
			$(this).closest('tr').removeClass('activeRow');
		}
	});
	$('#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);
					})
				}
			},
			onhide: function(dialogRef){
				$('#deleteQsos').prop("disabled", false);
			},
		});
	});
	$('#exportAdif').click(function (event) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		$('#exportAdif').prop("disabled", true);
		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';
		xhttp.send("id=" + JSON.stringify(id_list, null, 2)+"&sortorder=" +$('.table').DataTable().order());
		$('#exportAdif').prop("disabled", false);
	});
	$('#queueBureau').click(function (event) {
		handleQsl('Q','B', 'queueBureau');
	});
	$('#queueDirect').click(function (event) {
		handleQsl('Q','D', 'queueDirect');
	});
    $('#queueElectronic').click(function (event) {
		handleQsl('Q','E', 'queueElectronic');
	});
	$('#sentBureau').click(function (event) {
		handleQsl('Y','B', 'sentBureau');
	});
	$('#sentDirect').click(function (event) {
		handleQsl('Y','D', 'sentDirect');
	});
    $('#sentElectronic').click(function (event) {
		handleQsl('Y','E', 'sentElectronic');
	});
	$('#dontSend').click(function (event) {
		handleQsl('N','', 'dontSend');
	});
	$('#notRequired').click(function (event) {
		handleQsl('I','', 'notRequired');
	});
	$('#receivedBureau').click(function (event) {
		handleQslReceived('Y','B', 'receivedBureau');
	});
	$('#receivedDirect').click(function (event) {
		handleQslReceived('Y','D', 'receivedDirect');
	});
	$('#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');
	});
	$('#searchSota').click(function (event) {
		quickSearch('sota');
	});
	$('#searchWwff').click(function (event) {
		quickSearch('wwff');
	});
	$('#searchPota').click(function (event) {
		quickSearch('pota');
	});
	$('#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);
					},
				});
			}
		});
	});
	function quickSearch(type) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		if (nElements > 1) {
			BootstrapDialog.alert({
				title: 'WARNING',
				message: 'Only 1 row can be selected for Quickfilter!',
				type: BootstrapDialog.TYPE_WARNING,
				closable: false,
				draggable: false,
				callback: function (result) {
				}
			});
		}
		var offset = 0;
		if (!$(".eqslconfirmation")[0]){
			offset--;
		}
		if (!$(".lotwconfirmation")[0]){
			offset--;
		}
		elements.each(function() {
			var currentRow = $(this).first().closest('tr');
			var col1 = '';
			switch (type) {
				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;
				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;
				case 'sota': col1 = $(currentRow).find('#dxsota').text(); break;
				case 'wwff': col1 = $(currentRow).find('#dxwwff').text(); break;
				case 'pota': col1 = $(currentRow).find('#dxpota').text(); break;
				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();
		});
	}
	$('#printLabel').click(function (event) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		$('#printLabel').prop("disabled", true);
		$.ajax({
			url: base_url + 'index.php/logbookadvanced/startAtLabel',
			type: 'post',
			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) {
							$('#printLabel').prop("disabled", false);
							dialogItself.close();
						}
					}],
					onhide: function(dialogRef){
						$('#printLabel').prop("disabled", false);
					},
				});
			}
		});
	});
	$('#searchForm').on('reset', function(e) {
		setTimeout(function() {
			$('#searchForm').submit();
		});
	});
	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);
			}
		});
	}
	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);
			}
		});
	}
	$('#checkBoxAll').change(function (event) {
		if (this.checked) {
			$('#qsoList tbody tr').each(function (i) {
				selectQsoID($(this).data('qsoID'))
			});
		} else {
			$('#qsoList tbody tr').each(function (i) {
				unselectQsoID($(this).data('qsoID'))
			});
		}
	});
	$('#searchForm').submit();
});
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),
				'startat': $('#startat').val(),
				'grid': $('#gridlabel')[0].checked,
			},
		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);
		},
	});
}
function mapQsos(form) {
	$('#mapButton').prop("disabled", true);
	$("#qsoList").attr("Hidden", true);
	$("#qsoList_wrapper").attr("Hidden", true);
	$("#qsoList_info").attr("Hidden", true);
	var amap = $('#advancedmap').val();
	if (amap == undefined) {
		$(".qso_manager").append('');
	}
	$.ajax({
		url: base_url + 'index.php/logbookadvanced/mapQsos',
		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,
			qsoresults: this.qsoResults.value,
			sats: this.sats.value,
			cqzone: this.cqzone.value,
			lotwSent: this.lotwSent.value,
			lotwReceived: this.lotwReceived.value,
			eqslSent: this.eqslSent.value,
			eqslReceived: this.eqslReceived.value,
			qslvia: $('[name="qslviainput"]').val(),
			sota: this.sota.value,
			pota: this.pota.value,
			wwff: this.wwff.value,
			qslimages: this.qslimages.value,
		},
		success: function(data) {
			loadMap(data);
		},
		error: function() {
			$('#mapButton').prop("disabled", false);
		},
	});
};
function loadMap(data) {
	$('#mapButton').prop("disabled", false);
	var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
	var osmAttrib='Map data © OpenStreetMap contributors';
	// If map is already initialized
	var container = L.DomUtil.get('advancedmap');
	if(container != null){
		container._leaflet_id = null;
		container.remove();
		$(".qso_manager").append('');
	}
	var map = new L.Map('advancedmap', {
		fullscreenControl: true,
		fullscreenControlOptions: {
			position: 'topleft'
		},
	});
	L.tileLayer(
		osmUrl,
		{
			attribution: '© OpenStreetMap contributors, CC-BY-SA',
			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);
	var linecolor = 'blue';
	if (isDarkModeTheme()) {
		linecolor = 'red';
	}
	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,
			color: linecolor,
			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 += "
');
		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);
		}
		if ($(".lotwconfirmation")[0]){
			data.push(qso.lotw);
		}
		data.push(qso.qslMessage);
		data.push(qso.dxcc+(qso.end == null ? '' : ' Deleted DXCC'));
		data.push(qso.state);
		data.push(qso.cqzone);
		data.push(qso.iota);
		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();
	$('[data-toggle="tooltip"]').tooltip();
}
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);
	element.addClass('activeRow');
}
function unselectQsoID(qsoID) {
	var element = $("#qsoID-" + qsoID);
	element.find("input[type=checkbox]").prop("checked", false);
	element.removeClass('activeRow');
	$('#checkBoxAll').prop("checked", false);
}
$(document).ready(function () {
	$('#dateFrom').datetimepicker({
		format: 'DD/MM/YYYY',
	});
	$('#dateTo').datetimepicker({
		format: 'DD/MM/YYYY',
	});
	$('#searchForm').submit(function (e) {
		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);
		$('#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,
				qsoresults: this.qsoResults.value,
				sats: this.sats.value,
				cqzone: this.cqzone.value,
				lotwSent: this.lotwSent.value,
				lotwReceived: this.lotwReceived.value,
				eqslSent: this.eqslSent.value,
				eqslReceived: this.eqslReceived.value,
				qslvia: $('[name="qslviainput"]').val(),
				sota: this.sota.value,
				pota: this.pota.value,
				wwff: this.wwff.value,
				qslimages: this.qslimages.value,
			},
			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")) {
			$(this).closest('tr').addClass('activeRow');
		} else {
			$(this).closest('tr').removeClass('activeRow');
		}
	});
	$('#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);
					})
				}
			},
			onhide: function(dialogRef){
				$('#deleteQsos').prop("disabled", false);
			},
		});
	});
	$('#exportAdif').click(function (event) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		$('#exportAdif').prop("disabled", true);
		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';
		xhttp.send("id=" + JSON.stringify(id_list, null, 2)+"&sortorder=" +$('.table').DataTable().order());
		$('#exportAdif').prop("disabled", false);
	});
	$('#queueBureau').click(function (event) {
		handleQsl('Q','B', 'queueBureau');
	});
	$('#queueDirect').click(function (event) {
		handleQsl('Q','D', 'queueDirect');
	});
    $('#queueElectronic').click(function (event) {
		handleQsl('Q','E', 'queueElectronic');
	});
	$('#sentBureau').click(function (event) {
		handleQsl('Y','B', 'sentBureau');
	});
	$('#sentDirect').click(function (event) {
		handleQsl('Y','D', 'sentDirect');
	});
    $('#sentElectronic').click(function (event) {
		handleQsl('Y','E', 'sentElectronic');
	});
	$('#dontSend').click(function (event) {
		handleQsl('N','', 'dontSend');
	});
	$('#notRequired').click(function (event) {
		handleQsl('I','', 'notRequired');
	});
	$('#receivedBureau').click(function (event) {
		handleQslReceived('Y','B', 'receivedBureau');
	});
	$('#receivedDirect').click(function (event) {
		handleQslReceived('Y','D', 'receivedDirect');
	});
	$('#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');
	});
	$('#searchSota').click(function (event) {
		quickSearch('sota');
	});
	$('#searchWwff').click(function (event) {
		quickSearch('wwff');
	});
	$('#searchPota').click(function (event) {
		quickSearch('pota');
	});
	$('#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);
					},
				});
			}
		});
	});
	function quickSearch(type) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		if (nElements > 1) {
			BootstrapDialog.alert({
				title: 'WARNING',
				message: 'Only 1 row can be selected for Quickfilter!',
				type: BootstrapDialog.TYPE_WARNING,
				closable: false,
				draggable: false,
				callback: function (result) {
				}
			});
		}
		var offset = 0;
		if (!$(".eqslconfirmation")[0]){
			offset--;
		}
		if (!$(".lotwconfirmation")[0]){
			offset--;
		}
		elements.each(function() {
			var currentRow = $(this).first().closest('tr');
			var col1 = '';
			switch (type) {
				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;
				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;
				case 'sota': col1 = $(currentRow).find('#dxsota').text(); break;
				case 'wwff': col1 = $(currentRow).find('#dxwwff').text(); break;
				case 'pota': col1 = $(currentRow).find('#dxpota').text(); break;
				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();
		});
	}
	$('#printLabel').click(function (event) {
		var elements = $('#qsoList tbody input:checked');
		var nElements = elements.length;
		if (nElements == 0) {
			return;
		}
		$('#printLabel').prop("disabled", true);
		$.ajax({
			url: base_url + 'index.php/logbookadvanced/startAtLabel',
			type: 'post',
			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) {
							$('#printLabel').prop("disabled", false);
							dialogItself.close();
						}
					}],
					onhide: function(dialogRef){
						$('#printLabel').prop("disabled", false);
					},
				});
			}
		});
	});
	$('#searchForm').on('reset', function(e) {
		setTimeout(function() {
			$('#searchForm').submit();
		});
	});
	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);
			}
		});
	}
	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);
			}
		});
	}
	$('#checkBoxAll').change(function (event) {
		if (this.checked) {
			$('#qsoList tbody tr').each(function (i) {
				selectQsoID($(this).data('qsoID'))
			});
		} else {
			$('#qsoList tbody tr').each(function (i) {
				unselectQsoID($(this).data('qsoID'))
			});
		}
	});
	$('#searchForm').submit();
});
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),
				'startat': $('#startat').val(),
				'grid': $('#gridlabel')[0].checked,
			},
		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);
		},
	});
}
function mapQsos(form) {
	$('#mapButton').prop("disabled", true);
	$("#qsoList").attr("Hidden", true);
	$("#qsoList_wrapper").attr("Hidden", true);
	$("#qsoList_info").attr("Hidden", true);
	var amap = $('#advancedmap').val();
	if (amap == undefined) {
		$(".qso_manager").append('');
	}
	$.ajax({
		url: base_url + 'index.php/logbookadvanced/mapQsos',
		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,
			qsoresults: this.qsoResults.value,
			sats: this.sats.value,
			cqzone: this.cqzone.value,
			lotwSent: this.lotwSent.value,
			lotwReceived: this.lotwReceived.value,
			eqslSent: this.eqslSent.value,
			eqslReceived: this.eqslReceived.value,
			qslvia: $('[name="qslviainput"]').val(),
			sota: this.sota.value,
			pota: this.pota.value,
			wwff: this.wwff.value,
			qslimages: this.qslimages.value,
		},
		success: function(data) {
			loadMap(data);
		},
		error: function() {
			$('#mapButton').prop("disabled", false);
		},
	});
};
function loadMap(data) {
	$('#mapButton').prop("disabled", false);
	var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
	var osmAttrib='Map data © OpenStreetMap contributors';
	// If map is already initialized
	var container = L.DomUtil.get('advancedmap');
	if(container != null){
		container._leaflet_id = null;
		container.remove();
		$(".qso_manager").append('');
	}
	var map = new L.Map('advancedmap', {
		fullscreenControl: true,
		fullscreenControlOptions: {
			position: 'topleft'
		},
	});
	L.tileLayer(
		osmUrl,
		{
			attribution: '© OpenStreetMap contributors, CC-BY-SA',
			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);
	var linecolor = 'blue';
	if (isDarkModeTheme()) {
		linecolor = 'red';
	}
	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,
			color: linecolor,
			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 += "" + counter + " QSOs plotted
";
        return div;
    };
    legend.addTo(map);
}
	function createContentMessage(qso) {
		var table = '' +
		'' +
		'| ' +
		'Station callsign: ' + qso.mycallsign +
		" | 
" +
		'' +
		'| ' +
		'Gridsquare: ' + qso.mygridsquare +
		" | 
";
		return (table += "
");
	}
	function createContentMessageDx(qso) {
		var table = '' +
		'' +
		'| Callsign' +
		' | ' + qso.callsign + '' +
		' | 
' +
		'' +
		'| Date/time' +
		' | ' + qso.datetime + '' +
		' | 
' +
		'';
		if (qso.satname != "") {
			table += '| Band' +
			' | ' + qso.satname + '' +
			' | 
' +
			'';
		} else {
			table += '| Band' +
			' | ' + qso.band + '' +
			' | 
' +
			'';
		}
		table += '| Mode' +
		' | ' + qso.mode + '' +
		' | 
' +
		'';
		if (qso.gridsquare != undefined) {
			table += '| Gridsquare' +
			' | ' + qso.gridsquare + '' +
			' | 
';
		}
		if (qso.distance != undefined) {
			table += 'Distance' +
			' | ' + qso.distance + '' +
			'';
		}
		if (qso.bearing != undefined) {
			table += ' | Bearing' +
			' | ' + qso.bearing + '' +
			'';
		}
		return (table += ' | 
');
	}