﻿<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Data8 duplicare Global Search</title>

    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

    <link rel="stylesheet" href="data8_globalsearch.css" />
</head>
<body>
    <div class="container-fluid">
        <div id="loadingForm">
            <h2>Find Potential Duplicates</h2>
            <div>Loading Form...</div>
        </div>
        <div id="searchForm" style="display: none;">
            <h2>Find Potential Duplicates</h2>
            <form id="mainForm">
                <button id="submit" type="submit" class="btn btn-primary">Search</button>
            </form>
        </div>
        <div id="searching" style="display: none;">
            <h3>Searching for duplicates...</h3>
            <br />
            <div class="progress">
                <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="25" style="width: 0%">0%</div>
            </div>
        </div>
        <div id="results" style="display: none;">
            <h2>Potential Duplicates Found</h2>
            <table id="resultsTable" class="table table-striped">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col" class="col-sm-11">Record</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td scope="row" colspan="1">&nbsp;</td>
                        <td scope="row" colspan="1">
                            <div class="input-group">
                                <span class="input-group-btn">
                                    <button id="back" type="submit" class="btn btn-primary"><< Edit Search</button>
                                </span>
                                &nbsp;&nbsp;
                                <select class="form-control" id="newType"></select>
                                <span class="input-group-btn">
                                    <button id="create" type="submit" class="btn btn-primary">Go</button>
                                </span>

                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>

    <script type="text/javascript" src="ClientGlobalContext.js.aspx"></script>
    <script type="text/javascript" src="data8_globalsearch.js"></script>
<script type="text/javascript">
    var dedupeMetadata;

    $(document).ready(function () {
        d8.GlobalSearch.LoadGlobalSearchDetails(function (result) {
            dedupeMetadata = JSON.parse(result);
            for (i = 0; i < dedupeMetadata.FieldMapping.length; i++) {
                addInputToForm(dedupeMetadata.FieldMapping[i]);
            }
        });
    });

    $("#mainForm").submit(function (e) {
        e.preventDefault();
    
        $("#searchForm").hide();
        $("#searching").show();

        var progress = 0;
        var results = [];
        var data = {};
        for (i = 0; i < dedupeMetadata.FieldMapping.length; i++) {
            var mapping = dedupeMetadata.FieldMapping[i];
            data[mapping.Name] = $("#" + mapping.Name).val();
        };

        for (i = 0; i < dedupeMetadata.EntityTypes.length; i++) {
            var actionParameters = {
                "LogicalName": dedupeMetadata.EntityTypes[i],
                "DirtyFields": JSON.stringify(data),
                "FieldMappings": JSON.stringify(dedupeMetadata.FieldMapping)
            };

            d8.AjaxService.ActivateCustomAction("data8_PerformGlobalSearch", actionParameters, "POST", function(result) {
                    var pcComplete = Math.ceil(++progress * 100 / dedupeMetadata.EntityTypes.length);
                    $(".progress-bar").width(pcComplete + '%');
                    $(".progress-bar").html(pcComplete + '%');
                    
                var parsedResult = JSON.parse(result.JsonResponse);
                    if (parsedResult.Results.length > 0) {
                        results = results.concat(parsedResult.Results);
                    }

                    if (progress === dedupeMetadata.EntityTypes.length) {
                        displayDuplicates(results);
                    }
                },
                // Error
                function(jqXHR, textStatus, errorThrown, target) {
                    var obj = JSON.parse(jqXHR.responseText);
                    var errMsg = obj.error.message || '(' + jqXHR.status + ')' + errorThrown + ' while loading data.';
                    console.error(errMsg);
                });
        }
    });

    $('#create').click(function () {
        var entityType = $('#newType option:selected')[0].attributes["data-type"].value;
        d8.GlobalSearch.CreateGhostRecord(dedupeMetadata, entityType);
    });

    $('#back').click(function() {
        $('#searchForm').show();
        $('#results').hide();
        $(".progress-bar").width('0%');
        $(".progress-bar").html('0%');
        $('.result').remove();
    });

    function displayDuplicates(result) {
        var rowCount = 1;
        if (result.length === 0) {
            $("#resultsTable").find("tr:last").before($('<tr class="result"><td scope="row" colspan="2">No potential duplicates found.</td></tr>'));
        } else {
            for (i = 0; i < result.length; i++) {
                var entityGroup = result[i];
                if (entityGroup.Duplicates) {
                    for (j = 0; j < entityGroup.Duplicates.length; j++) {
                        var duplicate = entityGroup.Duplicates[j];

                        $("#resultsTable").find("tr:last").before($('<tr class="result"><td scope="row">' +
                                rowCount++ +
                                '</td><td><img src="' + getImage(entityGroup) + '" alt="Icon" />&nbsp;' + 
                                '<a href="#" onclick="return viewRecord(this);" data-logicalname="' +
                                entityGroup.LogicalName +
                                '" data-id="' +
                                duplicate.RecordId +
                                '">' +
                                duplicate.DisplayName +
                                '</a></td></tr>'));
                    }
                }
            }
        }

        for (i = 0; i < dedupeMetadata.EntityTypes.length; i++) {
            var entityName = dedupeMetadata.EntityTypes[i];
            var optionHtml = $('<option class="result" data-type="' + entityName + '">Create as new ' + entityName + '</option>');
            $('#newType').append(optionHtml);
        };

        $("#searching").hide();
        $("#results").show();
            
    };

    function getImage(entity) {
        if (entity.IconSmallName) {
            return Xrm.Page.context.getClientUrl() + "/WebResources/" + entity.IconSmallName;
        } else {
            return "/_imgs/ico_16_" + entity.ObjectTypeCode + ".gif";
        }
    }

    function viewRecord(record) {
        var id = record.attributes["data-id"].value;
        var logicalName = record.attributes["data-logicalname"].value;
        Xrm.Utility.openEntityForm(logicalName, '{' + id + '}', null, { openInNewWindow: true });
    };

    function createRecord(entityName) {
        d8.GlobalSearch.CreateGhostRecord(dedupeMetadata, entityName.attributes["data-logicalname"].value);
    };

    function addInputToForm(mappingMetadata) {
        var newHtml =
            "<div class='form-group'><label for='" +
            mappingMetadata.Name +
            "'>" +
            mappingMetadata.Label +
            "</label><input type='text' class='form-control' id='" +
            mappingMetadata.Name +
            "' placeholder='" +
            mappingMetadata.Label +
            "'></div>";

        $(newHtml).insertBefore('#submit');
        $('#loadingForm').hide();
        $('#searchForm').show();
    }

</script>
</body >
</html>