function showOrHideFieldSet(){
	$("fieldset").each(function() {
		if($(this).children(':visible').not('legend').not('.clearfix').not('script').length == 0){
			$(this).hide();
		}
	});
}

function getAndSetAllElementRequiredOrWarning(wfItemId, wfTaskId, wfStateNextString, wfItemTypeId, legacy) {
    var url='/ap/wfItem/elementRequiredOrWarning/widgetSearch.json';
    url+='?rnd='+Math.random(9999);
    $.ajax({
        dataType: 'json',
        data:{
            wfItemId: wfItemId,
            wfTaskId: wfTaskId,
            wfStateNextString: wfStateNextString,
            wfItemTypeId: wfItemTypeId,
            legacy: legacy
        },
        url: url,
        cache: false,
        success: function(data) {
			if (data && getSessionStorageVariable("elementRequiredOrWarningList", wfItemId, wfTaskId) == null) {
				var jsonList = JSON.stringify(
				    	data.map(jsonObject => ({
				      	discriminator: JSON.parse(jsonObject).discriminator,
				      	type: JSON.parse(jsonObject).type,
				      	messageKey: JSON.parse(jsonObject).messageKey
					}))
			 	);
				setSessionStorageVariable("elementRequiredOrWarningList", wfItemId, wfTaskId, jsonList);
				setAllElementRequiredOrWarning(JSON.parse(jsonList));
            }
        },
        error: function () {
			console.log("Error loading getAndSetAllElementRequiredOrWarning");
        }
    });
}

function setAllElementRequiredOrWarning(elementRequiredOrWarningJsonList, fragmentDivId) {
	if (elementRequiredOrWarningJsonList != null && elementRequiredOrWarningJsonList != "") {
		for (var i = 0; i < elementRequiredOrWarningJsonList.length; i++) {
			var elementRequiredOrWarningJson = elementRequiredOrWarningJsonList[i];
			var discriminator = elementRequiredOrWarningJson.discriminator;
			discriminator = discriminator.replace("[", "__");
			discriminator = discriminator.replace("]", "__");
			var wfObjectList = ['Element','','Parent','Child'];
			var prefix = "";
			if(fragmentDivId != null) {
				if(discriminator.startsWith(fragmentDivId + ".")) {
					discriminator = discriminator.substring((fragmentDivId + ".").length);
					prefix = "#" + fragmentDivId + "ElementFragmentEditContainer ";
				} else {
					continue;
				}
			}
			
			if(fragmentDivId != null && $(prefix + `label[for="${discriminator}${fragmentDivId}"]`).length) {
				discriminator = discriminator + fragmentDivId;
			}
			var domObject = $(prefix + `label[for="${discriminator}"]`);
			if (domObject.length){
				//controllo per vedere se è già presente l'asterisco/punto interrogativo
				if (domObject.children('sup').length == 0) { //verifico che non sia già stato aggiunto da questa procedura o dalla dichiarazione del widget xml
					if (domObject.children('span').length && domObject.children('span').children('sup').length == 0) { //verifico per sicurezza che esista lo span in cui è contenuto il campo e verifico che non sia già stato aggiunto a mano nell'etichetta					
						var htmlText = ``;
						if (elementRequiredOrWarningJson.type == "required") {
							htmlText = `&nbsp;<sup class='required-sup'><i class='fas fa-asterisk' data-bs-toggle='tooltip'></i></sup>`;
						} else if (elementRequiredOrWarningJson.type == "warning") {
							htmlText = `&nbsp;<sup class='question-sup'><i class='tip fa fa-question' data-bs-toggle='tooltip' data-bs-container='body' data-bs-html='true' title="${elementRequiredOrWarningJson.messageKey}"></i></sup>`;
						}
						domObject.children('span').after(htmlText);
						$('[data-bs-toggle="tooltip"]').tooltip();
					}
				}
				continue;
			}
			
			for (var wfObjectIndex in wfObjectList) {
				domObject = $(prefix + "#" + discriminator + wfObjectList[wfObjectIndex] + "FragmentLegend");
				if (domObject.length) {
					//controllo per vedere se è già presente l'asterisco/punto interrogativo
					if (domObject.children('sup').length == 0) {
						var htmlText = ``;
						if (elementRequiredOrWarningJson.type == "required") {
							htmlText = `<sup class='required-sup'><i class='fas fa-asterisk' data-bs-toggle='tooltip'></i></sup>`;
						} else if (elementRequiredOrWarningJson.type == "warning") {
							htmlText = `<sup class='question-sup'><i class='tip fa fa-question' data-bs-toggle='tooltip' data-bs-container='body' data-bs-html='true' title="${elementRequiredOrWarningJson.messageKey}"></i></sup>`;
						}
						if (domObject.children('i').length > 0) {
							domObject.children('i').before(htmlText);
						} else {
							domObject.append(htmlText);
						}
					}
					continue;
				}
			}
		}
	}
}

