// LAST UPDATE XB 07/10/2014

// ######################## //
// ### GLOBAL VARiABLES ### //
// ######################## //

var linkUpModule = function() {
	var o = {
		username : getParameterValueFromUrl("codeCollabo"),
		pw : getParameterValueFromUrl("mdpCollabo")
	};
	var req = getParameterValueFromUrl("reqRole");
	var reqRole;
	if (req != null && req != false) {
		reqRole = req.replace("/mongo/Role/", "");
	} else {
		return o;
	}
	var operatingCompany = GetObjetMongo(reqRole, o.username, o.pw);
	if (operatingCompany != null)
	{
		getTokenCollaborateur().then(function(token) {
			o.bearer = token;
		})
	}
	return o;
}(); 
 
var dialogModule = function() {
	return {
		errorTitle: "Échec de l'opération",
		warningTitle: "Avertissement",
		successTitle: "Opération réussie",
		noticeTitle: "Information"
	}
}();

var usernameFromUrl = getParameterValueFromUrl("codeCollabo");
var isSuperAdmin = (usernameFromUrl.toLowerCase()==="tni");
var pwFromUrl = getParameterValueFromUrl("mdpCollabo");
var errorTitle = "Échec de l'opération";
var warningTitle = "Avertissement";
var successTitle = "Opération réussie";
var noticeTitle = "Information";
var sDataUrlPrefix = "../../sdata/linkup";
var aLesDroitsLUFromUrl = getParameterValueFromUrl("aLesDroitsLinkUp");
var aLesDroitsLinkUp = null;
aLesDroitsLinkUp = (aLesDroitsLUFromUrl=="true");
var token = null;
var applicationName = "Connecteur GE";

// ######################### //
// ### RESUSABLE METHODS ### //
// ######################### //

// CREATOR LLG 27/11/2017
// Pour Recuperer le token du collaborateur connecte à passer aux headers des requetes
function getTokenCollaborateur ()
{
	var deferred = $.Deferred();

	if (token==null)
	{
		//if (window.chrome.webview.hostObjects.external && 'execCmd' in window.chrome.webview.hostObjects.external)
		if (window.chrome.webview.hostObjects.sync.external)
		{
			atoken = window.chrome.webview.hostObjects.sync.external.execCmd("recupererTokenSageIdV5", '');
			token = atoken;
		}
	}
	if (token)
	{
		deferred.resolve(token);
	}
	else
	{
		deferred.reject();
	}
	return deferred.promise();
}


// CREATOR XB 28/02/2014
// Pour trouver facilement les messages de debug dans le code :)
function debug(message) {
	alert(message);
}

// XB 25/04/13 // jQuery method to display a nice error message with jQuery UI dialog component
// Need linkup.css (fail class)
$.fn.failDialog = function(title, msg) {
	return this.each(function() {
		$(this).html(msg ? msg : "")
			.addClass("fail")
			.dialog({
				modal: true,
				title: title ? title : "Failure"
			});	
	});
}

// XB 16/05/13 // jQuery method to display a nice warning message with jQuery UI dialog component
// Need linkup.css (warning class)
$.fn.warningDialog = function(title, msg, width) {
	return this.each(function() {
		$(this).html(msg ? msg : "")
			.addClass("warning")
			.dialog({
				modal: true,
				title: title ? title : "Warning",
				width: width ? width : 300
			});	
	});
}

// XB & MLD 31/10/13 // jQuery method to display a nice success message with jQuery UI dialog component
// Need linkup.css (success class)
$.fn.successDialog = function(title, msg, width) {
	return this.each(function() {
		$(this).html(msg ? msg : "")
			.addClass("epicSuccess")
			.dialog({
				modal: true,
				title: title ? title : "Success",
				width: width ? width : 300,
				buttons: {
					"OK": function() {
						$(this).dialog("close");
					}
				}
			});	
	});
}

// XB 22/05/2013 // Get a parameter value in URL
function getParameterValueFromUrl(key) {
	var value;
	var params = window.location.href; // Complete URL
	params = params.substring(params.split("?")[0].length + 1, params.length); // Get parameters
	params = params.split('&');
	$.each(params, function(k,v) {
		if (v.split("=")[0] == key) value = v.split("=")[1];
	});
	typeof value === "undefined" ? value = false : value = decodeURIComponent(value)
	return value;
}

// ############################### //
// ### SERiALiZATiON FUNCTiONS ### //
// ############################### //

// XB 02/10/2013 - To serialize our organization object in LinkUp's way
function createLinkUpOrganizationObject(obj) {
	var o;
	if (obj.personne != null) {
		// Get credentials for Ajax Calls
		var username = urlParams["codeCollabo"];
		var pw = urlParams["mdpCollabo"];
		// Dealing with the country
		var countryAlphaCode2;
		if (obj.personne.pays != null) {
			var oCountries = GetLinkUpCountries(username, pw);
			if (oCountries.status) {
				oCountries = oCountries.data.$resources;
				$.each(oCountries, function(k, v) {
					if (v.isoAlpha2 == obj.personne.pays.toUpperCase()) countryAlphaCode2 = v["$key"]
				});
			}
		}
		o = {
			"Siren": obj.personne.siren,
			"Name": obj.personne.raisonSociale,
			"ZipCode": (obj.personne.codePostal === "") ? null : obj.personne.codePostal,
			"WebSite": obj.personne.siteWeb,
			"Email" : obj.personne.email,
			"Address1" : getFullAddress(obj.personne.numero, obj.personne.bister, obj.personne.adresse1),
			"Address2" : obj.personne.adresse2,
			"City" : obj.personne.ville,
			"Phone1" : obj.personne.telephone,
			"IsDeleted" : (obj.estCabinetActiveLinkUp) ? 0:1,
			"Photo": obj.personne.photo,
			"ComplementCP": obj.personne.codePostalGeo,
			"Phone2": obj.personne.mobile,
			"Fax": obj.personne.fax,
			"Capital": obj.capitalEuros
		};
		if (countryAlphaCode2 !== undefined) o.Country = countryAlphaCode2;
	}
	return o;
}
// XB 02/10/2013 - To serialize our operating company object in LinkUp's way
function createLinkUpOperatingCompanyObject(obj) {
	var o;
	if (obj.personne != null) {
		// Get credentials for Ajax Calls
		var username = urlParams["codeCollabo"];
		var pw = urlParams["mdpCollabo"];
		// Dealing with the country
		var countryAlphaCode2;
		if (obj.personne.pays != null) {
			var oCountries = GetLinkUpCountries(username, pw);
			if (oCountries.status) {
				oCountries = oCountries.data.$resources;
				$.each(oCountries, function(k, v) {
					if (v.isoAlpha2 == obj.personne.pays.toUpperCase()) countryAlphaCode2 = v["$key"]
				});
			}
		}
		// Dealing with the legal form
		var legalFormId;
		if (obj.personne.typeJuridique != null) {
			var oLegalForms = GetLinkUpLegalForms(username, pw);
			if (oLegalForms.status) {
				$.each(oLegalForms.data, function(k, v) {
					if (v.name != null && v.name.toUpperCase() === obj.personne.typeJuridique.toUpperCase()) {
						legalFormId = v["$key"];
						return false;
					}
				});
			}
		}	
		var o = {
			"Siren": obj.personne.siren,
			"Name": obj.personne.raisonSociale,
			"ZipCode": (obj.personne.codePostal === "") ? null : obj.personne.codePostal,
			"WebSite": obj.personne.siteWeb,
			"Email" : obj.personne.email,
			"Address1" : getFullAddress(obj.personne.numero, obj.personne.bister, obj.personne.adresse1),
			"Address2" : obj.personne.adresse2,
			"City" : obj.personne.ville,
			"Phone1" : obj.personne.telephone,
			"IsDeleted" : (obj.estDossierActiveLinkUp)?0:1,
			"Photo" : obj.personne.photo,
			"ComplementCP": obj.personne.codePostalGeo,
			"Phone2": obj.personne.mobile,
			"Fax": obj.personne.fax,
			"Capital": obj.capitalEuros
		};
		if (countryAlphaCode2 !== undefined) 
			o.Country = countryAlphaCode2;
		if (legalFormId !== undefined) 
			o.Type = legalFormId;
	}
	return o;
}

// XB 02/10/2013
// To serialize address
function getFullAddress(numero, bister, address1) {
	var fullAddress = "";
	if (numero != null)
		fullAddress += fullAddress + numero + " ";
	if (bister != null)
		fullAddress += bister + " ";
	if (address1 != null)
		fullAddress += address1;
	return fullAddress;
}

// XB 13/11/2013
// To serialize our collaborator object in LinkUp's way
function GetCollaborator(obj, isPme) {
	if (typeof isPme === 'undefined')
		isPme = false;
	var o = {
		"UserName" : obj.personne.email,
		"Name" : (obj.personne != null)?obj.personne.lastName: "",
		"FirstName" : (obj.personne != null)?obj.personne.firstName : "",
		"IsAdmindb" :(obj.estAdministrateurCabinet)?1:0,
		"IsAdmin" :(obj.estAdministrateurCabinet)?1:0,
		"IsDeleted" : (obj.estCollaborateurCabinet)?0:1,
		"Photo" : (obj.personne != null)?obj.personne.photo: null,
		"SageId" : (obj.personne != null)?obj.personne.sageId: null
	};
	if (isPme) {
		delete o.Photo;
		o.UsrProfileLockedDb = obj.estAdministrateurPme ? 0 : 1;
		o.IsDeleted = 0;
	}
	
	return o;
}

// ######################## //
// ### _GRiS FUNCTiONS ### //
// ######################## //

// XB 22/05/2013
// Reusable function for LinkUp _Gris functions, return true if checkbox must be disabled, else false
function hasLinkUpAdminRight(username, pw) {
	var right = GetLinkUpAdminRightByUser(username, pw); // Get LinkUp Administration right for an user
	if (!right.status) {
		$("#div_dialogAlert").failDialog(errorTitle, right.error);
		return true;
	} else {
		return right.data.value != "1";
	}	
}
// Global variable
var hasLinkUpAdminRightValue = aLesDroitsLinkUp?hasLinkUpAdminRight(usernameFromUrl, pwFromUrl):true;
// Activation of the checkbox "Activer cette entité sur Sage LinkUp Experts :"
$coala.Role_estCabinetActiveLinkUp_GRIS = function(obj, obj2, plugin) { 
	if (isSuperAdmin)
		return false;
	if (obj.estCabinetActiveLinkUp)
		return true;
	else
		return hasLinkUpAdminRightValue; 
}

// Activation of the checkbox "Identifiant LinkUp :"
$coala.Role_idEtablissementLinkUp_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the checkbox "Indique si l'entité est activée connecteur GE"
$coala.Role_estCabinetActiveConnecteurCloud_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "Identifiant connecteur GE :"
$coala.Role_idConnecteurCloud_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
$coala.Role_authServiceId_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the checkbox "Code client Sage :"
$coala.Role_codeOctave_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }

// Activation of the checkbox "Date de début :"
$coala.Role_dateDebutContratLinkUp_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the checkbox "Date de fin :"
$coala.Role_dateFinContratLinkUp_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "Capacité de stockage en Go :"
$coala.Role_quotaContrat_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "Type de contrat :"
$coala.Role_typeContrat_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "Identifiant (bis)"
$coala.Personne_idEE_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "SageId :"
$coala.Personne_sageId_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }
// Activation of the textbox "CloudId :"
$coala.Personne_cloudId_GRIS = function(obj, obj2, plugin) { return !isSuperAdmin; }


// Activation of the checkbox "Activer ce dossier dans Sage LinkUp Experts :"
$coala.Role_estDossierActiveLinkUp_GRIS = function(obj, obj2, plugin) { 
	if (isSuperAdmin)
		return false;
	else
		return hasLinkUpAdminRightValue; 
}
// Activation of the checkbox "Activer le compte dans Sage LinkUp Experts"
$coala.Role_estCollaborateurCabinet_GRIS = function(obj, obj2, plugin) { 
	if (isSuperAdmin)
		return false;
	else
		return hasLinkUpAdminRightValue; 
}
// Activation of the checkbox "Est un compte administrateur"
$coala.Role_estAdministrateurCabinet_GRIS = function(obj, obj2, plugin) { 	
	if (isSuperAdmin)
		return false;
	else
		return hasLinkUpAdminRightValue; 
}
// Activation of the checkbox "Activer cette entité sur Sage LinkUp Experts :"
$coala.Role_estAdministrateurCabinetReference_GRIS = function(obj, obj2, plugin) { 	
	if (isSuperAdmin)
		return false;
	else
		return hasLinkUpAdminRightValue; 
}
// Activation of the checkbox "Activer le compte dans Sage LinkUp Experts"
$coala.Role_estAdministrateurPme_GRIS = function(obj, obj2, plugin) { 
	if (isSuperAdmin)
		return false;
	else
		return hasLinkUpAdminRightValue; 
}

