ttajic
7/4/2018 - 10:32 AM

CRM XRM functions

var Adacta = Adacta || {};
Adacta.CRM = Adacta.CRM || {};
Adacta.CRM.CrmFormType = {
	Undefined: 0,
	Create: 1,
	Update: 2,
	ReadOnly: 3,
	Disabled: 4
} 

/* Math functions */
Adacta.CRM.Round = function (number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

/* Get attribute value */
Adacta.CRM.GetControl = function (attributeName)
{
	var controlObj = Xrm.Page.getControl(attributeName);
	if (controlObj)
	{
		return controlObj;
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetControl', false);
	}
	return null;
}
Adacta.CRM.GetAttribute = function (attributeName)
{
	var controlObj = Xrm.Page.getAttribute(attributeName);
	if (controlObj)
	{
		return controlObj;
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetAttribute', false);
	}
	return null;
}
Adacta.CRM.GetLookupText = function (attributeName, defaultValue)
{
	var lookupAttributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (lookupAttributeObj)
	{
		var lookupValueObj = lookupAttributeObj.getValue();
		if (lookupValueObj && lookupValueObj.length > 0)
		{
			return lookupValueObj[0].name;
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetLookupText', false);
	}
	return defaultValue;
}
Adacta.CRM.GetLookupId = function (attributeName, defaultValue)
{
	var lookupAttributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (lookupAttributeObj)
	{
		var lookupValueObj = lookupAttributeObj.getValue();
		if (lookupValueObj && lookupValueObj.length > 0)
		{
			return lookupValueObj[0].id;
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetLookupId', false);
	}
	return defaultValue;
}
Adacta.CRM.GetLookupFieldValue = function (attributeName, defaultValue)
{
	var textSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (textSetattributeObj != null)
	{
		return textSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetLookupFieldValue', false);
	}
	return defaultValue;
}
Adacta.CRM.GetOptionSetValue = function (attributeName, defaultValue)
{
	var optionSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (optionSetattributeObj != null)
	{
		return optionSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetOptionSetValue', false);
	}
	return defaultValue;
}
Adacta.CRM.GetOptionSetText = function (attributeName, defaultValue)
{
	var optionSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (optionSetattributeObj != null)
	{
		return optionSetattributeObj.getText();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetOptionSetText', false);
	}
	return defaultValue;
}
Adacta.CRM.GetDecimalFieldValue = function (attributeName, defaultValue)
{
	var textSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (textSetattributeObj != null)
	{
		return textSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetDecimalFieldValue', false);
	}
	return defaultValue;
}                                        a
Adacta.CRM.GetNumberFieldValue = function (attributeName, defaultValue)
{
	var textSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (textSetattributeObj != null)
	{
		return textSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetNumberFieldValue', false);
	}
	return defaultValue;
}
Adacta.CRM.GetTextFieldValue = function (attributeName, defaultValue)
{
	var textSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (textSetattributeObj != null)
	{
		return textSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetTextFieldValue', false);
	}
	return defaultValue;
}
Adacta.CRM.GetBoolFieldValue = function (attributeName, defaultValue)
{
	var textSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (textSetattributeObj != null)
	{
		return textSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetBoolFieldValue', false);
	}
	return defaultValue;
}
Adacta.CRM.GetDateFieldValue = function (attributeName, defaultValue)
{
	var dateSetattributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (dateSetattributeObj != null)
	{
		return dateSetattributeObj.getValue();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.GetDateFieldValue', false);
	}
	return defaultValue;
} 

/* Set attribute value */
Adacta.CRM.SetTextFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetTextFieldValue', false);
	}
}
Adacta.CRM.SetDecimalFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetDecimalFieldValue', false);
	}
}
Adacta.CRM.SetDoubleFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetDoubleFieldValue', false);
	}
}
Adacta.CRM.SetNumberFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetNumberFieldValue', false);
	}
}
Adacta.CRM.SetCurrencyFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetCurrencyFieldValue', false);
	}
}
Adacta.CRM.SetBoolFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetBoolFieldValue', false);
	}
}
Adacta.CRM.SetOptionSetFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetOptionSetFieldValue', false);
	}
}
Adacta.CRM.SetDateFieldValue = function (attributeName, attributeValue, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(attributeValue);
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetDateFieldValue', false);
	}
}
Adacta.CRM.SetLookupFieldValue = function (attributeName, entityId, name, logicalName, ignoreFormWritable, fireOnChange, ignoreSetValueError)
{
	try
	{
		
		if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
		{
			return;
		}
		var attributeObj = Xrm.Page.getAttribute(attributeName);
		if (attributeObj)
		{
			if (entityId)
			{
				//the shananigans in this if, helps preventing crm from reissuing onchange event
				/*if (entityId.indexOf('{') == -1)
				{   
					entityId = '{' + entityId;
				}
				
				if (entityId.indexOf('}') == -1)
				{
					entityId = entityId + '}';
				}
			       
			    entityId = entityId.toUpperCase();*/
			    // replace {}
			    entityId = entityId.replace("{","").replace("}","")+"";
		    }
		    
		    if (typeof ignoreSetValueError != undefined && ignoreSetValueError)
		    {
				try
				{
					
					attributeObj.setValue(null);
					var lookupValue = new Array();
					lookupValue[0] = new Object();
					lookupValue[0].id = entityId;
					lookupValue[0].name = name;
					lookupValue[0].entityType = logicalName;
					attributeObj.setValue(lookupValue);					
				}
				catch(ie)
				{
					var lookupValue = new Array();
					lookupValue[0] = new Object();
					lookupValue[0].id = entityId;
					lookupValue[0].name = name;
					lookupValue[0].entityType = logicalName;
					attributeObj.setValue(lookupValue);
				}
			}
			else
			{
				var lookupValue = new Array();
				lookupValue[0] = new Object();
				lookupValue[0].id = entityId;
				lookupValue[0].name = name;
				lookupValue[0].entityType = logicalName;
				attributeObj.setValue(lookupValue);
			}
			if (fireOnChange)
			{
				Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
			}
			if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
			{
				attributeObj.setSubmitMode("always"); //readonly field, always submit
			}
			else
			{
				attributeObj.setSubmitMode("dirty");
			}
		}
		else
		{
			Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetLookupFieldValue', false);
		}
	}
	catch(e)
	{
		Adacta.CRM.WriteExceptionWithMessageToLog(e, 'Error setting value for field: ' + attributeName + '.', 'Adacta.CRM.SetLookupFieldValue', false);
		throw(e);
	}
}
Adacta.CRM.ClearFieldValue = function (attributeName, ignoreFormWritable, fireOnChange)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.data.entity.attributes.get(attributeName);
	if (attributeObj)
	{
		attributeObj.setValue(null);
		
		if (fireOnChange)
		{
			Adacta.CRM.ForceFieldChange(attributeName, ignoreFormWritable); //fire OnChange event handlers
		}
			
		if (Xrm.Page.getControl(attributeName) && Xrm.Page.getControl(attributeName).getDisabled())
		{
			attributeObj.setSubmitMode("always"); //readonly field, always submit
		}
		else
		{
			attributeObj.setSubmitMode("dirty");
		}
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.ClearFieldValue', false);
	}
}

