var serverUrl
try {
    serverUrl = parent.Xrm.Page.context.getClientUrl()
} catch(ex) {
    serverUrl = parent.parent.Xrm.Page.context.getClientUrl()
} // Handle grandchild
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
function retrieveRecord(odataSetName, guid, columns, successCallback, passThruObject, debug, errorCallback) {
    if (!guid) {
        alert("record guid is required.");
        return;
    }
    if (!odataSetName) {
        alert("odataSetName is required.");
        return;
    }
    var thisUrl = serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + guid + "')";
    if (columns) {
        thisUrl += "?$select=" + columns;
    }
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: thisUrl,
        beforeSend: function (XMLHttpRequest) {
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            if (successCallback) {
                successCallback(data.d, passThruObject, textStatus, XmlHttpRequest);
            }
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            if (errorCallback) errorCallback(XmlHttpRequest, passThruObject, textStatus, errorThrown);
            else errorHandler(XmlHttpRequest, passThruObject, textStatus, errorThrown);
        }
    });
}
function retrieveMultiple(odataSetName, filter, columns, orderby, successCallback, passThruObject, debug, errorCallback) {
    if (!odataSetName) {
        odataSetName = ""
    }
    var thisUrl = serverUrl + ODATA_ENDPOINT + "/" + odataSetName;
    if (filter || columns) {
        thisUrl += "?"
    }
    if (filter) {
        thisUrl += "$filter=" + filter;
    }
    if (columns) {
        if (filter) {
            thisUrl += "&"
        }
        thisUrl += "$select=" + columns;
    }
    if (orderby) {
        thisUrl += "&$orderby=" + orderby;
    }
    if (debug) {
        alert(thisUrl)
    }
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: thisUrl,
        beforeSend: function (XMLHttpRequest) {
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            if (successCallback) {
                if (data && data.d && data.d.results) {
                    successCallback(data.d.results, passThruObject, textStatus, XmlHttpRequest);
                }
                else if (data && data.d) {
                    successCallback(data.d, passThruObject, textStatus, XmlHttpRequest, passThruObject);
                }
                else {
                    successCallback(data, passThruObject, textStatus, XmlHttpRequest, passThruObject);
                }
            }
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            if (errorCallback) errorCallback(XmlHttpRequest, passThruObject, textStatus, errorThrown);
            else errorHandler(XmlHttpRequest, passThruObject, textStatus, errorThrown);
        }
    });
}
function retrieveRelated(odataSetName, guid, columns, successCallback, debug, errorCallback) {
    var fld = "RegardingObjectId/Id";
    switch (odataSetName) {
    case "AnnotationSet":
        fld = "ObjectId/Id";
        break;
    }
    var filter = fld + " eq guid'" + guid + "'";
    retrieveMultiple(odataSetName, filter, columns, successCallback, debug, errorCallback);
}
function errorHandler(xmlHttpRequest, passThruObject, textStatus, errorThrow) {
    alert("ms.DataAccess - Ajax Error\n\n" + textStatus + ": " + xmlHttpRequest.statusText);
}