// Role "Collaborateur Cabinet"
// Activation of the textfield "Poste occupé"
$coala.Role_fonctionLinkUp_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the combo "Droits Gestion" (tiroir Gestion)
$coala.Role_droitsGestion_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de début" (tiroir Gestion)
//$coala.Role_dateDebutGestion_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de fin" (tiroir Gestion)
//$coala.Role_dateFinGestion_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the combo "Droits Social" (tiroir Social)
$coala.Role_droitsSocial_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de début" (tiroir Social)
//$coala.Role_dateDebutSocial_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de fin" (tiroir Social)
//$coala.Role_dateFinSocial_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the combo "Droits Juridique" (tiroir Juridique)
$coala.Role_droitsJuridique_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de début" (tiroir Juridique)
//$coala.Role_dateDebutJuridique_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }
// Activation of the date field "Date de fin" (tiroir Juridique)
//$coala.Role_dateFinJuridique_GRIS = function(obj, obj2, plugin) { return hasLinkUpAdminRightValue; }

$coala.Role_estDossierActiveComptaCollaborative_GRIS = function(obj, obj2, plugin) { return false;}

// Activation of the checkbox "Activer la Compta Collaborative :"


// ######################## //
// ### _MODiF FUNCTiONS ### //
// ######################## //

// XB 20/09/2013
// Triggered when Email is modified ('email' property)
$coala.Personne_email_MODIF=function(obj,callbackError,callbackSuccess, plugin) {
	var msg, orgSiren, oldEmail, result;
	var status = true;
	var mustSuccess = true; 
	var newEmail = obj.email;
	var funcOnbeforeunload = window.onbeforeunload;
	// CASE 1 : Personne has role type 'Collaborateur'
	var role = GetAssociatedRole(obj._id, usernameFromUrl, pwFromUrl, 'Collaborateur');
	
	// VALiDATION 1 : Check if role is correclty built
	if (!role.status) {
		callbackError.call(plugin);
		status = false;
		mustSuccess = false;
		msg = "L'objet rôle est incomplet, la modification de l'email est impossible. <br/>";
		if (role.error != null) msg += role.error;
		$("#div_dialogAlert").failDialog(errorTitle, msg)
	}

	if (status) {
		//VALIDATION 2 : Validate that the new Email is not already used 
		if (status) {
			
			var lstCollaboratorByEmail = GetObjetMongoListCollaboratorByEmail(newEmail, usernameFromUrl, pwFromUrl);
		
			for (var i=0;i<lstCollaboratorByEmail.length;i++)		
			{
				var currentCol = lstCollaboratorByEmail[i];
				if(currentCol._id === obj._id){
					continue;
				}
					
				var roleObject = GetObjetMongoRoleFromPersonneId(currentCol._id, usernameFromUrl, pwFromUrl);

				if(roleObject !== null && roleObject.estCollaborateurCabinet){
					callbackError.call(plugin);
					status = false;	
					$("#div_dialogAlert").failDialog(errorTitle, "Le collaborateur "+currentCol.fullName+" utilise déjà cet Email.");
				}
			}
		}
	}
	
	if (mustSuccess) {
		if ((role != null && role.data != null && role.data.estCollaborateurCabinet) || (obj.cloudId != null && obj.cloudId !== undefined && obj.cloudId != '') || (obj.sageId != null && obj.sageId !== undefined && obj.sageId != ''))
		{
			var msg;
			var url = "<a href='#' color=blue onClick=\"window.open('https://sagegenerationexperts.online-help.sage.fr/modifier-mon-adresse-e-mail-sage-id/', '_blank')\">procédure</a>";
			if (obj.codeCollaborateur===urlParams["codeCollabo"])
			{
				//SI collaborateur courant egal au contact en cours de modification 
				msg = "Pour modifier votre email, utiliser le menu Paramètres / Mon compte… / Mon compte SageID / Gérer mon compte SageID, suivant la "+url+".";
				$("#div_dialogWarning").warningDialog("Information", msg, 600);
				callbackError.call(plugin);
			}
			else
			{
				//SI collaborateur courant ne correspond pas au contact en cours de modification 
				msg = "Seul le collaborateur peut modifier son email en suivant la "+url+".";
				$("#div_dialogWarning").warningDialog("Information", msg, 600);
				callbackError.call(plugin);
			}
		}
	}
	
	callbackSuccess.call(plugin);
}

// LLG 28/05/2013
// When Siren is modified
// Modified IsValidSiren
$coala.Personne_siren_MODIF=function(obj,callbackError,callbackSuccess, plugin) {
	var status = true;
	var msg;
	var resultRead, resultUpdate;
	var siren;
	var organization = {};
	var operatingCompany = {};
	var role = GetAssociatedRole(obj._id, usernameFromUrl, pwFromUrl);
	// VALiDATIONS
	// Validate that our role object is correct
	if (!role.status || role.data == null) {
		//LLG LE 25/03/15 DEJA GERE PAR LE PLUGIN
		//msg = "L'objet rôle est incomplet, la modification du Siren est impossible.";
		status = false;
		//$("#div_dialogAlert").failDialog(errorTitle, msg)
		//LLG LE 25/03/15 DEJA GERE PAR LE PLUGIN
		callbackError.call(plugin);
	}
	// Validate that our organization is activated on LinkUp
	if (status && role.data.estCabinetActiveLinkUp) {
		siren = getSirenExtended(role.data);
		resultRead = readOrganization(siren, usernameFromUrl, pwFromUrl, 0); // Get our organization
		// Validate that our organization exists on LinkUp
		if (!resultRead.status) {
			$("#div_dialogAlert").failDialog(errorTitle, resultRead.error)
			callbackError.call(plugin);			
		} else {
			organization.personne = $.extend({}, obj); // Contains our organization object to update
			organization.estCabinetActiveLinkUp = true;
			msg = "Attention, vous voulez modifier le SIREN de cette entité de " + siren + " à " + obj.siren + ", or cette entité est synchronisée avec SAGE LinkUp Experts" +
				"<br/> <br/> Nous vous informons que cette modification sera répercutée dans la synchronisation avec SAGE LinkUp Experts. Vos paramétrages collaborateurs et dossiers seront conservés." +
				"<br/> <br/> Souhaitez-vous continuer et modifier ce SIREN ?";	
			if ($("#div_changeSiren").length > 0) { // Check if our <div> element exists
				$("#div_changeSiren div.warning").html(msg);
				$("#div_changeSiren").dialog({
					height: 250,
					width: 550,
					modal: true,
					closeOnEscape: false,
					buttons: {
						"Oui": function() {
							if (!$.isValidSiren(obj.siren, false, null)) { // Invalid SIREN
								msg = "Le SIREN " + obj.siren + " est incorrect, veuillez vérifier l'exactitude des informations" +
									"<br/> Un SIREN valide est nécessaire à la synchronisation.";		
								callbackError.call(plugin);		
								$(this).dialog("destroy");
								$("#div_dialogAlert").failDialog(errorTitle, msg);
							} else {
								resultUpdate = updateOrganization(organization, siren, usernameFromUrl, pwFromUrl); // Update our organization
								if (resultUpdate.status) {
									callbackSuccess.call(plugin);	
									$(this).dialog("destroy");
									$('#linkupReturn').show().removeClass().addClass("success").html("SIREN mis à jour dans LinkUp !").delay(1500).fadeOut(500);
								} else {
									callbackError.call(plugin);
									$(this).dialog("destroy");
									$("#div_dialogAlert").failDialog(errorTitle, resultUpdate.error)
								}
							}
						},
						"Non": function() {
							callbackError.call(plugin);
							$(this).dialog("destroy");
							msg = "La modification du SIREN est impossible." +
								"<br/> Si vous voulez modifier votre SIREN sans le synchroniser avec LinkUp, veuillez désactiver votre entité sur LinkUp via l'onglet \"Relation clients\" puis modifier le SIREN.";
							$("#div_dialogWarning").failDialog(errorTitle, msg);
						}
					},
					close: function() {
						callbackError.call(plugin);			
					}
				});
			} else {
				callbackError.call(plugin);		
			}
		}
	} 
	else {
			callbackSuccess.call(plugin);
	}
}

// XB 24/01/2013
// Méthode de validation d'une entité avant synchronisation unidirectionnelle vers LinkUp
// Paramètres :
// - currentOrganization est l'entité courante dans MongoDB
// - pluginOrganization est l'entité courante au niveau du plugin lorsque la fonction _MODIF est appelée
function ValidateOrganizationUpdate(currentOrganization, pluginOrganization, username, pw) {
	var result = {
		status: false
	}
	// VALIDATION 1, vérifier que l'objet récupéré dans MongoDB n'est pas null et qu'il a une personne
	if (currentOrganization == null || currentOrganization.personne == null) {
		result.error = "L'entité courante n'a pas été trouvée dans la base MongoDB (valeur à NULL).";
		return result;
	}
	// VALiDATION 2, vérifier que la raison sociale de l'entité n'est ni indéfinie ni la chaîne vide
	var orgPersonne = currentOrganization.personne;
	if (!orgPersonne.raisonSociale) {
		result.error = "Veuillez indiquer une raison sociale sur votre entité.";
		return result;		
	}
	// VALIDATION 3, vérifier que le SIREN de l'entité n'est ni indéfini ni la chaîne vide
	if (!orgPersonne.siren) {
		result.error = "Veuillez indiquer un SIREN pour le cabinet courant (" + currentOrganization.personne.fullName + ").";
		return result;
	}
	// VALIDATION 4, vérifier que le SIREN de l'entité est valide
	var orgSiren = orgPersonne.siren;
	if (!$.isValidSiren(orgSiren, false, null)) {
		result.error = "Le SIREN " + orgSiren + " est invalide.";
		return result;
	}
	// VALIDATION 5, vérifier qu'il n'y a 0 ou 1 entité activée (dans ce dernier cas, vérifier que celle qui est activée est celle sur laquelle nous travaillons)
	var listActivatedOrganizations = GetListActivatedOrganizations(username, pw);
	if (!listActivatedOrganizations.status) { // Erreur lors de la récupération de la liste des entités
		result.error = listActivatedOrganizations.error;
		return result;
	}
	var nbActivatedOrganizations = listActivatedOrganizations.data.length;
	if (nbActivatedOrganizations == 1) { // Véfifier que l'entité activée est bien celle sur laquelle nous sommes
		var currentActivatedOrganizationPersonne = listActivatedOrganizations.data[0].personne;
		if (currentActivatedOrganizationPersonne == null) {
			result.error = "Une erreur s'est produite lors de la lecture de l'objet 'personne' du cabinet déjà activé.";
			return result;
		} else if (orgPersonne._id != currentActivatedOrganizationPersonne._id) { // Validate if no organization has been activated
			result.error = "Un cabinet a déjà été activé.<br/>" +
				"Nom du cabinet : " + currentActivatedOrganizationPersonne.fullName + "<br\>" +
				"SIREN : " + currentActivatedOrganizationPersonne.siren;
			return result;
		}
	} else if (nbActivatedOrganizations > 1) {
		result.error = "Un nombre trop important de cabinets sont actuellement activés (" + nbActivatedOrganizations + ").";
		return result;
	}
	// OK
	result.status = true;
	result.orgSiren = orgSiren;
	return result;	
}