/*Form Validation*/
Adacta.CRM.IsFormValid = function(showErrors)
{
	try
	{
		var valid = true;
		if (!Xrm || !Xrm.Page || !Xrm.Page.data || !Xrm.Page.data.entity || !Xrm.Page.data.entity.attributes)
		{
			return false;	
		}
		
		Adacta.CRM.ClearNotification('_FormValidation_');
		Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {
			if (attribute.getRequiredLevel() == "required") {
				if(attribute.getValue() == null)
				{
					if(valid)
					{
						var control = attribute.controls.get(0);
						if (showErrors)
						{
							//Adacta.CRM.AddFormNotification = function (uniqueId, message, level)
							Adacta.CRM.AddFormNotification('_FormValidation_',control.getLabel() + ' is missing a value',1);
						}
					control.setFocus();
					}
					valid = false;
				}
			}
		});
		
		return valid;
	}
	catch(e)
	{
		Adacta.CRM.WriteExceptionToLog(e,'Adacta.CRM.IsFormValid', false);
	}
}

Adacta.CRM.SetFieldSubmitMode = function (attributeName, submitMode, ignoreFormWritable)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.getAttribute(attributeName);
	if (attributeObj)
	{
		attributeObj.setSubmitMode(submitMode);
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.SetFieldSubmitMode', false);
	}
}
Adacta.CRM.ForceFieldChange = function (attributeName, ignoreFormWritable)
{
	if (!Adacta.CRM.IsFormWritable() && !ignoreFormWritable)
	{
		return;
	}
	var attributeObj = Xrm.Page.getAttribute(attributeName);
	if (attributeObj)
	{
		attributeObj.fireOnChange();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + attributeName + ' not found.', 'Adacta.CRM.ForceFieldChange', false);
	}
} 

