/// <summary>
/// Form On Load functions
/// </summary>
/// <param name="executionContext">Execution Context</param>
function OnLoadConnection(executionContext) {
	"use strict";
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		SetCacheForMultilingualMessages();
		EnableOpportunityFields(executionContext);
		ConnectionRoleFilter(executionContext);
		
		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;

		if (formContext.data.attributes.get("source_0") !== null) {
			if (formContext.data.attributes.get("source_0").getValue() == "1") //accounts
			{
				if (formContext.getAttribute('record2id') !== null) {
					formContext.getControl("record2id").setEntityTypes(["account"]);
					filterConnectToLookup(executionContext, "account");
				}
			} else if (formContext.data.attributes.get("source_0").getValue() == "2") {
				if (formContext.getAttribute('record2id') !== null) {
					formContext.getControl("record2id").setEntityTypes(["contact"]); //contacts
					filterConnectToLookup(executionContext, "contact");
				}
			} else if (formContext.data.attributes.get("source_0").getValue() == null) {
				formContext.getControl("record2id").setEntityTypes(["account", "contact", "opportunity"]);
			}
		}

		var formType = formContext.ui.getFormType();

		//On Update Form
		if (formType === 2) {
			var connectToEntityType;
			var connectToNameLookupItem = GetAttributeData(formContext, "record2id");
			if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {
				connectToEntityType = connectToNameLookupItem[0].entityType;
			}

			if (connectToEntityType === "account") {
				formContext.getControl("record2id").setEntityTypes(["account"]);
				filterConnectToLookup(executionContext, "account");
			} else if (connectToEntityType === "contact") {
				formContext.getControl("record2id").setEntityTypes(["contact"]);
				filterConnectToLookup(executionContext, "contact");
			}
		}

	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "An error occurred while OnLoadConnection"
		});
	}
}

/// <summary>
/// Show Is win, Is payer, Price fields if Connected From is of type opportunity else hide them
/// </summary>
/// <param name="executionContext">Execution Context</param>
function EnableOpportunityFields(executionContext) {
	"use strict";
	try {
		var entityType;
		if (executionContext === null || executionContext === undefined)
			return;
		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;
		var connectedFrom = formContext.getAttribute("record1id").getValue();
		if (connectedFrom !== null) {
			entityType = connectedFrom[0].entityType;
		}
		var fields = ["negt_ispayer", "negt_iswin"];
		if (connectedFrom === null || connectedFrom === undefined || entityType !== "opportunity") {
			ShowOrHideFields(executionContext, fields, false);
		} else {
			ShowOrHideFields(executionContext, fields, true);
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "An error occurred while EnableOpportunityFields"
		});
	}
}

/// <summary>
/// Common function to show or hide any field
/// </summary>
/// <param name="executionContext">Execution Context</param>
/// <param name="fields">Fields array to show or hide</param>
/// <param name="value">Value true to show or false to hide the field</param>
function ShowOrHideFields(executionContext, fields, value) {
	"use strict";
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		for (var f = 0; f < fields.length; f++) {
			var control = executionContext.getFormContext().getControl(fields[f].toLowerCase());
			if (control !== null || control !== undefined) {
				executionContext.getFormContext().getControl(fields[f].toLowerCase()).setVisible(value);
			}
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "Error Occured while ShowOrHideFields in constant js"
		});
	}
}

/// <summary>
/// function to approve the account as primary connection
/// </summary>
/// <param name="executionContext">Execution Context</param>
function OnChangeOfPrimaryConnection(executionContext) {
	"use strict";
	try {
		var primaryAttributeName = "negt_iswin";
		var recordToRoleAttributeName = "record2roleid";
		var connectionAttributeName = "record2id";
		var opportunityAttributeName = "record1id";
		var payerAttributeName = "negt_ispayer";

		if (executionContext === null || executionContext === undefined)
			return;

		var globalContext = Xrm.Utility.getGlobalContext();
		if (globalContext === null || globalContext === undefined)
			return;

		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;

		var formType = formContext.ui.getFormType();
		var primaryOptionValue = formContext.getAttribute(primaryAttributeName).getValue();
		var payerOptionValue = formContext.getAttribute(payerAttributeName).getValue();

		//On Create Form
		if (formType === 1) {
			var roleToGuid;
			var roleTolookupItem = GetAttributeData(formContext, recordToRoleAttributeName);

			if (roleTolookupItem !== null && roleTolookupItem !== undefined) {
				roleToGuid = roleTolookupItem[0].id.slice(1, 37);
			}
			var relatedOpportunityId;
			var connectedFromEntityType;
			var relatedOpportunitylookupItem = GetAttributeData(formContext, opportunityAttributeName);

			if (relatedOpportunitylookupItem !== null && relatedOpportunitylookupItem !== undefined) {
				relatedOpportunityId = relatedOpportunitylookupItem[0].id.slice(1, 37);
				connectedFromEntityType = relatedOpportunitylookupItem[0].entityType; ;
			}
			var connectToEntityType;
			var connectToNameLookupItem = GetAttributeData(formContext, connectionAttributeName);
			if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {
				connectToEntityType = connectToNameLookupItem[0].entityType;
			}
			var primaryConnectionCount;
			var PrimaryConnectionGuid;
			var isPayer;
			var resultAPI;
			if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && roleTolookupItem !== null) {
				resultAPI = ConnectionRetrieveAPI(globalContext, roleToGuid, relatedOpportunityId);
				primaryConnectionCount = resultAPI["@odata.count"];
				if (primaryConnectionCount === 1) {
					PrimaryConnectionGuid = resultAPI.value[0]["connectionid"];
					isPayer = resultAPI.value[0]["negt_ispayer"];
				}
			}
			if (primaryConnectionCount === 1 && primaryOptionValue === true) {
				var winOptionValue = false;
				var payerOptionValue = false;
				if (isPayer) {
					payerOptionValue = false;
					formContext.getAttribute("negt_ispayer").setValue(isPayer);
				}
				ConfirmationDialogAction(globalContext, PrimaryConnectionGuid, winOptionValue, formContext, payerOptionValue);
			}
		}

		//On Update Form
		if (formType === 2 && primaryOptionValue === true) {
			var primaryRecordConnectionGuid = null;
			var isPayer;
			var currentConnectionId = formContext.data.entity.getId().slice(1, 37);

			var roleToGuid;
			var roleTolookupItem = GetAttributeData(formContext, recordToRoleAttributeName);

			if (roleTolookupItem !== null && roleTolookupItem !== undefined) {
				roleToGuid = roleTolookupItem[0].id.slice(1, 37);
			}
			var relatedOpportunityId,
			connectToEntityType,
			connectedFromEntityType,
			relatedConnectedToId;

			var relatedOpportunitylookupItem = GetAttributeData(formContext, opportunityAttributeName);

			if (relatedOpportunitylookupItem !== null && relatedOpportunitylookupItem !== undefined) {
				relatedOpportunityId = relatedOpportunitylookupItem[0].id.slice(1, 37);
				connectedFromEntityType = relatedOpportunitylookupItem[0].entityType;
			}

			var connectToNameLookupItem = GetAttributeData(formContext, connectionAttributeName);
			if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {
				connectToEntityType = connectToNameLookupItem[0].entityType;
				relatedConnectedToId = connectToNameLookupItem[0].id.slice(1, 37);
			}

			var recordcount;

			if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && roleTolookupItem !== null) {
				var results = ConnectionRetrieveAPI(globalContext, roleToGuid, relatedOpportunityId);
				recordcount = results["@odata.count"];
				if (recordcount === 1) {
					primaryRecordConnectionGuid = results.value[0]["connectionid"];
					isPayer = results.value[0]["negt_ispayer"];
				}
			}
			if (primaryRecordConnectionGuid !== null && primaryRecordConnectionGuid !== undefined) {
				if (currentConnectionId !== primaryRecordConnectionGuid.toUpperCase()) {
					//var winOptionValue = true;
					var winOptionValue = false;
					var payerOptionValue = false;
					if (isPayer) {
						payerOptionValue = false;
						formContext.getAttribute("negt_ispayer").setValue(isPayer);
					}
					ConfirmationDialogAction(globalContext, primaryRecordConnectionGuid, winOptionValue, formContext, payerOptionValue);
				}
			}
		}
		if (formType === 2 && primaryOptionValue === false) {
			var primaryRecordConnectionGuid = null;
			var currentConnectionId = formContext.data.entity.getId().slice(1, 37);

			var roleToGuid;
			var roleTolookupItem = GetAttributeData(formContext, recordToRoleAttributeName);

			if (roleTolookupItem !== null && roleTolookupItem !== undefined) {
				roleToGuid = roleTolookupItem[0].id.slice(1, 37);
			}
			var relatedOpportunityId,
			connectToEntityType,
			connectedFromEntityType;
			var relatedOpportunitylookupItem = GetAttributeData(formContext, opportunityAttributeName);

			if (relatedOpportunitylookupItem !== null && relatedOpportunitylookupItem !== undefined) {
				relatedOpportunityId = relatedOpportunitylookupItem[0].id.slice(1, 37);
				connectedFromEntityType = relatedOpportunitylookupItem[0].entityType;
			}

			var connectToNameLookupItem = GetAttributeData(formContext, connectionAttributeName);
			if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {
				connectToEntityType = connectToNameLookupItem[0].entityType;
			}

			var recordcount;

			if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && roleTolookupItem !== null) {
				var results = ConnectionRetrieveAPI(globalContext, roleToGuid, relatedOpportunityId);
				recordcount = results["@odata.count"];
				if (recordcount === 1) {
					primaryRecordConnectionGuid = results.value[0]["connectionid"];
				}
			}
			//if (primaryRecordConnectionGuid !== null && primaryRecordConnectionGuid !== undefined) {
			//    if (currentConnectionId !== primaryRecordConnectionGuid.toUpperCase()) {
			//        Xrm.Navigation.openAlertDialog({ text: GetMessageText("M61") });
			//        formContext.getAttribute("negt_iswin").setValue(true);
			//    }
			// }
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "Error Occured while OnChangeOfPrimaryConnection executing...."
		});
	}
}

