<html><head><meta></head><body style="overflow-wrap: break-word;">﻿


    <title></title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="../../ClientGlobalContext.js.aspx"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <script>
        debugger;
        var expirationError = "AutoMerge License Key needed or not valid!";
        var totalCount = 0;
        var currentCount = 0;
        var continueMerge = true;
        var errorCount = 0;
        var recordName = "";
        var automergeRunAsync = false;
        var recordsToBeUpdate;
        var entityName = "";
        $(document).ready(function () {
            debugger;
            var parameters = getParameters();
            totalCount = parameters.records.length;
            setProgressBar();
            entityName = parameters.entityName;
            setAutoMergeTriggerToTrue(parameters.records);
        });

        function setAutoMergeTriggerToTrue(selectedItems) {
            "use strict";

            if (selectedItems != null) {

                if (selectedItems.length > 0) {
                    recordsToBeUpdate = selectedItems;
                    wholeUpdateProcess(selectedItems[0]);
                }
            }
        }

        function wholeUpdateProcess(selectedItem) {
            "use strict";
            var updEntity = { gnb_automergetrigger: true };
            if (continueMerge == true) {
                updateRecord(selectedItem, updEntity);
            }
        }

        function updateRecord(id, updEntity) {
            "use strict";

            updateEntity(entityName, id, updEntity, function (success, errorText) {
                if (!success) {
                    errorCount++;
                    //User error.
                    if (errorText.message == expirationError) {
                        continueMerge = false;
                        Xrm.Utility.alertDialog("AutoMerge License Key is needed or not valid.");
                    } else {
                        //Xrm.Utility.alertDialog(errorText.message);
                        $("#errorMessages-label").css("display", "block");
                        addErrorRow(id, errorText.message);

                    }
                }
                currentCount++;
                setProgressBar();
                checkLatestRecord();

                recordsToBeUpdate.shift();
                if (recordsToBeUpdate.length > 0) {
                    wholeUpdateProcess(recordsToBeUpdate[0]);
                } else {
                    if (errorCount == 0) {
                        javascript: self.close();
                        reloadTheGrid();
                    }
                }

            }, true);
        }

function reloadTheGrid() {
    try {
        parent.window.location.reload();
    } catch (err) {}
}

        function updateEntity(entity, id, changes, callback, async) {
            var serviceUrl = getServiceUrl();
            var select = "/" + entity + "s(" + id.replace('{', '').replace('}', '') + ")";

            var req = new XMLHttpRequest();
            req.open("PATCH", serviceUrl + select, async != null ? async : 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.onreadystatechange = function () {
                if (this.readyState === 4 /* complete */) {
                    req.onreadystatechange = null;
                    if (this.status === 200 || this.status === 201 || this.status === 204) { //OK - Created - No Content
                        callback(true);
                    } else {
                        debugger;
                        var error = JSON.parse(this.response).error;

                        callback(false, error);
                    }
                }
            };
            req.send(JSON.stringify(changes));
        }
        function retrieveWithQuery(entity, query, callback, async) {
            "use strict";
            var serviceUrl = getServiceUrl();
            var select = "/" + entity + "s?" + query;

            var req = new XMLHttpRequest();
            req.open("GET", serviceUrl + select, async !== null ? async : 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=\"OData.Community.Display.V1.FormattedValue\"");
            req.setRequestHeader("Prefer", "odata.maxpagesize=10");
            req.onreadystatechange = function () {
                if (this.readyState === 4) {
                    req.onreadystatechange = null;
                    if (this.status === 200) {
                        var results = JSON.parse(this.response);
                        callback(results);
                    }
                    else {
                        callback(null);
                    }
                }
            };
            req.send();
        }
        function getParameters() {
            var searchJSON = searchToObject();
            return JSON.parse(searchJSON.data);
        }
        function searchToObject() {
            var pairs = window.location.search.substring(1).split("&"),
                obj = {},
                pair,
                i;

            for (i in pairs) {
                if (pairs[i] === "") continue;

                pair = pairs[i].split("=");
                obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
            }

            return obj;
        }
        function getClientUrl() {
            "use strict";
            if (Xrm != null) {
                return Xrm.Page.context.getClientUrl();
            }

            return null;
        }
        // get service url
        function getServiceUrl() {
            "use strict";
            return getClientUrl() + "/api/data/v8.2";
        }
        function setConfiguration() {
            "use strict";
            var runAsync = retrieveConfiguration();
            automergeRunAsync = (runAsync === "true" || runAsync === "1") ? true : false;
        }
        function retrieveConfiguration() {
            "use strict";
            var query = "$select=gnb_fieldlist&$filter=gnb_listtype eq 6";
            var returnValue = null;

            retrieveWithQuery("gnb_automergefieldlist", query, function (result) {
                if (result === null || result.value === null || result.value.length <= 0) {
                    returnValue = null;
                }
                else {
                    returnValue = result.value[0]["gnb_fieldlist"];
                }
            }, false);

            return returnValue;
        }

        function setProgressBar() {
            $("#automergeProgress").css("width", (currentCount / totalCount) * 100 + "%");
            $('#automergeProgressMessage').text("Processing " + currentCount + " of " + totalCount);
        }
        function changeProgressHeight() {
            $('.progress').css('margin-top', (window.innerHeight / 10) * 3);
        }
        function addErrorRow(name, errorMessage) {
            $("#errorMessages")
                .append('<div class="row" style="margin-left:0 !important"><div onclick="openRecord(this)" data-recordid="' + name + '" class="col-6" style="float: left;" role="alert"><a>Record '
                    + (currentCount +1)
                    + '</a></div>'
                    + '<div class="col-6" style="float: left;padding-left: 30px;" role="alert">'
                    + errorMessage
                    + '</div>'
                    + '</div>');
        }

        //$("#cancelButton").click(function () {
        //    continueMerge = false;
        //});
        function setFalseContinuteMerge() {
            continueMerge = false;
        }

        function checkLatestRecord() {
            if (currentCount === totalCount && errorCount > 0) {
                $("#cancelButton").text("Close");
            }
        }

        function openRecord(row) {
            var entityFormOptions = {};
            entityFormOptions["entityName"] = entityName;
            entityFormOptions["entityId"] = $(row).data("recordid");
            entityFormOptions["openInNewWindow"] = true;

            Xrm.Navigation.openForm(entityFormOptions).then(
                function (success) {
                    console.log(success);
                },
                function (error) {
                    console.log(error);
                });

        }
    </script>



    <div class="container" style="padding-top: 30px;max-width:400px;">
        <div class="spinner-grow text-light" role="status">
            <span class="sr-only">Loading...</span>
        </div>
        <div class="progress">
            <div id="automergeProgress" class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" style="height: 20px;width: 0%; background-color:#009800ab !important;">
            </div>
        </div>
        <div id="automergeProgressMessage" style="margin-top: -5px;text-align: center;padding-bottom: 12px;"></div>
        <div style="-ms-transform: translateY(-50%);display: flex;justify-content: center;align-items: center;margin-top: 4px;">
            <button id="cancelButton" class="btn btn-danger btn-sm btn-block" style="max-width: 150px;" onclick="setFalseContinuteMerge()">Cancel</button>
        </div>
        <div class="bg-danger" id="errorMessages-label" role="alert" style="text-align:center;display:none;margin-top: 25px;">
            Error Records
        </div>
        <div id="errorMessages">
        </div>
    </div>


</body></html>