function showOrHideButtonsNextStates() {
	var selectNextStatesList = document.getElementById("selectNextStates");
	for (var i = 0; i < selectNextStatesList.length; i++) {
		if (selectNextStatesList.options[selectNextStatesList.selectedIndex].value != selectNextStatesList[i].getAttribute("value")) {
			var selectNextStatesNotSelected = selectNextStatesList[i].getAttribute("value");
			$("#button-backward-to-" + selectNextStatesNotSelected).hide();
			$("#button-forward-to-" + selectNextStatesNotSelected).hide();
		}	
	}
	var selectNextStatesSelected = selectNextStatesList.options[selectNextStatesList.selectedIndex].value;
	$("#button-backward-to-" + selectNextStatesSelected).show();
	$("#button-forward-to-" + selectNextStatesSelected).show();
}

function managementElementRequiredOrWarning(wfItemId, wfTaskId, fragmentDivId) {
	var elementRequiredOrWarningSessionStorage = getSessionStorageVariable("elementRequiredOrWarningList", wfItemId, wfTaskId);
	var selectNextStatesStringCookie = null;
	
	if (elementRequiredOrWarningSessionStorage != null) {
		setAllElementRequiredOrWarning(JSON.parse(elementRequiredOrWarningSessionStorage), fragmentDivId);
    }
    
    if (document.cookie.match(RegExp('(?:^|;\\s*)' + "selectNextStates-" + wfItemId + "-" + wfTaskId + '=([^;]*)'))){
		selectNextStatesStringCookie = window.atob(document.cookie.match(RegExp('(?:^|;\\s*)' + "selectNextStates-" + wfItemId + "-" + wfTaskId + '=([^;]*)'))[1]);
	}
	if (selectNextStatesStringCookie !== null) {
		$("#selectNextStates").find('option').attr("selected", false);
		$(`select option[value="${selectNextStatesStringCookie}"]`).attr("selected", "selected");
	}
	
	if (document.getElementById("selectNextStates") != null) {
		showOrHideButtonsNextStates();
		$("#selectNextStates").on("change", function() {
			$('body').append('<div class="overlay"><div class="opacity"></div><i class="fas fa-spin fa-spinner"></i></div>');
			$('.overlay').fadeIn(150);
			var selectNextStates = document.getElementById("selectNextStates");
			var selectNextStatesValue = selectNextStates.options[selectNextStatesValue.selectedIndex].value;
			if (document.cookie.match(RegExp('(?:^|;\\s*)' + "selectNextStates-" + wfItemId + "-" + wfTaskId + '=([^;]*)'))){
				Cookies.remove("selectNextStates-" + wfItemId + "-" + wfTaskId);
			}
			Cookies.set("selectNextStates-" + wfItemId + "-" + wfTaskId, window.btoa(selectNextStatesValue));
			getAndSetAllElementRequiredOrWarning(wfItemId, wfTaskId, selectNextStatesValue, null, null);
			showOrHideButtonsNextStates();
		});
	}
	
	$("input[name=booleanMap\\[legacy\\]]").on("change", function() {
		var checkedValue = $("input[name=booleanMap\\[legacy\\]]:checked").val();
		if (checkedValue == "true") {
			getAndSetAllElementRequiredOrWarning(wfItemId, wfTaskId, null, null, true);
		} else if (checkedValue == "false") {
			getAndSetAllElementRequiredOrWarning(wfItemId, wfTaskId, null, null, false);
		} else {
			getAndSetAllElementRequiredOrWarning(wfItemId, wfTaskId, null, null, null);
		}
	});
}

//questa funzione permette di salvare i dati necessari in una variabile di sessione con una chiave univoca (itemId + taskId)
//la logica si occupa dell'eliminazione di tutte le chiavi contenenti un certo prefisso SOLO quando viene raggiunto il limite di spazio (5mb)
//inoltre viene effettuata la codifica del contenuto in base64-encoded
function setSessionStorageVariable(prefix, wfItemId, wfTaskId, content) {
	try {
		sessionStorage.setItem(prefix + "-" + wfItemId + "-" + wfTaskId, window.btoa(encodeURIComponent(content)));
	} catch (e) {
		Object.keys(sessionStorage).forEach(function(key){
       		if (key != null && key.startsWith(prefix)) {
           		sessionStorage.removeItem(key);
       		}
   		});
	  	sessionStorage.setItem(prefix + "-" + wfItemId + "-" + wfTaskId, window.btoa(encodeURIComponent(content)));
	}
}

//questa funzione permette di recuperare i dati necessari contenuti in una variabile di sessione con una chiave univoca (itemId + taskId)
//viene effettuato il recupero e viene effettuata la decodifica in base64-encoded
//qualora non sia presente il dato verrà restituito null
function getSessionStorageVariable(prefix, wfItemId, wfTaskId) {
	var sessionStorageVariable = sessionStorage.getItem(prefix + "-" + wfItemId + "-" + wfTaskId);
	if(sessionStorageVariable != null) {
		return decodeURIComponent(window.atob(sessionStorageVariable));
	} else {
		return null;
	}
}