// XB 03/10/2013
// Activation of an organization
$coala.Role_estCabinetActiveLinkUp_MODIF=function(obj, callbackError, callbackSuccess, plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	// Get credentials for Ajax Calls
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var status = true;
	var msg;
	$('#linkupReturn').show().removeClass().addClass("processing").html("Traitement en cours...");
	// Getting our organization
	var currentOrganization = GetObjetMongoCourant(obj._id, username, pw);
	currentOrganization.estCabinetActiveLinkUp = obj.estCabinetActiveLinkUp; // Set the desired value on currentOrganization
	// Validate our organization
	var validatedOrganization = ValidateOrganizationUpdate(currentOrganization, obj, username, pw);
	if (!validatedOrganization.status) { // Invalid organization
		status = false;	
		msg = validatedOrganization.error;	
	}
	// Processing our organization's activation on Link Up
	if (status)	{
		alert("Pour activer l'entité courante, vous devez passer par le traitement 'Traitements -> Connecteur GE -> Sage LinkUp Experts -> Assistant de démarrage de Sage LinkUp Experts'");
		/* Validate an organization only with the wizzard
		
		var resultUpdate = updateOrganization(currentOrganization, validatedOrganization.orgSiren, username, pw, 0);
		if (!resultUpdate.status) { // Success
			status = false;	
			msg = resultUpdate.error;
		}*/
	}
	if (status) { // SUCCESS
		callbackError.call(plugin);	
		$('#linkupReturn').removeClass().addClass("success").html("Sauvegarde réussie !").delay(1500).fadeOut(500);
	} else { // ERROR
		callbackError.call(plugin);
		$('#linkupReturn').removeClass().html("");
		$("#div_dialogAlert").failDialog(errorTitle, msg);
	}
}

// UPDATOR XB 28/02/14
// Activer un dossier sur LinkUp (case à cocher)
$coala.Role_estDossierActiveLinkUp_MODIF=function(obj,callbackError,callbackSuccess,plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	// Get credentials for Ajax Calls
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var msg;
	var resultRead, resultUpdate, resultCreate, resultUnsubscribe;
	var estDossierActive = obj.estDossierActiveLinkUp;
	
	// Get our operating company
	var dossierCourant = GetObjetMongoCourant(obj._id, username, pw);
	var personneCourante = dossierCourant.personne;
	
	// VALiDATIONS
	// VALiDATE that our operating company is not null
	if (dossierCourant == null || personneCourante == null) {
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, "Le dossier n'a pas pu être récupéré dans MongoDB (valeur à NULL).");
		callbackError.call(plugin);
		return false;
	}
	
	// VALiDATE Siren
	// Get operating company's siren
	var sirenCourant = dossierCourant.personne.siren;
	// No Siren for our company
	if (sirenCourant == null || sirenCourant == '') {
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, "Veuillez indiquer un SIREN pour ce dossier.");
		callbackError.call(plugin);
		return false;
	}
	
	// Récupérer tous les dossiers activés LinkUp dans MongoDB
	var listDossiers = GetDossiersActives(username, pw);
	if (!listDossiers.status) {
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, listDossiers.error);
		callbackError.call(plugin);
		return false;
	}
	var msgFct = "estDossierActiveLinkUp_MODIF";

	// VALiDATE estDossierActiveLinkUp, we cannot disable an operating company on LinkUp
	if (!estDossierActive) {
		resultRead = readOperatingCompany(sirenCourant, username, pw, msgFct); // Does our company exist on Link Up ? (GET request)
		if (resultRead.status == false) { // 404, our company with siren = sirenCourant does not exists
			// Special case, our company is "Linkup activated" in MongoDB BUT doesn't exist in LinkUp
			// There is a problem, we must disable our company in MongoDB
			callbackSuccess.call(plugin);
			return true;
		} else {
			
			var dialogTitle = "Désabonnement d'un dossier Sage LinkUp Experts";
			var dialogMessage = "Confirmez-vous le désabonnement de ce dossier Sage LinkUp Experts ?\n\n" + 
					"Ce dossier ne sera plus visible depuis le site Sage LinkUp Experts.\n\n"+
					"Les contrats (Bankin, SOP, Sage production sociale et compta collaborative, ...) qui sont associés seront également désactivés.";
			if (confirm(dialogMessage, dialogTitle)){
					resultUnsubscribe = unsubscribeOperatingCompany(obj, sirenCourant, username, pw, msgFct);
					if (resultUnsubscribe.status == false)
					{
						$("#div_dialogAlert").failDialog(errorTitle, resultUnsubscribe.error);
						callbackError.call(plugin);						
						return false;
					}
					else
					{
						var successMsg;
						successMsg = "Votre dossier n'est plus activé sur Sage LinkUp Experts.";
						$("#div_dialogSuccess").successDialog(successTitle, successMsg);
						callbackSuccess.call(plugin);
						return true;
					}
				}
				else{
					callbackError.call(plugin);						
					return false;
				}
		}
	}		
	// M308412 Vérifier qu'aucun dossier avec le même SIREN n'a été activé dans LinkUp
	var i = 0;
	var personneDossier;
	while (i < listDossiers.data.length) {
		personneDossier = listDossiers.data[i].personne;
		if (personneDossier != null && personneDossier.siren == sirenCourant && personneDossier._id != dossierCourant.personne._id) {
			$("#div_dialogAlert").failDialog(dialogModule.errorTitle, 'Le dossier "' + personneDossier.fullName + '" est déjà activé dans Sage LinkUp Experts avec ce SIREN.');
			callbackError.call(plugin);	
			return false;
		}
		i += 1;
	}
	
	// Récupérer toutes les entités activées sur LinkUp
	var listOrganizations = GetListActivatedOrganizations(username, pw);
	if (!listOrganizations.status) { // Erreur lors de la récupération de la liste des entités
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, listOrganizations.error);
		callbackError.call(plugin);
		return false;
	}
	var nbOrganizations = listOrganizations.data.length;
	if (nbOrganizations == 1) {
		var personneOrganization = listOrganizations.data[0].personne;
		if (personneOrganization == null || personneOrganization.siren == null || personneOrganization.siren == "") {
			$("#div_dialogAlert").failDialog(dialogModule.errorTitle, "Le SIREN de l'entité activée sur LinkUp n'est pas renseigné.");
			callbackError.call(plugin);
			return false;				
		} else {
			var sirenOrganization = personneOrganization.siren;
			if (listOrganizations.data[0].idEtablissementLinkUp != null)
				sirenOrganization += '-'+listOrganizations.data[0].idEtablissementLinkUp;
		}
	} else {
		if (nbOrganizations == 0) {
			msg = "Aucune entité n'est activé sur LinkUp.";
		} else {
			msg = "Un nombre anormal (" + nbOrganizations + ") d'entités sont activées sur LinkUp."; 
		}
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, msg);
		callbackError.call(plugin);
		return false;		
	}

	if (!$.isValidSiren(sirenCourant, true, sirenOrganization)) {
		$("#div_dialogAlert").failDialog(errorTitle, "Le Siren " + sirenCourant + " est invalide.");
		callbackError.call(plugin);
		return false;
	}

	// Add the organization Siren to our operating company object
	dossierCourant.SirenCabinet = sirenOrganization;	
	// GET du dossier
	resultRead = readOperatingCompany(sirenCourant, username, pw, msgFct);
	if (typeof resultRead.status === "undefined") {
		$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
		callbackError.call(plugin);
		return false;
	} else if (!resultRead.status) {
		$("#div_addContract").dialog({
			height: 250,
			width: 550,
			modal: true,
			closeOnEscape: false,
			buttons: {
				"OK": function() {
					try {	
						var begin = $("#beginDateAbt").val();
						var beginDate = new Date(begin.substring(6,10), parseInt(begin.substring(3,5), 10) - 1, begin.substring(0,2), 12);
						var end = $("#endDateAbt").val();
						var endDate = new Date(end.substring(6,10), parseInt(end.substring(3,5), 10) - 1, end.substring(0,2), 12);
						var type = "ADVANCED";
						var capa = $("#capacity").val();
						if (begin=="" || end=="" || type=="" || beginDate == null || endDate == null || capa =="") {
							$("#span_addContractError").html("Veuillez renseigner tous les champs.").show();
						} else if (!$.isValidDate(begin)) {
							$("#span_addContractError").html("La date de début d'abonnement est incorrecte.").show();
						} else if (!$.isValidDate(end)) {
							$("#span_addContractError").html("La date de fin d'abonnement est incorrecte.").show();
						} else if (beginDate > endDate) {
							$("#span_addContractError").html("La date de début d'abonnement doit être antérieure à la date de fin d'abonnement.").show();
						} else if (parseInt(capa) > 3 && parseInt(capa) < 1) {
							$("#span_addContractError").html("La capacité de stockage en Go doit être compris entre 1 et 3.").show();
						} else {
							dossierCourant["Contract"] = {
								"BeginDate": beginDate,
								"EndDate": endDate,
								"Type": type,
								"QuotaGio":capa
							};
							$("#div_addContract").dialog("close");
							/*Ajout des Conditions Tarifaires*/
							$("#div_ctlu").dialog({
								height: 250,
								width: 550,
								modal: true,
								closeOnEscape: false,
								buttons: {
									"OK": function() {
										// C'est OK, nous pouvons passer la propriété à true
										 obj.estDossierActiveLinkUp = true;
										// On poste
										resultCreate = createOperatingCompany(dossierCourant.SirenCabinet, dossierCourant, username, pw);
										if (!resultCreate.status) {
											$("#div_dialogAlert").failDialog(errorTitle, resultCreate.error);
											obj.estDossierActiveLinkUp = false;
											$("#div_ctlu").dialog("close");	
											return;
										} else {
											obj["dateDebutContratLinkUp"] = begin;
											obj["dateFinContratLinkUp"] = end;
											obj["typeContrat"] = type;
											obj["quotaContrat"] = capa;
											callbackSuccess.call(plugin);
											$("#div_ctlu").dialog("close");
											return true;
										}											
									},
									"Annuler": function() {
										$("#div_ctlu").dialog("close");
									}								
								},
								open: function() {
									$("#span_addContractError").hide();		
								},
								close: function() {
									callbackError.call(plugin);
									return false;				
								}
							});
						}
					}
					catch (exception) {
						msg = "Une erreur s'est produite lors de l'activation du dossier" + 
							"<br/> Détail de l'erreur : " + exception;
						$("#div_dialogAlert").failDialog(dialogModule.errorTitle, msg);
						$("#div_addContract").dialog("close");
						$("#div_ctlu").dialog("close");
						callbackError.call(plugin);
						return false;
					}
				},
				"Annuler": function() {
					$("#div_addContract").dialog("close");
				}
			},
			open: function() {
				$("#span_addContractError").hide();		
			},
			close: function() {
				callbackError.call(plugin);
				return false;				
			}
		});		
		
	} else {
		// PUT request
		// UPDATE - Our operating company is not activated in MongoDB, but exists on LinkUp
		resultUpdate = updateOperatingCompany(dossierCourant, resultRead.data, username, pw);
		if (!resultUpdate.status) {
			$("#div_dialogAlert").failDialog(errorTitle, resultUpdate.error);	
			callbackError.call(plugin);
			return false;
		} else {
			callbackSuccess.call(plugin);
			return true;
		}
	}
	
}


$coala.Role_estDossierActiveComptaCollaborative_MODIF=function(obj,callbackError,callbackSuccess,plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var resultRead, resultUpdate;
	var estDossierActiveComptaCollaborative = obj.estDossierActiveComptaCollaborative;
	var dossierCourant = GetObjetMongoCourant(obj._id, username, pw);
	var sirenCourant = dossierCourant.personne.siren;
	var aGe = false;
	var msgFct = "estDossierActiveComptaCollaborative_MODIF";

	var estDossierActive = obj.estDossierActiveLinkUp;

	if (!estDossierActive)
	{
		msg = "Vous devez activer Sage LinkUp Experts avant de pouvoir activer la Compta Collaborative sur ce dossier.";
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, msg);
		obj.estDossierActiveComptaCollaborative = false;
		callbackSuccess.call(plugin);
		return false;
	}
	
	resultRead = readOperatingCompany(sirenCourant, username, pw, msgFct);

	if ("aGE" in urlParams)	
		aGe = (urlParams["aGE"]=="true");
	
	if (!aGe)
	{
		msg = "Ce traitement est disponible uniquement si vous avez la clé Génération Experts.";
		$("#div_dialogAlert").failDialog(dialogModule.errorTitle, msg);
		callbackError.call(plugin);
		return false;
	}

	if (typeof resultRead.status === "undefined") {
		$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
		callbackError.call(plugin);
		return false;
	} else  
	{ 
		if (estDossierActiveComptaCollaborative) 
		{
			// Ajout des Conditions Tarifaires
			$("#div_comptacollablu").dialog({
				height: 250,
				width: 550,
				modal: true,
				closeOnEscape: false,
				buttons: 
				{
					"Oui": function() 
					{	// Activation de la compta collaborative
						resultUpdate = enableCollaborativeAccounting(sirenCourant, dossierCourant, estDossierActiveComptaCollaborative, username, pw);
						if (!resultUpdate.status) 
						{
							$("#div_dialogAlert").failDialog(errorTitle, resultUpdate.error);	
							callbackError.call(plugin);
							return false;
						} else
						{
							callbackSuccess.call(plugin);
							$("#div_comptacollablu").dialog("close");
							return true;
						}										
					},
					"Non": function() 
					{
						$("#div_comptacollablu").dialog("close");
					}								
				},
				close: function() {
					callbackError.call(plugin);
					return false;				
				}
			});	
		} else  
		{	// Désactivation de la compta collaborative
			resultUpdate = enableCollaborativeAccounting(sirenCourant, dossierCourant, estDossierActiveComptaCollaborative, username, pw);
			if (!resultUpdate.status) 
			{
				$("#div_dialogAlert").failDialog(errorTitle, resultUpdate.error);	
				callbackError.call(plugin);
				return false;
			} else
			{
				callbackSuccess.call(plugin);
				return true;
			}		
		}		
	}	
}

