//Create a new record with a WebApi call (>= CRM 2016)
function createRecordWebApi(serverUrl, entitySet, record, successCallback, errorCallback) {
    var request = new XMLHttpRequest();
    request.open("POST", serverUrl + "/api/data/v8.0/" + entitySet, true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    request.setRequestHeader("OData-MaxVersion", "4.0");
    request.setRequestHeader("OData-Version", "4.0");
    request.onreadystatechange = function () {
        if (this.readyState === 4 /* complete */) {
            request.onreadystatechange = null;
            if (this.status === 204) {
                var settingId = this.getResponseHeader("OData-EntityId");
                var splittedUrl = settingId.split("(");

                if (splittedUrl.length >= 1) {
                    var crmId = splittedUrl[1].replace(")", "");
                    successCallback(crmId);
                }
            } else {
                errorCallback("Error occured during save: " + JSON.parse(this.response).error.message);
            }
        }
    };
    request.send(JSON.stringify(record));
}

//Update a record with a WebApi call (>= CRM 2016)
function updateRecordWebApi(serverUrl, entitySet, recordId, record, successCallback, errorCallback) {
    var request = new XMLHttpRequest();
    request.open("PATCH", serverUrl + "/api/data/v8.0/" + entitySet + "(" + recordId + ")", true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    request.setRequestHeader("OData-MaxVersion", "4.0");
    request.setRequestHeader("OData-Version", "4.0");
    request.onreadystatechange = function () {
        if (this.readyState === 4 /* complete */) {
            request.onreadystatechange = null;
            if (this.status === 204) {
                var settingId = this.getResponseHeader("OData-EntityId");
                var splittedUrl = settingId.split("(");

                if (splittedUrl.length >= 1) {
                    var crmId = splittedUrl[1].replace(")", "");
                    successCallback(crmId);
                }
            } else {
                errorCallback("Error occured during save: " + JSON.parse(this.response).error.message);
            }
        }
    };
    request.send(JSON.stringify(record));
}


//CRM request
function getCRMData(baseUrl, resource, select, filter, expand, successCallback, errorCallback) {
    if (select == null || select === "")
            errorCallback("There are no select columns specified.");
    var url = baseUrl + "/api/data/v9.0/" + resource + "?$select=" + select;
    if (filter != null && filter !== "")
        url += "&$filter=" + filter;
    if (expand != null && expand !== "")
        url += "&$expand=" + expand;

    console.log(url);
    var request = new XMLHttpRequest();
    request.open("GET", encodeURI(url), true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    request.setRequestHeader("OData-MaxVersion", "4.0");
    request.setRequestHeader("OData-Version", "4.0");
    request.onreadystatechange = function () {
        if (this.readyState === 4 /* complete */) {
            request.onreadystatechange = null;
            if (this.status === 200)
                successCallback(JSON.parse(this.response).value);
            else
                errorCallback(JSON.parse(this.response).error);
        }
    };
    request.send();
}

//Retrieve multiple records with a WebApi call (>= CRM 2016)
function retrieveMultipleRecordsWebApi(serverUrl, entitySet, columns, filter, successCallback, errorCallback) {
    if (columns == null || columns === "")
        errorCallback("There are no select columns specified.");
    
    var url = serverUrl + "/api/data/v9.0/" + entitySet + "?$select=" + columns;
    if (filter != null && filter !== "")
        url += "&$filter=" + filter;

    console.log(url);
    var request = new XMLHttpRequest();
    request.open("GET", encodeURI(url), true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    request.setRequestHeader("OData-MaxVersion", "4.0");
    request.setRequestHeader("OData-Version", "4.0");
    request.onreadystatechange = function () {
        if (this.readyState === 4 /* complete */) {
            request.onreadystatechange = null;
            if (this.status === 200)
                successCallback(JSON.parse(this.response).value);
            else
                errorCallback(JSON.parse(this.response).error);
        }
    };
    request.send();
}

//Create a new record with an Odata call (< CRM 2016)
function createRecordOdata(entityName, record, successCallback, errorCallback) {
    SDK.REST.createRecord(
        record,
        entityName,
        function(newRecord) {
            successCallback(newRecord[entityName + "Id"]);
        },
        function (error) {
            errorCallback(error);
        });
}

//Update a record with an Odata call (< CRM 2016)
function updateRecordOdata(entityName, recordId, record, successCallback, errorCallback) {
    SDK.REST.updateRecord(
        recordId,
        record,
        entityName,
        function () {
            successCallback(recordId);
        },
        function (error) {
            errorCallback(error);
        });
}

//Retrieve multiple records with an Odata call (< CRM 2016)
function retrieveMultipleRecordsOdata(entityName, columns, filter, successCallback, errorCallback) {
    if (columns == null || columns === "")
        errorCallback("There are no select columns specified.");

    var select = "$select=" + columns;
    if (filter != null && filter !== "")
        select += "&$filter=" + filter;

    SDK.REST.retrieveMultipleRecords(
        entityName,
        select,
        function (results) {
            if (results != null) {
                successCallback(results);
            }
        },
        function (error) {
            errorCallback(error);
        },
        function () {
            //OnComplete handler
        }
    );
}

//Check if the given string is valid Json
function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}