/// <summary>
/// Common function to retrieve the value from the field
/// </summary>
/// <param name="executionContext">Execution Context</param>
/// <param name="attributeName">Attribute Schema Name</param>
function GetAttributeData(executionFormCtx, attributeName) {
	"use strict";
	var returnValue = executionFormCtx.getAttribute(attributeName).getValue();
	return returnValue;
}

/// <summary>
/// Common function to Show the Confirmation Dialog
/// </summary>
/// <param name="contextURL">Global Context</param>
/// <param name="connectionGuid">Connection Guid</param>
/// <param name="optionValue">Primary Option Value</param>
/// <param name="formContext">Form Context</param>
function ConfirmationDialogAction(contextURL, connectionGuid, optionValue, formContext, payerOption) {
	"use strict";
	var exMsg = "";
	var exMsgCancelbtn = "";
	var exMsgApprovbtn = "";
	var exMsgSubtitle = "";
	if (typeof(Storage) !== "undefined") {
		exMsg = sessionStorage.getItem("M59");
		exMsgCancelbtn = sessionStorage.getItem("M96");
		exMsgApprovbtn = sessionStorage.getItem("M95");
		exMsgSubtitle = sessionStorage.getItem("M97");
	} else {
		exMsg = GetMessageText("M59");
		exMsgCancelbtn = GetMessageText("M96");
		exMsgApprovbtn = GetMessageText("M95");
		exMsgSubtitle = GetMessageText("M97");
	}

	if (exMsg === "" || exMsg === null) {
		exMsg = GetMessageText("M59");
	}

	if (exMsgCancelbtn === "" || exMsgCancelbtn === null) {
		exMsgCancelbtn = GetMessageText("M96");
	}
	if (exMsgApprovbtn === "" || exMsgApprovbtn === null) {
		exMsgApprovbtn = GetMessageText("M95");
	}
	if (exMsgSubtitle === "" || exMsgSubtitle === null) {
		exMsgSubtitle = GetMessageText("M97");
	}

	var confirmStrings = {
		title: "Information",
		text: exMsg,
		subtitle: exMsgSubtitle,
		confirmButtonLabel: exMsgApprovbtn,
		cancelButtonLabel: exMsgCancelbtn
	};
	var confirmOptions = {
		height: 200,
		width: 450
	};
	//Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(successCallback, errorCallback);
	Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success) {
		if (success.confirmed) {
			var entity = {};
			entity.negt_iswin = optionValue;

			if (payerOption !== undefined && payerOption !== null && payerOption !== '') {
				entity.negt_ispayer = payerOption;
			}

			var req = new XMLHttpRequest();
			req.open("PATCH", contextURL.getClientUrl() + "/api/data/v9.1/connections(" + connectionGuid + ")", false);
			req.setRequestHeader("OData-MaxVersion", "4.0");
			req.setRequestHeader("OData-Version", "4.0");
			req.setRequestHeader("Accept", "application/json");
			req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
			req.onreadystatechange = function () {
				if (this.readyState === 4) {
					req.onreadystatechange = null;
					if (this.status === 204) {
						//Success - No Return Data - Do Something
					} else {
						Xrm.Navigation.openAlertDialog(this.statusText);
					}
				}
			};
			req.send(JSON.stringify(entity));
		} else {
			formContext.getAttribute("negt_iswin").setValue(false);
			formContext.getAttribute("negt_ispayer").setValue(false);
		}
	}, function () {
		formContext.getAttribute("negt_iswin").setValue(false);
		formContext.getAttribute("negt_ispayer").setValue(false);
	});
}

/// <summary>
/// Common function to retrive WebAPI
/// </summary>
/// <param name="contextURL">Global Context</param>
/// <param name="roleGuid">Connection Role Guid</param>
/// <param name="relatedOpportunityId">Connected From Guid</param>

function ConnectionRetrieveAPI(contextURL, roleGuid, relatedOpportunityId) {
	"use strict";
	var results = null;
	var req = new XMLHttpRequest();
	req.open("GET", contextURL.getClientUrl() + "/api/data/v9.1/connections?$select=connectionid,negt_ispayer&$filter=negt_iswin eq true  and  statecode eq 0 and  _record2roleid_value eq " + roleGuid + " and  _record1id_value eq " + relatedOpportunityId + " and  record2objecttypecode eq 1 &$count=true", false);
	req.setRequestHeader("OData-MaxVersion", "4.0");
	req.setRequestHeader("OData-Version", "4.0");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
	req.onreadystatechange = function () {
		if (this.readyState === 4) {
			req.onreadystatechange = null;
			if (this.status === 200) {
				results = JSON.parse(this.response);

			} else {
				Xrm.Navigation.openAlertDialog({
					text: this.statusText
				});

			}
		}
	};
	req.send();
	return results;
}