// XB 27/09/2013
// Activation of an operatingCompanie's administrator account on LinkUp
$coala.Role_estAdministrateurPme_MODIF=function(obj,callbackError,callbackSuccess, plugin)
{
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	var status = true;
	var mode = urlParams.mode;
	if (mode == "create") {
		msg = 'Vous êtes en mode "Création".' +
			'<br/> L\'activation de l\'administrateur PME pourra se faire une fois que vous aurez cliqué sur le bouton "Terminer".';
		$("#div_dialogWarning").warningDialog(warningTitle, msg);
		status = false;	
		callbackError.call(plugin);
	}
	
	if (status === true) {
		// Get credentials for Ajax Calls
		var username = urlParams["codeCollabo"];
		var pw = urlParams["mdpCollabo"];
		// Si la coche s'active, il faut vérifier qu'il y ait un seul collaborateur pour cet email...Si c'est lui meme on propose un PUT
		// Si la coche se déactive, il faut mettre en sommeil le collaborateur
		var nbCab = 0;
		var lstCabs;
		var colCourant;
		var sirenCabRatta;
		var emailCourant;
		var msg;
		var resultRead, resultCreateOrUpdate;
		
		// Getting our collaborator
		colCourant = GetObjetMongoCourant(obj._id, username, pw);
		// --- VALiDATIONS -- //
		if (colCourant == null) {
			status = false;
			callbackError.call(plugin);
		} else {
			// Vu que le colCourant est recalculé par mongo , la valeur modifiee au niveau du plugin n'est pas mise à jour
			colCourant.estAdministrateurPme = obj.estAdministrateurPme;
		}
		// Getting our collaborator's email
		if (status && colCourant != null && colCourant.personne.email != null) {
			emailCourant = colCourant.personne.email;
		}
		// Our collaborator's email is NULL or empty
		if (status && (emailCourant==null || emailCourant == '')) {
			msg = "Veuillez indiquer un email pour l'administrateur courant (" + colCourant.personne.fullName + ").";
			$("#div_dialogAlert").failDialog(errorTitle, msg);
			status = false;
			callbackError.call(plugin);
		}
		// Our collaborator's name is NULL or empty		
		if (status && (colCourant.personne.lastName==null || colCourant.personne.lastName == '')) {
			msg = "Veuillez indiquer un nom pour l'administrateur courant (" + colCourant.personne.fullName + ").";
			$("#div_dialogAlert").failDialog(errorTitle, msg);
			status = false;
			callbackError.call(plugin);
		}	
		// Our collaborator's first name is NULL or empty		
		if (status && (colCourant.personne.firstName==null || colCourant.personne.firstName == '')) {
			msg = "Veuillez indiquer un prénom pour l'administrateur courant (" + colCourant.personne.fullName + ").";
			$("#div_dialogAlert").failDialog(errorTitle, msg);
			status = false;
			callbackError.call(plugin);
		}	
		// Getting activated organizations
		if (status) {
			lstCabs = GetLstCabinetsActives(username, pw); // AJAX Call
			if (lstCabs != null) {
				// Récupérer dans nbCab le nombre de cabinets activés et dans sirenCabRatta le Siren du dernier cabinet activé
				// Normalement, 1 seul cabinet activé
				$.each(lstCabs, function(i, item){
					nbCab++;
					sirenCabRatta = getSirenExtended(item);
				});
			}
			if (nbCab == 0) { // No organization activated on LinkUp
				msg = "Aucune entité n'est actuellement activée sur LinkUp. <br/> Veuillez activer une entité avant d'activer le compte de votre collaborateur.";
				$("#div_dialogAlert").failDialog(errorTitle, msg);
				status = false;
				callbackError.call(plugin);			
			} else if (nbCab > 1) { // More than one organization is activated on LinkUp
				msg = "Un nombre trop important de cabinets sont actuellement activés (" + nbCab + ").";
				$("#div_dialogAlert").failDialog(errorTitle, msg);
				status = false;
				callbackError.call(plugin);
			} else if (nbCab == 1) { // One organization activated on GE, we check that it is activated in the LinkUp Database
				var resultRead = readOrganization(sirenCabRatta, username, pw);
				if (resultRead.status) {
					if (resultRead.data.isDeleted == "1") { // Organization found but marked as "deleted"
						msg = "L'entité est inactive sur LinkUp. Veuillez la désactiver puis la réactiver à nouveau.";
						$("#div_dialogAlert").failDialog(errorTitle, msg);
						status = false;
						callbackError.call(plugin);	
					}
				} else { // No organization found for given Siren
					$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
					status = false;
					callbackError.call(plugin);				
				}
			}
		}
		// --- PROCESSiNG OUR COLLABORATOR ACTIVATiON ON LiNKUP --- //
		if (status) { // Get our collaborator on LinkUp (does it exist ?)
			$('#linkupReturn').show().removeClass().addClass("processing").html("Traitement en cours...");
			var idEtablissement = colCourant.idEtablissement;
			var sirenDosRatta = readSirenOfAnOperatingCompany(idEtablissement, username, pw);
			resultRead = readAdministratorOfAnOperatingCompany(sirenDosRatta, emailCourant, username, pw); // Get our administrator	
			if (typeof resultRead.status === "undefined") {
				$('#linkupReturn').removeClass().html("");
				$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
				status = false;
				callbackError.call(plugin);			
			} else {
				if (!resultRead.status) { // CREATE
					resultCreateOrUpdate = createAdministratorOfAnOperatingCompany(sirenDosRatta, colCourant, username, pw);
					// Update status and error message
					status = resultCreateOrUpdate.status;
					if (!status) msg = resultCreateOrUpdate.error
				} else { // UPDATE
					//status = false;
					//msg = "La modification d'un administrateur PME est impossible actuellement.";
					
					//resultCreateOrUpdate = updateAdministratorOfAnOperatingCompany(sirenDosRatta, $.extend({}, colCourant), resultRead.data, username, pw);
					resultCreateOrUpdate = updateAdministratorOfAnOperatingCompany(sirenDosRatta, $.extend({}, colCourant), resultRead.data, username, pw);
					// Update status and error message
					status = resultCreateOrUpdate.status;
					if (!status) msg = resultCreateOrUpdate.error

				}
				if (status) { // Success
					$('#linkupReturn').removeClass().addClass("success")
						.html("Sauvegarde réussie !")
						.delay(1500)
						.fadeOut(500);
					callbackSuccess.call(plugin);				
				} else { // Failure
					$('#linkupReturn').removeClass().html("");
					$("#div_dialogAlert").failDialog(errorTitle, msg);
					callbackError.call(plugin);			
				}
			}		
		}
	}
}

// XB 05/11/2013
// Méthode de validation d'un collaborateur avant synchronisation unidirectionnelle vers LinkUp
// Paramètres :
// - currentCollaborator est l'entité courante dans MongoDB
// - pluginCollaborator est l'entité courante au niveau du plugin lorsque la fonction _MODIF est appelée
function ValidateCollaboratorUpdate(currentCollaborator, pluginCollaborator, username, pw) {
	var result = {
		status: false
	}
	// VALIDATION 1, vérifier que l'objet récupéré dans MongoDB n'est pas null et qu'il a une personne
	if (currentCollaborator == null || currentCollaborator.personne == null) {
		result.error = "Le collaborateur courant n'a pas été trouvé dans la base MongoDB (valeur à NULL).";
		return result;
	}
	// VALiDATION 2, vérifier que l'email du collaborateur n'est ni indéfinie ni la chaîne vide
	var colPersonne = currentCollaborator.personne;
	if (!colPersonne.email) {
		result.error = "Veuillez indiquer une adresse e-mail sur votre collaborateur.";
		return result;		
	}
	// VALiDATION 3, vérifier que le nom du collaborateur n'est ni indéfini ni la chaîne vide
	if (!colPersonne.lastName) {
		result.error = "Veuillez indiquer un nom sur votre collaborateur.";
		return result;		
	}
	// VALiDATION 4, vérifier que le prénom du collaborateur n'est ni indéfini ni la chaîne vide
	if (!colPersonne.firstName) {
		result.error = "Veuillez indiquer un prénom sur votre collaborateur.";
		return result;		
	}	
	// VALIDATION 5, vérifier que l'utilisateur n'est pas le seul administrateur (si oui, annuler le traitement)
	if (pluginCollaborator.estCollaborateurCabinet === false || pluginCollaborator.estAdministrateurCabinet === false) {
		var listAdministrators = GetLinkUpAdministrators(username, pw);
		if (!listAdministrators.status) {
			result.error = listAdministrators.error;
			return result; 	
		} else {
			if (listAdministrators.data.length == 1 && listAdministrators.data[0]._id.toUpperCase() == currentCollaborator._id.toUpperCase()) {
				result.error = "Il est impossible de désactiver ce collaborateur car il est nécessaire d'avoir au moins un compte administrateur activé sur "+applicationName+"."
				return result; 						
			}
		}
	}	
	// VALIDATION 6, vérifier qu'il y a une eu une seule entité activée
	var listActivatedOrganizations = GetListActivatedOrganizations(username, pw);
	if (!listActivatedOrganizations.status) { // Erreur lors de la récupération de la liste des entités
		result.error = listActivatedOrganizations.error;
		return result;
	}
	var nbActivatedOrganizations = listActivatedOrganizations.data.length;
	if (nbActivatedOrganizations < 1) { // Aucune entité activée
		result.error = "Aucune entité n'est actuellement activée sur LinkUp. <br/> Veuillez activer une entité avant d'activer le compte de votre collaborateur.";
		return result;
	} else if (nbActivatedOrganizations > 1) { // Plus d'une entité activée
		result.error = "Un nombre trop important de cabinets sont actuellement activés (" + nbActivatedOrganizations + ").";
		return result;		
	} else {
		// Récupération du SIREN
		var currentActivatedOrganizationPersonne = listActivatedOrganizations.data[0].personne;
		if (currentActivatedOrganizationPersonne == null) {
			result.error = "Une erreur s'est produite lors de la lecture de l'objet 'personne' du cabinet déjà activé.";
			return result;
		} else {
			result.orgSiren = currentActivatedOrganizationPersonne.siren;
			if (listActivatedOrganizations.data[0].idEtablissementLinkUp!=null)
				result.orgSiren += '-'+listActivatedOrganizations.data[0].idEtablissementLinkUp;
		}		
	}
	// OK
	result.status = true;
	result.colEmail = colPersonne.email;
	return result;	
}

