<html>
<head>
    <meta charset="utf-8">
    <title>Act-On User Configuration</title>
    <script type="text/javascript" src="ClientGlobalContext.js.aspx"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.4.0.min.js" integrity="sha256-BJeo0qm959uMBGb65z40ejJYGSgR7REI4+CW1fNKwOg=" crossorigin="anonymous"></script>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@8.14.0/dist/sweetalert2.min.css" integrity="sha384-YsmGiKlWaq3sIUC9UrvhWjrYU2tMXFSQh1IuJjFZSmeSzFOplGnWcZ2+u1LVb89d" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@7.1.0/dist/promise.min.js" integrity="sha384-005PDAIqkqwXU+AXeML/eBA7l58lCjKhvbg8P8ty+qjZmefaAmsHhAPffBPB2eHh" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@8.14.0/dist/sweetalert2.min.js" integrity="sha384-fhb7KkIYTlZ6oSbA5ltLBiFEdKahM2KP27zu2aXQ8d5TqwNegpWNm/XPTCy+ggjC" crossorigin="anonymous"></script>
    <script type="text/javascript" src="custom_ActOnLib.js"></script>
  <style>
    .swal2-popup .swal2-styled:focus {
        box-shadow: none !important;
    }
  </style>
</head>
<body style="overflow-wrap: break-word;">
    <br>
    <div class="row">
        <div class="col-md-11 offset-md-1">
            <h2>Act-On Dynamics Configuration</h2>
        </div>
    </div>

    <div id="unauthorized" class="alert alert-danger" role="alert" style="display: none">
        You do not have the required privileges to view this page.
    </div>
    <br>

    <div id="loggedin" class="row">
        <div class="col-md-1"></div>
        <div class="col-md-10">
            <table class="table table-condensed table-striped table-bordered" id="dynamicsusers">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Dynamics Email Address</th>
                        <th title="Email address you use to log in to Act-On">Act-On Login</th>
                        <th colspan="3" title="The domain you use to connect to Act-On e.g. example.actonsoftware.com">Act-On Domain</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </div>
        <div class="col-md-1"></div>
    </div>

    <script type="text/javascript">
        var success = 0;
        var failure = 0;
        var actonusers = [];
        var entity = 'custom_acton_sso';
        var context;
        var roles;
        var dynamicsusers = [];
        var invalidLicenseTypes = [3];
        var dynversion='365';
        var helplink='https://crmbook.powerobjects.com/system-administration/business-administration/security-roles/#'+dynversion;
        var confirmColor = '#0288d1';
        var cancelColor = '#828282';
		var defaultinternalemailusers = ["dynamics365athena@onmicrosoft.com","dynamics365athena2@onmicrosoft.com","powerqueryonline@onmicrosoft.com","enterprisesales@onmicrosoft.com","ppdfcdsclient@microsoft.com","pacheckerapp@microsoft.com","enterprisesurveyappuser@contoso.com","crmoln@microsoft.com","crmoln2@microsoft.com"];
        
        $(document).ready(function () {
            Init();
            roles = getUserRoles();
            if(isUserSysAdmin(roles)){
                getDynamicsUsers();
                getSystemUsers();
            }
            else {
                $("#unauthorized").show();
                $("#loggedin").hide();
            }
        });

		var isDefaultEmailUser = function (dusr) {
			if(dusr != null){
					return defaultinternalemailusers.indexOf(dusr.toLowerCase()) !== -1;
				}
			else
				return false;
		}

        var isUserSysAdmin = function (roles) {
            var sysAdminNames = ['system administrator', 'systemadministrator'];
            return roles.some(function (role) {
                return sysAdminNames.indexOf(role.toLowerCase()) !== -1;
            });
        };

        var getDynamicsUsers = function () {
            var data = getData('$select=custom_aologin,custom_domain,custom_acton_ssoid, custom_userid', entity);
            dynamicsusers = data;
        }

        var getSystemUsers = function () {
            var users = [];
            var query='$select=systemuserid, internalemailaddress, firstname, lastname, isdisabled, invitestatuscode, userlicensetype&$filter=isdisabled eq false';
            var users = getData(query, "SystemUser");
            processDynamicsUserData(users);
        }

        var processDynamicsUserData = function (results) {

            $("#dynamicsusers > tbody").empty();
            results.forEach(function (u) {
				// only allow users that are enabled, non-default (from a MS Dynamics CRM perspective), and (either invited or have some type of license to login)
                if (u["isdisabled"] == false && !isDefaultEmailUser(u["internalemailaddress"]) && (u["invitestatuscode"] > 0 || u["userlicensetype"] != -1)) {

                    u.actonEmail = '';
                    u.actonDomain = '';

                    dynamicsusers.forEach(function (dUser) {
                        if (dUser["custom_userid"] == u["systemuserid"]) {
                            u.actonEmail = dUser["custom_aologin"],
                            u.actonDomain = dUser["custom_domain"],
                            u.ssoId = dUser["custom_acton_ssoid"]
                        }
                    })

                    addDynamicsTableRow(u);
                }
            });
        }

        var addDynamicsTableRow = function (row) {
            var html = '<tr>';
            html += '<td>' + row["firstname"] + ' ' + row["lastname"] + "</td>";
            html += '<td>' + row["internalemailaddress"] + "</td>";
            html += '<td><input id="actonEmail' + row["systemuserid"] + '" style="font-size: 10pt" type="text" class="actonEmail form-control"  value="' + row.actonEmail + '"/></td>';
            html += '<td><input id="actonDomain' + row["systemuserid"] + '" style="font-size: 10pt" type="text" class="actonDomain form-control" value="' + row.actonDomain + '"/>' +
                '<input id="ssoId' + row["systemuserid"] + '" type="hidden" value="' + row.ssoId + '" /></td>';
            html+= '<td><input type="button" class="btn btn-primary btn-sm" onclick="save(' + "'" + row["systemuserid"] + "'" + ')" value="Save" /></td>';

            var styletext=' style="display:none"';
            if(row.actonEmail){
                styletext='';
            }

            html+='<td><button type="button" id="removebtn' + row["systemuserid"] +'" ' + styletext + ' onclick="remove(' + "'" + row["systemuserid"] + "'" + ')" class="btn btn-link">Remove</button></td>';
            html += '</tr>'
            $('#dynamicsusers > tbody:last-child').append(html);
        }

        var remove = function(userId){
            Swal.fire({
                title: 'Are you sure?',
                text: "Please confirm!",
                type: 'warning',
                showCancelButton: true,
                confirmButtonColor: confirmColor,
                cancelButtonColor: cancelColor,
                confirmButtonText: 'Yes, delete it!',
                focusConfirm: false
                }).then(function(result){
                if (result.value) {
                    var ssoId = $("#ssoId"+ userId).val();
                    if(deleteSID(ssoId)){
                        $("#actonEmail" + userId).val('');
                        $("#actonDomain"+ userId).val('');
                        $("#removebtn"+userId).hide();
                        Swal.fire({
                            title:'Success!',
                            html:"Act-On User affiliation has been deleted.  <br /><br />To finish registration, please go to User Settings and remove the role 'Act-On User'.",
                            type:'success',
                            footer:'<a href="' + helplink + '" target="_docs">Click here for more info</a>',
                            confirmButtonColor: confirmColor,
                            focusConfirm: false
                        }).then((result) => {
                            location.reload();
                        });
                    }
                    else{
                        alert("Problem deleting Act-On SSO Affiliation.  Please check your logs and contact Act-On support.");
                    }
                }
            })
        }

        var save = function (userId) {
            var aoemail = $("#actonEmail" + userId).val();
            var aodomain = $("#actonDomain"+ userId).val();
            var ssoId = $("#ssoId"+ userId).val();
            if (aoemail !== '' && aodomain != '') {
                if (ssoId === 'undefined'){
                    createSID(aoemail, aodomain, userId);
                }
                else
                    updateSID(aoemail, aodomain, ssoId);
            }
            else  {
                alert('You must enter a value for both the Act-On Username and the Act-On SubDomain : ' + name);
            }
        }

        var successCallback = function (data, textStatus, XmlHttpRequest) {
            Swal.fire({
                title:'Success!',
                html:"Act-On User affiliation has been created.  <br /><br />To finish registration, please go to User Settings and add the role 'Act-On User'.",
                type:'success',
                footer:'<a href="' + helplink + '" target="_docs">Click here for more info</a>',
                confirmButtonColor: confirmColor,
                focusConfirm:false
            }).then((result) => {
                location.reload();
            });
        }
        var errorCallback = function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Error updating Act-On SSO Affiliation : " + textStatus + JSON.stringify(errorThrown));
            console.log("Update error: " + error?.responseJSON?.error?.message?.value);
            alert("Problem creating Act-On SSO Affiliation.  Please check your logs and contact Act-On support.");
        }

        var createSID = function (email, domain, userId) {
            var data = generateSid(email, domain, userId);
            data.custom_userid = userId;
            var json = JSON.stringify(data);
            createObject(serverUrl, entity, json, successCallback, errorCallback);
        }

        var updateSID = function (email, domain, ssoID) {
            var data = generateSid(email, domain);
            var json = JSON.stringify(data);
            if(updateObject(serverUrl, ssoID, entity, json)){
                Swal.fire({
                title: 'Success!',
                text: "Act-On User affiliation has been updated.",
                type: 'success',
                confirmButtonColor: confirmColor,
                focusConfirm:false
            });
            }
            else{
                alert("Problem updating Act-On SSO Affiliation.  Please check your logs and contact Act-On support.");
            }
        }

        var deleteSID = function (ssoID){
            var data = {};
            var json = JSON.stringify(data);
            return deleteObject(serverUrl, ssoID, entity, json);
        }
    </script>
</body>
</html>