// function to trigger on save of connection
/// <summary>
/// function to prevent saving two connections with Primary No for same role
/// </summary>
/// <param name="executionContext">Execution Context</param>
// function to trigger on save of connection
/// <summary>
/// function to prevent saving two connections with Primary No for the same role
/// </summary>
/// <param name="executionContext">Execution Context</param>
function OnSaveOfConnection(executionContext) {
	"use strict";
	var primaryAttributeName = "negt_iswin";
	var recordToRoleAttributeName = "record2roleid";
	var connectionAttributeName = "record2id";
	var opportunityAttributeName = "record1id";
	var isPayerOptionName = "negt_ispayer";
	
	var isPayerSessionFlag=sessionStorage.getItem("IsPayerFlag");
	if(isPayerSessionFlag!==null && isPayerSessionFlag!==undefined)
	{
		if(isPayerSessionFlag==="1") 
		{
			sessionStorage.setItem("IsPayerFlag","0");
			return;
		}
	}
	
	var abc=executionContext.getEventArgs().isDefaultPrevented();
	console.log("Save Mode is "+abc);
    var eventArgs = executionContext.getEventArgs();
	console.log("Save Mode is "+eventArgs.getSaveMode());
	
	if (executionContext === null || executionContext === undefined)
		return;

	var globalContext = Xrm.Utility.getGlobalContext();
	if (globalContext === null || globalContext === undefined)
		return;

	var formContext = executionContext.getFormContext();
	if (formContext === null || formContext === undefined)
		return;
	var formType = formContext.ui.getFormType();
	var primaryOptionValue = formContext.getAttribute(primaryAttributeName).getValue();
	var primaryOptionValue = formContext.getAttribute(primaryAttributeName).getValue();
	var isPayerOptionValue = GetAttributeData(formContext, isPayerOptionName);
	var roleToGuid;
	var roleTolookupItem = GetAttributeData(formContext, recordToRoleAttributeName);

	if (roleTolookupItem !== null && roleTolookupItem !== undefined) {
		roleToGuid = roleTolookupItem[0].id.slice(1, 37);
	}

	var relatedOpportunityId,
	connectedFromEntityType,
	connectToEntityType,
	connectToEntityId;
	var relatedOpportunitylookupItem = GetAttributeData(formContext, opportunityAttributeName);

	if (relatedOpportunitylookupItem !== null && relatedOpportunitylookupItem !== undefined) {
		relatedOpportunityId = relatedOpportunitylookupItem[0].id.slice(1, 37);
		connectedFromEntityType = relatedOpportunitylookupItem[0].entityType;
	}
	var connectToNameLookupItem = GetAttributeData(formContext, connectionAttributeName);
	if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {

		connectToEntityType = connectToNameLookupItem[0].entityType;
		connectToEntityId = connectToNameLookupItem[0].id.slice(1, 37);
	}

	var primaryConnectionCount;
	var totalConnectionCount;

	if (connectedFromEntityType = "opportunity") {
		if (connectToEntityType !== "account" && connectToEntityType !== "contact") {
			var exMsg = "";
			exMsg = GetMessageText("M78");
			Xrm.Navigation.openAlertDialog({
				text: exMsg
			});
			formContext.getAttribute(connectionAttributeName).setValue(null);
			executionContext.getEventArgs().preventDefault();

		}
	}

	if (formType === 1) {
		if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && isPayerOptionValue === true) {
			IsPayerYesAlertCreate(relatedOpportunityId, globalContext, executionContext, formType);
		}

		if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && roleTolookupItem !== null && primaryOptionValue === false) {
			var results = ConnectionRetrieveAPI(globalContext, roleToGuid, relatedOpportunityId);
			primaryConnectionCount = results["@odata.count"];
			var results1 = TotalConnectionRetrieveAPI(globalContext, roleToGuid, relatedOpportunityId);
			totalConnectionCount = results1["@odata.count"];
			if (totalConnectionCount === 1 && primaryConnectionCount === 0) {
				var exMsg = "";
				var exMsgCancelbtn = "";
				var exMsgApprovbtn = "";
				var exMsgSubtitle = "";

				if (typeof(Storage) !== "undefined") {
					exMsg = sessionStorage.getItem("M60");
					exMsgCancelbtn = sessionStorage.getItem("M96");
					exMsgApprovbtn = sessionStorage.getItem("M95");
					exMsgSubtitle = sessionStorage.getItem("M97");
				} else {
					exMsg = GetMessageText("M60");
					exMsgCancelbtn = GetMessageText("M96");
					exMsgApprovbtn = GetMessageText("M95");
					exMsgSubtitle = GetMessageText("M97");
				}

				if (exMsg === "" || exMsg === null) {
					exMsg = GetMessageText("M60");
				}

				if (exMsgCancelbtn === "" || exMsgCancelbtn === null) {
					exMsgCancelbtn = GetMessageText("M96");
				}

				if (exMsgApprovbtn === "" || exMsgApprovbtn === null) {
					exMsgApprovbtn = GetMessageText("M95");
				}
				if (exMsgSubtitle === "" || exMsgSubtitle === null) {
					exMsgSubtitle = GetMessageText("M97");
				}

				executionContext.getEventArgs().preventDefault();
				var confirmStrings = {
					title: "Information",
					text: exMsg,
					subtitle: exMsgSubtitle,
					confirmButtonLabel: exMsgApprovbtn,
					cancelButtonLabel: exMsgCancelbtn
				};
				var confirmOptions = {
					height: 200,
					width: 450
				};
				//Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(successCallback, errorCallback);
				Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success) {
					if (success.confirmed) {
						formContext.getAttribute("negt_iswin").setValue(true);
					} else {
						formContext.getAttribute("negt_iswin").setValue(false);
					}
				}, function () {
					formContext.getAttribute("negt_iswin").setValue(false);
				});

			}
		}
	}
	if (formType === 2) {
		var connectionId = formContext.data.entity.getId().slice(1, 37);

		if (connectToEntityType === "account" && connectedFromEntityType === "opportunity" && isPayerOptionValue === true) {
			IsPayerYesAlertUpdate(relatedOpportunityId, globalContext, connectionId, executionContext, formType);
		}
	}
}

/// <summary>
/// function to retrive WebAPI(retrieves total count of connections for a particular role)
/// </summary>
/// <param name="contextURL">Global Context</param>
/// <param name="roleGuid">Connection Role Guid</param>
/// <param name="relatedOpportunityId">Connected From Guid</param>
function TotalConnectionRetrieveAPI(contextURL, roleGuid, relatedOpportunityId) {
	"use strict";
	var results1 = null;
	var req = new XMLHttpRequest();
	req.open("GET", contextURL.getClientUrl() + "/api/data/v9.1/connections?$filter=record2objecttypecode eq 1  and  statecode eq 0 and  _record2roleid_value eq " + roleGuid + " and  _record1id_value eq " + relatedOpportunityId + "&$count=true", false);
	req.setRequestHeader("OData-MaxVersion", "4.0");
	req.setRequestHeader("OData-Version", "4.0");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
	req.onreadystatechange = function () {
		if (this.readyState === 4) {
			req.onreadystatechange = null;
			if (this.status === 200) {
				results1 = JSON.parse(this.response);

			} else {
				Xrm.Navigation.openAlertDialog({
					text: this.statusText
				});
			}
		}
	};
	req.send();
	return results1;
}

/// <summary>
/// function to show alert when changing Is Payer field
/// </summary>
/// <param name="executionContext">Execution Context</param>
function OnChangeOfIsPayer(executionContext) {
	"use strict";
	if (executionContext === null || executionContext === undefined)
		return;
	var formContext = executionContext.getFormContext();
	if (formContext === null || formContext === undefined)
		return;

	var globalContext = Xrm.Utility.getGlobalContext();
	if (globalContext === null || globalContext === undefined)
		return;

	var connectionAttributeName = "record2id";
	var isPayerOptionName = "negt_ispayer";
	var isPayerOptionValue = GetAttributeData(formContext, isPayerOptionName);
	var connectedAccountId = null;
	var connectedRecordEntityType = null;
	var connectToNameLookupItem = GetAttributeData(formContext, connectionAttributeName);
	if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined) {
		connectedAccountId = connectToNameLookupItem[0].id.slice(1, 37);
		connectedRecordEntityType = connectToNameLookupItem[0].entityType;
	}

	var accountType;
	var mkDenial;
	if (isPayerOptionValue === true && connectedRecordEntityType === "account") {
		var result = RetrieveConnectedAccountDetails(globalContext, connectedAccountId);
		accountType = result["accountcategorycode"];
		mkDenial = result["negt_mkdenialcode"];
		if (accountType === 10000 && mkDenial !== 10001) {
			var exMsg = "";
			if (typeof(Storage) !== "undefined") {
				exMsg = sessionStorage.getItem("M49");
			} else {
				exMsg = GetMessageText("M49");
			}
			if (exMsg === "" || exMsg === null) {
				exMsg = GetMessageText("M49");
			}
			Xrm.Navigation.openAlertDialog({
				text: exMsg
			});
			formContext.getAttribute(isPayerOptionName).setValue(false);
		}
		if (accountType !== 10000 && mkDenial === 10001) {
			var exMsg = "";
			if (typeof(Storage) !== "undefined") {
				exMsg = sessionStorage.getItem("M50");
			} else {
				exMsg = GetMessageText("M50");
			}
			if (exMsg === "" || exMsg === null) {
				exMsg = GetMessageText("M50");
			}
			Xrm.Navigation.openAlertDialog({
				text: exMsg
			});
			formContext.getAttribute(isPayerOptionName).setValue(false);
		}
		if (accountType === 10000 && mkDenial === 10001) {
			var exMsg = "";
			if (typeof(Storage) !== "undefined") {
				exMsg = sessionStorage.getItem("M51");
			} else {
				exMsg = GetMessageText("M51");
			}
			if (exMsg === "" || exMsg === null) {
				exMsg = GetMessageText("M51");
			}
			Xrm.Navigation.openAlertDialog({
				text: exMsg
			});
			formContext.getAttribute(isPayerOptionName).setValue(false);
		}
	}
}