// XB 05/11/2013
// Activation d'un compte Sage LinkUp Experts
$coala.Role_estCollaborateurCabinet_MODIF = function(obj, callbackError, callbackSuccess, plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	// Si la coche s'active, il faut vérifier qu'il y ait un seul collaborateur pour cet email...Si c'est lui meme on propose un PUT
	// Si la coche se déactive, il faut mettre en sommeil le collaborateur
	// Get credentials for Ajax Calls
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var status = true;
	var msg, dialogMessage, dialogTitle;
	var resultRead, resultCreateOrUpdate;
	var orgSiren, colEmail;
	var funcOnbeforeunload = window.onbeforeunload;
	

	// Récupération du collaborateur dans MongoDB
	var currentCollaborator = GetObjetMongoCourant(obj._id, username, pw);
	if (currentCollaborator == null) {
		callbackError.call(plugin);
		status = false;
		$("#div_dialogAlert").failDialog(errorTitle, "Le collaborateur n'a pas été trouvé dans la base de données (MongoDB).");
	} else {
		if(currentCollaborator.personne.email != null)
		{
			var lstCollaboratorByEmail = GetObjetMongoListCollaboratorByEmail(currentCollaborator.personne.email, username, pw);
			
			for (var i=0;i<lstCollaboratorByEmail.length;i++)		
			{
				var currentCol = lstCollaboratorByEmail[i];
				if(currentCol._id === currentCollaborator.personne._id){
					continue;
				}
					
				var roleObject = GetObjetMongoRoleFromPersonneId(currentCol._id, username, pw);
				if(roleObject !== null && roleObject.estCollaborateurCabinet){
					callbackError.call(plugin);
					status = false;	
					$("#div_dialogAlert").failDialog(errorTitle, "Le collaborateur "+currentCol.fullName+" utilise déjà cet Email.");
				}
			}
		}
		
		currentCollaborator.estCollaborateurCabinet = obj.estCollaborateurCabinet; // Set the desired value on currentCollaborator
	}
	// Validate our collaborator
	if (status) {
		var validatedCollaborator = ValidateCollaboratorUpdate(currentCollaborator, obj, username, pw);
		if (!validatedCollaborator.status) { // Invalid collaborator
			callbackError.call(plugin);
			status = false;	
			$("#div_dialogAlert").failDialog(errorTitle, validatedCollaborator.error);
		} else {
			orgSiren = validatedCollaborator.orgSiren;
			colEmail = validatedCollaborator.colEmail;
		}
	}	
	if (status) {
		// Construction des messages spécifiques à l'activation ou à la désactivation
		if (obj.estCollaborateurCabinet === true) { // Activation
			dialogTitle = "Activation d'un compte "+applicationName;
			dialogMessage = "Vous allez créer un compte "+applicationName+" pour ce collaborateur.<br/><br/>" +
				"Si celui-ci ne dispose pas encore de Sage ID, il va recevoir un mail à cette adresse afin de finaliser la création et l'activation de son compte.<br/><br/>";
		} else { // Désactivation
			dialogTitle = "Désactivation d'un compte "+applicationName;
			dialogMessage = "Confirmez-vous la désactivation de ce compte "+applicationName+" ?<br/><br/>" + 
				"Ce collaborateur ne pourra plus se connecter au portail Web.";
		}
		// Ouverture de la boîte de dialogue pour l'activation
		$("#div_activateLinkUpUser").html(dialogMessage);
		$("#div_activateLinkUpUser").dialog({
			title: dialogTitle,
			height: 250,
			width: 500,
			modal: true,
			closeOnEscape: false,
			buttons: {
				"Continuer": function() {
					$(this).dialog("destroy");
					if (window.onbeforeunload != null) {
						window.onbeforeunload = funcOnbeforeunload;		
					}
					resultRead = readCollaboratorOfAnOrganization(orgSiren, colEmail, username, pw); // Get our collaborator
					if (resultRead && typeof resultRead.status === "undefined") {
						$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
						callbackError.call(plugin);					
					} else {
						if (!resultRead.status) { // CREATE
							resultCreateOrUpdate = createCollaboratorOfAnOrganization(orgSiren, currentCollaborator, username, pw);
							// Update status and error message
							status = resultCreateOrUpdate.status;
							if (status) { // Message confirmant la création du compte
								if (obj.estCollaborateurCabinet === true) {
									msg = "Le compte a bien été créé sur "+applicationName+".<br/></br>" + 
										"Le collaborateur va recevoir un e-mail à l'adresse " + colEmail + " pour procéder à l'activation de son compte.";
								} else {
									msg = "Le compte a bien été désactivé sur "+applicationName+".";
								}
							} else {
								msg = resultCreateOrUpdate.error;
							}
						} else { // UPDATE
							resultCreateOrUpdate = updateCollaboratorOfAnOrganization(orgSiren, $.extend({}, currentCollaborator), resultRead.data, false, true, username, pw);
							// Update status and error message
							status = resultCreateOrUpdate.status;		
							if (status) { // Message confirmant la mise à jour du compte
								if (obj.estCollaborateurCabinet === true) {
									msg = "Le compte a bien été réactivé sur "+applicationName+".";
								} else {
									msg = "Le compte a bien été désactivé sur "+applicationName+".";
								}
							} else {
								msg = resultCreateOrUpdate.error;
							}
						}
						if (status) { // Success
							// The administration right of our collaborator must be disactivated
							if (currentCollaborator.estAdministrateurCabinet) obj.estAdministrateurCabinet = false;
							obj.estAdministrateurCabinetReference = false; // The superadministrator right must be disactivated
							var result = unsetSageId(username, pw);
							if (!result.status) {
								$("#div_dialogAlert").failDialog(errorTitle, result.message);
							}
							$("#div_dialogSuccess").successDialog(successTitle, msg);
							callbackSuccess.call(plugin);				
						} else { // Failure
							$("#div_dialogAlert").failDialog(errorTitle, msg);
							callbackError.call(plugin);			
						}
					}
				},
				"Annuler": function() {
					$("#div_activateLinkUpUser").dialog("close");
				}								
			},
			close: function() {
				if (window.onbeforeunload != null) {
					window.onbeforeunload = funcOnbeforeunload;		
				}
				callbackError.call(plugin);			
			},
			open: function() {
				// To avoid collaborator to be saved if user closes the window whereas the dialog is still opened
				window.onbeforeunload = function(){ // Override onbeforeunload
				   callbackError.call(plugin);	
				}
			}			
		});
	}
}

// XB 03/10/2013
// Activation of an organization's administrator on LinkUp
$coala.Role_estAdministrateurCabinet_MODIF = function(obj, callbackError, callbackSuccess, plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	/*
	1) Si la coche s'active :
		1a) si le collaborateur existe dans LinkUp, il faut le mettre à jour (PUT) avec les droits administrateur
		1b) si le collaborateur n'existe pas dans LinkUp, il faut le créer (POST) avec les droits administrateur + cocher "Activer le compte"
	2) Sinon (si la coche se désactive), il faut mettre en sommeil le collaborateur (PUT) dans LinkUp + décocher "Activer le compte"
	*/
	// Get credentials for Ajax Calls
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var status = true;
	var currentCollaborator;
	var dialogMessage, dialogTitle;
	var msg;
	var resultRead;
	var orgSiren, colEmail;
	var funcOnbeforeunload = window.onbeforeunload;

	// Getting our collaborator
	var currentCollaborator = GetObjetMongoCourant(obj._id, username, pw);
	currentCollaborator.estAdministrateurCabinet = obj.estAdministrateurCabinet; // Set the desired value on currentCollaborator
	// Validate our collaborator
	var validatedCollaborator = ValidateCollaboratorUpdate(currentCollaborator, obj, username, pw);
	if (!validatedCollaborator.status) { // Invalid collaborator
		callbackError.call(plugin);
		status = false;	
		$("#div_dialogAlert").failDialog(errorTitle, validatedCollaborator.error);
	} else {
		orgSiren = validatedCollaborator.orgSiren;
		colEmail = validatedCollaborator.colEmail;
	}

	if (status) {
		// Construction des messages spécifiques à l'activation ou à la désactivation du rôle Administrateur
		if (obj.estAdministrateurCabinet === true) { // Activation du rôle Administrateur
			if (obj.estCollaborateurCabinet === true) { // Activation
				dialogTitle = "Ajout du rôle Administrateur";
				dialogMessage = "Confirmez-vous l'ajout du rôle Administrateur sur ce compte "+applicationName+" ?";
			} else {
				dialogTitle = "Activation d'un compte "+applicationName;
				dialogMessage = "Vous allez créer un compte "+applicationName+" pour ce collaborateur.<br/><br/>" +
					"Si celui-ci ne dispose pas encore de Sage ID, il va recevoir un mail à cette adresse afin de finaliser la création et l'activation de son compte.<br/><br/>";	
			}
		} else { // Suppression du rôle 'Administrateur'
			dialogTitle = "Suppression du rôle Administrateur";
			dialogMessage = "Confirmez-vous la suppression du rôle Administrateur sur de ce compte "+applicationName+" ?";
		}	
		// Ouverture de la boîte de dialogue d'activation
		$("#div_activateLinkUpUser").html(dialogMessage).dialog({
			title: dialogTitle,
			height: 250,
			width: 500,
			modal: true,
			closeOnEscape: false,
			buttons: {
				"Continuer": function() {
					$(this).dialog("destroy");
					if (window.onbeforeunload != null) {
						window.onbeforeunload = funcOnbeforeunload;		
					}
					resultRead = readCollaboratorOfAnOrganization(orgSiren, colEmail, username, pw); // Get our organization
					if (typeof resultRead.status === "undefined") {
						$("#div_dialogAlert").failDialog(errorTitle, resultRead.error);
						callbackError.call(plugin);					
					} else {
						if (!resultRead.status) { // CREATE
							resultCreateOrUpdate = createCollaboratorOfAnOrganization(orgSiren, currentCollaborator, username, pw);
							// Update status and error message
							status = resultCreateOrUpdate.status;
							if (status) { // Message confirmant la création du compte
								msg = "Le compte a bien été créé sur "+applicationName+".<br/></br>" + 
									"Le collaborateur va recevoir un e-mail à l'adresse " + colEmail + " pour procéder à l'activation de son compte.";
							} else {
								msg = resultCreateOrUpdate.error;
							}
						} else { // UPDATE
							resultCreateOrUpdate = updateCollaboratorOfAnOrganization(orgSiren, $.extend({}, currentCollaborator), resultRead.data, false, true, username, pw);
							// Update status and error message
							status = resultCreateOrUpdate.status;		
							if (status) { // Message confirmant la mise à jour du compte
								if (currentCollaborator.estCollaborateurCabinet === true) {
									msg = "Le compte a bien été mis à jour sur "+applicationName+".";
								} else {
									msg = "Le compte a bien été réactivé sur "+applicationName+".";
								}
							} else {
								msg = resultCreateOrUpdate.error;
							}
						}
						if (status) { // Success
							// The administration right of our collaborator must be disactivated
							if (!currentCollaborator.estCollaborateurCabinet) obj.estCollaborateurCabinet = true; // Force estCollaborateurCabinet to true (a collaborator cannot be LU administrator and not LU collaborator)
							obj.estAdministrateurCabinetReference = false; // The superadministrator right must be disactivated
							$("#div_dialogSuccess").successDialog(successTitle, msg);
							callbackSuccess.call(plugin);				
						} else { // Failure
							$("#div_dialogAlert").failDialog(errorTitle, msg);
							callbackError.call(plugin);			
						}
					}					
				},
				"Annuler": function() {
					$("#div_activateLinkUpUser").dialog("close");
				}								
			},
			close: function() {
				if (window.onbeforeunload != null) {
					window.onbeforeunload = funcOnbeforeunload;		
				}
				callbackError.call(plugin);			
			},
			open: function() {
				// To avoid collaborator to be saved if user closes the window whereas the dialog is still opened
				window.onbeforeunload = function(){ // Override onbeforeunload
				   callbackError.call(plugin);	
				}
			}			
		});
	}	
}

