/**
 * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
 *
 * @author Double Bastion LLC
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

$(document).ready(function() {

  var ctappdir = 'apps';

  // Get app directory
  var getappdirurl = OC.generateUrl('/apps/sms_relentless/user/getappdirectory');

  $.ajax({
     method: 'GET',
     url: getappdirurl,
     contentType: 'application/json',
     success: function(appdirfdb) {

                  ctappdir = appdirfdb;

		  // Get admin settings
		  var baseUrlget = OC.generateUrl('/apps/sms_relentless/user/getadminsettings');

		  $.ajax({
		     method: 'GET',
		     url: baseUrlget,
		     contentType: 'application/json',
		     success: function(settingsadm) {

			  $("#telapi_key").val(settingsadm.telapi_key);
			  $("#tel_pub_key").val(settingsadm.tel_pub_key);
			  $("#telapi_url_rec").val(settingsadm.telapi_url_rec);
			  $("#telapi_url").val(settingsadm.telapi_url);
			  $("#messaging_profile_id").val(settingsadm.messaging_profile_id);
			  $("#nexapi_key").val(settingsadm.nexapi_key);
			  $("#nexapi_secret").val(settingsadm.nexapi_secret);
			  $("#nexapi_url_rec").val(settingsadm.nexapi_url_rec);
			  $("#nexapi_url").val(settingsadm.nexapi_url);
			  $("#twilapi_key").val(settingsadm.twilapi_key);
			  $("#twilapi_secret").val(settingsadm.twilapi_secret);
			  $("#twilapi_url_rec").val(settingsadm.twilapi_url_rec);
			  $("#twilapi_url").val(settingsadm.twilapi_url);
			  $("#flowapi_key").val(settingsadm.flowapi_key);
			  $("#flowapi_secret").val(settingsadm.flowapi_secret);
			  $("#flowapi_url_rec").val(settingsadm.flowapi_url_rec);
			  $("#flowapi_url").val(settingsadm.flowapi_url);
			  $("#tel_sender_name").val(settingsadm.tel_sender_name);
			  $("#nex_sender_name").val(settingsadm.nex_sender_name);
			  $("#twil_sender_name").val(settingsadm.twil_sender_name);

			  var crntadmDispName = settingsadm.admdisplayname;
			  var allRestrictions = settingsadm.restrictions;
			  var allGroups = settingsadm.allgroups;
			  var allUsers = settingsadm.allusers;
			  var allGroupswadm = settingsadm.allgroupswadm;
			  var allUserswadm = settingsadm.alluserswadm;
			  var tnxallowedgrp = settingsadm.allowedkeysuse.tnx_groups_allowed;
			  var tnxallowedusr = settingsadm.allowedkeysuse.tnx_users_allowed;
			  var plvallowedgrp = settingsadm.allowedkeysuse.plv_groups_allowed;
			  var plvallowedusr = settingsadm.allowedkeysuse.plv_users_allowed;
			  var twlallowedgrp = settingsadm.allowedkeysuse.twl_groups_allowed;
			  var twlallowedusr = settingsadm.allowedkeysuse.twl_users_allowed;
			  var flrallowedgrp = settingsadm.allowedkeysuse.flr_groups_allowed;
			  var flrallowedusr = settingsadm.allowedkeysuse.flr_users_allowed;

			  var tnxallowedgrpdel = settingsadm.allowedkeysuse.tnx_groups_del;
			  var tnxallowedusrdel = settingsadm.allowedkeysuse.tnx_users_del;
			  var plvallowedgrpdel = settingsadm.allowedkeysuse.plv_groups_del;
			  var plvallowedusrdel = settingsadm.allowedkeysuse.plv_users_del;
			  var twlallowedgrpdel = settingsadm.allowedkeysuse.twl_groups_del;
			  var twlallowedusrdel = settingsadm.allowedkeysuse.twl_users_del;
			  var flrallowedgrpdel = settingsadm.allowedkeysuse.flr_groups_del;
			  var flrallowedusrdel = settingsadm.allowedkeysuse.flr_users_del;

			  if (tnxallowedgrpdel == 1) { $("#alwDelGrps-tnx").attr("checked", true); } else { $("#alwDelGrps-tnx").attr("checked", false); }
			  if (tnxallowedusrdel == 1) { $("#alwDelUsrs-tnx").attr("checked", true); } else { $("#alwDelUsrs-tnx").attr("checked", false); }
			  if (plvallowedgrpdel == 1) { $("#alwDelGrps-plv").attr("checked", true); } else { $("#alwDelGrps-plv").attr("checked", false); }
			  if (plvallowedusrdel == 1) { $("#alwDelUsrs-plv").attr("checked", true); } else { $("#alwDelUsrs-plv").attr("checked", false); }
			  if (twlallowedgrpdel == 1) { $("#alwDelGrps-twl").attr("checked", true); } else { $("#alwDelGrps-twl").attr("checked", false); }
			  if (twlallowedusrdel == 1) { $("#alwDelUsrs-twl").attr("checked", true); } else { $("#alwDelUsrs-twl").attr("checked", false); }
			  if (flrallowedgrpdel == 1) { $("#alwDelGrps-flr").attr("checked", true); } else { $("#alwDelGrps-flr").attr("checked", false); }
			  if (flrallowedusrdel == 1) { $("#alwDelUsrs-flr").attr("checked", true); } else { $("#alwDelUsrs-flr").attr("checked", false); }

			  if (settingsadm.show_all_messages == 1) { $("#showallmessages").attr("checked", true); } else { $("#showallmessages").attr("checked", false); }

			  // List all the groups and users allowed to access the API keys, for each provider
			  if (tnxallowedgrp) {
			      var tnxallowedgrparr = tnxallowedgrp.split("|");
			      for (var g = 0; g < tnxallowedgrparr.length; g++) {
				   $("#alwdakeyGrps-tnx").append("<div class='selectedGrps'>"+ tnxallowedgrparr[g] +"<img id='rmvGrp-tnx-"+ tnxallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
			      }
			  }

			  if (tnxallowedusr) {
			      var tnxallowedusrarr = tnxallowedusr.split("|");
			      for (var g = 0; g < tnxallowedusrarr.length; g++) {
				   $("#alwdakeyUsrs-tnx").append("<div class='selectedUsrs'>"+ tnxallowedusrarr[g] +"<img id='rmvUsr-tnx-"+ tnxallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
			      }
			  }

			  if (plvallowedgrp) {
			      var plvallowedgrparr = plvallowedgrp.split("|");
			      for (var g = 0; g < plvallowedgrparr.length; g++) {
				   $("#alwdakeyGrps-plv").append("<div class='selectedGrps'>"+ plvallowedgrparr[g] +"<img id='rmvGrp-plv-"+ plvallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
			      }
			  }

			  if (plvallowedusr) {
			      var plvallowedusrarr = plvallowedusr.split("|");
			      for (var g = 0; g < plvallowedusrarr.length; g++) {
				   $("#alwdakeyUsrs-plv").append("<div class='selectedUsrs'>"+ plvallowedusrarr[g] +"<img id='rmvUsr-plv-"+ plvallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
			      }
			  }

			  if (twlallowedgrp) {
			      var twlallowedgrparr = twlallowedgrp.split("|");
			      for (var g = 0; g < twlallowedgrparr.length; g++) {
				   $("#alwdakeyGrps-twl").append("<div class='selectedGrps'>"+ twlallowedgrparr[g] +"<img id='rmvGrp-twl-"+ twlallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
			      }
			  }

			  if (twlallowedusr) {
			      var twlallowedusrarr = twlallowedusr.split("|");
			      for (var g = 0; g < twlallowedusrarr.length; g++) {
				   $("#alwdakeyUsrs-twl").append("<div class='selectedUsrs'>"+ twlallowedusrarr[g] +"<img id='rmvUsr-twl-"+ twlallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
			      }
			  }

			  if (flrallowedgrp) {
			      var flrallowedgrparr = flrallowedgrp.split("|");
			      for (var g = 0; g < flrallowedgrparr.length; g++) {
				   $("#alwdakeyGrps-flr").append("<div class='selectedGrps'>"+ flrallowedgrparr[g] +"<img id='rmvGrp-flr-"+ flrallowedgrparr[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
			      }
			  }

			  if (flrallowedusr) {
			      var flrallowedusrarr = flrallowedusr.split("|");
			      for (var g = 0; g < flrallowedusrarr.length; g++) {
				   $("#alwdakeyUsrs-flr").append("<div class='selectedUsrs'>"+ flrallowedusrarr[g] +"<img id='rmvUsr-flr-"+ flrallowedusrarr[g] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
			      }
			  }


			  // Create a list with all the available groups, excluding the admin group
			  var grpsListItemswadm = "";
			  $.each(allGroupswadm, function(key, value) {
				 grpsListItemswadm += "<div class='groupsList'>"+ value +"</div>";
			  });

			  // Create a list with all the available users, excluding the admins
			  var usersListItemswadm = "";
			  $.each(allUserswadm, function(key, usrval) {
				 usersListItemswadm += "<div class='usersList'>"+ usrval +"</div>";
			  });
			  

			  function showListsalwdk() {

			      // Append the list of available groups to the table of groups and users allowed to use the API keys
			      $('[id^="showakeyGrps-"]').click(function() {
				 var crtid = $(this).attr("id").split("-")[1];
				 $("#grpsadapik-"+ crtid).remove();
				 $("#showakeyGrps-"+ crtid).append("<div id='grpsadapik-"+ crtid +"' class='grpsList'>"+ grpsListItemswadm +"</div>");
				 $("#adminOverlay").remove();
				 $("#app-content").append("<div id='adminOverlay'></div>");
				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });

				 $("#adminOverlay").click(function() { 
				    $("#adminOverlay").remove();
				    $("#grpsadapik-"+ crtid).remove();
				    $("#usrsadapik-"+ crtid).remove();
				 });

				 // Select a group
				 $(".groupsList").click(function() {
				    var slctdGrp = $(this).text();
				    $("#grpsadapik-"+ crtid).remove();
				    var addedTxtgrp = $("#alwdakeyGrps-"+ crtid).text();

				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
					$("#alwdakeyGrps-"+ crtid).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ crtid +"-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
				    } else { showAlert("That group has already been added!"); }

				    // Remove a group from list
				    $('[id^="rmvGrp-"]').click(function() {
				       $(this).closest(".selectedGrps").remove();
				    });
				 });

			      });

			      // Append the list of available users to the table of groups and users allowed to use the API keys
			      $('[id^="showakeyUsrs-"]').click(function() {

				 var crtidusr = $(this).attr("id").split("-")[1];
				 $("#usrsadapik-"+ crtidusr).remove();
				 $("#showakeyUsrs-"+ crtidusr).append("<div id='usrsadapik-"+ crtidusr +"' class='usrsList'>"+ usersListItemswadm +"</div>");
				 $("#adminOverlay").remove();
				 $("#app-content").append("<div id='adminOverlay'></div>");
				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });

				 $("#adminOverlay").click(function() { 
				    $("#adminOverlay").remove(); 
				    $("#grpsadapik-"+ crtidusr).remove();
				    $("#usrsadapik-"+ crtidusr).remove();
				 });

				 // Select a user
				 $(".usersList").click(function() {
				    var slctdUsr = $(this).text();
				    var addedTxtusr = $("#alwdakeyUsrs-"+ crtidusr).text();

				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
					$("#alwdakeyUsrs-"+ crtidusr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ crtidusr +"-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
				    } else { showAlert("That user has already been added!"); }

				    // Remove a user from list
				    $('[id^="rmvUsr-"]').click(function() {
				       $(this).closest(".selectedUsrs").remove();
				    });
				 });

			      });

			      // Remove a group from the list 
			      $('[id^="rmvGrp-"]').click(function() {
				 $(this).closest(".selectedGrps").remove();
			      });

			      // Remove a user from the list
			      $('[id^="rmvUsr-"]').click(function() {
				 $(this).closest(".selectedUsrs").remove();
			      });

			  }
			  showListsalwdk();


			  // Save the data
			  function saveAlwdRow() {
			     $('[id^="alwdrstsave-"]').unbind("click");
			     $('[id^="alwdrstsave-"]').click(function(event) {

				 event.preventDefault();
				 var crntprov = $(this).attr("id").replace("alwdrstsave-", "");
				 
				 if ($(this).attr("value") == "Save") {

				     var selGroups = [];
				     $("#alwdakeyGrps-"+ crntprov +" .selectedGrps").each(function() {
					selGroups.push($(this).text());
				     });
				     if (selGroups.length == 0) { selGroups.push(""); }

				     var selUsers = [];
				     $("#alwdakeyUsrs-"+ crntprov +" .selectedUsrs").each(function() {
					selUsers.push($(this).text());
				     });
				     if (selUsers.length == 0) { selUsers.push(""); }

				     // Check if the access key fields have been left empty
				     if (crntprov == 'tnx' && ($("#telapi_key").val().trim() == '' || $("#tel_pub_key").val().trim() == '' || $("#messaging_profile_id").val().trim() == '')) {
					 showAlert("Please first fill in the fields: 'Telnyx API Secret Key', 'Telnyx Account Public Key' and 'Messaging Profile ID'");
					 return;
				     } else if (crntprov == 'plv' && ($("#nexapi_key").val().trim() == '' || $("#nexapi_secret").val().trim() == '')) {
					 showAlert("Please first fill in the fields: 'Plivo Auth ID' and 'Plivo Auth Token'.");
					 return;
				     } else if (crntprov == 'twl' && ($("#twilapi_key").val().trim() == '' || $("#twilapi_secret").val().trim() == '')) {
					 showAlert("Please first fill in the fields: 'Twilio Account SID' and 'Twilio Auth Token'.");
					 return;
				     } else if (crntprov == 'flr' && ($("#flowapi_key").val().trim() == '' || $("#flowapi_secret").val().trim() == '')) {
					 showAlert("Please first fill in the fields: 'Flowroute Access Key' and 'Flowroute Secret Key'.");
					 return;
				     }

		                     if ($("#alwDelGrps-"+ crntprov +"").is(':checked')) { var delGroups = 1; } else { var delGroups = 0; }

		                     if ($("#alwDelUsrs-"+ crntprov +"").is(':checked')) { var delUsers = 1; } else { var delUsers = 0; }

				     var saveAlwdUrl = OC.generateUrl('/apps/sms_relentless/user/updatekeysallowedusers');

				     var alwddatatosend = {
					      groups: selGroups,
					      users: selUsers,
                                              groupsdel: delGroups,
                                              usersdel: delUsers,
					      provider: crntprov
				     };

				     $.ajax({
					   method: 'PUT',
					   url: saveAlwdUrl,
					   contentType: 'application/json',
					   data: JSON.stringify(alwddatatosend),
					   success: function(messagesent) {
					                if (messagesent == 'success') {
					                    showAlert('The allowed groups and users have been successfully saved to the database! However, to be able to send and receive messages using the shared keys from above, the allowed users have to generate and save the 2 webhook URLs corresponding to this SMS provider, on their own Settings page.');
					                } else if (messagesent != 'success' && messagesent != 'failure') {
					                    showAlert(messagesent);
					                } else if (messagesent == 'failure') {
					                    showAlert('Error while trying to save the allowed groups and users!');
					                }
					   },
					   error: function() {
							showAlert('Error while attempting to save the allowed groups and users! You can check the Nextcloud log to find more details about this issue.');
					   }
				     });

				     $(this).attr("value", "Edit");

				} else { $("#alwdrstsave-"+ crntprov).attr("value", "Save"); }

			     });
			  }
			  saveAlwdRow();



			  // Phone number restrictions

			  // Create a list with all the available groups
			  var grpsListItems = "";
			  $.each(allGroups, function(key, value) {
				 grpsListItems += "<div class='groupsList'>"+ value +"</div>";
			  });

			  // Create a list with all the available users, excluding the admins
			  var usersListItems = "";
			  $.each(allUserswadm, function(key, usrval) {
				 usersListItems += "<div class='usersList'>"+ usrval +"</div>";
			  });


			  if (allRestrictions.length > 0) {
			      var restrNmb = allRestrictions.length;
			  } else {
			      var restrNmb = 0;
			  }


			  // List the access restrictions for groups and users
			  if (restrNmb == 0) {

			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ restrNmb +"' class='restrPhoneNmbr'></select></td><td><div id='rstgrp-"+ restrNmb +"' class='restrGroups'></div></td><td><div id='showGrps-"+ restrNmb +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ restrNmb +"' class='restrUsers'></div></td><td><div id='showUsr-"+ restrNmb +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ restrNmb +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ restrNmb +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");

			  } else {

			      for (k = 0; k < restrNmb; k++) {

				   if (allRestrictions[k].groups) {
				       var groupsfdbpre = allRestrictions[k].groups.split("|");
				       var groupsfdb = "";
				       for (var g = 0; g < groupsfdbpre.length; g++) {
					    groupsfdb += "<div class='selectedGrps'>"+ groupsfdbpre[g] +"<img id='rmvGrp-"+ groupsfdbpre[g] +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>";
				       }
				   } else { var groupsfdb = ""; }

				   if (allRestrictions[k].users) {
				       var usersfdbpre = allRestrictions[k].users.split("|");
				       var usersfdb = "";
				       for (var u = 0; u < usersfdbpre.length; u++) {
					    usersfdb += "<div class='selectedUsrs'>"+ usersfdbpre[u] +"<img id='rmvUsr-"+ usersfdbpre[u] +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>";
				       }
				   } else { var usersfdb = ""; }

				   $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ allRestrictions[k].saved_by_dsplname +"' disabled></td><td><select id='rstphn-"+ k +"' class='restrPhoneNmbr' style='pointer-events:none'><option selected>"+ allRestrictions[k].phone_number +"</option></select></td><td><div id='rstgrp-"+ k +"' class='restrGroups'>"+ groupsfdb +"</div></td><td><div id='showGrps-"+ k +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ k +"' class='restrUsers'>"+ usersfdb +"</div></td><td><div id='showUsr-"+ k +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ k +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ k +"' class='saveRestrictions' value='Edit' title='Edit Row' /></td></tr>");
			      }
			      $("#phoneNmbrRestr").append("<div><img id='addRestrRow' src='/" + ctappdir + "/sms_relentless/img/add.svg' title='Add Row'></div>");
			  }


			  // Get the available phone numbers from all providers associated with the access keys entered on the Settings page
			  $("#phoneNumberTh").addClass('icon-loading');
			  var getnumbersUrl = OC.generateUrl("/apps/sms_relentless/user/getsmsnumbers");
			  var numbersListItems = '';

			  $.ajax({
				  url: getnumbersUrl,
				  type: "POST",
				  cache: false,
				  processData: false,
				  contentType: false,
				  success: function(currentnmbrs) {

					            $("#phoneNumberTh").removeClass('icon-loading');

						    // Create a list with all the available phone numbers
					            numbersListItems = "<option value='' selected>Select phone number</option>";

						    $.each(currentnmbrs, function(key, indsmsnmb) {
							   numbersListItems += "<option value='"+ indsmsnmb +"'>"+ indsmsnmb +"</option>";
						    });

						    if (restrNmb == 0) { var indRow = 0; } else { var indRow = parseInt(restrNmb + 1); }

						    // Append the list of available phone numbers
						    $("#rstphn-"+ indRow).empty();
						    $("#rstphn-"+ indRow).append(numbersListItems);
			
				  },
				  error: function() {
					            $("#phoneNumberTh").removeClass('icon-loading'); 
					            showAlert("Error while attempting to retrieve the available phone numbers!");
				  }
			  });


			  function showLists() {

			      // Append the list of available groups to the restrictions table
			      $('[id^="showGrps-"]').click(function() {
				 var crtnmbr = $(this).attr("id").replace("showGrps-", "");
				 $("#grpL-"+ crtnmbr).remove();
				 $("#showGrps-"+ crtnmbr).append("<div id='grpL-"+ crtnmbr +"' class='grpsList'>"+ grpsListItems +"</div>");
				 $("#adminOverlay").remove();
				 $("#app-content").append("<div id='adminOverlay'></div>");
				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });

				 $("#adminOverlay").click(function() { 
				    $("#adminOverlay").remove(); 
				    $("#grpL-"+ crtnmbr).remove(); 
				    $("#usrL-"+ crtnmbr).remove();
				 });

				 // Select a group
				 $(".groupsList").click(function() {
				    var slctdGrp = $(this).text();
				    $("#grpL-"+ crtnmbr).remove();
				    var addedTxtgrp = $("#rstgrp-"+ crtnmbr).text();

				    if (addedTxtgrp.indexOf(slctdGrp) == -1) {
					$("#rstgrp-"+ crtnmbr).append("<div class='selectedGrps'>"+ slctdGrp +"<img id='rmvGrp-"+ slctdGrp +"' class='removeGroup' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this group'></div>");
				    } else { showAlert("That group has already been added!"); }

				    // Remove a group from list
				    $('[id^="rmvGrp-"]').click(function() {
				       $(this).closest(".selectedGrps").remove();
				    });
				 });

			      });

			      // Append the list of available users to the restrictions table
			      $('[id^="showUsr-"]').click(function() {

				 var ctusrnmbr = $(this).attr("id").replace("showUsr-", "");
				 $("#usrL-"+ ctusrnmbr).remove();
				 $("#showUsr-"+ ctusrnmbr).append("<div id='usrL-"+ ctusrnmbr +"' class='usrsList'>"+ usersListItems +"</div>");
				 $("#adminOverlay").remove();
				 $("#app-content").append("<div id='adminOverlay'></div>");
				 $("#adminOverlay").css({ "width" : parseInt($("#sms_relentless_adm").width() + 400) +"px", "height" : $("#sms_relentless_adm").height() +"px" });

				 $("#adminOverlay").click(function() { 
				    $("#adminOverlay").remove(); 
				    $("#grpL-"+ ctusrnmbr).remove(); 
				    $("#usrL-"+ ctusrnmbr).remove();
				 });

				 // Select a user
				 $(".usersList").click(function() {
				    var slctdUsr = $(this).text();
				    var addedTxtusr = $("#rstusr-"+ ctusrnmbr).text();

				    if (addedTxtusr.indexOf(slctdUsr) == -1) {
					$("#rstusr-"+ ctusrnmbr).append("<div class='selectedUsrs'>"+ slctdUsr +"<img id='rmvUsr-"+ slctdUsr +"' class='removeUser' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this user'></div>");
				    } else { showAlert("That user has already been added!"); }

				    // Remove a user from list
				    $('[id^="rmvUsr-"]').click(function() {
				       $(this).closest(".selectedUsrs").remove();
				    });
				 });

			      });

			      // Remove a group from the list 
			      $('[id^="rmvGrp-"]').click(function() {
				 $(this).closest(".selectedGrps").remove();
			      });

			      // Remove a user from the list
			      $('[id^="rmvUsr-"]').click(function() {
				 $(this).closest(".selectedUsrs").remove();
			      });

			  }
			  showLists();


			  // Save the data
			  function saveRestrRow() {

			     $('[id^="rstsave-"]').unbind("click");
			     $('[id^="rstsave-"]').click(function(event) {

				 event.preventDefault();
				 var crntrwnmbr = $(this).attr("id").replace("rstsave-", "");

				 if ($(this).attr("value") == "Save") {

				     var phoneNmbr = $("#rstphn-"+ crntrwnmbr).val();
				     var slctdGroups = [];
				     $("#rstgrp-"+ crntrwnmbr +" .selectedGrps").each(function() {
					slctdGroups.push($(this).text());
				     });
				     var slctdUsers = [];
				     $("#rstusr-"+ crntrwnmbr +" .selectedUsrs").each(function() {
					slctdUsers.push($(this).text());
				     });

				     if (phoneNmbr != '') {

				       if (slctdGroups.length > 0 || slctdUsers.length > 0) {

					 var saveRestrUrl = OC.generateUrl('/apps/sms_relentless/user/updatenumberrestrictions');

					 var datatosend = {
					      savedByDsplname: crntadmDispName,
					      phoneNumber: phoneNmbr,
					      groups: slctdGroups,
					      users: slctdUsers
					 };

					 $.ajax({
					   method: 'PUT',
					   url: saveRestrUrl,
					   contentType: 'application/json',
					   data: JSON.stringify(datatosend),
					   success: function(messagetosend) {
					                if (messagetosend == 'success') {
					                    showAlert('The restrictions have been successfully saved to the database!');
					                } else {
					                    showAlert('Error while trying to save the restrictions!');
					                }
					   },
					   error: function() {
							showAlert('Error while attempting to save the restrictions! You can check the Nextcloud log to find more details about this issue.');
					   }
					 });

				       } else { showAlert("You must select at least a group or a user in order to restrict access to a phone number."); return; }

				     } else { showAlert("Please select a phone number!"); return; }

				     $(this).attr("value", "Edit");

				} else {

				     $("#rstsave-"+ crntrwnmbr).attr("value", "Save");
				}

			     });
			  }
			  saveRestrRow();

			  // Remove a row
			  function removeRestrRow() {

			       $('[id^="rmRow-"]').click(function() {

				  var slctRowRmv = $(this).attr("id").replace("rmRow-", "");
				  var crntPhNmbr = $("#rstphn-"+ slctRowRmv).val();

				  confirmAlert("Do you really want to remove this row from the database ?");

				  $("#confirmCancel").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });

				  $("#confirmOk").click(function() {

				      $("#alertMsgOverlay").remove();
				      $("#alertConfMessage").remove();

				      var rmvRestrUrl = OC.generateUrl('/apps/sms_relentless/user/removenumberrestrictions');
				      $.ajax({
					   url: rmvRestrUrl,
					   method: "POST",
					   dataType: "text",
					   data: { phoneNumber: crntPhNmbr },
					   success: function(delresult) {

					                     if (delresult.indexOf("success") > -1) {
					                         showAlert("The restriction has been removed successfully!");
					                         $("#rstphn-"+ slctRowRmv).closest("tr").remove();
					                     } else {
					                         showAlert("Error while trying to remove restriction data!");
					                     }
					   },
					   error: function() { showAlert("Error while attempting to remove restriction data! You can check the Nextcloud log to find more details about this issue."); }
				       });
				  });
			       });
			  }
			  removeRestrRow();

			  // Add a new row
			  $("#addRestrRow").click(function() {
			      if ($("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").length > 0) {
				  var lastrstAuth = $("#phoneNmbrRestr").find("tr:last-child").find(".restrPhoneNmbr").attr("id").replace("rstphn-", "");
				  var indRowAdd = parseInt(lastrstAuth + 1);
			      } else { var indRowAdd = 0; }
			      $("#phoneNmbrRestr").append("<tr><td><input type='text' class='restrAuthor' value='"+ crntadmDispName +"' disabled></td><td><select id='rstphn-"+ indRowAdd +"' class='restrPhoneNmbr'>"+ numbersListItems +"</select></td><td><div id='rstgrp-"+ indRowAdd +"' class='restrGroups'></div></td><td><div id='showGrps-"+ indRowAdd +"' class='showAllGroups'><img src='/" + ctappdir + "/sms_relentless/img/group.svg' style='cursor:pointer' title='Show all groups'></div></td><td><div id='rstusr-"+ indRowAdd +"' class='restrUsers'></div></td><td><div id='showUsr-"+ indRowAdd +"' class='showAllUsers'><img src='/" + ctappdir + "/sms_relentless/img/user.svg' style='cursor:pointer' title='Show all users'></div></td><td><img id='rmRow-"+ indRowAdd +"' class='removeRow' src='/" + ctappdir + "/sms_relentless/img/closewnd.svg' title='Remove this row from the database' style='cursor:pointer;margin:6px 7px 0px 6px;'></td><td><input type='submit' id='rstsave-"+ indRowAdd +"' class='saveRestrictions' value='Save' title='Save Row' /></td></tr>");
			      showLists();
			      saveRestrRow();
			      removeRestrRow();

			      // Check if the same phone number has been already restricted
			      $("#rstphn-"+ indRowAdd).change(function() {
				 var selectedPhNmbr = $("#rstphn-"+ indRowAdd).val();
				 var allPHoneRestr = $("#phoneNmbrRestr").find("tr").find(".restrPhoneNmbr");
				 var phNmbrChck = 0;
				 allPHoneRestr.each(function() {
				    var slctdphnmbr = ($(this).val())? $(this).val() : $(this).text();
				    if (selectedPhNmbr == slctdphnmbr) { phNmbrChck++; }
				 });

				 if (phNmbrChck == 2) {
				     showAlert("This phone number is already in the list of restricted phone numbers. Please edit its own row, or choose a different phone number to restrict access to.");
				     $(this).val('');
				     return;
				 }
			      });
			  });

		     },
		     error: function() {
				showAlert('Error while getting the admin settings! You can check the Nextcloud log to find more details about this issue.');
		     }
		  });



		  // Save admin settings
		  function randomStr(strlength) {
			var fintext = "";
			var keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
			for (var i = 0; i < strlength; i++) {
			     fintext += keyspace.charAt(Math.floor(Math.random() * keyspace.length));
			}
			return fintext;
		  }

		  $("#generate_tel_rcpt").on("click", function(event) {

		     var teltokenrec = randomStr(70);
		     var telnyxwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstel?telrecparam=') + teltokenrec;

		     $("#telapi_url_rec").val(telnyxwhurlrec);
		  });

		  $("#copyToClipboardtel").on("click", function(event) {
		     var $tempEl = $("<input>");
		     $("body").append($tempEl);
		     $tempEl.val($("#telapi_url_rec").val()).select();
		     document.execCommand("Copy");
		     $tempEl.remove();
		     showAlert("The link has been copied to your clipboard!");
		  });

		  $("#generate_tel_delrcpt").on("click", function(event) {

		     var teltoken = randomStr(70);
		     var telnyxwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytel?teldrparam=') + teltoken;

		     $("#telapi_url").val(telnyxwhurl);
		  });

		  $("#generate_nex_rcpt").on("click", function(event) {

		     var plivotokenrec = randomStr(70);
		     var plivowhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsnex?plivorecparam=') + plivotokenrec;

		     $("#nexapi_url_rec").val(plivowhurlrec);
		  });

		  $("#copyToClipboardnex").on("click", function(event) {
		     var $tempElpl = $("<input>");
		     $("body").append($tempElpl);
		     $tempElpl.val($("#nexapi_url_rec").val()).select();
		     document.execCommand("Copy");
		     $tempElpl.remove();
		     showAlert("The link has been copied to your clipboard!");
		  });

		  $("#generate_nex_delrcpt").on("click", function(event) {

		     var plivotoken = randomStr(70);
		     var plivodrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverynex?plivodrparam=') + plivotoken;

		     $("#nexapi_url").val(plivodrwhurl);
		  });

		  $("#generate_twil_rcpt").on("click", function(event) {

		     var twiltokenrec = randomStr(35);
		     var twilwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmstwil?twilrecparam=') + twiltokenrec;

		     $("#twilapi_url_rec").val(twilwhurlrec);
		  });

		  $("#copyToClipboardtwil").on("click", function(event) {
		     var $tempElpl = $("<input>");
		     $("body").append($tempElpl);
		     $tempElpl.val($("#twilapi_url_rec").val()).select();
		     document.execCommand("Copy");
		     $tempElpl.remove();
		     showAlert("The link has been copied to your clipboard!");
		  });

		  $("#generate_twil_delrcpt").on("click", function(event) {

		     var twiltoken = randomStr(35);
		     var twildrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliverytwil?twildrparam=') + twiltoken;

		     $("#twilapi_url").val(twildrwhurl);
		  });

		  $("#generate_flow_rcpt").on("click", function(event) {

		     var flowtokenrec = randomStr(70);
		     var flowwhurlrec = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recsmsflow?flowrecparam=') + flowtokenrec;

		     $("#flowapi_url_rec").val(flowwhurlrec);
		  });

		  $("#copyToClipboardflow").on("click", function(event) {
		     var $tempElpl = $("<input>");
		     $("body").append($tempElpl);
		     $tempElpl.val($("#flowapi_url_rec").val()).select();
		     document.execCommand("Copy");
		     $tempElpl.remove();
		     showAlert("The link has been copied to your clipboard!");
		  });

		  $("#generate_flow_delrcpt").on("click", function(event) {

		     var flowtoken = randomStr(70);
		     var flowdrwhurl = window.location.origin + OC.generateUrl('/apps/sms_relentless/api/recdeliveryflow?flowdrparam=') + flowtoken;

		     $("#flowapi_url").val(flowdrwhurl);
		  });

		  // Add group icons
		  $(".srGroupImg").each(function() {
		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/group.svg");
		  });

		  // Add user icons
		  $(".srUserImg").each(function() {
		     $(this).attr("src", "/" + ctappdir + "/sms_relentless/img/user.svg");
		  });

		  $("#save_admin_settings").on("click", function(event) {

		    event.preventDefault();
		    OC.msg.startAction('#smsr_save_msg', t('sms_relentless', 'Saved'));

		    var baseUrlsv = OC.generateUrl('/apps/sms_relentless/user/updateadminsettings');

		    var showallmsgs = 0;
		    if ($("#showallmessages").is(':checked')) {
			showallmsgs = 1;
		    }

		    var telsenderinit = $("#tel_sender_name").val();
                    if (!(/^[A-Za-z0-9 ]*$/.test(telsenderinit))) { showAlert('The "Telnyx alphanumeric Sender ID" field contains characters that are not alphanumeric and spaces. They are not allowed and they will be removed.'); }
		    var telsenderproc = telsenderinit.replace(/[^A-Za-z 0-9]/g, '');

		    var nexsenderinit = $("#nex_sender_name").val();
                    if (!(/^[A-Za-z0-9 ]*$/.test(nexsenderinit))) { showAlert('The "Plivo alphanumeric Sender ID" field contains characters that are not alphanumeric and spaces. They are not allowed and they will be removed.'); }
		    var nexsenderproc = nexsenderinit.replace(/[^A-Za-z 0-9]/g, '');

		    var twilsenderinit = $("#twil_sender_name").val();
                    if (!(/^[A-Za-z0-9 ]*$/.test(twilsenderinit))) { showAlert('The "Twilio alphanumeric Sender ID" field contains characters that are not alphanumeric and spaces. They are not allowed and they will be removed.'); }
		    var twilsenderproc = twilsenderinit.replace(/[^A-Za-z 0-9]/g, '');

		    var datatosave = {
				      telapiKey: $("#telapi_key").val(),
				      telPubKey: $("#tel_pub_key").val(),
				      telapiUrlRec: $("#telapi_url_rec").val(),
				      telapiUrl: $("#telapi_url").val(),
				      messagingProfileId: $("#messaging_profile_id").val(),
				      nexapiKey: $("#nexapi_key").val(),
				      nexapiSecret: $("#nexapi_secret").val(),
				      nexapiUrlRec: $("#nexapi_url_rec").val(),
				      nexapiUrl: $("#nexapi_url").val(),
				      twilapiKey: $("#twilapi_key").val(),
				      twilapiSecret: $("#twilapi_secret").val(),
				      twilapiUrlRec: $("#twilapi_url_rec").val(),
				      twilapiUrl: $("#twilapi_url").val(),
				      flowapiKey: $("#flowapi_key").val(),
				      flowapiSecret: $("#flowapi_secret").val(),
				      flowapiUrlRec: $("#flowapi_url_rec").val(),
				      flowapiUrl: $("#flowapi_url").val(),
				      telSenderName: telsenderproc,
				      nexSenderName: nexsenderproc,
				      twilSenderName: twilsenderproc,
				      showAllMessages: showallmsgs
		    };

		    $.ajax({
		       method: 'PUT',
		       url: baseUrlsv,
		       contentType: 'application/json',
		       data: JSON.stringify(datatosave),
		       success: function() {
		       },
		       error: function() {
			    showAlert('Error while attempting to save the settings! You can check the Nextcloud log to find more details about this issue.');
		       }
		    });

		  });

		  function showAlert(alertText) {

		     let alertwnd = "<div id='alertMessage'>";
		     alertwnd += "<a id='closeAlertWnd' title='Close this window'></a>";
		     alertwnd += "<div id='alertTextWrap'>"+ alertText +"</div>";
		     alertwnd += "<input type='submit' id='alertOk' value='OK'>";
		     alertwnd += "</div>";

		     $("#content").append("<div id='alertMsgOverlay'></div>");
		     $("#content").append(alertwnd);

		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
		     $("#alertMessage").css({ "top" : topDist, "left" : leftDist });

		     $("#closeAlertWnd").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
		     $("#alertOk").click(function() { $("#alertMsgOverlay").remove(); $("#alertMessage").remove(); });
		  }

		  function confirmAlert(alertText) {

		     $("#alertMsgOverlay").remove();
		     $("#alertConfMessage").remove();

		     let alertwndcf = "<div id='alertConfMessage'>";
		     alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
		     alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
		     alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Cancel'>";
		     alertwndcf += "<input type='submit' id='confirmOk' value='OK'></div>";
		     alertwndcf += "</div>";

		     $("#content").append("<div id='alertMsgOverlay'></div>");
		     $("#content").append(alertwndcf);

		     let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
		     let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
		     $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });

		     $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
		     $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
		  }

     },
     error: function(appdirfdb) {
                alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue.");
     }
   });

});