/// <summary>
/// function to retrieve Connected account details
/// </summary>
/// <param name="globalContext">Global Context</param>
/// <param name="connectedAccountId">Connected Account Guid</param>
function RetrieveConnectedAccountDetails(globalContext, connectedAccountId) {
	"use strict";
	var result = null;
	var req = new XMLHttpRequest();
	req.open("GET", globalContext.getClientUrl() + "/api/data/v9.1/accounts(" + connectedAccountId + ")?$select=accountcategorycode,negt_mkdenialcode", false);
	req.setRequestHeader("OData-MaxVersion", "4.0");
	req.setRequestHeader("OData-Version", "4.0");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
	req.onreadystatechange = function () {
		if (this.readyState === 4) {
			req.onreadystatechange = null;
			if (this.status === 200) {
				result = JSON.parse(this.response);
			} else {
				Xrm.Navigation.openAlertDialog({
					text: this.statusText
				});
			}
		}
	};
	req.send();
	return result;
}

/// <summary>
/// common function to retrieve the data through api call
/// </summary>
/// <param name="query">Query to pass in api call</param>
function GetData(query) {
	"use strict";
	try {
		var data = {};
		var serverURL = Xrm.Utility.getGlobalContext().getClientUrl();
		var req = new XMLHttpRequest();
		req.open("GET", serverURL + "/api/data/v9.1/" + query, false);
		req.setRequestHeader("Accept", "application/json");
		req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
		req.setRequestHeader("OData-MaxVersion", "4.0");
		req.setRequestHeader("OData-Version", "4.0");
		req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
		req.onreadystatechange = function () {
			if (this.readyState === 4) {
				req.onreadystatechange = null;
				if (this.status === 200) {
					data = JSON.parse(this.responseText);
					return data;
				} else {
					var error = JSON.parse(this.responseText).error;
					Xrm.Navigation.openAlertDialog({
						text: error.message
					});
				}
			}
		};
		req.send();
		return data;
	} catch (error) {
		var exMsg = "";
		if (typeof(Storage) !== "undefined") {
			exMsg = sessionStorage.getItem("M8");
		} else {
			exMsg = GetMessageText("M8");
		}
		if (exMsg === "" || exMsg === null) {
			exMsg = GetMessageText("M8");
		}
		Xrm.Navigation.openAlertDialog({
			text: exMsg
		});
	}
}

/// <summary>
/// Common function to retrieve the messages to be displayed while alerting
/// </summary>
/// <param name="msgKey">Message Key</param>
function GetMessageText(msgKey) {
	"use strict";
	try {
		var userId = Xrm.Utility.getGlobalContext().userSettings.userId;
		userId = userId.replace("{", "");
		userId = userId.replace("}", "");
		var query = "usersettingscollection(" + userId + ")?$select=uilanguageid";
		var userData = GetData(query);
		if (userData !== null && userData !== undefined) {
			var langCode = userData.uilanguageid;
            var defaultLangCode = 1033;
			var langQuery = "negt_multilingualconfigurations?$select=negt_languagecode,negt_message,negt_messagekey,negt_multilingualconfigurationid,negt_name&$filter=negt_languagecode eq '" + langCode + "' and  negt_messagekey eq '" + msgKey + "'";
			var langData = GetData(langQuery);
			if (langData !== null && langData !== undefined && langData.value.length > 0) {
				return langData.value[0].negt_message;
			}
            else{
                var defaultLangQuery = "negt_multilingualconfigurations?$select=negt_languagecode,negt_message,negt_messagekey,negt_multilingualconfigurationid,negt_name&$filter=negt_languagecode eq '" + defaultLangCode + "' and  negt_messagekey eq '" + msgKey + "'";
                var defaultLangData = GetData(defaultLangQuery);
                if (defaultLangData !== null && defaultLangData !== undefined && defaultLangData.value.length > 0) {
                    return defaultLangData.value[0].negt_message;
                }
            }
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "An error occurred while GetMessageText."
		});
	}
}

/// <summary>
/// On Change of Account lock set/clear is payer accordingly and check for denied accounts
/// </summary>
/// <param name="executionContext">executionContext</param>
function OnChangeOfAccount(executionContext) {
	"use strict";
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;

		var globalContext = Xrm.Utility.getGlobalContext();
		if (globalContext === null || globalContext === undefined)
			return;
		var isPayerOptionName = "negt_ispayer";
		var connectToNameLookupItem = GetAttributeData(formContext, "record2id");
		var stateCode = GetAttributeData(formContext, "statecode");
		if (connectToNameLookupItem !== null && connectToNameLookupItem !== undefined && stateCode === 0) {
			var connectedId = connectToNameLookupItem[0].id.slice(1, 37);
			var connectedRecordEntityType = connectToNameLookupItem[0].entityType;

			var connectFromNameLookupItem = GetAttributeData(formContext, "record1id");
			if (connectFromNameLookupItem !== null && connectFromNameLookupItem !== undefined) {
				var connectedFromRecordEntityType = connectFromNameLookupItem[0].entityType;
				if (connectedFromRecordEntityType === "opportunity") {
					if (connectedRecordEntityType === "account") {

						formContext.getControl(isPayerOptionName).setDisabled(false);

						var result = RetrieveConnectedAccountDetails(globalContext, connectedId);
						CheckDeniedCode(result, formContext, true);
					} else if (connectedRecordEntityType === "contact") {
						SetIsPayerForContact(formContext);

						//retrieve account and check for denied code
						var contactResult = GetData("contacts(" + connectedId + ")?$select=_parentcustomerid_value");
						if (contactResult !== null) {
							var accId = contactResult["_parentcustomerid_value"];
							if (accId !== null) {
								var accResult = RetrieveConnectedAccountDetails(globalContext, accId);
								CheckDeniedCode(accResult, formContext, false);
							}
						}
					}
				}
			}
			if (connectedRecordEntityType === "account") {
				OnChangeOfIsPayer(executionContext);
			}
		}
	} catch (e) {
		var exMsg = "";
		if (typeof(Storage) !== "undefined") {
			exMsg = sessionStorage.getItem("M62");
		} else {
			exMsg = GetMessageText("M62");
		}
		if (exMsg === "" || exMsg === null) {
			exMsg = GetMessageText("M62");
		}
		Xrm.Navigation.openAlertDialog({
			text: exMsg
		});
	}
}

/// <summary>
///  check for denied accounts
/// </summary>
/// <param name="executionContext">executionContext</param>
function CheckDeniedCode(result, formContext, accFlag) {
	"use strict";
	try {
		if (result !== null || result !== undefined) {
			var mkDenialCode = result["negt_mkdenialcode"];
			if (mkDenialCode === 10001) //denied
			{
				var exMsg = "";
				if (typeof(Storage) !== "undefined") {
					if (accFlag) {
						exMsg = sessionStorage.getItem("M63");
					} else {
						exMsg = sessionStorage.getItem("M68");
					}
				} else {
					if (accFlag) {
						exMsg = GetMessageText("M63");
					} else {
						exMsg = sessionStorage.getItem("M68");
					}
				}
				if (exMsg === "" || exMsg === null) {
					if (accFlag) {
						exMsg = GetMessageText("M63");
					} else {
						exMsg = sessionStorage.getItem("M68");
					}
				}
				Xrm.Navigation.openAlertDialog({
					text: exMsg
				});
				formContext.getAttribute("record2id").setValue(null);
			}
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "An error occurred in CheckDeniedCode"
		});
	}
}

/// <summary>
/// Set Cache For Multilingual Messages
/// </summary>
/// <param name="executionContext">executionContext</param>
function SetCacheForMultilingualMessages() {
	"use strict";
	try {
		if (typeof(Storage) !== "undefined") {
			var arrAccountMessages = ["M8", "M49", "M50", "M51", "M59", "M60", "M62", "M63", "M68", "M84", "M94", "M95", "M96", "M97", "M128", "M129", "M146"];
			// Get the data from cache using user-specific cache key
			for (var j = 0; j < arrAccountMessages.length; j++) {
				var res = sessionStorage.getItem(arrAccountMessages[j]);
				if (res === null || res === undefined) {
					var msgText = GetMessageText(arrAccountMessages[j]);
					sessionStorage.setItem(arrAccountMessages[j], msgText);
				}
			}
		}
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "An error occurred in SetCacheForMultilingualMessages"
		});
	}
}