/*Form parameters*/
Adacta.CRM.GetFormParameter = function(name, defaultValue)
{
	try
	{
		var params = Xrm.Page.context.getQueryStringParameters();
		if (params)
		{
			var parameter = params[name];
			if (typeof parameter !== 'undefined')
			{
				return parameter;
			}
			return defaultValue;
		}
	}
	catch(e)
	{
		Adacta.CRM.WriteExceptionToLog(e,'Adacta.CRM.IsFormValid', false);
	}
}

/*Form type functions*/
Adacta.CRM.IsFormWritable = function ()
{
	var formType = Xrm.Page.ui.getFormType();
	return formType == Adacta.CRM.CrmFormType.Create || Adacta.CRM.CrmFormType.Update;
}
Adacta.CRM.IsCreateForm = function ()
{
	var formType = Xrm.Page.ui.getFormType();
	return formType == Adacta.CRM.CrmFormType.Create;
}
Adacta.CRM.IsUpdateForm = function ()
{
	var formType = Xrm.Page.ui.getFormType();
	return formType == Adacta.CRM.CrmFormType.Update;
} 

/*Visibility functions*/
Adacta.CRM.makeFieldMandatory = function (fieldName)
{
	var field = Xrm.Page.data.entity.attributes.get(fieldName);
	if (field)
	{
		field.setRequiredLevel('required');
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.makeFieldMandatory', false);
	}
}
Adacta.CRM.makeFieldNonMandatory = function (fieldName)
{
	try
	{
		var field = Xrm.Page.data.entity.attributes.get(fieldName);
		if (field)
		{
			field.setRequiredLevel('none');
		}
		else
		{
			Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.makeFieldNonMandatory', false);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.makeFieldRecommended = function (fieldName)
{
	var field = Xrm.Page.data.entity.attributes.get(fieldName);
	if (field)
	{
		field.setRequiredLevel('recommended');
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.makeFieldRecommended', false);
	}
}
Adacta.CRM.showField = function (fieldName)
{
	var field = Xrm.Page.ui.controls.get(fieldName);
	if (field)
	{
		field.setVisible(true);
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.showField', false);
	}
}
Adacta.CRM.setFocus = function (fieldName)
{
	var field = Xrm.Page.ui.controls.get(fieldName);
	if (field)
	{
		field.setFocus();
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.setFocus', false);
	}
}
Adacta.CRM.hideField = function (fieldName)
{
	var field = Xrm.Page.ui.controls.get(fieldName);
	if (field)
	{
		field.setVisible(false);
	}
	else
	{
		Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.hideField', false);
	}
}
Adacta.CRM.enableField = function (fieldName)
{
	try
    {
        var formState = Xrm.Page.ui.getFormType();
        if (formState == 3 || formState == 4) {
            return;
        }

		var control = Xrm.Page.ui.controls.get(fieldName);
		if (control)
		{
			control.setDisabled(false);
		}
		else
		{
			Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.enableField', false);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.disableField = function (fieldName, makeNonMandatory)
{
	try
    {
        var formState = Xrm.Page.ui.getFormType();
        if (formState == 3 || formState == 4) {
            return;
        }

		var control = Xrm.Page.ui.controls.get(fieldName);
		if (control)
		{
			control.setDisabled(true);
			
			if (makeNonMandatory)
			{
				Adacta.CRM.makeFieldNonMandatory(fieldName);
			}
		}
		else
		{
			Adacta.CRM.WriteToLog('Field: ' + fieldName + ' not found.', 'Adacta.CRM.disableField', false);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}

Adacta.CRM.showTab = function (tabName)
{
	try
	{
		Xrm.Page.ui.tabs.get(tabName).setVisible(true);
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.hideTab = function (tabName)
{
	try
	{
		Xrm.Page.ui.tabs.get(tabName).setVisible(false);
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.expandTab = function (tabName)
{
	try
	{
		Adacta.CRM.showTab(tabName);
		Xrm.Page.ui.tabs.get(tabName).setDisplayState('expanded');
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.collapseTab = function (tabName, hideTab, makeFieldsNonMandatory)
{
	try
	{
		var tab = Xrm.Page.ui.tabs.get(tabName);
		if (!tab)
		{
			Adacta.CRM.WriteToLog('Tab: ' + tabName + ' not found.', 'Adacta.CRM.collapseTab', false);
			return;
		}
		tab.setDisplayState('collapsed');
		
		if (hideTab)
		{
			Adacta.CRM.hideTab(tabName);
		}
		
		if (makeFieldsNonMandatory)
		{
			tab.sections.forEach(function (section, index) 
			{
			  Adacta.CRM.makeSectionFieldsNonMandatory(tabName, section.getName());
			});
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}

Adacta.CRM.hideSection = function (tabName, sectionName, makeFieldsNonMandatory)
{
	try
	{
		Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName).setVisible(false);
		if (makeFieldsNonMandatory)
		{
			Adacta.CRM.makeSectionFieldsNonMandatory(tabName, sectionName);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}

Adacta.CRM.showSection = function (tabName, sectionName)
{
	try
	{
		Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName).setVisible(true);
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.setHeaderFieldRequiredLevel = function (fieldName, requiredLevel)
{
	var field = Xrm.Page.getControl(fieldName);
	if (field)
	{
		field.setRequiredLevel('recommended');
	}
}
Adacta.CRM.makeSectionFieldsNonMandatory = function (tabName, sectionName)
{
	try
	{
		var section = Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName);
		if (!section)
		{
			return;
		}
		var controls = section.controls.get();
		var controlsLenght = controls.length;
		for (var i = 0; i < controlsLenght; i++)
		{
			var attribute = controls[i].getAttribute();
			if (attribute)
			{
				Adacta.CRM.makeFieldNonMandatory(attribute.getName());
			}
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.setSectionFieldsDisabled = function (tabName, sectionName)
{
	try
	{
		var section = Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName);
		if (!section)
		{
			return;
		}
		var controls = section.controls.get();
		var controlsLenght = controls.length;
		for (var i = 0; i < controlsLenght; i++)
		{
			controls[i].setDisabled(true);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}

Adacta.CRM.setSectionFieldsEnabled = function (tabName, sectionName)
{
	try
	{
		var section = Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName);
		if (!section)
		{
			return;
		}
		var controls = section.controls.get();
		var controlsLenght = controls.length;
		for (var i = 0; i < controlsLenght; i++)
		{
			controls[i].setDisabled(false);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}

Adacta.CRM.clearSectionFields = function (tabName, sectionName, fireOnChange)
{
	try
	{
		var section = Xrm.Page.ui.tabs.get(tabName).sections.get(sectionName);
		if (!section)
		{
			return;
		}
		var controls = section.controls.get();
		var controlsLenght = controls.length;
		for (var i = 0; i < controlsLenght; i++)
		{
			controls[i].getAttribute().setValue(null);
			//Adacta.CRM.ClearFieldValue(controls[i].getAttribute().getName(),false,fireOnChange);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.changeFieldLabel = function (fieldName, fieldLabel)
{
	try
	{
		var fieldControl = Xrm.Page.ui.controls.get(fieldName);
		if (fieldControl)
		{
			fieldControl.setLabel(fieldLabel);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.clearFieldNotifications = function (fieldName)
{
	try
	{
		var fieldControl = Xrm.Page.getControl(fieldName);
		if (fieldControl)
		{
			fieldControl.clearNotification();
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.setFieldNotifications = function (fieldName, message)
{
	try
	{
		var fieldControl = Xrm.Page.getControl(fieldName);
		if (fieldControl)
		{
			fieldControl.setNotification(message);
		}
	}
	catch (e)
	{}
} 

/*BPF Header field manipulation*/
Adacta.CRM.setHeaderFieldNonMandatory = function (fieldName)
{
	try
	{
		var headerControl = Xrm.Page.getControl('header_process_' + fieldName);
		if (headerControl)
		{
			var headerAttribute = headerControl.getAttribute();
			if (headerAttribute)
			{
				headerAttribute.setRequiredLevel('none');
			}
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.hideHeaderField = function (fieldName, show)
{
	try
	{
		var headerControl = Xrm.Page.getControl('header_process_' + fieldName);
		if (headerControl)
		{
			headerControl.setVisible(show);
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
} 

/*Form notifications*/
Adacta.CRM.ClearNotification = function (uniqueId)
{
	try
	{
		if (Notify !== undefined)
		{
			//use notify solution for notification
			if (Notify.remove = typeof fn === 'function')
			{
				Notify.remove(uniqueId);				
			}
		}
	}
	catch(e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
		try
		{
			Xrm.Page.ui.clearFormNotification(uniqueId);
		}
		catch(e2)
		{
			Adacta.CRM.WriteExceptionToLog(e2);
		}
	}
} 
Adacta.CRM.AddFormNotification = function (uniqueId, message, level)
{
	try
	{
		if (Notify !== undefined)
		{
			var notificationLevel = "";
			
			//just in case we get passed a numeric value
			switch(level)
			{
				case "1":
				{
					notificationLevel = "ERROR";
					break;
				}
				case "2":
				{
					notificationLevel = "INFO";
					break;
				}
				case "3":
				{
					notificationLevel = "WARNING";
					break;
				}
				default:
				{
					notificationLevel = level;
				}
			}
			
			//use notify solution for notification
			if (typeof Notify.add === 'function')
			{
				Notify.add(message,notificationLevel, uniqueId);
				return;
			}
		}
	}
	catch(e)
	{
		Adacta.CRM.WriteExceptionToLog(e);		
	}
	
	try
	{		
		//since notify.js supports more than CRM, and does not support numeric values we need to map to numeric		
		switch(level)
		{
			case "INFO":
			case "SUCCESS":
			case "QUESTION":
			case "LOADING":
			{
				level = 2
				break;
			}
			case "ERROR":
			{
				level = 1;
				break;
			}
			case "WARNING":
			{
				level = 3;
				break;
			}
			default:
			{
				level = 2;
				break;
			}
		}
		
		if (Xrm.Page.ui.setFormNotification !== undefined) 
		{           
		    if (!!uniqueId) 
		    {
		        Xrm.Page.ui.clearFormNotification(uniqueId);
		        if (level === 1) 
		        {
		            //Error
		            Xrm.Page.ui.setFormNotification(message, "ERROR", uniqueId);
		        }
		        if (level === 2) 
		        {
		            //Info
		            Xrm.Page.ui.setFormNotification(message, "INFO", uniqueId);
		        }
		        if (level === 3) 
		        {
		            //Warning
		            Xrm.Page.ui.setFormNotification(message, "WARNING", uniqueId);
		        }
		    } 
		    else 
		    {
		        var tempUniqueId = "formNotification00";
		        Xrm.Page.ui.clearFormNotification(tempUniqueId);
		        if (level === 1) 
		        {
		            //Error
		            Xrm.Page.ui.setFormNotification(message, "ERROR", tempUniqueId);
		        }
		        if (level === 2) 
		        {
		            //Info
		            Xrm.Page.ui.setFormNotification(message, "INFO", tempUniqueId);
		        }
		        if (level === 3) 
		        {
		            //Warning
		            Xrm.Page.ui.setFormNotification(message, "WARNING", tempUniqueId);
		        }
		    }
		}   
	}
	catch(e2)
	{
		Adacta.CRM.WriteExceptionToLog(e2);
	}
} 

/* General helper functions */
Adacta.CRM.MakeAllFieldsNonMandatory = function ()
{
	try{
		Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {
		  var attributeName = attribute.getName();
		  Adacta.CRM.makeFieldNonMandatory(attributeName);
		});
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.MakeFieldReadOnly = function (control) {
    try {
        if (typeof control.getDisabled !== 'undefined' && !control.getDisabled()) {
            control.setDisabled(true);
        }
    }
    catch (e) {
        Adacta.CRM.WriteExceptionToLog(e);
    }
}
Adacta.CRM.MakeFieldsReadOnly = function ()
{
    try {
        var controls = Xrm.Page.ui.controls.get();
        for (var i in controls) {
            var control = controls[i];
            Adacta.CRM.MakeFieldReadOnly(control);
        }
    }
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.RefreshQuickViewForm = function (lookupFieldName)
{
	try
	{
		var fieldValue = Adacta.CRM.GetLookupFieldValue(lookupFieldName);
		var fieldControl = Xrm.Page.getControl(lookupFieldName);
		if (fieldValue && fieldControl)
		{
			Adacta.CRM.ClearFieldValue(lookupFieldName);
			Adacta.CRM.SetLookupFieldValue(lookupFieldName, fieldValue[0].id, fieldValue[0].name, fieldValue[0].entityType);
			//Adacta.CRM.ForceFieldChange(lookupFieldName);
			if (Xrm.Page.getControl(attributeName).getDisabled())
			{
				//no need to force submit of a readonly field since we did not change a thing
				Adacta.CRM.SetFieldSubmitMode(lookupFieldName, 'never');
			}
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
}
Adacta.CRM.GetCurrentUser = function ()
{
	return {
		id: Xrm.Page.context.getUserId(),
		name: Xrm.Page.context.getUserName(),
		logicalName: 'systemuser'
	};
}
Adacta.CRM.IsUserSystemAdministrator = function ()
{
	return XrmServiceToolkit.Soap.IsCurrentUserRole('System Administrator');
}
Adacta.CRM.GetFormDirtyFields = function ()
{
	try
	{
		var dirtyFields = [];
		var attributes = Xrm.Page.data.entity.attributes.get();
		for (var i in attributes)
		{
			var attribute = attributes[i];
			if (attribute.getIsDirty())
			{
				dirtyFields.push(attribute.getName());
				Adacta.CRM.WriteToLog("Dirty attribute:" + attribute.getName(), "Adacta.CRM.GetFormDirtyFields");
			}
		}
		return dirtyFields;
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
		return null;
	}
}
Adacta.CRM.OpenFormNewWindow = function (entityLogicalName, entityId, parameters)
{
	var windowOptions = {
		openInNewWindow: true
	};
	Xrm.Utility.openEntityForm(entityLogicalName, entityId, parameters, windowOptions);
} 

/* XrmServiceToolkit helper functions */
Adacta.CRM.TryGetXrmToolkitValue = function (xrmToolkitAttribute, defaultValue)
{
	try
	{
		if (xrmToolkitAttribute && xrmToolkitAttribute.id)
		{
			return {
				id: xrmToolkitAttribute.id,
				name: xrmToolkitAttribute.name,
				logicalName: xrmToolkitAttribute.logicalName
			}
		}
		if (!xrmToolkitAttribute)
		{
			return defaultValue;
		}
		return xrmToolkitAttribute.value;
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
		return defaultValue;
	}
} 

/* Form change functions */
Adacta.CRM.ChangeForm = function (newFormId)
{
	try
	{
		var formItem = Xrm.Page.ui.formSelector.getCurrentItem();
		if (formItem == null)
		{
			return;
		}
		var currentFormId = formItem.getId().toLowerCase();
		newFormId = newFormId.toLowerCase();
		if (currentFormId != newFormId)
		{
			//change the form cause ids are different
			var availableForms = Xrm.Page.ui.formSelector.items.get();
			for (var i in availableForms)
			{
				var form = availableForms[i];
				if (form.getId().toLowerCase() == newFormId.toLowerCase())
				{
					form.navigate();
					return true;
				}
			}
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e);
	}
	return false;
} 

/* Quick forms */
Adacta.CRM.RefreshQuickView = function(qvFormName)
{
	try
	{		
		var quickViewControl = Xrm.Page.ui.quickForms.get(qvFormName);
		if (quickViewControl != undefined)
		{
			quickViewControl.refresh();
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionToLog(e,"Adacta.CRM.RefreshQuickView");
	}
}

/* prefilter lookup function */
Adacta.CRM.PreFilterLookup = function () {

    var preFilterByValue = function (controlName, value, filterByAttributeName) {
        try {
            var control = Xrm.Page.getControl(controlName);

            if (!control) {
                Adacta.CRM.WriteToLog("Unable to find control with name:" + controlName, "Adacta.CRM.PreFilterLookup.SimplePreFilter");
                return;
            }

            control.addPreSearch(function () {
                try {
                    if (value != null) {
                        fetchXml = "<filter type='and'><condition attribute='" + filterByAttributeName + "' operator='eq' value='" + value + "' /></filter>";
                        Xrm.Page.getControl(controlName).addCustomFilter(fetchXml);
                    }
                }
                catch (e) {
                    Adacta.CRM.WriteExceptionWithMessageToLog(e, "Error executing preSearchFilterFunction for control: " + controlName, 'Adacta.CRM.PreFilterLookup.SimplePrefilter.addPreSearch', true);
                }
            });
        }
        catch (e) {
            Adacta.CRM.WriteExceptionWithMessageToLog(e, "Error appying preFilterByValue for control: " + controlName, 'Adacta.CRM.PreFilterLookup.PreFilterByValue', true);
        }
    }

	var simplePreFilter = function (controlName, valueAttributeName, filterByAttributeName) 
	{
        try {
            var valueAttributeObject = Xrm.Page.data.entity.attributes.get(valueAttributeName);

            var attributeValue = null;
            if (valueAttributeObject != null) {
                attributeValue = valueAttributeObject.getValue();
                if (attributeValue && attributeValue.length && attributeValue.length > 0) {
                    attributeValue = attributeValue[0].id;
                }
            }
            else {
                Adacta.CRM.WriteToLog('Field [valueAttributeName]: ' + valueAttributeName + ' not found.', 'Adacta.CRM.PreFilterLookup.SimplePreFilter', false);
            }

            preFilterByValue(controlName, attributeValue, filterByAttributeName);
        }
        catch (e) {
            Adacta.CRM.WriteExceptionWithMessageToLog(e, "Error appying simplePreFilter for control: " + controlName, 'Adacta.CRM.PreFilterLookup.SimplePrefilter', true);
        }
	}
	
	var complexPreFilter = function (controlName, fetchXmlFilter) 
	{
		try
		{
			var control = Xrm.Page.getControl(controlName);
			
			if (!control)
			{
				Adacta.CRM.WriteToLog("Unable to find control with name:" + controlName, "Adacta.CRM.PreFilterLookup.complexPreFilter");
				return;
			}
			
			control.addPreSearch(function () 
			{
				try
				{
					if (fetchXmlFilter != null && fetchXmlFilter !== '') 
				    {
				        Xrm.Page.getControl(controlName).addCustomFilter(fetchXmlFilter);
					}
				}
				catch(e)
				{
					Adacta.CRM.WriteExceptionWithMessageToLog(e, "Error executing preSearchFilterFunction for control: " + controlName, 'Adacta.CRM.PreFilterLookup.complexPreFilter.addPreSearch', true);
				}
			});	
		}
		catch(e)
		{
			Adacta.CRM.WriteExceptionWithMessageToLog(e, "Error appying simpleFilter for control: " + controlName, 'Adacta.CRM.PreFilterLookup.complexPreFilter', true);
		}
	}
	
    return {
        PreFilterByValue: preFilterByValue,
		SimplePrefilter: simplePreFilter,
		ComplexPrefilter : complexPreFilter 
	};
}();

/* comparison functions */
Adacta.CRM.AreIdsEqual = function (id1, id2)
{
	if (typeof id1 === 'undefined' || typeof id2 === 'undefined' || id1==null || id2==null)
	{
		return false;
	}
	//remove the brackets and change case
	id1 = id1.replace(/{|}|/gi,'').toUpperCase();
	id2 = id2.replace(/{|}|/gi,'').toUpperCase();
	
	return id1 == id2;
}

/* Diagnostics & logging functions */
Adacta.CRM.GetDirtyFields = function()
{
	try
	{
		var attributes = Xrm.Page.data.entity.attributes.get() ;
		for (var i in attributes)
		{
			var attribute = attributes[i];
			if (attribute.getIsDirty() || attribute.getSubmitMode() == "always")
			{
				console.log("Attribute dirty: " + attribute.getName());
			}
		}
	}
	catch (e)
	{
		Adacta.CRM.WriteExceptionWithMessageToLog(e, 'Adacta.CRM.PreFilterLookup.complexPreFilter', false);
	}
}
Adacta.CRM.WriteToLog = function (message, component, writeToTrace)
{
	try
	{
		var date = new Date();
		if (component)
		{
			console.log(date.toLocaleString() + ":" + component + ": " + message);
		}
		else
		{
			console.log(date.toLocaleString() + ":" + message);
		}
	}
	catch (e)
	{}
}
Adacta.CRM.WriteExceptionToLog = function (e, component, writeToTrace)
{
	try
	{
		var date = new Date();
		if (component)
		{
			console.log(date.toLocaleString() + ":" + component + ": " +  e.message);
		}
		else
		{
			console.log(date.toLocaleString() + ":" +  e.message);
		}
		if (typeof e.stack != 'undefined')
		{
			console.log(date.toLocaleString() + ":" + e.stack);
		}		
	}
	catch (e)
	{}
}
Adacta.CRM.WriteExceptionWithMessageToLog = function (e, message, component, writeToTrace)
{
	try
	{
		var date = new Date();
		if (component)
		{
			console.log(date.toLocaleString() + ":" + component + ": " + message);
		}
		else
		{
			console.log(date.toLocaleString() + ":" + message);
		}
		
		console.log(date.toLocaleString() + ":" + e.message);
		
		if (typeof e.stack != 'undefined')
		{
			console.log(date.toLocaleString() + ":" + e.stack);
		}
	}
	catch (e)
	{}
}
Adacta.CRM.PopulateOptionSet = function (attributeName, optionsarray)
{
	try
	{
		var pickList = Xrm.Page.getControl(attributeName);
    	var removeoptions = pickList.getOptions();
    	var setoptions = [];
    	
    	//check allowed options
    	for (var i = 0; i < removeoptions.length; i++){
    		for (var j = 0; j < optionsarray.length; j++){
    			if(removeoptions[i].value==optionsarray[j].value){
    				setoptions.push(optionsarray[j]);
    			}
    		}
    	}
    	
    	//remove all options
    	for (var i = 0; i < removeoptions.length; i++) 
        pickList.removeOption(removeoptions[i].value);
        
        //set new options
        for (var i = 0; i < setoptions.length; i++) 
        pickList.addOption(setoptions[i]);
        
	}	
	catch(e)
	{
		Adacta.CRM.WriteToLog(e.message,'Adacta.CRM.PopulateOptionSet');
	}
}
Adacta.CRM.ReplaceAll = function(targetString, findString, replaceString, ignore) 
{
    return targetString.replace(new RegExp(findString.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(replaceString)=="string")?replaceString.replace(/\$/g,"$$$$"):replaceString);
} 

/* Check if user is in array of roles */
Adacta.CRM.IsInSecurityRoles = function (roles) {

    var fetch = "<fetch mapping='logical' version='1.0' >" +
        "<entity name= 'systemuser' >" +
        "<attribute name='systemuserid' />" +
        "<filter type='and' >" +
        "<condition attribute='systemuserid' operator='eq-userid' />" +
        "</filter>" +
        "<link-entity name='systemuserroles' from='systemuserid' to='systemuserid' link-type='inner' >" +
        "<link-entity name='role' from='roleid' to='roleid' link-type='inner' >" +
        "<filter type='or' >";
    roles.forEach(function (role) {
        fetch += "<condition attribute='name' operator='eq' value='" + role + "' />";
    });
    fetch += "</filter>" +
        "</link-entity>" +
        "</link-entity>" +
        "</entity >" +
        "</fetch >";

    var results = XrmServiceToolkit.Soap.Fetch(fetch);

    if (results == null || results == undefined || results.length == 0)
        return false;

    return true;
};