//--------------------------------------------------------------------------
//			QUERY GENERIC FUNCTION
//--------------------------------------------------------------------------
  (function(webapi, $) {
    function safeAjax(ajaxOptions) {
      var deferredAjax = $.Deferred();
      shell.getTokenDeferred().done(function(token) {
        // add headers for AJAX
        tokenCTS = token;
        if (!ajaxOptions.headers) {
          $.extend(ajaxOptions, {
            headers: {
              "__RequestVerificationToken": token
            }
          });
        } else {
          ajaxOptions.headers["__RequestVerificationToken"] = token;
        }
        $.ajax(ajaxOptions)
        .done(function(data, textStatus, jqXHR) {
          validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
          }).fail(deferredAjax.reject); //AJAX
      }).fail(function() {
        deferredAjax.rejectWith(this, arguments); // on token failure pass the token AJAX and args
      });
      return deferredAjax.promise();
    }
    webapi.safeAjax = safeAjax;
  })(window.webapi = window.webapi || {}, jQuery)
function executeAJAX(sUrl, sucessFunction, queryJSON = undefined, errorFunction = undefined, typeOperation = "", sRegisterSeparator = "<|@!>")
{
	if (errorFunction == undefined)
		errorFunction = function(xhr, textStatus, errorThrown) {
			alert('Error number ' + xhr.status + ': '+  xhr.responseJSON.error.message + ' (Internal code: \'' + xhr.responseJSON.error.code + '\')\n' + errorThrown + ". Status: " + textStatus);
		}
	var ltypeOperation = (typeOperation.length == 0)?((queryJSON != undefined && queryJSON != null && ((typeof queryJSON == 'string' && queryJSON.length > 0) || typeof queryJSON == 'object'))?((sUrl.substring(sUrl.length-1) == ')') ? "PATCH" : "POST"):((sUrl.substring(sUrl.length-1) == ')') ? "DELETE" : "GET")):typeOperation;	
	var lArrayData = (queryJSON != undefined && queryJSON != null) ? ((typeof queryJSON == 'string') ? (queryJSON.split(sRegisterSeparator)) : JSON.stringify([queryJSON])) : "";
			
	for (var lsDataOfRegister of lArrayData) {
	
		var oExe = webapi.safeAjax({
			type: ltypeOperation,
			contentType: "application/json; charset=utf-8",
			datatype: "json",
			url: /_api/ + sUrl,
			data: lsDataOfRegister,
			  beforeSend: function(XMLHttpRequest) {
				XMLHttpRequest.setRequestHeader("OData-MaxVersion", "4.0");
				XMLHttpRequest.setRequestHeader("OData-Version", "4.0");
				XMLHttpRequest.setRequestHeader("Accept", "application/json");
				
				if (ltypeOperation = "GET")
					XMLHttpRequest.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
				else
					XMLHttpRequest.setRequestHeader('__RequestVerificationToken', tokenCTS);
			},
			async: true,
			
			success: sucessFunction,
			error: errorFunction
			
		});
		
	}
	
}
function addEntity(sEntityName, dataJSON, sucessFunction = undefined, errorFunction = undefined) {
	
	if (sucessFunction == undefined)
		sucessFunction = function(data, textStatus, xhr) {
			console.log("New " + sEntityName + " ID: " + xhr.getResponseHeader("entityid"));
		}
		
	executeAJAX(sEntityName, sucessFunction, dataJSON, errorFunction, "POST");
}
function updateEntity(sEntityName, sEntityID,  dataJSON, sucessFunction = undefined, errorFunction = undefined) {
	
	if (sucessFunction == undefined)
		sucessFunction = function(data, textStatus, xhr) {
			console.log("Updated " + sEntityName + " ID: " + sEntityID);
		}
		
	executeAJAX(sEntityName + "(" + sEntityID + ")", sucessFunction, dataJSON, errorFunction, "PATCH");
}
function deleteEntity(sEntityName, sEntityID, sucessFunction = undefined, errorFunction = undefined) {
	
	if (sucessFunction == undefined)
		sucessFunction = function(data, textStatus, xhr) {
			console.log("Delete " + sEntityName + " ID: " + sEntityID);
		}
		
	executeAJAX(sEntityName + "(" + sEntityID + ")", sucessFunction, "", errorFunction, "DELETE");
}
function getAjaxUrlFilter(sIDquerySelectorControls, bInputContains = false) {
	var lColControlsRef = (typeof sIDquerySelectorControls == 'string') ? document.querySelectorAll(sIDquerySelectorControls) : (["NodeList", "Array"].includes(sIDquerySelectorControls.constructor.name)) ? sIDquerySelectorControls : [sIDquerySelectorControls];
	var lsResultUrlFilter = "";
	var lsFieldName = "";
	var lsFieldValue = "";
	var lsOperator = "";
	for (let lcrtSelection of lColControlsRef) {
		
		lsFieldName = lcrtSelection.getAttribute("name");
		if (lsFieldName != null && lsFieldName.length > 0) {
					
			switch(lcrtSelection.nodeName.toUpperCase()) {
				
				case "INPUT":
					lsOperator = (bInputContains == false || lcrtSelection.nodeName.toUpperCase() != "TEXT") ? "eq": "";					
					lsFieldValue = (lcrtSelection.type.toUpperCase() == "NUMBER") ? lcrtSelection.value : "'" + lcrtSelection.value + "'";
					
					break;
					
				case "SELECT":
				
					let liOptionSelected = lcrtSelection.selectedIndex;
					
					if (liOptionSelected > 0) {
						let loOption = lcrtSelection.options[liOptionSelected];
						
						if (loOption.value.length > 0) {
				
							lsOperator = "eq";
							lsFieldValue = "'" + ((loOption.getAttribute("idvalue") != null) ? loOption.getAttribute("idvalue") : loOption.value) + "'" ;
						
						}
						
					} else
						lsFieldName = "";
					
					break;
			}
			
			if (lsFieldName.length > 0) 
				lsResultUrlFilter = ((lsResultUrlFilter.length > 0) ? (lsResultUrlFilter + " and ") : "") + ((lsOperator.length > 0) ? (lsFieldName + " " + lsOperator + " " + lsFieldValue) : ("contains(" + lsFieldName + ", " + lsFieldValue + ")"));				
		}
	}
	return lsResultUrlFilter;
}
function checkEntityFilter(sEntityName, sFieldName, sFilter = undefined, sucessFunction = undefined, errorFunction = undefined) {
	
	if (sucessFunction == undefined)
		sucessFunction = function(data, textStatus, xhr) {
			console.log("Number of " + sEntityName + ": " + data.value.length);
		}
		
	executeAJAX(sEntityName + "?$select=" + sFieldName + ((sFilter != undefined && sFilter != null && (typeof sFilter == 'string' && sFilter.length > 0)) ? "&$filter=" + sFilter : "" ), sucessFunction, "", errorFunction, "GET");
}
function AddNewPropertyToJson(sJson, sNewProperty, sPropertyValue) {
	
	if (typeof sJson == 'string' && typeof sNewProperty == 'string' && typeof sPropertyValue == 'string' && sNewProperty.length > 0 && sPropertyValue.length > 0)
		if (sJson.length > 0)
			return sJson.split('}').join(',"' + sNewProperty + '":"' + sPropertyValue + '"}');
		else
			return '{"' + sNewProperty + '":"' + sPropertyValue + '"}';
	
}
function checkInputUnique(data, ctrlControlLocked = undefined, sErrorMessage = "", scrtlShowMessage = ".alert") {
	var lbExistData = false;
	var lcrtlAlert = document.querySelector(scrtlShowMessage);
	var lbLockedControl = (ctrlControlLocked != undefined && ctrlControlLocked != null && ctrlControlLocked.nodeName.toUpperCase() == "INPUT");
	
	if (typeof data == 'object') {
		
		console.log(data["@odata.context"] + ": " + data.value.length);
		lbExistData = (data.value.length > 0) ? true : false;
	
	}
	
	
	if (lcrtlAlert != null) {
		
		if (lbLockedControl == true)
		{
			ctrlControlLocked.setCustomValidity("");
			if (lbExistData == false && ctrlControlLocked.checkValidity() == false) {
				
				if (ctrlControlLocked.value.trim().length > 0) {
					
					if (sErrorMessage.length == 0 || typeof data == 'object')
						sErrorMessage = ctrlControlLocked.getAttribute("title");
					lbExistData = (sErrorMessage != null && sErrorMessage.length > 0);
					
				}
			}
		}
		
		if (lbExistData == true) {
			
			lcrtlAlert.style.display = "block";
			lcrtlAlert.innerHTML = sErrorMessage;
			
		} else {
			
			lcrtlAlert.style.display = "none";
			lcrtlAlert.innerHTML = "";		
			
		}
	}
	
	if (lbLockedControl == true)
		ctrlControlLocked.setCustomValidity((lbExistData == true) ? sErrorMessage : "");
	
}
function checkLicensePlate(data, ctrlControlLocked = undefined, sErrorMessage = "", sErrorNoRegister = "", scrtlShowMessage = ".alert") {
	
	if (typeof data == 'object' && data.value.length > 0) {
			
		console.log(data["@odata.context"] + ": " + data.value.length);
		
		for (var lsDataOfRegister of data.value) {
			
			ctrlControlLocked.setAttribute('vehicleid', "'" + lsDataOfRegister.cts_vehicleid + "'");
			
			switch(lsDataOfRegister.cts_lifecyclestatus) {
				
				case 3:
					checkInputUnique(data, ctrlControlLocked, sErrorMessage, scrtlShowMessage);
					break;
				case 1:
					newData = data;
					checkEntityFilter("cts_trips", "cts_tripid", "_cts_vehicleid_value eq '" + lsDataOfRegister.cts_vehicleid + "'", 
					   function(data, textStatus, xhr) { checkLicensePlateUnregister(data, ctrlControlLocked, sErrorMessage, sErrorNoRegister, scrtlShowMessage, newData) });
					break;
				default:
					if ((lcrtlAlert = document.querySelector(scrtlShowMessage)) != null) {
						lcrtlAlert.style.display = "none";
						lcrtlAlert.innerHTML = "";
					}					
			}
		}
	} else {
		if ((lcrtlAlert = document.querySelector(scrtlShowMessage)) != null) {
			lcrtlAlert.style.display = "none";
			lcrtlAlert.innerHTML = "";
		}
		
	}
	
	if (ctrlControlLocked.validationMessage == "AJAXquery")
		ctrlControlLocked.setCustomValidity("");
	
	return true;
}
function checkLicensePlateUnregister(data, ctrlControlLocked = undefined, sErrorMessage = "", sErrorNoRegister = "", scrtlShowMessage = ".alert", newData = null) {
	if (typeof data == 'object' && data.value.length > 0) {
			
		console.log(data["@odata.context"] + ": " + data.value.length);	
		
		let lsIdTrips = "";
		for (var lsDataOfRegister of data.value) {
			
			lsIdTrips = ((lsIdTrips.length > 0) ? lsIdTrips + ",'" : "'") + lsDataOfRegister.cts_tripid + "'";
			
		}
		
		ctrlControlLocked.setAttribute('tripids', lsIdTrips);
		
		if ((lcrtlAlert = document.querySelector(scrtlShowMessage)) != null) {
			lcrtlAlert.style.display = "block";
			lcrtlAlert.innerHTML = sErrorNoRegister;
		}
	} else {
		
		//checkInputUnique(newData, ctrlControlLocked, sErrorMessage, scrtlShowMessage);
	}
	
	if (ctrlControlLocked.validationMessage == "AJAXquery")
		ctrlControlLocked.setCustomValidity("");
	return true;
	
}
//--------------------------------------------------------------------------
//			INTERNAL GENERIC SUCCESS FUNCTION
//--------------------------------------------------------------------------
function sucessAddOptionsInSelect(sIDSelectControl, data, sVisibleField, sValueFields, sDefaultText = "", sDefaultFilterField = "", sDefaultFilterValue="") {
	var bReturnValue = false;
	var loSelectOptionControl = (typeof sIDSelectControl == "string") ? $('#' + sIDSelectControl) : sIDSelectControl;
	
	if (loSelectOptionControl != null && loSelectOptionControl != undefined) {
			
		loSelectOptionControl.empty();
		
		if (sDefaultText.length > 0) {
		
			loSelectOptionControl.append($('