/// <summary>
/// Fuction to restrict setting up 'Payer'- Keep value as No and read-only." for connection with contacts
/// </summary>
/// <param name="msgKey">Message Key</param>
//Fuction to restrict setting up 'Payer'- Keep value as No and read-only." for connection with contacts
function SetIsPayerForContact(formContext) {
	"use strict";
	var isPayerOptionName = "negt_ispayer";
	formContext.getAttribute(isPayerOptionName).setValue(false);
	formContext.getControl(isPayerOptionName).setDisabled(true);
}

/// <summary>
/// function to retrieve the total count of connections with Is payer = Yes (for account) from a particular opportunity.
/// </summary>
/// <param name="msgKey">Message Key</param>
function IsPayerYesAlertCreate(relatedOpportunityId, globalContext, executionContext, formType) {

	"use strict";
	var recordCount = 0;
	var connectGuid = null;
	//var accountId = null;
	//var recordToRoleId = null;
	var formContext = executionContext.getFormContext();
	if (formContext === null || formContext === undefined)
		return;

	var exMsg = "";
	var exMsgCancelbtn = "";
	var exMsgApprovbtn = "";
	var exMsgSubtitle = "";

	if (typeof(Storage) !== "undefined") {
		exMsg = sessionStorage.getItem("M84");
		exMsgCancelbtn = sessionStorage.getItem("M96");
		exMsgApprovbtn = sessionStorage.getItem("M95");
		//exMsgSubtitle = sessionStorage.getItem("M94");
	} else {
		exMsg = GetMessageText("M84");
		exMsgCancelbtn = GetMessageText("M96");
		exMsgApprovbtn = GetMessageText("M95");
		//exMsgSubtitle = GetMessageText("M94");
	}

	if (exMsgCancelbtn === "" || exMsgCancelbtn === null) {
		exMsgCancelbtn = GetMessageText("M96");
	}
	if (exMsgApprovbtn === "" || exMsgApprovbtn === null) {
		exMsgApprovbtn = GetMessageText("M95");
	}
	// if (exMsgSubtitle === "" || exMsgSubtitle === null) {
	// 	exMsgSubtitle = GetMessageText("M97");
	// }
	var confirmStrings = {
		title: "Information",
		//text: exMsg,
		subtitle: exMsg,
		confirmButtonLabel: exMsgApprovbtn,
		cancelButtonLabel: exMsgCancelbtn
	};
	var confirmOptions = {
		height: 100,
		width: 450
	};

	//var isPayerOptionName = "negt_ispayer";
	//Get count of Payer Account Connection
	var req = new XMLHttpRequest();
	req.open("GET", globalContext.getClientUrl() + "/api/data/v9.1/connections?$filter=_record1id_value eq " + relatedOpportunityId + " and  negt_ispayer eq true  and  statecode eq 0 and  record2objecttypecode eq 1&$count=true", false);
	req.setRequestHeader("OData-MaxVersion", "4.0");
	req.setRequestHeader("OData-Version", "4.0");
	req.setRequestHeader("Accept", "application/json");
	req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
	req.onreadystatechange = function () {
		if (this.readyState === 4) {
			req.onreadystatechange = null;
			if (this.status === 200) {
				var results = JSON.parse(this.response);
				if (results !== undefined) {

					recordCount = results["@odata.count"];

					for (var i = 0; i < results.value.length; i++) {
						connectGuid = results.value[i]["connectionid"];
					}
				}
			} else {
				Xrm.Navigation.openAlertDialog({
					text: this.statusText
				});
			}
		}
	};
	req.send();
	//If Is Payer Account Connection Present, confirmation to set new payer account
	if (formType === 1 && recordCount === 1 && connectGuid !== null) {

		executionContext.getEventArgs().preventDefault();
		Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success) {
			if (success.confirmed) {

				var entity = {};
				entity.negt_ispayer = false;

				var req = new XMLHttpRequest();
				req.open("PATCH", globalContext.getClientUrl() + "/api/data/v9.1/connections(" + connectGuid + ")", false);
				req.setRequestHeader("OData-MaxVersion", "4.0");
				req.setRequestHeader("OData-Version", "4.0");
				req.setRequestHeader("Accept", "application/json");
				req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
				req.setRequestHeader("If-Match", "*");
				req.onreadystatechange = function () {
					if (this.readyState === 4) {
						req.onreadystatechange = null;
						if (this.status === 204) {
							//Success - No Return Data - Do Something
						} else {
							Xrm.Navigation.openAlertDialog({
								text: this.statusText
							});
						}
					}
				};
				req.send(JSON.stringify(entity));

				formContext.getAttribute("negt_ispayer").setValue(true);
				//formContext.data.entity.save();
				ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
				
			} else {
				//sessionStorage.setItem("IsPayerFlag","1");
				formContext.getAttribute("negt_ispayer").setValue(false);
				//formContext.data.save();
			}
		}, function () {
			formContext.getAttribute("negt_ispayer").setValue(false);
			//sessionStorage.setItem("IsPayerFlag","1");
			//formContext.data.save();
		});
	}
	//Confirmation to set payer account
	else if(formType === 1 && recordCount === 0 && connectGuid === null){
		executionContext.getEventArgs().preventDefault();
		Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success){
			if(success.confirmed){
				formContext.getAttribute("negt_ispayer").setValue(true);
				//formContext.data.entity.save();
				ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
			}else {
				formContext.getAttribute("negt_ispayer").setValue(false);
				//formContext.data.save();
			}
		}, function(){
			formContext.getAttribute("negt_ispayer").setValue(false);
			//formContext.data.save();
		});
	}
}

/// <summary>
/// Set Payer to only one account on update
/// </summary>
/// <param name="msgKey">Message Key</param>
function IsPayerYesAlertUpdate(relatedOpportunityId, globalContext, connectionId, executionContext, formType) {
	"use strict";
	var recordCount = 0;
	var connectGuid = null;
	var formContext = executionContext.getFormContext();
	if (formContext === null || formContext === undefined)
		return;
	var exMsg = "";
	var exMsgCancelbtn = "";
	var exMsgApprovbtn = "";
	var exMsgSubtitle = "";

	if (typeof(Storage) !== "undefined") {
		exMsg = sessionStorage.getItem("M84");
		exMsgCancelbtn = sessionStorage.getItem("M96");
		exMsgApprovbtn = sessionStorage.getItem("M95");
		//exMsgSubtitle = sessionStorage.getItem("M94");
	} else {

		exMsg = GetMessageText("M84");
		exMsgCancelbtn = GetMessageText("M96");
		exMsgApprovbtn = GetMessageText("M95");
		//exMsgSubtitle = GetMessageText("M94");
	}

	if (exMsgCancelbtn === "" || exMsgCancelbtn === null) {
		exMsgCancelbtn = GetMessageText("M96");
	}
	if (exMsgApprovbtn === "" || exMsgApprovbtn === null) {
		exMsgApprovbtn = GetMessageText("M95");
	}

		var confirmStrings = {
		title: "Information",
		//text: exMsg,
		subtitle: exMsg,
		confirmButtonLabel: exMsgApprovbtn,
		cancelButtonLabel: exMsgCancelbtn
	};
	var confirmOptions = {
		height: 100,
		width: 450
	};
	
	 var req = new XMLHttpRequest();
	 req.open("GET", globalContext.getClientUrl() + "/api/data/v9.1/connections?$filter=_record1id_value eq " + relatedOpportunityId + " and  negt_ispayer eq true  and  statecode eq 0 and  record2objecttypecode eq 1&$count=true", false);
	 req.setRequestHeader("OData-MaxVersion", "4.0");
	 req.setRequestHeader("OData-Version", "4.0");
	 req.setRequestHeader("Accept", "application/json");
	 req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
	 req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
	 req.onreadystatechange = function () {
		 if (this.readyState === 4) {
			 req.onreadystatechange = null;
			 if (this.status === 200) {
				 var results = JSON.parse(this.response);
				 if (results !== undefined) {
					 recordCount = results["@odata.count"];

					 for (var i = 0; i < results.value.length; i++) {
						 connectGuid = results.value[i]["connectionid"];
					 }
					
					ConfirmationForIsPayer(executionContext,formType,recordCount,connectionId,connectGuid,relatedOpportunityId,confirmStrings,confirmOptions);
				 }
			 } else {
				 Xrm.Navigation.openAlertDialog({
					 text: this.statusText
				 });
			 }
		 }
	 };
	 req.send();
}