// XB 16/05/2013
// Activation of a super administrator
$coala.Role_estAdministrateurCabinetReference_MODIF=function(obj,callbackError,callbackSuccess, plugin) {
	//if user is admin, just change the value in mongo database
	if (isSuperAdmin)
	{
		callbackSuccess.call(plugin);
		return true;
	}
	// Get credentials for Ajax Calls
	var username = urlParams["codeCollabo"];
	var pw = urlParams["mdpCollabo"];
	var collaborator;
	var status = true;
	var listSuperAdministrators;
	var nbSuperAdministrators;
	var currentSuperAdministrator;
	var msg;
	
	// Getting our collaborator
	collaborator = GetObjetMongoCourant(obj._id, username, pw);	
	// --- VALiDATIONS -- //
	// Our collaborator cannot be be found
	if (collaborator == null) { 
		msg = "Le collaborateur n'a pu être lu dans la base Mongo.";
		status = false;
	}
	// Our collaborator is neither collaborator nor administrator on LinkUp 
	if (status && !collaborator.estCollaborateurCabinet || !collaborator.estAdministrateurCabinet) {
		msg = "Le compte du collaborateur n'est pas activé dans "+applicationName+" et/ou le collaborateur n'est pas administrateur dans "+applicationName+".";
		status = false;	
	}
	// Check the number of super administrators
	if (status) {
		listSuperAdministrators = GetListOfSuperAdministrators(username, pw);
		if (!listSuperAdministrators.status) { // Error during the GET request
			msg = listSuperAdministrators.error;
			status = false;	
		} else {
			nbSuperAdministrators = listSuperAdministrators.data.length;
			if (nbSuperAdministrators == 0) { // There is no administrator, we can activate it
				callbackSuccess.call(plugin);
			} else if (nbSuperAdministrators == 1) {
				currentSuperAdministrator = listSuperAdministrators.data[0];
				if (collaborator._id == currentSuperAdministrator._id) { // Deactivation is possible only if the current Super Administrator == our current collaborator
					msg = "Attention ! Il n'y a plus de compte administrateur de référence. Les services connectés tels que la Marketplace et la synchronisation Sage LinkUp Experts ne fonctionneront plus tant qu'un administrateur de référence n'aura pas été activé.";
					$("#div_dialogWarning").warningDialog(warningTitle, msg);
					callbackSuccess.call(plugin);
				} else { // Activation is impossible
					status = false;	
					currentSuperAdministrator = currentSuperAdministrator.personne;
					if (typeof currentSuperAdministrator === "undefined") {
						msg = "Un administrateur de référence est déjà activé.";
					} else {
						msg = "Un administrateur de référence est déjà activé (" + currentSuperAdministrator.fullName + ").";
					}		
				}
			} else if (nbSuperAdministrators > 1) {
				status = false;
				msg = "L'activation est impossible car plus d'un administrateur de référence est activé (" + nbSuperAdministrators + ").";
			} else {
				status = false;	
				msg = "Nombre anormal d'administrateurs de référence (" + nbSuperAdministrators + ").";
			}
		}
	}
	
	// Display error messages and use callbackError
	if (!status) {
		$("#div_dialogAlert").failDialog(errorTitle, msg);
		callbackError.call(plugin);	
	}
}

// ############################ //
// ### AJAX CALLS FUNCTiONS ### //
// ############################ //

	// ######################### //
	// ### CRUD ORGANiZATION ### //
	// ######################### //
// XB 03/07/2013
// READ - Get an organization for a given siren
// Parameters - siren of the organization
// Result - r with an attribute 'status' if code 200 (true) else 404 (false)
function readOrganization(siren, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	$.ajax({
		type: "GET",
		url: encodeURI("../../sdata/linkup/organizations('" + siren + "')"),
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data) {
			r.data = data;
			r.status = true;
		},
		error: function (jqXHR, textStatus, errorThrow) {
			r.status = false;
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;					
			} else if (jqXHR.status == 404) { // Organization not found
				r.error = "Le cabinet de SIREN " + siren + " n'a pas été trouvé (GET). " + 
					"<br/> Code erreur : " + jqXHR.status;		
			} else {
				r.error = "Une erreur s'est produite lors de la lecture de l'entité de SIREN " + siren + " (GET). " + 
					"<br/> Signature de la méthode : readOrganization(siren, username, pw) " + 
					"<br/> Code erreur : " + jqXHR.status + 
					"<br/> Détail de l'erreur : " + jqXHR.responseText;
			}
		}
	});	
	return r;
}

// XB 03/10/2013
// UPDATE - Update an organization (PUT)
// Parameters - objMongo is the organization in Coala DB
function updateOrganization(objMongo, orgSiren, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	var o = createLinkUpOrganizationObject(objMongo); // Serialization

	if (o != null) {
		$.ajax({
			type: "PUT",
			url: encodeURI("../../sdata/linkup/organizations('" + orgSiren + "')"),
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data) {	
				r.status = true;							
			},
			error: function (jqXHR, textStatus, errorThrow) {
				if (jqXHR.status == 400 || jqXHR.status == 403 || jqXHR.status == 404 || jqXHR.status == 409) { // Bad request
					r.error = "La synchronisation de cette entité est impossible." +
						"<br/> " + jqXHR.responseText;		
				} else if (jqXHR.status == 401) { // Not authenticated
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
						"<br/> Code erreur : " + jqXHR.status;
				} else {
					r.error = "Une erreur s'est produite lors de la mise à jour d'une entité (PUT). " +
						"<br/> Signature de la méthode : updateOrganization(objMongo, orgSiren, username, pw, acc) " + 
						"<br/> Code erreur : " + jqXHR.status + 
						"<br/> Détail de l'erreur : " + jqXHR.responseText;  
					r.status = false;
				}
			}
		});	
	} else {
		r.status = false;
		r.error = "Une erreur s'est produite lors de la sérialization de l'entité";
	}
	return r;
}

	// ######################### //
	// ### CRUD COLLABORATOR ### //
	// ######################### //
// XB 03/07/2013
// READ - Get a collaborator of an organization
// Parameters - SIREN of the organization and email of the collaborator
// Result - r with an attribute 'status' if code 200 and a SageId (true) or code 404 (false)
function readCollaboratorOfAnOrganization(siren, email, username, pw, acc) {
	var r = {};
	if (typeof acc === "undefined") acc = 0;
	$.ajax({
		type: "GET",
		url: encodeURI("../../sdata/linkup/admin/organizations('" + siren + "')/collaborators('" + encodeURIComponent(email) + "')"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data) {
				r.data = data;
				r.status = true;
		},
		error: function (jqXHR, textStatus, errorThrow) {
			if (jqXHR.status == 401) { // Not authenticated
				var res = "";
				if (jqXHR.responseText == "Admin token not found")
				{
					res = "Le compte administrateur de référence n'est pas connu.<br/> Veuillez vous ré-authentifier via le menu <br/>Traitements -> Sage LinkUp Experts -> Administrateur de référence -> Authentifier le compte de l'administrateur de référence.";
				}
				r.error = "Vous n'êtes pas authentifié sur "+applicationName+"." + 
					"<br/> Code erreur : " + jqXHR.status+
					"<br/>"+res;	
			} else if (jqXHR.status == 404) {
				r.status = false; // Collaborator not found
			} else {
				r.error = "Une erreur s'est produite lors de la lecture du collaborateur d'email " + email + " (GET). " + 
					"<br/> Signature de la méthode : readCollaboratorOfAnOrganization(siren, email, username, pw, acc) " + 
					"<br/> Code erreur : " + jqXHR.status + 
					"<br/> Détail de l'erreur : " + jqXHR.responseText;
			}
		}
	});	
	return r;
}

// XB & LLG 24/07/2013
// UPDATE - Update a collaborator of an organization (PUT)
// Parameters - objMongo is the collaborator in Coala DB while objLinkUp is the collaborator in LinkUp DB
function updateCollaboratorOfAnOrganization(orgSiren, objMongo, objLinkUp, isAdminClicked, isUpdatedByEmail, username, pw, acc) {
	var url;	
	var r = {};
	if (typeof acc === "undefined") acc = 0;
	if (isAdminClicked) {
		// If my collaborator is an administrator, it must be a LinkUp collaborator too
		// This is important to force this value, because if both checkboxes "estCollaborateurCabinet" and "estAdministrateurCabinet" are unchecked
			// then if we check "estAdministrateurCabinet", "estCollaborateurCabinet" will be set to false in this method
		if (objMongo.estAdministrateurCabinet == true) objMongo.estCollaborateurCabinet = true	
	} else {
		// If my collaborator is not a LinkUp collaborator, he must not be an administrator LinkUp
		if (objMongo.estCollaborateurCabinet == false) objMongo.estAdministrateurCabinet = false	
	}
	var o = GetCollaborator(objMongo); // Serialization
	if (o != null) {
		if (isUpdatedByEmail === true) {
			url = encodeURI("../../sdata/linkup/admin/organizations('" + orgSiren + "')/collaborators(UserName eq '" + encodeURIComponent(o.UserName) + "')");
		} else {
			url = encodeURI("../../sdata/linkup/admin/organizations('" + orgSiren + "')/collaborators('" + o.SageId + "')");
		}
		$.ajax({
			type: "PUT",
			url: url,
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data) {	
				r.status = true;							
			},
			error: function (jqXHR, textStatus, errorThrow) {
				if (jqXHR.status == 400 || jqXHR.status == 409) { // Bad Request
					r.error =  "Une erreur s'est produite lors de la mise à jour du collaborateur sur "+applicationName+"." +	
						"<br/> " + jqXHR.responseText; 
				} else if (jqXHR.status == 401) { // Not authenticated
					var res = "";
					if (jqXHR.responseText == "Admin token not found")
					{
						res = "Le compte administrateur de référence n'est pas connu.<br/> Veuillez vous ré-authentifier via le menu <br/>Traitements -> Sage LinkUp Experts -> Administrateur de référence -> Authentifier le compte de l'administrateur de référence.";
					}
					r.error = "Vous n'êtes pas authentifié sur "+applicationName+"." + 
						"<br/> Code erreur : " + jqXHR.status+
						"<br/>"+res;	
				} else if (jqXHR.status == 403) {
					r.error = "Vous n'êtes pas administrateur du cabinet sur "+applicationName+", vous n'êtes pas autorisé à effectuer ce traitement (" + jqXHR.status + ").";										
				} else {
					r.error = "Une erreur s'est produite lors de la mise à jour d'un collaborateur (PUT). " +
						"<br/> Signature de la méthode : updateCollaboratorOfAnOrganization(orgSiren, objMongo, objLinkUp, isAdminClicked, isUpdatedByEmail, username, pw, acc) " + 
						"<br/> Code erreur : " + jqXHR.status + 
						"<br/> Détail de l'erreur : " + jqXHR.responseText;  
				}
				r.status = false;
			}
		});	
	} else {
		r.status = false;
		r.error = "Une erreur s'est produite lors de la sérialization du collaborateur";
	}
	return r;
}
// XB 03/07/2013
// CREATE - Create a collaborator (POST)
// Parameters - objMongo is the collaborator in Coala DB
function createCollaboratorOfAnOrganization(orgSiren, objMongo, username, pw, acc) {
	var r = {};
	if (typeof acc === "undefined") acc = 0;
	var o = GetCollaborator(objMongo); // Serialization
	if (o != null) {
		o.IsDeleted = 0; // We are creating a collaborator, so it must be activated !
		$.ajax({
			type: "POST",
			url: encodeURI("../../sdata/linkup/admin/organizations('" + orgSiren + "')/collaborators"),
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data){	
				r.data = data;
				r.status = true;						
			},			
			error: function (jqXHR, textStatus, errorThrow) {	
				if (jqXHR.status == 401) { // Not authenticated
					var res = "";
					if (jqXHR.responseText == "Admin token not found")
					{
						res = "Le compte administrateur de référence n'est pas connu.<br/> Veuillez vous ré-authentifier via le menu <br/>Traitements -> Sage LinkUp Experts -> Administrateur de référence -> Authentifier le compte de l'administrateur de référence.";
					}
					r.error = "Vous n'êtes pas authentifié sur "+applicationName+"." + 
						"<br/> Code erreur : " + jqXHR.status+
						"<br/>"+res;	
				} else {
					r.error = "Une erreur s'est produite lors de la création du collaborateur sur "+applicationName+". (POST)" +
						"<br/> Signature de la méthode : createCollaboratorOfAnOrganization(orgSiren, objMongo, username, pw, acc) " + 
						"<br/> <span style='font-weight:bold;'>Code erreur : </span> " + jqXHR.status + 
						"<br/> <span style='font-weight:bold;'>Détail de l'erreur : </span> " + jqXHR.responseText; 
				}
				r.status = false;
			}			
		});
	} else {
		r.status = false;
		r.error = "Une erreur s'est produite lors de la sérialization du collaborateur.";
	}
	return r;
}

	// ######################### //
	// ### CRUD ADMINISTRATOR ### //
	// ######################### //

