﻿<html>
<head>
    <meta charset="utf-8">
    <title>data8 duplicare™ Configuration</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css">
    <style type="text/css">
        html, body {
            font-family: Segoe UI, Tahoma, Arial;
            font-size: 12px;
            cursor: default;
            color: #444;
        }

        input, select {
            font-family: Segoe UI, Tahoma, Arial;
            font-size: 12px;
            color: #444;
        }

        h2 {
            color: black;
            font-size: 21px;
            font-weight: bold;
        }

         h3 {
            color: #1160b7;
            font-size: 15px;
            font-weight: normal;
        }

        #globalsearch {
            display: none;
        }

    </style>
</head>
<body>
    <div id="loading" class="container-fluid">
        <h2>data<span style="color: #FF7C22">8</span> duplicare&trade;</h2>
        <div align="center">
            <img src="/_imgs/AdvFind/progress.gif" /><br />
            Loading...
        </div>
    </div>
    <div id="main-config" class="container-fluid" style="display: none">
        <h2>data<span style="color: #FF7C22">8</span> duplicare&trade;</h2>
        <div class="row  alert alert-danger" id="laterVersion" style="display:none;">
            <p>There is a newer version of data<span style="color: #FF7C22">8</span> duplicare&trade; available. Please update your solution via the listing on AppSource or contact your Data8 account manager.</p>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <label for="Username">Data8 Username</label>
                    <div class="input-group">
                        <div class="input-group-addon">
                            <i class="glyphicon glyphicon-user"></i>
                        </div>
                        <input class="form-control" id="Username" type="text" placeholder="Data8 Username">
                    </div>
                </div>
                <div class="form-group">
                    <label for="Password">Data8 Password</label>
                    <div class="input-group">
                        <div class="input-group-addon">
                            <i class="glyphicon glyphicon-asterisk"></i>
                        </div>
                        <input class="form-control" id="Password" type="password" placeholder="Data8 Password">
                    </div>
                </div>
                <div id="locationInput" class="form-group" style="display:none;">
                    <label for="Password">Data Processing Location</label>
                    <div class="input-group">
                        <div class="input-group-addon">
                            <i class="glyphicon glyphicon-hdd"></i>
                        </div>
                        <select class="form-control" id="Location">
                        </select>
                    </div>
                </div>               
                <button id="Save" class="btn btn-success">Save</button>
                <span id="ValidationStatus"></span>
                <div style="margin-top: 1em" id="ValidationDetails"></div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <p style="font-weight: bold; font-size: large">
                    <a href="https://www.data-8.co.uk/resources/how-tos/dynamics/duplicare/" target="_blank">View the documentation and FAQs</a>.
                </p>
            </div>
        </div>
        <div class="row" id="globalSearch">
            <div class="col-sm-12">
                <p>
                    <br />
                    data<span style="color: #FF7C22">8</span> duplicare&trade; contains a global search feature. In order to use this feature, a global search form will need to be configured - for more information, please refer to our documentation.
                </p>
                <div class="btn-group">
                    <a href="data8_ConfigureGlobalSearch.html" class="btn btn-default">
                        Configure Global Search
                    </a>
                </div>
            </div>
        </div>
        <div class="row" id="appInsights" style="display:none;">
            <div class="col-sm-12">
                <p>
                    <br />
                    Occasionally data<span style="color: #FF7C22">8</span> support may ask you to enable advanced debugging. In order to toggle that debugging, please click the button below
                </p>
                <p id="appInsightsEnabled" style="display:none;">Advanced Debugging is currently ENABLED on your system.</p>
                <p id="appInsightsDisabled" style="display:none;">Advanced Debugging is currently DISABLED on your system.</p>
                <button id="appInsightsToggle" class="btn btn-default">Toggle Advanced Debugging</button>
            </div>
        </div>
        <div class="row" id="duplicatePlusEnable" style="display:none;">
            <div class="col-sm-12">
                <p>
                    <br />
                    data<span style="color: #FF7C22">8</span> duplicare includes an opt in feature called "Duplicates Detected+" which gives a more in depth duplicates detected experience. Please enable or disable that feature below and press Save above.
                </p>
                <div class="form-check" >
                    <input type="checkbox" class="form-check-input" id="DuplicatesDetectedPlus">
                    <label class="form-check-label" for="DuplicatesDetectedPlus">Duplicates Detected+ Enabled</label>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <p>
                    <br />
                    Copyright &copy; Data8 Ltd 2017-2023. All rights reserved.
                </p>
            </div>
        </div>
        <br />
    </div>

    <script type="text/javascript" src="ClientGlobalContext.js.aspx"></script>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>
    <script src="https://use.fontawesome.com/f00756e2fe.js"></script>

    <script type="text/javascript">
        "use strict";

        var orgUrl = Xrm.Page.context.getClientUrl();
        var oDataEndpoint = orgUrl + "/api/data/v8.0/";        
        var settingsId;
        var orgId;

        var performInitialChecks = function () {
            var qry = "organizations?$select=organizationid";

            $.ajax(oDataEndpoint + qry, {
                dataType: "json",
                success: function (result) {
                    if (result.value.length === 1) {
                        var organization = result.value[0];
                        orgId = organization.organizationid;
                        getAvailableLocations();
                        checkForLatestVersion();
                        showGlobalSearchButton();
                        if (orgUrl.indexOf("dynamics.com") > -1) {
                            $('#duplicatePlusEnable').show();
                        }
                    }
                }
            });
        }

        var showGlobalSearchButton = function () {
            var qry = "data8_dedupeplusconfigurations?$top=50&$select=data8_dedupeplusconfigurationid&$filter=data8_globalsearchenabled eq true";

            $.ajax(oDataEndpoint + qry, {
                dataType: "json",
                success: function (result) {
                    if (result.value.length > 0) {
                        $('#globalSearch').show();
                    }
                }
            });
        }

        var checkForLatestVersion = function () {
            var qry = "solutions?$select=version&$filter=(uniquename%20eq%20%27Data8DuplicateDetectionPlus%27)";
            $.ajax(oDataEndpoint + qry, {
                dataType: "json",
                success: function (result) {
                    if (result.value.length === 1) {
                        var thisVersion = result.value[0].version;
                        var url = "https://webservices.data-8.co.uk/validatecrmconnection.asmx/HasLatestSolutionVersion";
                        $.ajax(url, {
                            method: "POST",
                            contentType: "application/x-www-form-urlencoded",
                            dataType: "xml",
                            data: "solutionName=Duplicare&version=" + thisVersion,
                            success: function (result) {
                                var isLatest = $(result).find("Success").text();
                                if (isLatest === "false") {
                                    $('#laterVersion').show();
                                }
                            }
                        })
                    }
                }
            });
        }        

        var getAvailableLocations = function () {
            var url = "https://webservices.data-8.co.uk/validatecrmconnection.asmx/GetAvailableRegions";
            $.ajax(url, {
                method: "POST",
                contentType: "application/x-www-form-urlencoded",
                dataType: "xml",
                data: "organizationId=" + orgId,
                success: function (result) {
                    $.each($(result).find('Regions').find('string'), function (i, region) {
                        var regionText = region.textContent;
                        $('#Location').append($('<option>', {
                            value: (regionText === "Data8 Hosted" ? "data8" : regionText),
                            text: (regionText === "Data8 Hosted" ? "Data8 Hosted" : "Azure - " + regionText)
                        }));
                    });
                    $('#Location').show();
                    loadConfig();
                }
            })
        }

        var loadConfig = function () {
            var qry = "data8_globaldedupeconfigurations?$select=data8_username,data8_verificationtoken,data8_verificationtokenreceiveddate,data8_dataprocessinglocation,data8_appinsightsloggingenabled,data8_duplicatesdetectedplusenabled";
            $.ajax(oDataEndpoint + qry, {
                dataType: "json",
                beforeSend: function (jqXHR) {
                    jqXHR.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
                },
                success: function (result) {
                    var settings;

                    if (result.value.length === 1) {
                        settings = result.value[0];
                        settingsId = "data8_globaldedupeconfigurations(" + settings.data8_globaldedupeconfigurationid + ")";
                        $('#locationInput').show();
                        $('#appInsights').show();

                        if (settings.data8_appinsightsloggingenabled) {
                            $('#appInsightsEnabled').show();
                            $('#appInsightsDisabled').hide();
                        }
                        else {
                            $('#appInsightsEnabled').hide();
                            $('#appInsightsDisabled').show();
                        }

                        if (settings.data8_duplicatesdetectedplusenabled) {
                            $('#DuplicatesDetectedPlus').prop("checked", true);
                        }

                    } else {
                        settings = { data8_username: "" };
                    }

                    $("#Username").val(settings.data8_username);

                    if (settings.data8_dataprocessinglocation)
                        $("#Location").val(settings.data8_dataprocessinglocation);

                    if (typeof (settings.data8_verificationtokenreceiveddate) !== "undefined") {
                        $("#ValidationStatus").text("Connection details last verified at " + settings["data8_verificationtokenreceiveddate@OData.Community.Display.V1.FormattedValue"]);
                    }
                    else if (settings.data8_verificationtoken) {
                        $("#ValidationStatus").text("Connection details could not be verified");
                    }

                    $('#main-config').show();
                    $('#loading').hide();
                }
            });
        }

        var makeStr = function(length) {
            var result = '';
            var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
            var charactersLength = characters.length;
            for ( var i = 0; i < length; i++ ) {
                result += characters.charAt(Math.floor(Math.random() * charactersLength));
            }
            return result;
        }

        $("#Save").click(function () {
            var onSuccess = function () {
                window.location.reload();
            };

            var onError = function (jqXHR) {
                // Extract and show error
                var response = JSON.parse(jqXHR.responseText);
                var msg = response.error.message;
                var detailsIndex = msg.indexOf("Details: ");
                var details = "";
                if (detailsIndex !== -1) {
                    details = msg.substring(detailsIndex);
                    msg = msg.substring(0, detailsIndex);
                }
                $("#ValidationStatus").text(msg);
                $("#ValidationDetails").text(details);
                $("#Password").closest(".form-group").addClass("has-error");

                saveBtn.prop("disabled", false);
            };

            var saveChanges = function (data) {
                if (typeof (settingsId) === "undefined") {
                    // Create a new configuration
                    $.ajax(oDataEndpoint + "data8_globaldedupeconfigurations", {
                        method: "POST",
                        contentType: "application/json",
                        data: JSON.stringify(data),
                        dataType: "json",
                        success: function (data, textStatus, jqXHR) {
                            // Store the ID of the record to allow future updates
                            settingsId = jqXHR.getResponseHeader("OData-EntityId");
                            onSuccess();
                        },
                        error: onError
                    });
                } else {
                    // Update the existing configuration
                    $.ajax(oDataEndpoint + settingsId, {
                        method: "PATCH",
                        contentType: "application/json",
                        data: JSON.stringify(data),
                        dataType: "json",
                        success: onSuccess,
                        error: onError
                    });
                }

                saveBtn.prop("disabled", true);
                $("#ValidationStatus").html("<i class=\"fa fa-spinner fa-pulse\"></i> Validating...");
            };

            var saveBtn = $(this);
            var username = $("#Username").val();
            var password = $("#Password").val();
            var location = $("#Location").val();

            if (username === "") {
                $("#Username").closest(".form-group").addClass("has-error");
                return;
            } else {
                $("#Username").closest(".form-group").removeClass("has-error");
            }

            var data = {
                data8_verificationtoken: makeStr(10),
                data8_username: username
            };

            if (password !== "")
                data.data8_password = password;

            if (location !== "") {
                data.data8_dataprocessinglocation = location;
            }

            data.data8_duplicatesdetectedplusenabled = $('#DuplicatesDetectedPlus').prop("checked");

            saveChanges(data);
        });

        $("#appInsightsToggle").click(function () {
            var data = {
                data8_appinsightsloggingenabled: !$('#appInsightsEnabled').is(':visible')
            };

            $.ajax(oDataEndpoint + settingsId, {
                method: "PATCH",
                contentType: "application/json",
                data: JSON.stringify(data),
                dataType: "json",
                success: function (result) {
                    performInitialChecks();
                }
            });
        });

        $(document).ready(function () {
            performInitialChecks();          
        });
    </script>
</body>
</html>