function ConfirmationForIsPayer(executionContext,formType,recordCount,connectionId,connectGuid,relatedOpportunityId,confirmStrings,confirmOptions)
{
	try
	{
		var formContext = executionContext.getFormContext();
	var globalContext = Xrm.Utility.getGlobalContext();
		if (globalContext === null || globalContext === undefined)
			return;
		//If Is Payer Account Connection Present, confirmation to set new payer account
	if (formType === 2 && recordCount === 1 && connectionId !== null && connectGuid !== null) {
		if (connectGuid.toLowerCase() !== connectionId.toLowerCase()) {
			
			executionContext.getEventArgs().preventDefault();
			Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success) {
				if (success.confirmed) {

					var entity = {};
					entity.negt_ispayer = false;

					var req = new XMLHttpRequest();
					req.open("PATCH", globalContext.getClientUrl() + "/api/data/v9.1/connections(" + connectGuid + ")", false);
					req.setRequestHeader("OData-MaxVersion", "4.0");
					req.setRequestHeader("OData-Version", "4.0");
					req.setRequestHeader("Accept", "application/json");
					req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
					req.setRequestHeader("If-Match", "*");
					req.onreadystatechange = function () {
						if (this.readyState === 4) {
							req.onreadystatechange = null;
							if (this.status === 204) {
								//Success - No Return Data - Do Something
							} else {
								Xrm.Navigation.openAlertDialog({
									text: this.statusText
								});
							}
						}
					};
					req.send(JSON.stringify(entity));
                    
					formContext.getAttribute("negt_ispayer").setValue(true);
					
					ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
					
					var entity = {};
                    entity.negt_ispayer = true;
                    // var req = new XMLHttpRequest();
                    // req.open("PATCH", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/connections("+connectionId+")", false);
                    // req.setRequestHeader("OData-MaxVersion", "4.0");
                    // req.setRequestHeader("OData-Version", "4.0");
                    // req.setRequestHeader("Accept", "application/json");
                    // req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                    // req.onreadystatechange = function() {
                        // if (this.readyState === 4) {
                            // req.onreadystatechange = null;
                            // if (this.status === 204) {
								// ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
                                // //Success - No Return Data - Do Something
                            // } else {
                                // Xrm.Utility.alertDialog(this.statusText);
                            // }
                        // }
                    // };
                    // req.send(JSON.stringify(entity));
					
				} else {
					formContext.getAttribute("negt_ispayer").setValue(false);
					//sessionStorage.setItem("IsPayerFlag","1");
					//formContext.data.save();
				}
			}, function () {
				formContext.getAttribute("negt_ispayer").setValue(false);
				//sessionStorage.setItem("IsPayerFlag","1");
				//formContext.data.save();
			});
		}
		else
		{
			//formContext.data.save();
		}
	}
	//Confirmation to set payer account
	else if(formType === 2 && recordCount === 0 && connectionId !== null && connectGuid === null){
		//if (connectGuid.toLowerCase() !== connectionId.toLowerCase()) 
		{
			executionContext.getEventArgs().preventDefault();
		Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success){
			if(success.confirmed){

			formContext.getAttribute("negt_ispayer").setValue(true);
			ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
		 // var entity = {};
                    // entity.negt_ispayer = true;
		    // Xrm.WebApi.online.updateRecord("connection", connectionId, entity).then(
                        // function success(result) {
                            // var updatedEntityId = result.id;
							// ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
                        // },
                        // function(error) {
                            // Xrm.Utility.alertDialog(error.message);
                        // }
                    // );
		
				//ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId);
			}else {
				formContext.getAttribute("negt_ispayer").setValue(false);
				sessionStorage.setItem("IsPayerFlag","1");
				formContext.data.save();
			}
		}, function(){
			formContext.getAttribute("negt_ispayer").setValue(false);
			sessionStorage.setItem("IsPayerFlag","1");
			formContext.data.save();
		});
		}
	}
	else
	{
		//formContext.data.save();
	}
	}catch
	{
		
	}
}


function ChangeOpportuntiyBillingAddress(executionContext, globalContext, relatedOpportunityId){
	debugger;
	"use strict";
	try{

		//Get Account Payer Address
		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;
		var name = null;
		var address1_line1 = null;
		var address1_city = null;
		var address1_postalcode = null;
		var stateName = null;
		var stateId = null;
		var countryName = null;
		var countryId = null;
		
		var payerAccount = formContext.getAttribute("record2id");
		if(payerAccount !== null && payerAccount !== undefined){
			var payerAccountId = payerAccount.getValue()[0].id;
			payerAccountId = payerAccountId.replace("}", "");
			payerAccountId = payerAccountId.replace("{", "");
			var query = "accounts?$select=name,address1_city,address1_line1,address1_postalcode,_negt_countryid_value,_negt_stateid_value&$filter=accountid eq " + payerAccountId;
			var payerAccountAddress = GetData(query);
			if(payerAccountAddress !== null && payerAccountAddress !== undefined){
				if (payerAccountAddress.value !== undefined){
					if (payerAccountAddress.value.length > 0){
						name = payerAccountAddress.value[0]["name"];
						address1_line1 = payerAccountAddress.value[0]["address1_line1"];
						address1_city = payerAccountAddress.value[0]["address1_city"];
						address1_postalcode = payerAccountAddress.value[0]["address1_postalcode"];
						//Get countryid and countryname
						if (payerAccountAddress.value[0]["_negt_countryid_value"] !== null && payerAccountAddress.value[0]["_negt_countryid_value"] !== undefined) {
							countryId = payerAccountAddress.value[0]["_negt_countryid_value"];
							countryName = payerAccountAddress.value[0]["[email protected]"];
						}
						//Get stateid and statename
						if (payerAccountAddress.value[0]["_negt_stateid_value"] !== null && payerAccountAddress.value[0]["_negt_stateid_value"] !== undefined) {
							stateId = payerAccountAddress.value[0]["_negt_stateid_value"];
							stateName = payerAccountAddress.value[0]["[email protected]"];
						}
					}
				}
			}
		}

		var subtitleMsg = "";
		var cancelBtnLbl = "";
		var confirmBtnLbl = "";
		

		if (typeof(Storage) !== "undefined") {
			subtitleMsg = sessionStorage.getItem("M146");
			cancelBtnLbl = sessionStorage.getItem("M96");
			confirmBtnLbl = sessionStorage.getItem("M95");
		} else {
			subtitleMsg = sessionStorage.getItem("M146");
			cancelBtnLbl = sessionStorage.getItem("M96");
			confirmBtnLbl = sessionStorage.getItem("M95");
		}

		if (cancelBtnLbl === "" || cancelBtnLbl === null) {
			cancelBtnLbl = GetMessageText("M96");
		}
		if (confirmBtnLbl === "" || confirmBtnLbl === null) {
			confirmBtnLbl = GetMessageText("M95");
		}
		if (subtitleMsg === "" || subtitleMsg === null) {
			subtitleMsg = GetMessageText("M146");
		}

        var subTittleMsgArray = [];
        subTittleMsgArray = subtitleMsg.split(";");

        var res = "";

        //Show account name
		if(name === null){
			res = subTittleMsgArray[1].replace("@BillingName", "");
		}
		else{
			res = subTittleMsgArray[1].replace("@BillingName", name);
		}
		//Show account street 
        if(address1_line1 === null){
			res = res.replace("@Street", "");
		}
		else{
			res = res.replace("@Street", address1_line1);
		}
		//Show account city
		if(address1_city === null){
			res = res.replace("@City", "");
		}
		else{
			res = res.replace("@City", address1_city);
		}
		//Show account postal code
		if(address1_postalcode === null){
			res = res.replace("@Zip/Postal Code", "");
		}
		else{
			res = res.replace("@Zip/Postal Code", address1_postalcode);
		}
		//Show account state name
		if(stateName === null){
			res = res.replace("@State/Province", "");
		}
		else{
			res = res.replace("@State/Province", stateName);
		}
        //Show account country name
		if(countryName === null){
			res = res.replace("@County/Region", "");
		}
        else{
			res = res.replace("@County/Region", countryName);
		}
        
		var confirmStrings = {
			title: "Information",
			//text: "Payer Address : Name - "+name+"\nStreet - "+address1_line1+", City - "+address1_city+",\nPostal Code - "+address1_postalcode+",\nState - "+stateName+",\nCountry - "+countryName,
            text: res,
			subtitle: subTittleMsgArray[0],
			confirmButtonLabel: confirmBtnLbl,
			cancelButtonLabel: cancelBtnLbl
		};
		var confirmOptions = {
			height: 320,
			width: 450
		};
		Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(function (success){
			if(success.confirmed){
				console.log("Success....!!!");
				//Save connection record
				//formContext.data.entity.save();

				var entity = {};
				//Set billing name
				entity.negt_billingname = name;

				//Set billing site street
				entity.negt_billingstreet = address1_line1;

				//Set billing site city
				entity.negt_billingcity = address1_city;
				
				//Set billing site zip/postal code, if account zip/postal code is not null
				entity.negt_billingpostalcode = address1_postalcode;

				//Set billing site country, if account country is not null
				if(countryId !== null && countryId !== undefined){
					entity["[email protected]"] = "/negt_countries("+countryId+")";
					entity["negt_billingcountry"] = countryName;
				}
				else{
					entity["negt_billingcountryid"] = null;
					entity["negt_billingcountry"] = countryName;
				}
				//Set billing site state, if account state is not null
				if(stateId !== null && stateId !== undefined){
					entity["[email protected]"] = "/negt_states("+stateId+")";
					entity["negt_billingstateorprovince"] = stateName;
				}
				else{
					entity["negt_billingstateid"] = null;
					entity["negt_billingstateorprovince"] = stateName;
				}
				
				var req = new XMLHttpRequest();
				req.open("PATCH",  globalContext.getClientUrl() + "/api/data/v9.1/opportunities("+relatedOpportunityId+")", false);
				req.setRequestHeader("OData-MaxVersion", "4.0");
				req.setRequestHeader("OData-Version", "4.0");
				req.setRequestHeader("Accept", "application/json");
				req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
				req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
				req.onreadystatechange = function() {
					if (this.readyState === 4) {
						req.onreadystatechange = null;
						if (this.status === 204) {
							console.log("Opportunity Billing Address Update Successfull....!!!");
						} else {
							Xrm.Navigation.openAlertDialog({
								text: "Error in Opportunity Billing Address Update....!!"
							});
						}
					}
				};
				req.send(JSON.stringify(entity));
				sessionStorage.setItem("IsPayerFlag","1");
				formContext.data.entity.save();
			}
			else{
				//Save connection record
				sessionStorage.setItem("IsPayerFlag","1");
				formContext.data.save();
			}
		},function () {
				//formContext.getAttribute("negt_ispayer").setValue(false);
				sessionStorage.setItem("IsPayerFlag","1");
				formContext.data.save();
			});
	}
	catch(error){
		Xrm.Navigation.openAlertDialog({
			text: "Error occurred in ChangeOpportuntiyBillingAddress"
		});
	}
}

