$(document).ready(function () {
var context = GetGlobalContext();
var params = context.getQueryStringParameters();
// The data passed to the web resource should be in the following format:
//
// lookupEntityName,lookupEntityIdFieldName,lookupEntityDisplayFieldName,nameOfLookupFieldOnForm,webResourceName
//
var dataParam = params.data.split(",");
var lookupEntitySetName = dataParam[0];
var lookupEntityIdFieldName = dataParam[1];
var lookupEntityDisplayFieldName = dataParam[2];
var nameOfLookupFieldOnForm = dataParam[3];
var webResourceName = dataParam[4];
var oDataQuery = context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc" +
"/" + lookupEntitySetName + "?$select=" + lookupEntityIdFieldName + "," + lookupEntityDisplayFieldName;
var lookupAttribute = window.parent.Xrm.Page.getAttribute(nameOfLookupFieldOnForm);
var lookupArray = lookupAttribute.getValue();
$.getJSON(oDataQuery, function (data) {
var results = data.d.results;
var lookupdropdown = $("#lookupdropdown");
for (var i = 0; i < results.length; i++) {
var option = "<option value='" + results[i][lookupEntityIdFieldName];
option += "'>" + results[i][lookupEntityDisplayFieldName] + "</option>";
lookupdropdown.append(option);
}
lookupdropdown.prepend("<option value='blank'></option>");
if (lookupArray) {
var lookupId = lookupArray[0].id.replace("{", "").replace("}", "").toLowerCase();
lookupdropdown.val(lookupId);
} else {
lookupdropdown.val("blank");
}
$("#lookupdropdown option[value='Loading...']").remove();
lookupdropdown.width("100%"); // couldn't figure out what was causing it to not stretch so I just forced it
lookupdropdown.change(function () {
var name = $("#lookupdropdown option:selected").text();
if (name == "") {
SetLookupValueToNull(nameOfLookupFieldOnForm);
} else {
var entityType = results[0].__metadata.type.replace("Microsoft.Crm.Sdk.Data.Services.", "");
SetLookupValue(nameOfLookupFieldOnForm, lookupdropdown.val(),
name, entityType);
}
});
});
var requiredLevel = lookupAttribute.getRequiredLevel();
if (requiredLevel == "required") {
// We want to drive whether our dropdown requires a value by the hidden lookup fields metadata
// However, if we keep the lookup field's requirement level to required the form validation
// will tell us it is required an force us to show it.
lookupAttribute.setRequiredLevel("none");
//NOTE: Modifying html that the CRM server sends down to the browser is not supported.
// However, here we are finding a label for this control and updating its text.
// This is relatively harmless and the likelihood of the CRM representing a label
// for a control as anything other than an html label control is low. So I feel safe
// enough to break the "don't touch the CRM html" rule. Even if it becomes an issue
// at upgrade, we have one place where we can make the adjustments
var label = $("label[for='" + webResourceName + "']", window.parent.document);
// TODO: Improve this so it isn't tightly coupled to CRM generated html/css. Using undocumented css and server urls is unsupported.
label.append("<IMG class=ms-crm-ImageStrip-frm_required alt=Required src='/_imgs/imagestrips/transparent_spacer.gif?ver=600790655'>");
// TODO: add onsave to display an error message.
window.parent.Xrm.Page.data.entity.addOnSave(function (context) {
var name = $("#lookupdropdown option:selected").text();
if (name == "") {
var labelForWebResource = window.parent.Xrm.Page.getControl(webResourceName).getLabel();
alert("You must provide a value for " + labelForWebResource + ".");
context.getEventArgs().preventDefault();
}
});
}
});
function SetLookupValue(fieldName, id, name, entityType) {
if (fieldName != null) {
var lookupValue = new Array();
lookupValue[0] = new Object();
lookupValue[0].id = id;
lookupValue[0].name = name;
lookupValue[0].entityType = entityType;
window.parent.Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
}
}
function SetLookupValueToNull(fieldName) {
if (fieldName != null) {
window.parent.Xrm.Page.getAttribute(fieldName).setValue(null);
}
}