// XB 27/09/2013
// READ - Get an administrator of an operating company
// Parameters - SIREN of the organization and email of the collaborator
// Result - r with an attribute 'status' if code 200 and a SageId (true) or code 404 (false)
function readAdministratorOfAnOperatingCompany(siren, email, username, pw, acc) {
	if (typeof acc === undefined) acc = 0;
	var r = {};
	$.ajax({
		type: "GET",
		url: encodeURI("../../sdata/linkup/operatingCompanies('" + siren + "')/collaborators('" + encodeURIComponent(email) + "')"),
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data) {
			r.data = data;
			r.status = true;
		},
		error: function (jqXHR, textStatus, errorThrow) {
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
			} else if (jqXHR.status == 404) {
				r.status = false; // Collaborator not found
			} else {
				r.error = "Une erreur s'est produite lors de la lecture de l'administrateur d'email " + email + " (GET). " + 
					"<br/> Signature de la méthode : readAdministratorOfAnOperatingCompany(siren, email, username, pw, acc) " + 
					"<br/> Code erreur : " + jqXHR.status + 
					"<br/> Détail de l'erreur : " + jqXHR.responseText;
			}
		}
	});	
	return r;
}

// XB 27/09/2013
// UPDATE - Update an administrator of an organization (PUT)
// Parameters - objMongo is the collaborator in Coala DB while objLinkUp is the collaborator in LinkUp DB
function updateAdministratorOfAnOperatingCompany(orgSiren, objMongo, objLinkUp, username, pw, acc) {
	var r = {};
	var o = GetCollaborator(objMongo, true); // Serialization
	if (o != null) {
		$.ajax({
			type: "PUT",
			url: encodeURI("../../sdata/linkup/operatingCompanies('" + orgSiren + "')/collaborators('" + encodeURIComponent(o.UserName) + "')"),
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "html",
			cache: false, 
			async: false,
			success: function(data) {	
				r.status = true;							
			},
			error: function (jqXHR, textStatus, errorThrow) {
				if (jqXHR.status == 400 || jqXHR.status == 404 || jqXHR.status == 300 || jqXHR.status == 409) {
					r.error =  "Une erreur s'est produite lors de la mise à jour de l'administrateur sur LinkUp." +	
						"<br/> " + jqXHR.responseText + jqXHR.status; 
				} else if (jqXHR.status == 401) { // Not authenticated
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
						"<br/> Code erreur : " + jqXHR.status;
				} else {
					r.error = "Une erreur s'est produite lors de la mise à jour d'un collaborateur (PUT). " +
						"<br/> Signature de la méthode : updateAdministratorOfAnOperatingCompany(orgSiren, objMongo, objLinkUp, username, pw, acc) " + 
						"<br/> Code erreur : " + jqXHR.status + 
						"<br/> Détail de l'erreur : " + jqXHR.responseText;  
				}
				r.status = false;
			}
		});	
	} else {
		r.status = false;
		r.error = "Une erreur s'est produite lors de la sérialization du collaborateur";
	}
	return r;
}
// XB 27/08/2013
// CREATE - Create an Administrator (POST)
// Parameters - objMongo is the collaborator in Coala DB
function createAdministratorOfAnOperatingCompany(orgSiren, objMongo, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	var o = GetCollaborator(objMongo, true); // Serialization
	if (o != null) {
		o.IsDeleted = 0; // We are creating a collaborator, so it must be activated !
		$.ajax({
			type: "POST",
			url: encodeURI("../../sdata/linkup/operatingCompanies('" + orgSiren + "')/collaborators"),
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "text", 
			cache: false, 
			async: false,
			success: function(data){	
				r.data = data;
				r.status = true;						
			},			
			error: function (jqXHR, textStatus, errorThrow) {	
				if (jqXHR.status == 400 || jqXHR.status == 404 || jqXHR.status == 300 || jqXHR.status == 409) {
					r.error =  "Vous ne pouvez pas créer ce compte." +	
						"<br/> " + jqXHR.responseText; 
				} else if (jqXHR.status == 401) { // Not authenticated
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
						"<br/> Code erreur : " + jqXHR.status;
				} else {
					r.error = "Une erreur s'est produite lors de la création de l'administrateur sur LinkUp. (POST)" +
						"<br/> Signature de la méthode : createAdministratorOfAnOperatingCompany(orgSiren, objMongo, username, pw, acc) " + 
						"<br/> <span style='font-weight:bold;'>Code erreur : </span> " + jqXHR.status + 
						"<br/> <span style='font-weight:bold;'>Détail de l'erreur : </span> " + jqXHR.responseText; 
				}
				r.status = false;
			}			
		});
	} else {
		r.status = false;
		r.error = "Une erreur s'est produite lors de la sérialization du collaborateur.";
	}
	return r;
}

	// ############################## //
	// ### CRUD OPERATING COMPANY ### //
	// ############################## //

// XB 03/07/2013
// Get an operating company for a given siren
function readOperatingCompany(siren, username, pw, msg, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	if (token==null)
	{	//Specifique sur la lecture ou la creation d'un dossier, afin d'eviter de le faire pour chaque dossier Coala
		getTokenCollaborateur().then(function(token) {
			linkUpModule.bearer = token;
		})
	}
	$.ajax({
		type: "GET",
		url: encodeURI("../../sdata/linkup/checkSirenFree('" + siren + "')"),
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data) {	
			r.data = data;
			r.status = (data==false);
			if (data==false)
			{
				r.error = "Une erreur s'est produite lors de la création du dossier de Siren " + siren + " sur LinkUp." +
					"<br/> Détail de l'erreur : Ce siren existe déjà.</span> " ;  	
			}
		},
		error: function (jqXHR, textStatus, errorThrow) {
			if (jqXHR.status == 401) { // Not authenticated
				if(msg == "estDossierActiveLinkUp_MODIF"){
					r.error = "Vous n’avez pas les droits pour activer le dossier dans Sage LinkUp," +
					"<br/> veuillez contacter l’administrateur.";
				}
				else if(msg == "estDossierActiveComptaCollaborative_MODIF"){
					r.error = "Vous n’avez pas les droits pour activer la compta collaborative," +
					"<br/> Veuillez contacter l’administrateur";
				}
				else{
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
				}

				
			} else if (jqXHR.status == 404) { // Organization or Operating Company not found
				r.status = false;
			} else {
				r.error = "Une erreur s'est produite lors de la création du dossier de Siren " + siren + " sur LinkUp. (GET)" +
					"<br/> Signature de la méthode : readOperatingCompany(siren, username, pw, msg, acc) " + 
					"<br/> Code erreur : </span> " + jqXHR.status + 
					"<br/> Détail de l'erreur : </span> " + jqXHR.responseText;  		
			}
		}
	});
	return r;
}

// LLG 27/12/2018
// Unsubscribe an operating company
function unsubscribeOperatingCompany(dossierCourant, siren, username, pw, msg) {
	var r = {
		"status": false
	}
	var o = null;
	$.ajax({
		type: "POST",
		url: encodeURI("../../sdata/linkup/organizations('" + siren + "')/unsubscribe"),
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		contentType: "application/json; charset=UTF-8",
		data: JSON.stringify(o),
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data){	
			r.data = data;
			r.status = true;	
			dossierCourant.dateDebutContratLinkUp = "";
			dossierCourant.dateFinContratLinkUp = "";
			dossierCourant.typeContrat = "";
			dossierCourant.quotaContrat = 0;
			dossierCourant.estDossierActiveComptaCollaborative = false;
			dossierCourant.estDossierActiveLinkUp = false;
		},
		error: function (jqXHR, textStatus, errorThrow) {			
			r.status = false;
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
				"<br/> Code erreur : " + jqXHR.status;
			} else if (jqXHR.status == 403) {
				r.error = "Vous n'êtes pas administrateur du cabinet sur LinkUp. Vous ne pouvez pas désabonner de dossier." +
					"<br/> Code erreur : " + jqXHR.status;
			} else if ($.inArray(jqXHR.status, [400, 404, 409]) >= 0) {
				r.error =  "Erreur : " +	
					"<br/> <br/>" + jqXHR.responseText; 
			} else {
				r.error = "Une erreur s'est produite lors du désabonnement du dossier sur LinkUp. (POST)" +
					"<br/> Signature de la méthode : unsubscribeOperatingCompany(companySiren, username, pw, acc) " + 
					"<br/> <span style='font-weight:bold;'>Code erreur : </span> " + jqXHR.status + 
					"<br/> <span style='font-weight:bold;'>Détail de l'erreur : </span> " + jqXHR.responseText;  
			}
		}
	});

	return r;
}

// XB 02/10/2013
// Update an operating company for a given siren
function updateOperatingCompany(objMongo, objLinkUp, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var isDeleted = true;
	var r = {};
	if (objLinkUp.isDeleted != null)
		isDeleted = (objLinkUp.isDeleted == 0)?false:true;
	objMongo.estDossierActiveLinkUp = isDeleted;	
	var o = createLinkUpOperatingCompanyObject(objMongo);
	//o.IsDeleted = isDeleted;
	if (o != null) {
		$.ajax({
			type: "PUT",
			url: encodeURI("../../sdata/linkup/operatingCompanies('" + o.Siren + "')"),
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data){	
				r.status = true;							
			},
			error: function (jqXHR, textStatus, errorThrow) {
				r.status = false;
				if (jqXHR.status == 401) { // Not authenticated
					r.error = "Cette action de synchronisation a échoué. <br/> <br/> Vous n'êtes pas authentifié sur LinkUp." + 
						"<br/> Code erreur : " + jqXHR.status;
				} else if ($.inArray(jqXHR.status, [400, 403, 404, 409]) >= 0) {
					r.error =  "Cette action de synchronisation a échoué." +	
						"<br/> <br/>" + jqXHR.responseText; 
				} else {
					r.error = "Cette action de synchronisation a échoué. <br/> <br/> Une erreur s'est produite lors de la mise à jour d'un dossier (PUT). " +
						"<br/> Signature de la méthode : updateOperatingCompany(objMongo, objLinkUp, username, pw, acc) " + 
						"<br/> Code erreur : " + jqXHR.status + 
						"<br/> Détail de l'erreur : " + jqXHR.responseText;  
				}
			}
		});
	}
	return r;
}

// XB 03/07/2013
// Create an operating company
function createOperatingCompany(sirenCabinet, objMongo, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {
		"status": false
	}
	// Faire un POST de l'entité
	//Sauvegarde de l'objet
	var copyObjet = null;
	if (objMongo["Contract"] != null)
	{
		copyObjet = objMongo;
	}
	var o = createLinkUpOperatingCompanyObject(objMongo);
	o["IsDeleted"] = 0;
	if (o != null) {
		if (copyObjet != null)
			o["Contract"] = copyObjet["Contract"];
		$.ajax({
			type: "POST",
			url: encodeURI("../../sdata/linkup/organizations('" + sirenCabinet + "')/operatingCompanies"),
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data){	
				r.data = data;
				r.status = true;						
			},
			error: function (jqXHR, textStatus, errorThrow) {			
				r.status = false;
				if (jqXHR.status == 401) { // Not authenticated
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
				} else if (jqXHR.status == 403) {
					r.error = "Vous n'êtes pas administrateur du cabinet sur LinkUp. Vous ne pouvez pas créer de dossier." +
						"<br/> Code erreur : " + jqXHR.status;
				} else if ($.inArray(jqXHR.status, [400, 404, 409]) >= 0) {
					r.error =  "Il est impossible de publier ce dossier." +	
						"<br/> <br/>" + jqXHR.responseText; 
				} else {
					r.error = "Une erreur s'est produite lors de la création du dossier sur LinkUp. (POST)" +
						"<br/> Signature de la méthode : createOperatingCompany(sirenCabinet, objMongo, username, pw, acc) " + 
						"<br/> <span style='font-weight:bold;'>Code erreur : </span> " + jqXHR.status + 
						"<br/> <span style='font-weight:bold;'>Détail de l'erreur : </span> " + jqXHR.responseText;  
				}
				if (objMongo["dateDebutContratLinkUp"] != null && objMongo["dateDebutContratLinkUp"] != "")
					objMongo["dateDebutContratLinkUp"] = null;
				if (objMongo["dateFinContratLinkUp"] != null && objMongo["dateFinContratLinkUp"] != "")
					objMongo["dateFinContratLinkUp"] = null;
				if (objMongo["typeContrat"] != null && objMongo["typeContrat"] != "")
					objMongo["typeContrat"] = null;
				if (objMongo["quotaContrat"] != null && objMongo["quotaContrat"] != "")
					objMongo["quotaContrat"] = null;			}
		});
	} else {
		r.status = false;
	}
	return r;
}