//nachiket
function ConnectionRoleFilter(executionContext) {
	"use strict";
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		var formContext = executionContext.getFormContext();
		if (formContext === null || formContext === undefined)
			return;
		var langCode = 1033;

		var userId = Xrm.Utility.getGlobalContext().userSettings.userId;
		userId = userId.replace("{", "");
		userId = userId.replace("}", "");
		var query = "usersettingscollection(" + userId + ")?$select=uilanguageid";
		var userData = GetData(query);
		if (userData !== null && userData !== undefined) {
			langCode = userData.uilanguageid;
		}

		var categoryValue = GetConfigurationKeyValue(langCode);

		if (categoryValue == null) {
			categoryValue = 1;
		}
		var queryRoles = "connectionroles?$filter=category eq " + categoryValue + "";
		var roleData = GetData(queryRoles);
		if (roleData !== null && roleData !== undefined) {
			if (roleData.value.length == 0) {
				categoryValue = 1;
			}
		}

		formContext.getControl("record2roleid").addPreSearch(function () {

			var fetchXml = "<filter type='and'><condition attribute='category' operator='eq' value='" + categoryValue + "' /></filter>";
			formContext.getControl("record2roleid").addCustomFilter(fetchXml);
		});

	} catch (e) {}
}

/// <summary>
/// GetConfigurationKeyValue
/// </summary>
/// <param name="executionContext">executionContext</param>
function GetConfigurationKeyValue(key) {
	"use strict";
	var configValue = null;
	try {
		var query = "negt_configurationentities?$select=negt_value&$filter=negt_name eq '" + key + "'";
		var configData = GetData(query);
		if (configData !== null && configData !== undefined) {
			if (configData.value !== undefined) {
				if (configData.value.length > 0) {
					if (configData.value[0]["negt_value"] !== null && configData.value[0]["negt_value"] !== undefined) {
						configValue = configData.value[0]["negt_value"];
					}
				}
			}
		}
	} catch (e) {}
	return configValue;
}

function OpenConnectionFormFromSubgrid(executionContext, selectedControl) {
	"use strict";
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		var name = "";
		if (executionContext.data.entity.getEntityName() === "account" || executionContext.data.entity.getEntityName() === "opportunity") {
			name = executionContext.getAttribute('name').getValue();
		} else if (executionContext.data.entity.getEntityName() === "contact") {
			name = executionContext.getAttribute('firstname').getValue();
			if (executionContext.getAttribute('middlename').getValue() !== null) {
				name = name + " " + executionContext.getAttribute('middlename').getValue();
			}
			if (executionContext.getAttribute('lastname').getValue() !== null) {
				name = name + " " + executionContext.getAttribute('lastname').getValue();
			}
		}

		var accountGrid = false;
		//var control = executionContext.ui.controls.get("AccountConnection");
		//if (control !== null) {
		if (selectedControl.name === "AccountConnection") {
			accountGrid = true;
		}
		//}

		var contactGrid = false;
		//var control = executionContext.ui.controls.get("ContactConnection");
		//if (control !== null) {
		if (selectedControl.name === "ContactConnection") {
			contactGrid = true;
		}
		//}

		var entityFormOptions = {};
		entityFormOptions["entityName"] = "connection";

		var formParameters = {};

		if (accountGrid) {
			formParameters["source_0"] = "1";
		}

		if (contactGrid) {
			formParameters["source_0"] = "2";
		}

		formParameters["record1id"] = [{
				"entityType": executionContext.data.entity.getEntityName(),
				"id": executionContext.data.entity.getId(),
				"name": name
			}
		];

		Xrm.Navigation.openForm(entityFormOptions, formParameters).then(
			function (success) {
			console.log(success);
		},
			function (error) {
			console.log(error);
		});
	} catch (e) {}
}
//nachiket

function filterConnectToLookup(executionContext, entity) {
	try {
		if (executionContext === null || executionContext === undefined)
			return;
		var formContext = executionContext.getFormContext();

		if (formContext === null || formContext === undefined)
			return;

		var countryId = "";
		var ownerIdLookup = formContext.getAttribute("ownerid").getValue();
		if (ownerIdLookup !== null) {
			var ownerId = ownerIdLookup[0].id;
			ownerId = ownerId.replace("}", "").replace("{", "");
			var query = "systemusers?$select=_negt_countryid_value&$filter=systemuserid eq " + ownerId;
			var userData = GetData(query);
			if (userData !== null && userData !== undefined) {
				if (userData.value !== undefined) {
					if (userData.value.length > 0) {
						if (userData.value[0]["_negt_countryid_value"] !== null && userData.value[0]["_negt_countryid_value"] !== undefined) {
							countryId = userData.value[0]["_negt_countryid_value"];
						}
					}
				}
			}
		}

		var negt_elogcompanyid = "";
		if (countryId !== null && countryId !== undefined && countryId !== "") {
			var qry = "negt_countries?$select=negt_elogcompanyid&$filter=negt_countryid eq " + countryId;
			var Data = GetData(qry);
			if (Data !== null && Data !== undefined) {
				if (Data.value !== undefined) {
					if (Data.value.length > 0) {
						if (Data.value[0]["negt_elogcompanyid"] !== null && Data.value[0]["negt_elogcompanyid"] !== undefined) {
							negt_elogcompanyid = Data.value[0]["negt_elogcompanyid"];
						}
					}
				}
			}
		}
		if (negt_elogcompanyid !== null && negt_elogcompanyid !== undefined && negt_elogcompanyid !== "") {
			//custom view for account
			if (entity === "account") {
				var viewId = "{A9AF0AB8-861D-4CFA-92A5-C6281FED7FAB}";
				//var viewId = formContext.getControl("record2id").getDefaultView();
				var viewDisplayName = "Owner Country Wise Account";

				var entityName = "account";
				var viewIsDefault = true;

				var Fetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
					"<entity name='account'>" +
					"<attribute name='name' />" +
					"<attribute name='primarycontactid' />" +
					"<attribute name='telephone1' />" +
					"<attribute name='accountid' />" +
					"<attribute name='negt_stateid' />" +
					"<attribute name='negt_countryid' />" +
					"<attribute name='address1_city' />" +
					"<order attribute='name' descending='false' />" +
					"<filter type='and'>" +
					"<condition attribute='statecode' operator='eq' value='0' />" +
					"<condition attribute='negt_mkdenialcode' operator='ne' value='10001' />" +
					"</filter>" +
					"<link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='primaryemail'>" +
					"<attribute name='emailaddress1' />" +
					"</link-entity>" +
					"<link-entity name='systemuser' from='systemuserid' to='negt_ownerid' link-type='inner' alias='ae'>" +
					"<link-entity name='negt_country' from='negt_countryid' to='negt_countryid' link-type='inner' alias='af'>" +
					"<filter type='and'>" +
					"<condition attribute='negt_elogcompanyid' operator='eq' value='" + negt_elogcompanyid + "' />" +
					"</filter>" +
					"</link-entity>" +
					"</link-entity>" +
					"</entity>" +
					"</fetch>";

				var layoutXml =
					"<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
					"<row name='result' id='accountid'>" +
					"<cell name='name' width='200' />" +
					"<cell name='address1_city' width='200' />" +
					"<cell name='negt_stateid' width='200' />" +
					"<cell name='negt_countryid' width='200' />" +
					"<cell name='telephone1' width='200' />" +
					"<cell name='primarycontactid' width='200' />" +
					"<cell name='primaryemail.emailaddress1' width='200' />" +
					"</row>" +
					"</grid>";

				formContext.getAttribute("record2id").controls.forEach(
					function (control, i) {
					control.addCustomView(viewId, entityName, viewDisplayName, Fetch, layoutXml, viewIsDefault);
				});

			} else if (entity === "contact") {
				//custom view for contact
				var viewId1 = "{A2D479C5-53E3-4C69-ADDD-802327E67A0D}";
				//var viewId = formContext.getControl("record2id").getDefaultView();
				var viewDisplayName1 = "Owner Country Wise Contact";

				var entityName1 = "contact";
				var viewIsDefault1 = true;

				var Fetch1 = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
					"<entity name='contact'>" +
					"<attribute name='fullname' />" +
					"<attribute name='telephone1' />" +
					"<attribute name='contactid' />" +
					"<attribute name='emailaddress1' />" +
					"<attribute name='address1_city' />" +
					"<attribute name='negt_countryid' />" +
					"<attribute name='parentcustomerid' />" +
					"<attribute name='address1_telephone1' />" +
					"<order attribute='fullname' descending='false' />" +
					"<filter type='and'>" +
					"<condition attribute='statecode' operator='eq' value='0' />" +
					"</filter>" +
					"<link-entity name='account' from='accountid' to='parentcustomerid' link-type='inner' alias='ao'>" +
					"<filter type='and'>" +
					"<condition attribute='negt_mkdenialcode' operator='ne' value='10001' />" +
					"<condition attribute='statecode' operator='eq' value='0' />" +
					"</filter>" +
					"</link-entity>" +
					"<link-entity name='systemuser' from='systemuserid' to='negt_ownerid' link-type='inner' alias='ae'>" +
					"<link-entity name='negt_country' from='negt_countryid' to='negt_countryid' link-type='inner' alias='af'>" +
					"<filter type='and'>" +
					"<condition attribute='negt_elogcompanyid' operator='eq' value='" + negt_elogcompanyid + "' />" +
					"</filter>" +
					"</link-entity>" +
					"</link-entity>" +
					"</entity>" +
					"</fetch>";

				var layoutXml1 = "<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
					"<row name='result' id='contactid'>" +
					"<cell name='fullname' width='200' />" +
					"<cell name='emailaddress1' width='200' />" +
					"<cell name='telephone1' width='200' />" +
					"<cell name='parentcustomerid' width='200' />" +
					"<cell name='address1_city' width='200' />" +
					"<cell name='negt_countryid' width='200' />" +
					"<cell name='address1_telephone1' width='200' />" +
					"</row>" +
					"</grid>";

				formContext.getAttribute("record2id").controls.forEach(
					function (control, i) {
					control.addCustomView(viewId1, entityName1, viewDisplayName1, Fetch1, layoutXml1, viewIsDefault1);
				});
			}
		}
	} catch (e) {
		var exMsg = "";
		if (typeof(Storage) !== "undefined") {
			exMsg = sessionStorage.getItem("M128");
		} else {
			exMsg = GetMessageText("M128");
		}
		if (exMsg === "" || exMsg === null) {
			exMsg = GetMessageText("M128");
		}
		Xrm.Navigation.openAlertDialog({
			text: GetMessageText("M128")
		});
	}
}

function GetConfigValue(column, value) {
	"use strict";
	try {
		var field = "negt_name";
		var results = null;
		var req = new XMLHttpRequest();
		req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/negt_configurationentities?$select=" + column + "&$filter=" + field + " eq '" + value + "'", false);
		req.setRequestHeader("OData-MaxVersion", "4.0");
		req.setRequestHeader("OData-Version", "4.0");
		req.setRequestHeader("Accept", "application/json");
		req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
		req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
		req.onreadystatechange = function () {
			if (this.readyState === 4) {
				req.onreadystatechange = null;
				if (this.status === 200) {
					results = JSON.parse(this.response);
				} else {
					Xrm.Utility.alertDialog(this.statusText);
				}
			}
		};
		req.send();
	} catch (e) {
		Xrm.Navigation.openAlertDialog({
			text: "Error Occured while executing the GetConfigValue ...."
		});
	}
	return results;
}

function CheckAdminRole() {
	"use strict";
	var flag = false;
	try {
		var RoleArray = [];
		var GetRole = GetConfigValue("negt_value", "AdminRole");

		if (GetRole !== null && GetRole !== undefined) {
			if (GetRole.value !== undefined) {
				if (GetRole.value.length > 0) {
					if (GetRole.value[0]["negt_value"] !== null && GetRole.value[0]["negt_value"] !== undefined) {
						RoleArray = GetRole.value[0]["negt_value"].split(',');
					}
				}
			}
		}

		var userRole = Xrm.Utility.getGlobalContext().getUserRoles();

		for (var i = 0; i < userRole.length; i++) {
			var query = "roles?$select=name&$filter=roleid eq '" + userRole[i] + "'";

			var roleData = GetData(query);
			if (roleData !== null || roleData !== undefined) {
				if (roleData.value !== undefined) {
					if (roleData.value.length > 0) {
						for (var j = 0; j < RoleArray.length; j++) {
							if (roleData.value[0]["name"].toLowerCase() === RoleArray[j].toLowerCase()) {
								flag = true;
							}
						}
					}
				}
			}
		}
	} catch (error) {
		var exMsg = error;
		window.parent.Xrm.Navigation.openAlertDialog({
			text: exMsg
		});
	}
	return flag;
}
/// <summary>
/// hideNewButton
/// </summary>
/// <param name="executionContext">executionContext</param>
function hideNewButton(primaryControl) {
	try {
		var formContext = primaryControl;
		if (formContext !== null) {
			var isAdmin = CheckAdminRole();
			if (isAdmin) {
				return true;
			}
		}
	} catch (e) {
		var exMsg = "";
		if (typeof(Storage) !== "undefined") {
			exMsg = sessionStorage.getItem("M129");
		} else {
			exMsg = GetMessageText("M129");
		}
		if (exMsg === "" || exMsg === null) {
			exMsg = GetMessageText("M129");
		}
		Xrm.Navigation.openAlertDialog({
			text: GetMessageText("M129")
		});
	}
}