// Activer la compta collaborative
function enableCollaborativeAccounting(siren, objMongo, isActiv, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {
		"status": false
	}
	var o = createLinkUpOperatingCompanyObject(objMongo);
	o["IsDeleted"] = 0;
	if (o != null) {
		$.ajax({
			type: "POST",
			url: encodeURI("../../sdata/linkup/organizations('" + siren + "')/UpdateSharedAccounting/" + isActiv),			
			headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
			username: username,
			password: pw,
			contentType: "application/json; charset=UTF-8",
			data: JSON.stringify(o),
			dataType: "json", 
			cache: false, 
			async: false,
			success: function(data){	
				r.data = data;
				r.status = true;						
			},
			error: function (jqXHR, textStatus, errorThrow) {			
				r.status = false;
				if (jqXHR.status == 401) { // Not authenticated
					r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
				} else if (jqXHR.status == 403) {
					r.error = "Vous n'êtes pas administrateur sur LinkUp. Vous ne pouvez pas créer de dossier." +
						"<br/> Code erreur : " + jqXHR.status;
				} else if ($.inArray(jqXHR.status, [400, 404, 409]) >= 0) {
					r.error =  "Il est impossible de publier ce dossier." +	
						"<br/> <br/>" + jqXHR.responseText; 
				} else {
					r.error = "Une erreur s'est produite lors de la création du dossier sur LinkUp. (POST)" +
						"<br/> Signature de la méthode : createLinkUpOperatingCompanyObject(siren, objMongo, isActiv, username, pw, acc) " + 
						"<br/> <span style='font-weight:bold;'>Code erreur : </span> " + jqXHR.status + 
						"<br/> <span style='font-weight:bold;'>Détail de l'erreur : </span> " + jqXHR.responseText;  
				}
				}
		});
	} else {
		r.status = false;
	}
	return r;
}

	// ################### //
	// ### FROM LINKUP ### //
	// ################### //
	
// XB 26/11/2013
// Get last contract of an organization and an operating company
function getOperatingCompanyLastContract(orgSiren, opeSiren, username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {}
	$.ajax({
		type: "GET",
		url: encodeURI("../../sdata/linkup/organizations('" + orgSiren + "')/operatingCompanies('" + opeSiren + "')/contracts?orderBy=endDate desc"),
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data) {	
			if (data.$resources == null || data.$resources.length == 0) { // No contract
				r.data = null;
			} else {
				r.data = data.$resources[0];
			}
			r.status = true;
		},
		error: function (jqXHR, textStatus, errorThrow) {	
			r.status = false;
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
			}		
			if (jqXHR.status == 403) { // Not authorized
				r.error = "Vous n'êtes pas autorisé à mettre  à jour le contrat depuis LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
			}	
		}
	});
	return r;
}
// XB 03/07/2013
// AJAX GET CALL to get all the countries in LinkUp DB
function GetLinkUpCountries(username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	$.ajax({
		type: "GET",
		url: encodeURI(sDataUrlPrefix + "/countries"),
		cache: true,
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json",  
		async: false,
		success: function(data) {
			r.status = true;
			r.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {				
			r.status = false;
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
			}	
		}
	});
	return r;
}

// XB 26/09/2013
// AJAX GET CALL to get all the legal forms in LinkUp DB
function GetLinkUpLegalForms(username, pw, acc) {
	if (typeof acc === "undefined") acc = 0;
	var r = {};
	$.ajax({
		type: "GET",
		url: encodeURI(sDataUrlPrefix + "/legalForms"),
		cache: true,
		headers: { 'AuthorizationSageIdBearer': 'Bearer '+linkUpModule.bearer },
		username: username,
		password: pw,
		dataType: "json",  
		async: false,
		success: function(data) {
			if (data.$resources == null) {
				r.status = false;
			} else {
				r.status = true;
				r.data = data.$resources;			
			}
		},
		error: function (jqXHR, textStatus, errorThrow) {				
			r.status = false;
			if (jqXHR.status == 401) { // Not authenticated
				r.error = "Vous n'êtes pas authentifié sur LinkUp." + 
					"<br/> Code erreur : " + jqXHR.status;
			}
		}
	});
	return r;
}

	// ################## //
	// ### FROM COALA ### //
	// ################## //

// Permet de récupérer l'entité courante dans MongoDB
function GetObjetMongoCourant(id, username, pw) {
	var res = null;
	$.ajax({
		url: encodeURI("/mongo/Role?where=_id eq '" + id + "'&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET"		
	}).success(function(data) {
		if (data != null && data[0] !== undefined)
			res = data[0];
	});	
	return res;
}

function GetObjetMongoListCollaboratorByEmail(email, username, pw){
	var res = null;
	$.ajax({
		url: encodeURI("/mongo/Personne?where=email eq '" + email + "'"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true},
		type: "GET"
	}).success(function(data) {
		res = data;
	});	
	return res;
}

function GetObjetMongoRoleFromPersonneId(id, username, pw) {
	
	var res = null;
	$.ajax({
		url: encodeURI("/mongo/Role?where=personne eq '/mongo/Personne/" + id + "' and type eq 'Collaborateur'&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET"		
	}).success(function(data) {
		if (data != null && data[0] !== undefined)
			res = data[0];
	});	
	return res;
}

/* Permet de récupérer la liste des entités activées pour LinkUp dans MongoDB (estCabinetActiveLinkUp) */
function GetLstCabinetsActives(username, pw) {
	var res = null;
	$.ajax({
		url: encodeURI("/mongo/Role?where=type eq 'Dossier' and estEntite eq true and estCabinetActiveLinkUp eq true&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET"
	}).success(function(data) {
		res = data;
	});	
	return res;
}

// CREATOR XB 27/02/2014
// UPDATOR XB 28/02/2014
// Récupérer la liste des dossiers activés sur LinkUp
function GetDossiersActives(username, pw) {
	var result = {
		status: false
	};
	$.ajax({
		url: encodeURI("/mongo/Role?where=type eq 'Dossier' and estDossierActiveLinkUp eq true&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET",
		success: function(data){
			result.status = true;
			result.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {
			result.error = "Une erreur s'est produite lors de la récupération des dossiers activés sur Sage LinkUp Experts. (GET)" +
				"<br/><br/> Signature de la méthode : GetDossiersActives(username, pw) " + 
				"<br/> Code erreur : " + jqXHR.status + 
				"<br/><br/> Détail de l'erreur : <br/>" + jqXHR.responseText;
		}		
	});	
	return result;
}

// XB 03/10/2013
// Get all LinkUp administrators
function GetLinkUpAdministrators(username, pw) {
	var result = {
		status: false
	};
	$.ajax({
		type: "GET",
		url: encodeURI("/mongo/Role?where=type eq 'Collaborateur' and estAdministrateurCabinet eq true"),
		username: username,
		password: pw,
		postData: {format: 'application/json', pageable: true},
		dataType: "json", 
		cache: false, 
		async: false,
		success: function(data){	
			result.status = true;
			result.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {
			result.error = "Une erreur s'est produite lors de la récupération des administrateurs activés sur Sage LinkUp Experts. (GET)" +
				"<br/><br/> Signature de la méthode : GetLinkUpAdministrators(username, pw) " + 
				"<br/> Code erreur : " + jqXHR.status + 
				"<br/><br/> Détail de l'erreur : <br/>" + jqXHR.responseText; 
		}
	});
	return result;
}

// XB 21/05/2013
// Get all the activated organizations on LinkUp in CoalaDB
function GetListActivatedOrganizations(username, pw) {
	var r = {};
	$.ajax({
		url: encodeURI("/mongo/Role?where=type eq 'Dossier' and estEntite eq true and estCabinetActiveLinkUp eq true&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET",
		success: function(data) {
			r.status = true;
			r.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {				
			r.status = false;
			r.error = "Une erreur s'est produite lors de la récupération des entités activées. (GET)" +
				"<br/> Signature de la méthode : GetListActivatedOrganizations(username, pw) " + 
				"<br/> Code erreur : </span> " + jqXHR.status + 
				"<br/> Détail de l'erreur : </span> " + jqXHR.responseText;
		}
	});
	return r;
}

// XB 16/05/2013
// Get all the super administrators on LinkUp in CoalaDB
function GetListOfSuperAdministrators(username, pw) {
	var r = {};
	$.ajax({
		url: encodeURI("/mongo/Role?where=type eq 'Collaborateur' and estCollaborateurCabinet eq true and estAdministrateurCabinet eq true and estAdministrateurCabinetReference eq true&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: { format: 'application/json', pageable: true, include: 'personne' },
		type: "GET",
		success: function(data) {
			r.status = true;
			r.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {				
			r.status = false;
			r.error = "Une erreur s'est produite lors de la récupération des administrateurs de référence. (GET)" +
				"<br/> Signature de la méthode : GetListOfSuperAdministrators(username, pw) " + 
				"<br/> Code erreur : </span> " + jqXHR.status + 
				"<br/> Détail de l'erreur : </span> " + jqXHR.responseText;
		}
	});
	return r;
}

// XB 22/05/2013
// Get LinkUp Administration right
function GetLinkUpAdminRightByUser(username, pw) {
	var r = {};
	$.ajax({
		type: "GET",
		url: encodeURI("/sdata/coala/collaborateurs('" + username + "')/droits('Administrer LinkUp')"),
		dataType: "json", 		
		username: username,
		password: pw,
		cache: false, 
		async: false,
		postData: { format: 'application/json' },
		success: function(data) {
			r.status = true;
			r.data = data;
		},
		error: function (jqXHR, textStatus, errorThrow) {				
			r.status = false;
			r.error = "Une erreur s'est produite lors de la récupération des droits de l'utilisateur " + username + ". (GET)" +
				"<br/> Signature de la méthode : GetUserRights(username, pw) " + 
				"<br/> Code erreur : </span> " + jqXHR.status + 
				"<br/> Détail de l'erreur : </span> " + jqXHR.responseText;
		}
	});
	return r;	
}

// XB 30/05/2013
// READ - Get the siren of an operating company
// Parameters - SIREN of the organization and email of the collaborator
// Result - siren
function readSirenOfAnOperatingCompany(idEtablissement, username, pw) {
	var res = null;
	$.ajax({
		url: encodeURI("/mongo/Role?where= idEtablissement eq '"+idEtablissement+"' and type eq 'Dossier'&include=personne"),
		//url: encodeURI("/mongo/Role?where=_id eq '" + id + "'&include=personne"),
		username: username,
		password: pw,
		dataType: "json", 
		cache: false, 
		async: false,
		postData: {format: 'application/json', pageable: true, include: 'personne'},
		type: "GET"		
	}).success(function(data) {
		if (data != null && data[0] !== undefined)
			res = data[0].personne.siren;
	});	
	return res;
}

// XB 07/10/2014
// Supprimer le SageId
function unsetSageId(user, mdp) {
	var roleObjectId = getParameterValueFromUrl("reqRole");
	var result = {
		status: false
	};
	if ((/\/mongo\/Role\/\w*/).test(roleObjectId)) {
		roleObjectId = roleObjectId.replace("/mongo/Role/", ""); // Obtain our role Id
		var roleObject = GetObjetMongoCourant(roleObjectId, user, mdp); // Get role in DB
		if (roleObject != null && roleObject.personne != null && typeof(roleObject.personne.sageId) !== 'undefined') {
			var newPersonne = $.extend({}, roleObject.personne);
			delete newPersonne.sageId;
			$.ajax( { // Process AJAX request
				url: encodeURI(urlParams.req + "?" +  urlParams.date + "&propagation=true"),
				type: "POST",
				username: user,
				password: mdp,
				async: false,
				cache: false,
				contentType: "application/json; charset=utf-8",
				data: JSON.stringify(newPersonne),
				success: function() {
					result.status = true;
				},
				error: function(jqXHR, textStatus, errorThrown) {
					result.message = "Le Sage Id n'a pu être mis à jour" +
						"<br/> Code erreur : " + jqXHR.status +
						"<br/> Détail de l'erreur : " + jqXHR.responseText;
				}
			} );
		} else {
			result.status = true; // Le SageId est deja null
		}
	} else {
		result.message = "Le Sage Id n'a pu être mis à jour" +
			"<br/> L'ID du role n'a pu etre lu dans l'URL";
	}
	return result;
}

function getSirenExtended (aRoleAndAPerson)
{
	if (aRoleAndAPerson == null)
	return null;
	
	var siren = aRoleAndAPerson.personne.siren;
	if (aRoleAndAPerson.idEtablissementLinkUp!=null)
		siren += '-'+aRoleAndAPerson.idEtablissementLinkUp;
	
	return siren;

}