Browse Source

PHP 8.1 updates, layout tweaks, new theme settings, contact details pane, etc.

fusionate 2 years ago
parent
commit
8108ae5d14
8 changed files with 912 additions and 276 deletions
  1. 100 4
      app_config.php
  2. 426 0
      message_contact.php
  3. 3 3
      message_media.php
  4. 173 164
      messages.php
  5. 56 39
      messages_contacts.php
  6. 141 65
      messages_thread.php
  7. 12 0
      resources/providers/settings.php
  8. 1 1
      resources/service/message_send_inbound.php

+ 100 - 4
app_config.php

@@ -61,11 +61,35 @@
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set the message notify sound file.";
 		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "ce4491a2-fab9-43c9-853e-1101a372e891";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "message";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "contact_details";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "boolean";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "Set whether to display the Contact details pane.";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "78b2ed97-f7b1-4159-81e5-1aac08ea2c34";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_when_font";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "arial";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b969552c-4e80-41c2-9d25-4e5e0935605f";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_when_size";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "71%";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
 		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "2825a8af-738f-45a6-bf51-5ed852b24d2c";
 		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
 		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_background_color";
 		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
-		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#a3e1fd";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#cbf0ff";
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
@@ -73,7 +97,15 @@
 		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
 		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_border_color";
 		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
-		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#cbf0ff";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#a3e1fd";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "35e27679-1542-4c3f-b320-926adc0c7ba9";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_border_radius";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "20px 20px 0 20px";
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
@@ -85,11 +117,35 @@
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "1cdb56f7-b50c-40dd-bf75-0f6270e429c3";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_text_font";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "arial";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b4d3c4a5-8e16-417b-940d-9058f6d40d87";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_text_size";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "90%";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "bf4aef34-6ca6-4a6b-821f-6d53defe8bd5";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_me_when_color";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#4593b6";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
 		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "cf96ec30-9848-430b-a998-c4de001c4816";
 		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
 		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_background_color";
 		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
-		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#b1fda5";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#daffd4";
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
@@ -97,7 +153,15 @@
 		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
 		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_border_color";
 		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
-		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#cffec7";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#abefa0";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "4e18ed14-1c5a-49a0-9877-f0b48016e2ce";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_border_radius";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "0 20px 20px 20px";
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
@@ -109,6 +173,38 @@
 		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
 		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
 		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "a106a611-6fb1-4b31-83fc-311f5f74c4a5";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_text_font";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "arial";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "2582cc81-cf6c-4870-8685-0d70576ae7eb";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_text_size";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "90%";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "b8c4bbee-cd64-42a7-b845-4e38a1d7a89f";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_em_when_color";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "#52b342";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
+		$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "42fbaecc-0f55-4817-beca-f8bdb961cbd4";
+		$apps[$x]['default_settings'][$y]['default_setting_category'] = "theme";
+		$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "message_bubble_media_width_max";
+		$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
+		$apps[$x]['default_settings'][$y]['default_setting_value'] = "300px";
+		$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
+		$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
+		$y++;
 
 	//message queues table
 		$y = 0;

+ 426 - 0
message_contact.php

@@ -0,0 +1,426 @@
+<?php
+/*
+	FusionPBX
+	Version: MPL 1.1
+
+	The contents of this file are subject to the Mozilla Public License Version
+	1.1 (the "License"); you may not use this file except in compliance with
+	the License. You may obtain a copy of the License at
+	http://www.mozilla.org/MPL/
+
+	Software distributed under the License is distributed on an "AS IS" basis,
+	WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+	for the specific language governing rights and limitations under the
+	License.
+
+	The Original Code is FusionPBX
+
+	The Initial Developer of the Original Code is
+	Mark J Crane <[email protected]>
+	Portions created by the Initial Developer are Copyright (C) 2023
+	the Initial Developer. All Rights Reserved.
+
+	Contributor(s):
+	Mark J Crane <[email protected]>
+*/
+
+//includes files
+	require_once dirname(__DIR__, 2) . "/resources/require.php";
+	require_once "resources/check_auth.php";
+
+//check permissions
+	if (permission_exists('contact_view')) {
+		//access granted
+	}
+	else {
+		echo "access denied";
+		exit;
+	}
+
+//add multi-lingual support
+	$language = new text;
+	$text = $language->get(null, '/app/contacts');
+
+
+//action add or update
+	if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
+		$contact_uuid = $_REQUEST["id"];
+	}
+	else {
+		echo '<html><body>&nbsp;</body></html> ';
+		exit;
+	}
+
+//main contact details
+	$sql = "select * from v_contacts ";
+	$sql .= "where domain_uuid = :domain_uuid ";
+	$sql .= "and contact_uuid = :contact_uuid ";
+	$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+	$parameters['contact_uuid'] = $contact_uuid;
+	$database = new database;
+	$row = $database->select($sql, $parameters, 'row');
+	if (!empty($row)) {
+		$contact_type = $row["contact_type"];
+		$contact_organization = $row["contact_organization"];
+		$contact_name_prefix = $row["contact_name_prefix"];
+		$contact_name_given = $row["contact_name_given"];
+		$contact_name_middle = $row["contact_name_middle"];
+		$contact_name_family = $row["contact_name_family"];
+		$contact_name_suffix = $row["contact_name_suffix"];
+		$contact_nickname = $row["contact_nickname"];
+		$contact_title = $row["contact_title"];
+		$contact_category = $row["contact_category"];
+		$contact_role = $row["contact_role"];
+		$contact_time_zone = $row["contact_time_zone"];
+		$contact_note = $row["contact_note"];
+	}
+	unset($sql, $parameters, $row);
+
+//get the available users for this contact
+	$sql = "select * from v_users ";
+	$sql .= "where domain_uuid = :domain_uuid ";
+	$sql .= "order by username asc ";
+	$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+	$database = new database;
+	$users = $database->select($sql, $parameters ?? null, 'all');
+	unset($sql, $parameters);
+
+//determine if contact assigned to a user
+	if (!empty($users)) {
+		foreach ($users as $user) {
+			if ($user['contact_uuid'] == $contact_uuid) {
+				$contact_user_uuid = $user['user_uuid'];
+				break;
+			}
+		}
+	}
+
+//get the assigned users that can view this contact
+	$sql = "select u.username, u.user_uuid, a.contact_user_uuid from v_contacts as c, v_users as u, v_contact_users as a ";
+	$sql .= "where c.contact_uuid = :contact_uuid ";
+	$sql .= "and c.domain_uuid = :domain_uuid ";
+	$sql .= "and u.user_uuid = a.user_uuid ";
+	$sql .= "and c.contact_uuid = a.contact_uuid ";
+	$sql .= "order by u.username asc ";
+	$parameters['contact_uuid'] = $contact_uuid;
+	$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+	$database = new database;
+	$contact_users_assigned = $database->select($sql, $parameters, 'all');
+	unset($sql, $parameters);
+
+//get the assigned groups that can view this contact
+	$sql = "select g.*, cg.contact_group_uuid ";
+	$sql .= "from v_groups as g, v_contact_groups as cg ";
+	$sql .= "where cg.group_uuid = g.group_uuid ";
+	$sql .= "and cg.domain_uuid = :domain_uuid ";
+	$sql .= "and cg.contact_uuid = :contact_uuid ";
+	$sql .= "and cg.group_uuid <> :group_uuid ";
+	$sql .= "order by g.group_name asc ";
+	$parameters['domain_uuid'] = $domain_uuid;
+	$parameters['contact_uuid'] = $contact_uuid;
+	$parameters['group_uuid'] = $_SESSION["user_uuid"];
+	$database = new database;
+	$contact_groups_assigned = $database->select($sql, $parameters, 'all');
+	if (!empty($contact_groups_assigned)) {
+		foreach ($contact_groups_assigned as $field) {
+			$contact_groups[] = "'".$field['group_uuid']."'";
+		}
+	}
+	unset($sql, $parameters);
+
+//get the available groups for this contact
+	$sql = "select group_uuid, group_name from v_groups ";
+	$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
+	if (!empty($contact_groups)) {
+		$sql .= "and group_uuid not in (".implode(',', $contact_groups).") ";
+	}
+	$sql .= "order by group_name asc ";
+	$parameters['domain_uuid'] = $domain_uuid;
+	$database = new database;
+	$contact_groups_available = $database->select($sql, $parameters, 'all');
+	unset($sql, $parameters, $contact_groups);
+
+//determine title name
+	if ($contact_name_given || $contact_name_family) {
+		$contact_name = $contact_name_prefix ? escape($contact_name_prefix).' ' : null;
+		$contact_name .= $contact_name_given ? escape($contact_name_given).' ' : null;
+		$contact_name .= $contact_name_middle ? escape($contact_name_middle).' ' : null;
+		$contact_name .= $contact_name_family ? escape($contact_name_family).' ' : null;
+		$contact_name .= $contact_name_suffix ? escape($contact_name_suffix).' ' : null;
+	}
+	else {
+		$contact_name = $contact_organization;
+	}
+
+//show the content
+	echo "<!DOCTYPE html>\n";
+	echo "<html>\n";
+	echo "<head>\n";
+
+	echo "<meta charset='utf-8'>\n";
+	echo "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n";
+	echo "<meta http-equiv='X-UA-Compatible' content='IE=edge'>\n";
+	echo "<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no' />\n";
+	echo "<meta name='robots' content='noindex, nofollow, noarchive' />\n";
+
+	echo "<link rel='stylesheet' type='text/css' href='".PROJECT_PATH."/resources/fontawesome/css/all.min.css.php'>\n";
+	echo "<link rel='stylesheet' type='text/css' href='".PROJECT_PATH."/resources/bootstrap/css/bootstrap.min.css.php'>\n";
+	echo "<script language='JavaScript' type='text/javascript' src='".PROJECT_PATH."/resources/fontawesome/js/solid.min.js.php' defer></script>\n";
+	echo "<script language='JavaScript' type='text/javascript' src='".PROJECT_PATH."/resources/bootstrap/js/bootstrap.min.js.php'></script>\n";
+
+//css
+	echo "<link rel='stylesheet' type='text/css' href='/themes/default/css.php'>\n";
+	echo "<style>\n";
+	echo "	body {\n";
+	echo "		margin-right: 0;\n";
+	echo "		}\n";
+	echo "	div.box.contact-details {\n";
+	echo "		padding: 10px !important;\n";
+	echo "		}\n";
+	echo "</style>\n";
+
+//end the header and start the body
+	echo "</head>\n";
+	echo "<body>\n";
+
+	echo "<div id='main_content' style='margin-top: 0; width: calc(100% - 10px); padding-right: 0;'>\n";
+
+//show the content
+	echo "<div class='action_bar' id='action_bar' style='position: relative; top: 0; width: calc(100% + 13px); margin-left: -10px; padding-right: 0; margin-bottom: 0;'>\n";
+	echo "	<div class='heading'><b>".($contact_name ? $contact_name : $text['header-contact-edit'])."</b></div>\n";
+	echo "	<div class='actions'>\n";
+	if (!empty($contact_user_uuid) && permission_exists('user_edit') && is_uuid($contact_user_uuid)) {
+		echo button::create(['type'=>'button','label'=>$text['button-user'],'icon'=>'user','collapse'=>'hide-sm-dn','link'=>'../../core/users/user_edit.php?id='.urlencode($contact_user_uuid)]);
+	}
+	if (permission_exists('contact_edit')) {
+		echo button::create(['type'=>'button','label'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'id'=>'btn_edit','style'=>'margin-left: 15px; margin-right: 0;','onclick'=>"window.open('../contacts/contact_edit.php?id=".urlencode($contact_uuid)."');"]);
+	}
+	echo "	</div>\n";
+	echo "	<div style='clear: both;'></div>\n";
+	echo "</div>\n";
+
+	if ($contact_title || $contact_organization) {
+		echo ($contact_title ? '<i>'.$contact_title.'</i>' : null).($contact_title && $contact_organization ? ', ' : null).($contact_organization ? '<strong>'.$contact_organization.'</strong>' : null)."\n";
+	}
+	else {
+		echo $contact_note."\n";
+	}
+	echo "<br />\n";
+
+	echo "<div class='grid' style='grid-gap: 10px; grid-template-columns: auto;'>\n";
+
+//general info
+	echo "	<div class='box contact-details'>\n";
+	echo "		<div class='grid contact-details'>\n";
+	echo "			<div class='box'><b class='fas fa-user fa-fw fa-md'></b></div>\n";
+	echo "			<div class='box'>\n";
+	echo "				<div class='grid' style='grid-template-columns: 70px auto;'>\n";
+		//nickname
+			if ($contact_nickname) {
+				echo "<div class='box contact-details-label'>".$text['label-contact_nickname']."</div>\n";
+				echo "<div class='box'>\"".escape($contact_nickname)."\"</div>\n";
+			}
+		//name
+			if ($contact_name_given) {
+				echo "<div class='box contact-details-label'>".$text['label-name']."</div>\n";
+				echo "<div class='box'>".escape($contact_name_given).(!empty($contact_name_family) ? ' '.escape($contact_name_family) : null)."</div>\n";
+			}
+		//contact type
+			if ($contact_type) {
+				echo "<div class='box contact-details-label'>".$text['label-contact_type']."</div>\n";
+				echo "<div class='box'>";
+				if (!empty($_SESSION["contact"]["type"])) {
+					sort($_SESSION["contact"]["type"]);
+					foreach ($_SESSION["contact"]["type"] as $type) {
+						if ($contact_type == $type) {
+							echo escape($type);
+						}
+					}
+				}
+				else if ($text['option-contact_type_'.$contact_type]) {
+					echo $text['option-contact_type_'.$contact_type];
+				}
+				else {
+					echo escape($contact_type);
+				}
+				echo "</div>\n";
+			}
+		//category
+			if ($contact_category) {
+				echo "<div class='box contact-details-label'>".$text['label-contact_category']."</div>\n";
+				echo "<div class='box'>";
+				if (!empty($_SESSION["contact"]["category"])) {
+					sort($_SESSION["contact"]["category"]);
+					foreach ($_SESSION["contact"]["category"] as $category) {
+						if ($contact_category == $category) {
+							echo escape($category);
+							break;
+						}
+					}
+				}
+				else {
+					echo escape($contact_category);
+				}
+				echo "</div>\n";
+			}
+		//role
+			if ($contact_role) {
+				echo "<div class='box contact-details-label'>".$text['label-contact_role']."</div>\n";
+				echo "<div class='box'>";
+				if (!empty($_SESSION["contact"]["role"])) {
+					sort($_SESSION["contact"]["role"]);
+					foreach ($_SESSION["contact"]["role"] as $role) {
+						if ($contact_role == $role) {
+							echo escape($role);
+							break;
+						}
+					}
+				}
+				else {
+					echo escape($contact_role);
+				}
+				echo "</div>\n";
+			}
+		//time_zone
+			if ($contact_time_zone) {
+				echo "<div class='box contact-details-label'>".$text['label-contact_time_zone']."</div>\n";
+				echo "<div class='box'>";
+				echo $contact_time_zone."<br>\n";
+				echo "</div>\n";
+			}
+		//users (viewing contact)
+			if (permission_exists('contact_user_view') && !empty($contact_users_assigned)) {
+				echo "<div class='box contact-details-label'>".$text['label-users']."</div>\n";
+				echo "<div class='box'>";
+				foreach ($contact_users_assigned as $field) {
+					echo escape($field['username'])."<br>\n";
+				}
+				echo "</div>\n";
+			}
+		//groups (viewing contact)
+			if (permission_exists('contact_group_view') && !empty($contact_groups_assigned)) {
+				echo "<div class='box contact-details-label'>".$text['label-groups']."</div>\n";
+				echo "<div class='box'>";
+				foreach ($contact_groups_assigned as $field) {
+					echo escape($field['group_name'])."<br>\n";
+				}
+				echo "</div>\n";
+			}
+	echo "				</div>\n";
+	echo "			</div>\n";
+	echo "		</div>\n";
+	echo "	</div>\n";
+
+//numbers
+	if (permission_exists('contact_phone_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-phone_numbers']."\"><b class='fas fa-hashtag fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require 'app/contacts/contact_phones_view.php';
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//emails
+	if (permission_exists('contact_email_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-emails']."\"><b class='fas fa-envelope fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require 'app/contacts/contact_emails_view.php';
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//addresses
+	if (permission_exists('contact_address_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-addresses']."\"><b class='fas fa-map-marker-alt fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require 'app/contacts/contact_addresses_view.php';
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//urls
+	if (permission_exists('contact_url_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-urls']."\"><b class='fas fa-link fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_urls_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//relations
+	if (permission_exists('contact_relation_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['header-contact_relations']."\"><b class='fas fa-project-diagram fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_relations_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//attachments
+	if (permission_exists('contact_attachment_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-attachments']."\"><b class='fas fa-paperclip fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_attachments_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//times
+	if (permission_exists('contact_time_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['header_contact_times']."\"><b class='fas fa-clock fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_times_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//extensions
+	if (permission_exists('contact_extension_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-contact_extensions']."\"><b class='fas fa-fax fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_extensions_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+//notes
+	if (permission_exists('contact_note_view')) {
+		echo "	<div class='box contact-details'>\n";
+		echo "		<div class='grid contact-details'>\n";
+		echo "			<div class='box' title=\"".$text['label-contact_notes']."\"><b class='fas fa-sticky-note fa-fw fa-lg'></b></div>\n";
+		echo "			<div class='box'>\n";
+		require "app/contacts/contact_notes_view.php";
+		echo "			</div>\n";
+		echo "		</div>\n";
+		echo "	</div>\n";
+	}
+
+	echo "</div>\n";
+echo "</body>\n";
+echo "</html>\n";
+
+?>

+ 3 - 3
message_media.php

@@ -30,8 +30,8 @@
 //get media uuid
 	$message_media_uuid = $_GET['id'];
 	$action = $_GET['action'];
-	if (is_numeric($_GET['width'])) {
-		$width = $_GET['width'];
+	if (!empty($_GET['width']) && is_numeric(str_replace('px','',$_GET['width']))) {
+		$width = str_replace('px','',$_GET['width']);
 	}
 
 //get media
@@ -79,7 +79,7 @@
 
 				header('Content-Description: File Transfer');
 				header('Content-Type: application/octet-stream');
-				header("Content-Disposition: attachment; filename=\"".$media['message_media_name']."\"");
+				header("Content-Disposition: attachment; filename=\"".(strlen($media['message_media_name']) <= 36 ? $media['message_media_name'] : $message_media_uuid.'.'.strtolower($media['message_media_type']))."\"");
 				header('Content-Transfer-Encoding: binary');
 				header('Expires: 0');
 				header('Cache-Control: must-revalidate');

+ 173 - 164
messages.php

@@ -44,7 +44,7 @@
 		echo "	<div class='heading' style=\"text-align: center;\"><b>Missing Application</b></div>\n";
 		echo "	<div style=\"text-align: center;\">\n";
 		echo "	<br />\n";
-		echo "	This feature requires the <strong>provider</strong> member feature to be installed.<br />\n";
+		echo "	This feature requires the seperate <strong>Providers</strong> app to be installed.<br />\n";
 		echo "	Please install it using the <strong>Application Manager</strong>.\n";
 		echo "	</div>\n";
 		echo "	<div style='clear: both;'></div>\n";
@@ -116,8 +116,8 @@
 	require_once "resources/header.php";
 
 //add audio
-	echo "<audio id=\"message_audio\" >\n";
-	echo "	<source src=\"".$_SESSION['message']['notify_sound']['text']."\" type=\"audio/mpeg\">\n";
+	echo "<audio id='message_audio' >\n";
+	echo "	<source src=\"".$_SESSION['message']['notify_sound']['text']."\" type='audio/mpeg'>\n";
 	echo "</audio>\n";
 	echo "<script language='JavaScript' type='text/javascript'>\n";
 	echo "	var audio = document.getElementById('message_audio');\n";
@@ -137,7 +137,7 @@
 	echo "\n";
 	echo "function check_updates() {\n";
 	echo "	var xhttp = new XMLHttpRequest();\n";
-	echo "	xhttp.open('GET', '/app/messages/message_update.php?id=".$_SESSION['user']['user_uuid']."');\n";
+	echo "	xhttp.open('GET', 'message_update.php?id=".$_SESSION['user']['user_uuid']."');\n";
 	echo "	xhttp.send();\n";
 	echo "	xhttp.onreadystatechange = function() {\n";
 	//echo "		var time_now = date_now.getTime();\n";
@@ -149,14 +149,14 @@
 	//echo "				alert('update ajax: '+this.responseText+ ' input: '+document.getElementById('message_update').value);\n";
 	echo "				document.getElementById('message_update').value = this.responseText;\n";
 	echo "				message_to = document.getElementById('message_to').value;\n";
-	echo "				contacts_url = '/app/messages/messages_contacts.php';\n";
-	echo "				parent.document.getElementById('contacts_frame').src = contacts_url;\n";
-	echo "				parent.document.getElementById('contacts_frame').onload = function() {\n";
+	echo "				contacts_url = 'messages_contacts.php';\n";
+	echo "				document.getElementById('contacts_frame').src = contacts_url;\n";
+	echo "				document.getElementById('contacts_frame').onload = function() {\n";
 	echo "					scroll_to_bottom('messages_frame');\n";
 	echo "				}\n";
-	echo "				messages_url = '/app/messages/messages_thread.php?number='+message_to;\n";
-	echo "				parent.document.getElementById('messages_frame').src = messages_url;\n";
-	echo "				parent.document.getElementById('messages_frame').onload = function() {\n";
+	echo "				messages_url = 'messages_thread.php?number='+message_to;\n";
+	echo "				document.getElementById('messages_frame').src = messages_url;\n";
+	echo "				document.getElementById('messages_frame').onload = function() {\n";
 	echo "					scroll_to_bottom('messages_frame');\n";
 	echo "				}\n";
 	echo "				message_notify();\n";
@@ -169,7 +169,7 @@
 	echo "</script>\n";
 
 //body onload
-	echo "<body onLoad=\"scroll_to_bottom('messages_frame');\">\n";
+	echo "<body onload=\"scroll_to_bottom('messages_frame');\">\n";
 
 //resize thread window on window resize
 	echo "<script language='JavaScript' type='text/javascript'>\n";
@@ -194,7 +194,6 @@
 	echo "		text-align: center;\n";
 	echo "		vertical-align: middle;\n";
 	echo "		}\n";
-	echo "\n";
 
 	echo "	#message_new_container {\n";
 	echo "		display: block;\n";
@@ -211,7 +210,6 @@
 	echo "		-moz-box-shadow: 0px 1px 20px #888;\n";
 	echo "		box-shadow: 0px 1px 20px #888;\n";
 	echo "		}\n";
-	echo "\n";
 
 	echo "	#message_media_layer {\n";
 	echo "		z-index: 999999;\n";
@@ -223,12 +221,10 @@
 	echo "		text-align: center;\n";
 	echo "		vertical-align: middle;\n";
 	echo "		}\n";
-	echo "\n";
 
 	echo "	td.contact_selected {\n";
 	echo "		border-right: 5px solid ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5').";\n";
 	echo "		}\n";
-	echo "\n";
 
 	echo "	.contact_list_image {\n";
 	echo "		float: left;\n";
@@ -241,15 +237,16 @@
 	echo "		background-position: center center;\n";
 	echo "		border-radius: 11px;\n";
 	echo "		}\n";
-	echo "\n";
 
-	echo ".container {\n";
-	echo "	width: 100%;\n";
-	echo "	height: 75vh;\n";
-	echo "	max-width: 100%;\n";
+	echo "	div.container {\n";
+	echo "		width: 100%;\n";
+	echo "		height: 75vh;\n";
+	echo "		max-width: 100%;\n";
 	//echo "	max-height: 100%;\n";
 	//echo "	border:1px solid black;\n";
-	echo "  display: grid;\n";
+	echo "  	display: grid;\n";
+	echo "		padding-left: 0;\n";
+	echo "		padding-right: 0;\n";
 
 	//flex
 	//echo "	flex: 1;\n";
@@ -258,40 +255,54 @@
 	//echo "	justify-content: space-between;\n";
 
 	//echo "	display: inline-grid;\n";
-	echo "	grid-template-columns: minmax(120px, 1fr) minmax(200px, 3fr) 1fr;\n";
-	echo "	grid-template-rows: 1fr;\n";
-	echo "	gap: 10px 10px;\n";
-	//echo "  grid-auto-flow: row;\n";
+	if (!empty($_SESSION['message']['contact_details']['boolean']) && $_SESSION['message']['contact_details']['boolean'] == 'true') {
+		echo "	grid-template-columns: minmax(120px, 1fr) minmax(200px, 3fr) 1fr;\n";
+	}
+	else {
+		echo "	grid-template-columns: minmax(120px, 1fr) minmax(200px, 4fr);\n";
+	}
+	echo "		grid-template-rows: 1fr;\n";
+	echo "		gap: 10px 10px;\n";
+	//echo "  	grid-auto-flow: row;\n";
 
-	echo "	grid-template-areas:\n"; 
-	//echo "		\"contacts header header\"\n";
+	echo "		grid-template-areas:\n";
+	//echo "	\"contacts header header\"\n";
 	echo "		\"contacts messages details\"\n";
 	echo "		\"contacts send details\"\n";
-	//echo "		width: 100%;\n";
-	//echo "		height: 100%;\n";
-	echo "	}\n";
-	echo "\n";
+	//echo "	width: 100%;\n";
+	//echo "	height: 100%;\n";
+	echo "		}\n";
 
-	echo ".contacts {\n";
+	echo "	div.contacts {\n";
 	echo "		grid-area: contacts;\n";
-	//echo "		min-width: 120px;\n";
-	//echo "		height: 100%;\n";
+	//echo "	min-width: 120px;\n";
+	//echo "	height: 100%;\n";
 	echo "		background: ".($_SESSION['theme']['form_table_field_background_color']['text'] ?? '#fff').";\n";
+	echo "		border-right: 1px solid #ccc;\n";
 	echo "	}\n";
-	echo "\n";
-	echo ".messages { grid-area: messages; }\n";
-	//echo ".header { grid-area: header; }\n";
-	echo ".details { grid-area: details; }\n";
-	echo ".send { grid-area: send; }\n";
-	echo "\n";
 
-	echo "@media (max-width: 992px) {\n";
-	echo "		.container { grid-template-columns: 120px minmax(200px, 3fr); }\n";
-	echo "}\n";
+	echo "	div.messages {\n";
+	echo "		grid-area: messages;\n";
+	echo "		border-top: 1px dashed #ccc;\n";
+	echo "		border-bottom: 1px dashed #ccc;\n";
+	echo "		}\n";
 
-	echo "@media (max-width: 500px) {\n";
-	echo "		.attachment_image { display: none; }\n";
-	echo "}\n";
+	echo "	div.send {\n";
+	echo "		grid-area: send;\n";
+	echo "		margin: 4px;\n";
+	echo "		}\n";
+
+	echo "	div.details {\n";
+	echo "		min-width: 330px;\n";
+	echo "		grid-area: details;\n";
+	echo "		border-left: 1px solid #ccc;\n";
+	echo "		}\n";
+
+	echo "	@media (max-width: 992px) {\n";
+	echo "		div.container {\n";
+	echo "			grid-template-columns: 120px minmax(200px, 3fr);\n";
+	echo "			}\n";
+	echo "	}\n";
 
 	echo "</style>\n";
 
@@ -379,137 +390,135 @@
 	echo "	<div style='clear: both;'></div>\n";
 	echo "</div>\n";
 
-	echo "<div class=\"container\">\n";
-	echo "	<div class=\"contacts\" style='border: 0px solid black;'>\n";
-	echo "		<iframe id=\"contacts_frame\" style=\"width: 100%; height: 100%;\" src=\"/app/messages/messages_contacts.php\" frameborder=\"0\"></iframe>\n";
+	echo "<div class='container'>\n";
+	echo "	<div class='contacts'>\n";
+	echo "		<iframe id='contacts_frame' style='width: 100%; height: 100%;' src='messages_contacts.php' frameborder='0'></iframe>\n";
 	echo "	</div>\n";
-	echo "	<div class=\"messages\" style='border: 0px solid black;'>\n";
-	echo "		<iframe id=\"messages_frame\" style=\"width: 100%; height: 100%;\" src=\"/app/messages/messages_thread.php\" frameborder=\"0\"></iframe>\n";
+	echo "	<div class='messages'>\n";
+	echo "		<iframe id='messages_frame' class='myautoscroll' style='width: 100%; height: 100%;' src='messages_thread.php' frameborder='0'></iframe>\n";
 	echo "	</div>\n";
-	echo "	<div class=\"send\">\n";
 
 	if (permission_exists('message_add')) {
-		//output input form
-		//echo "<iframe name=\"message_reply_frame\" style=\"display: none; width: 0px; height: 0px;\"></iframe>\n";
-		//echo "<form id='message_reply' method='post' onsubmit='document.getElementById(\"message_text\").value = \"\";' enctype='multipart/form-data' action='message_send.php' target='message_reply_frame'>\n";
-		echo "<form id='message_reply' method='post' onsubmit='' enctype='multipart/form-data' action='message_send.php'>\n";
-		echo "<input type='hidden' name='message_update' id='message_update' value='".$message_update."'>\n";
-
-		//echo "<div>\n";
-		if (!empty($destinations) && count($destinations) > 1) {
-			echo "	From <select class='formfld' name='message_from' id='message_from'\">\n";
-			foreach ($destinations as $destination) {
-				echo "		<option value='".$destination."'>".$destination."</option>\n";
+		echo "	<div class='send'>\n";
+			//output input form
+			//echo "<iframe name=\"message_reply_frame\" style=\"display: none; width: 0px; height: 0px;\"></iframe>\n";
+			//echo "<form id='message_reply' method='post' onsubmit='document.getElementById(\"message_text\").value = \"\";' enctype='multipart/form-data' action='message_send.php' target='message_reply_frame'>\n";
+			echo "<form id='message_reply' method='post' onsubmit='' enctype='multipart/form-data' action='message_send.php'>\n";
+			echo "<input type='hidden' name='message_update' id='message_update' value='".$message_update."'>\n";
+
+			//echo "<div>\n";
+			//echo "	To <div id='div_message_to'>".escape($message_to)."</div>\n";
+			echo "	<input type='hidden' class='formfld' name='message_to' id='message_to' value='".urlencode($message_to ?? '')."'>\n";
+			//echo "</div>\n";
+
+			echo "<textarea class='formfld' id='message_text' name='message_text' style='width: 100%; min-height: 55px; resize: vertical; padding: 5px 8px; margin: 3px 0 10px 0;' placeholder=\"".$text['description-enter_response']."\"></textarea>";
+			//echo "<input type='input' class='formfld' name='message_text' id='message_text' style='width: 90%; max-width: 100%;'>\n";
+// 			echo "<table cellpadding='0' cellspacing='0' border='0' width='100%' style='margin-top: 5px;'>\n";
+// 			echo "	<tr>\n";
+// 			echo "		<td class='attachment_image' style='width: 20px;'><img src='resources/images/attachment.png' style='min-width: 20px; height: 20px; border: none; padding-right: 5px;'></td>\n";
+// 			echo "		<td>\n";
+			echo "<input type='file' class='formfld' style='max-width: 170px;' multiple='multiple' name='message_media[]' id='message_new_media'>\n";
+// 			echo "		</td>\n";
+// 			echo "		<td style='text-align: right;'>\n";
+			echo button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane','class'=>'default d-none d-sm-inline-block','style'=>'float: right; margin-left: 10px; margin-right: 0;']);
+			if (!empty($destinations) && count($destinations) > 1) {
+				echo "<select class='formfld' name='message_from' id='message_from' style='float: right; padding: 0 5px 0 8px; margin-bottom: 10px;'>\n";
+				echo "	<option value='' disabled='disabled'>".$text['label-message_from']."...</option>\n";
+				foreach ($destinations as $destination) {
+					echo "<option value='".$destination."'>".format_phone($destination)."</option>\n";
+				}
+				echo "</select>\n";
+			}
+			else {
+				//echo "	From \n";
+				echo "<input type='hidden' class='formfld' name='message_from' id='message_from' value='".urlencode($message_from ?? '')."'>\n";
+			}
+// 			echo "		</td>\n";
+// 			echo "	</tr>\n";
+// 			echo "</table>\n";
+			echo button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane','class'=>'default d-block d-sm-none','style'=>'width: 100%; margin-left: 0;']);
+			//echo "<table cellpadding='0' cellspacing='0' border='0' width='100%' style='margin-top: 15px;'>\n";
+			//echo "	<tr>\n";
+			//echo "		<td align='left' width='50%'>";
+			//echo button::create(['label'=>$text['button-clear'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'reset','onclick'=>"$('#message_text').focus();"]);
+			//echo "		</td>\n";
+			//echo "		<td align='center'><span id='thread_refresh_state'><img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; cursor: pointer;' onclick=\"refresh_thread_stop('".$number."','".$contact_uuid."');\" alt=\"".$text['label-refresh_pause']."\" title=\"".$text['label-refresh_pause']."\"></span></td>\n";
+			//echo "		<td align='right' width='50%'>";
+			//echo button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane']);
+			//echo "		</td>\n";
+			//echo "	</tr>\n";
+			//echo "</table>\n";
+			echo "</form>\n";
+
+			//js to load messages for clicked number
+			echo "<script>\n";
+
+			//scroll to the bottom
+			echo "	function scroll_to_bottom(id) {\n";
+			echo "		document.getElementById(id).contentWindow.scrollTo(0, 999999);\n";
+			echo "	}\n";
+			echo "\n";
+
+			//update the url
+			echo "	function update_url(id, url) {\n";
+			echo "		document.getElementById(id).src = url;\n";
+			echo "	}\n";
+
+			//define form submit function
+			echo "	$('#message_reply').submit(function(event) {\n";
+			echo "		event.preventDefault();\n";
+			echo "		$.ajax({\n";
+			echo "			url: $(this).attr('action'),\n";
+			echo "			type: $(this).attr('method'),\n";
+			echo "			data: new FormData(this),\n";
+			echo "			processData: false,\n";
+			echo "			contentType: false,\n";
+			echo "			cache: false,\n";
+			echo "			success: function(){\n";
+			echo "					document.getElementById('message_reply').reset();\n";
+			if (!http_user_agent('mobile')) {
+				echo "				if ($('#message_new_layer').is(':hidden')) {\n";
+				echo "					$('#message_text').focus();\n";
+				echo "				}\n";
 			}
-			echo "	</select>\n";
-		}
-		else {
-			//echo "	From \n";
-			echo "	<input type='hidden' class='formfld' name='message_from' id='message_from' value='".urlencode($message_from ?? '')."'>\n";
-		}
-		//echo "	To <div id='div_message_to'>".escape($message_to)."</div>\n";
-		echo "	<input type='hidden' class='formfld' name='message_to' id='message_to' value='".urlencode($message_to ?? '')."'>\n";
-		//echo "</div>\n";
-
-		echo "<textarea class='formfld' id='message_text' name='message_text' style='width: 100%; max-width: 100%; min-height: 55px; border: 1px solid #cbcbcb; resize: vertical; padding: 5px 8px; margin-top: 10px; margin-bottom: 5px;' placeholder=\"".$text['description-enter_response']."\"></textarea>";
-		//echo "<input type='input' class='formfld' name='message_text' id='message_text' style='width: 90%; max-width: 100%;'>\n";
-		echo "<table cellpadding='0' cellspacing='0' border='0' width='100%' style='margin-top: 5px;'>\n";
-		echo "	<tr>\n";
-		echo "		<td class='attachment_image' style='width: 20px;'><img src='resources/images/attachment.png' style='min-width: 20px; height: 20px; border: none; padding-right: 5px;'></td>\n";
-		echo "		<td>\n";
-		echo "			<input type='file' class='formfld' style='max-width: 170px;' multiple='multiple' name='message_media[]' id='message_new_media'>\n";
-		echo "		</td>\n";
-		echo "		<td style='text-align: right;'>\n";
-		echo "			".button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane']);
-		echo "		</td>\n";
-		echo "	</tr>\n";
-		//echo "	<tr>\n";
-		//echo "		<td align='left' width='50%'>";
-		//echo button::create(['label'=>$text['button-clear'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'reset','onclick'=>"$('#message_text').focus();"]);
-		//echo "		</td>\n";
-		//echo "		<td align='center'><span id='thread_refresh_state'><img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; cursor: pointer;' onclick=\"refresh_thread_stop('".$number."','".$contact_uuid."');\" alt=\"".$text['label-refresh_pause']."\" title=\"".$text['label-refresh_pause']."\"></span></td>\n";
-		//echo "		<td align='right' width='50%'>";
-		//echo button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane']);
-		//echo "		</td>\n";
-		//echo "	</tr>\n";
-		echo "</table>\n";
-		//echo "<table cellpadding='0' cellspacing='0' border='0' width='100%' style='margin-top: 15px;'>\n";
-		//echo "	<tr>\n";
-		//echo "		<td align='left' width='50%'>";
-		//echo button::create(['label'=>$text['button-clear'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'reset','onclick'=>"$('#message_text').focus();"]);
-		//echo "		</td>\n";
-		//echo "		<td align='center'><span id='thread_refresh_state'><img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; cursor: pointer;' onclick=\"refresh_thread_stop('".$number."','".$contact_uuid."');\" alt=\"".$text['label-refresh_pause']."\" title=\"".$text['label-refresh_pause']."\"></span></td>\n";
-		//echo "		<td align='right' width='50%'>";
-		//echo button::create(['type'=>'submit','label'=>$text['button-send'],'title'=>$text['label-ctrl_enter'],'icon'=>'paper-plane']);
-		//echo "		</td>\n";
-		//echo "	</tr>\n";
-		//echo "</table>\n";
-		echo "</form>\n";
-
-		//js to load messages for clicked number
-		echo "<script>\n";
-
-		//scroll to the bottom
-		echo "	function scroll_to_bottom(id) {\n";
-		echo "		document.getElementById(id).contentWindow.scrollTo(0, 999999);\n";
-		echo "	}\n";
-		echo "\n";
-
-		//update the url
-		echo "	function update_url(id, url) {\n";
-		echo "		document.getElementById(id).src = url;\n";
-		echo "	}\n";
-
-		//define form submit function
-		echo "	$('#message_reply').submit(function(event) {\n";
-		echo "		event.preventDefault();\n";
-		echo "		$.ajax({\n";
-		echo "			url: $(this).attr('action'),\n";
-		echo "			type: $(this).attr('method'),\n";
-		echo "			data: new FormData(this),\n";
-		echo "			processData: false,\n";
-		echo "			contentType: false,\n";
-		echo "			cache: false,\n";
-		echo "			success: function(){\n";
-		echo "					document.getElementById('message_reply').reset();\n";
-		if (!http_user_agent('mobile')) {
-			echo "				if ($('#message_new_layer').is(':hidden')) {\n";
-			echo "					$('#message_text').focus();\n";
-			echo "				}\n";
-		}
 
-		//refresh the message thread
-		//echo "					setTimeout(function() {\n";
-		//echo "						refresh_thread()\n";
-		//echo "					}, 1000);\n";
-		//echo "				refresh_thread('".$number."', '".$contact_uuid."', 'true');\n";
+			//refresh the message thread
+			//echo "					setTimeout(function() {\n";
+			//echo "						refresh_thread()\n";
+			//echo "					}, 1000);\n";
+			//echo "				refresh_thread('".$number."', '".$contact_uuid."', 'true');\n";
 
-		echo "				}\n";
-		echo "		});\n";
-		echo "	});\n";
-		//enable ctrl+enter to send
-		echo "	$('#message_text').keydown(function (event) {\n";
-		echo "		if ((event.keyCode == 10 || event.keyCode == 13) && event.ctrlKey) {\n";
-		echo "			$('#message_compose').submit();\n";
-		echo "		}\n";
-		echo "	});\n";
-
-		echo "</script>\n";
+			echo "				}\n";
+			echo "		});\n";
+			echo "	});\n";
+			//enable ctrl+enter to send
+			echo "	$('#message_text').keydown(function (event) {\n";
+			echo "		if ((event.keyCode == 10 || event.keyCode == 13) && event.ctrlKey) {\n";
+			echo "			$('#message_compose').submit();\n";
+			echo "		}\n";
+			echo "	});\n";
+
+			echo "</script>\n";
+		echo "	</div>\n"; //send
+	}
+	if (!empty($_SESSION['message']['contact_details']['boolean']) && $_SESSION['message']['contact_details']['boolean'] == 'true') {
+		echo "	<div class='details d-none d-md-block'>\n";
+		if (permission_exists('contact_view')) {
+			echo "	<iframe id='contact_frame' style='width: 100%; height: 100%;' src='message_contact.php' frameborder='0'></iframe>\n";
+		}
+		echo "	</div>\n";
 	}
-	echo "	</div>\n"; //send
-	echo "	<div class=\"details\">\n";
-	//echo "		<iframe id=\"messages_frame\" style=\"width: 100%; height: 100%;\" src=\"/app/contacts/contact_view.php?id=&query_string=\" frameborder=\"0\"></iframe>\n";
-	echo "	</div>\n";
 	echo "</div>\n"; //container
 
+/*
 	echo "<script>\n";
 	echo "	function refresh_thread() {\n";
 	echo "		message_to = parent.document.getElementById('message_to').value;\n";
-	echo "		update_url('messages_frame', '/app/messages/messages_thread.php?number='+message_to);\n";
+	echo "		update_url('messages_frame', 'messages_thread.php?number='+message_to);\n";
 	echo "	}\n";
 
 	echo "</script>\n";
-/*
+
 	echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
 	echo "	<tr>\n";
 	echo "		<th width='30%'>".$text['label-contacts']."</th>\n";
@@ -524,9 +533,9 @@
 	echo "	</tr>\n";
 	echo "</table>\n";
 	echo "<input type='hidden' id='contact_current_number' value=''>\n";
-*/
+
 //js to load messages for clicked number
-	//echo "<script>\n";
+	echo "<script>\n";
 
 	/*
 	$refresh_contacts = is_numeric($_SESSION['message']['refresh_contacts']['numeric']) && $_SESSION['message']['refresh_contacts']['numeric'] > 0 ? $_SESSION['message']['refresh_contacts']['numeric'] : 10; //default (seconds)
@@ -640,4 +649,4 @@
 //include the footer
 	require_once "resources/footer.php";
 
-?>
+?>

+ 56 - 39
messages_contacts.php

@@ -152,8 +152,9 @@
 	echo "<html>\n";
 	echo "<head>\n";
 
-//include main css
-	//echo "<link rel='stylesheet' type='text/css' href='/themes/default/css.php'>\n";
+//include icons
+	echo "<link rel='stylesheet' type='text/css' href='/resources/fontawesome/css/all.min.css.php'>\n";
+	echo "<script language='JavaScript' type='text/javascript' src='/resources/fontawesome/js/solid.min.js.php' defer></script>\n";
 
 //js to load messages for clicked number
 	echo "<script>\n";
@@ -166,15 +167,14 @@
 
 	//update the url
 	echo "	function update_url(id, url) {\n";
-	//echo "			alert(id);\n";
 	//echo "		alert('from: '+parent.document.getElementById('message_from').value);\n";
 	//echo "		alert('to: '+parent.document.getElementById('message_to').value);\n";
 	//echo "		alert('to: '+parent.document.getElementById('message_text').value);\n";
-	echo "		parent.document.getElementById(id).src = url;\n";
 	echo "		parent.document.getElementById(id).onload = function() {\n";
-	echo "			scroll_to_bottom(id);\n";
-	echo "			parent.document.getElementById(id).contentWindow.scrollTo(0, 999999);\n";
+// 	echo "			scroll_to_bottom(id);\n";
+	echo "			this.contentWindow.scrollTo(0, 999999);\n";
 	echo "		}\n";
+	echo "		parent.document.getElementById(id).src = url;\n";
 	//echo "		scroll_to_bottom(id);\n";
 	echo "	}\n";
 	echo "</script>\n";
@@ -183,6 +183,10 @@
 	echo "<style>\n";
 	echo "\n";
 
+	echo "	body {\n";
+	echo "		margin: 0 14px 0 0;\n";
+	echo "		}\n";
+
 	echo "	#message_new_layer {\n";
 	echo "		z-index: 999999;\n";
 	echo "		position: absolute;\n";
@@ -225,7 +229,7 @@
 	echo "\n";
 
 	echo "	td.contact_selected {\n";
-	echo "		border-right: 5px solid ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5').";\n";
+	echo "		border-right: 5px solid ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0').";\n";
 	echo "		}\n";
 	echo "\n";
 
@@ -243,43 +247,62 @@
 	echo "\n";
 
 	echo "	.row_style0 {\n";
-	echo "		border-bottom: 1px solid ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5').";\n";
-	echo "		background: ".($_SESSION['theme']['form_table_label_background_color']['text'] ?? '#e5e9f0').";\n";
+	echo "		border-top: 1px solid ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0').";\n";
+	echo "		border-bottom: 1px solid ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0').";\n";
+	echo "		border-radius: 4px;\n";
+	echo "		background: ".($_SESSION['theme']['message_bubble_em_background_color']['text'] ?? '#daffd4').";\n";
 	echo "		color: ".($_SESSION['theme']['body_text_color']['text'] ?? '#5f5f5f').";\n";
 	echo "		font-family: ".($_SESSION['theme']['body_text_font']['text'] ?? 'arial').";\n";
 	echo "		font-size: 12px;\n";
 	echo "		text-align: left;\n";
 	echo "		padding: 4px 7px;\n";
+	echo "		padding-top: 8px;\n";
+	echo "		cursor: pointer;\n";
 	echo "		}\n";
 	echo "\n";
 
 	echo "	.row_style1 {\n";
-	echo "		border-bottom: 1px solid ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5').";\n";
-	echo "		/*background: #fff;*/\n";
+	echo "		border-bottom: 1px dashed ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5').";\n";
+	echo "		border-radius: 4px;\n";
 	echo "		color: ".($_SESSION['theme']['body_text_color']['text'] ?? '#5f5f5f').";\n";
 	echo "		font-family: ".($_SESSION['theme']['body_text_font']['text'] ?? 'arial').";\n";
 	echo "		font-size: 12px;\n";
 	echo "		text-align: left;\n";
 	echo "		padding: 4px 7px;\n";
+	echo "		padding-top: 8px;\n";
+	echo "		cursor: pointer;\n";
 	echo "		}\n";
 	echo "\n";
 
+	echo "	.contact_message {\n";
+	echo "		margin-top: 5px;\n";
+	echo "		padding-left: 5px;\n";
+	echo "		}\n";
+
 	echo "	@media (max-width: 121px) {\n";
-	echo "		.contact_message { display: none; }\n";
-	echo "		.contact_image { float: none; margin-left: 20.5%; }\n";
-	echo "		.row_style0, .row_style1 { padding-bottom: 0px; text-align: center; }\n";
+	echo "		.contact_message {\n";
+	echo "			display: none;\n";
+	echo "			}\n";
+	echo "		.contact_image {\n";
+	echo "			float: none;\n";
+	echo "			margin-left: 20.5%;\n";
+	echo "			}\n";
+	echo "		.row_style0, .row_style1 {\n";
+	echo "			padding-bottom: 0px;\n";
+	echo "			text-align: center;\n";
+	echo "			}\n";
 	echo "		}\n";
 
 	echo "</style>\n";
 
 //end the header and start the body
 	echo "</head>\n";
-	echo "<body onload=''>\n";
+	echo "<body>\n";
 
 //contacts list
 	if (!empty($contacts) && @sizeof($contacts) != 0) {
 		echo "<table class='tr_hover' width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
-		foreach($contacts as $row) {
+		foreach ($contacts as $row) {
 			$number = $row['number'];
 			$name = $row['name'];
 			$count = $row['count'];
@@ -308,11 +331,14 @@
 				$contact_name = escape($row['name']);
 			}
 			if (!empty($_SESSION['user']['contact_number']) && $_SESSION['user']['contact_number'] == $number) {
-				echo "<tr onclick=\"parent.document.getElementById('message_to').value=".escape($number)."; parent.document.getElementById('contacts_frame').src='/app/messages/messages_contacts.php?number=".urlencode($number)."'; update_url('messages_frame', '/app/messages/messages_thread.php?number=".urlencode($number)."');\"><td valign='top' class='row_style0 contact_selected' style='cursor: default;'>\n";
+				echo "<tr onclick=\"parent.document.getElementById('message_to').value=".escape($number)."; parent.document.getElementById('contacts_frame').src='messages_contacts.php?number=".urlencode($number)."'; update_url('messages_frame', 'messages_thread.php?number=".urlencode($number)."'); ".(permission_exists('contact_view') && !empty($_SESSION['message']['contact_details']['boolean']) && $_SESSION['message']['contact_details']['boolean'] == 'true' ? "parent.document.getElementById('contact_frame').src='message_contact.php?id=".$row['contact_uuid']."';" : null)."\"><td valign='top' class='row_style0 contact_selected'>\n";
+				if (permission_exists('contact_view') && !empty($_SESSION['message']['contact_details']['boolean']) && $_SESSION['message']['contact_details']['boolean'] == 'true') {
+					echo "<script>parent.document.getElementById('contact_frame').src='message_contact.php?id=".$row['contact_uuid']."';</script>";
+				}
 				$selected = true;
 			}
 			else {
-				echo "<tr onclick=\"parent.document.getElementById('message_to').value=".escape($number)."; parent.document.getElementById('contacts_frame').src='/app/messages/messages_contacts.php?number=".urlencode($number)."'; update_url('messages_frame', '/app/messages/messages_thread.php?number=".urlencode($number)."');\"><td valign='top' class='row_style1'>\n"; // onclick=\"load_thread('".urlencode($number)."', '".$contact[$number]['contact_uuid']."');\"
+				echo "<tr onclick=\"parent.document.getElementById('message_to').value=".escape($number)."; parent.document.getElementById('contacts_frame').src='messages_contacts.php?number=".urlencode($number)."'; update_url('messages_frame', 'messages_thread.php?number=".urlencode($number)."'); ".(permission_exists('contact_view') && !empty($_SESSION['message']['contact_details']['boolean']) && $_SESSION['message']['contact_details']['boolean'] == 'true' ? "parent.document.getElementById('contact_frame').src='message_contact.php';" : null)."\"><td valign='top' class='row_style1'>\n"; // onclick=\"load_thread('".urlencode($number)."', '".$contact[$number]['contact_uuid']."');\"
 				$selected = false;
 			}
 
@@ -324,29 +350,19 @@
 				//echo "<img id='contact_image_".$row['contact_uuid']."' class='contact_list_image' src='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'>\n";
 			}
 			else {
-				if (!empty($contact_name) && is_numeric($contact_name)) {
-					//echo "<div style='width: 80px; height: 80px; border: 2px solid #c4cddd; border-radius: 50%; float: left; text-align: center; vertical-align: middle;'><span style='font-size: 150%; font-weight: 600; color: #c4cddd;'>".substr($contact_name, -1)."</span></div><span style='padding-left: 3px;'/>\n";
-					echo "<div class='contact_image' style='width: 50px; height: 50px; float: left; padding-right: 3px;'>\n";
-					echo "	<img src='resources/images/status_logged_out.png' style=\"width: 50px;\"/>\n";
-					echo "</div>\n";
-				}
-				else {
-					//echo "<div style='width: 80px; height: 80px; border: 2px solid #c4cddd; border-radius: 50%; float: left; text-align: center; vertical-align: middle;'><span style='font-size: 150%; font-weight: 600; color: #c4cddd;'>".substr($contact_name, 0, 1)."</span></div><span style='padding-left: 3px;'/>\n";
-					echo "<div class='contact_image' style='width: 50px; height: 50px; float: left; padding-right: 3px;'>\n";
-					echo "	<img src='resources/images/status_available.png' style=\"width: 50px;\"/>\n";
-					echo "</div>\n";
-				}
+				echo "<div class='contact_image' style='width: 50px; height: 50px; float: left; padding-right: 3px;'>\n";
+				echo "	<i class='fas fa-".(!empty($contact_name) && !is_numeric($contact_name) ? 'user-tie' : 'user')." fa-fw fa-3x' style='margin-top: 4px; color: ".($selected ? ($_SESSION['theme']['message_bubble_em_when_color']['text'] ?? '#52b342') : '#ccc').";'></i>\n";
+				echo "</div>\n";
 			}
 
-			//echo "&nbsp;\n";
-			echo "<span style='padding-left: 3px;'/>\n";
-			echo "	<a href=\"#\" style='text-decoration: none; color: ".$_SESSION['theme']['text_link_color']['text'].";'>\n";
-			echo "		<strong>".escape($contact_name)."</strong>".$count."<br />\n";
+			echo "<div style='padding-left: 3px; margin-bottom: 4px;'>\n";
+			echo "	<a href='view:messages' onclick='event.preventDefault();' style='text-decoration: none; color: ".($_SESSION['theme']['text_link_color']['text'] ?? '#004083').";'>\n";
+			echo "		<strong>".(is_numeric($contact_name) ? format_phone($contact_name) : escape($contact_name))."</strong>".$count."<br />\n";
 			echo "	</a>\n";
-			echo "	<span class='contact_message' style='padding-left: 5px;'/>\n";
-			echo "		".escape($message)."<br />\n";
-			echo "	</span>\n";
-			echo "</span>\n";
+			echo "	<div class='contact_message'>\n";
+			echo "		".(!empty($message) && strlen($message) <= 100 ? escape($message) : substr($message,0,100).'...')."<br />\n";
+			echo "	</div>\n";
+			echo "</div>\n";
 			//if ($selected) {
 			//	echo "<script>$('#contact_current_name').html(\"<a href='callto:".escape($number)."'>".escape(format_phone($number))."</a>\");</script>\n";
 			//}
@@ -372,4 +388,5 @@
 	//echo "	<span id='contacts_refresh_state'><img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; margin-top: 3px; cursor: pointer;' onclick=\"refresh_contacts_stop();\" alt=\"".$text['label-refresh_pause']."\" title=\"".$text['label-refresh_pause']."\"></span> ";
 	//echo "</center>\n";
 
-?>
+	echo "</html>\n";
+?>

+ 141 - 65
messages_thread.php

@@ -157,32 +157,49 @@
 	$database->execute($sql, $parameters);
 	unset($sql, $parameters);
 
-//css styles
+//show the content
+	echo "<!DOCTYPE html>\n";
+	echo "<html>\n";
+	echo "<head>\n";
+
+//include icons
+	echo "<link rel='stylesheet' type='text/css' href='/resources/fontawesome/css/all.min.css.php'>\n";
+	echo "<script language='JavaScript' type='text/javascript' src='/resources/fontawesome/js/solid.min.js.php' defer></script>\n";
+
+	//css styles
 	echo "<style>\n";
+
+	echo "	body {\n";
+	echo "		margin: 0;\n";
+	echo "		padding: 5px;\n";
+	echo "		padding-top: 15px;\n";
+	echo "		}\n";
+
 	echo "	.message-bubble {\n";
 	echo "		display: table;\n";
 	echo "		padding: 10px;\n";
 	echo "		border: 1px solid;\n";
 	echo "		margin-bottom: 10px;\n";
+	echo "		clear: both;\n";
 	echo "		}\n";
-//$_SESSION['dashboard']['chart_text_color']['text'];
+
 	echo "	.message-bubble-em {\n";
-	echo "		margin-right: 30%;\n";
-	echo "		border-radius: 0 20px 20px 20px;\n";
-	echo "		border-color: ".$_SESSION['theme']['message_bubble_em_border_color']['text'].";\n";
-	echo "		background-color: ".$_SESSION['theme']['message_bubble_em_background_color']['text'].";\n";
-	echo "		color: ".$_SESSION['theme']['message_bubble_em_text_color']['text'].";\n";
-	echo "		clear: both;\n";
+	echo "		padding-right: 15px;\n";
+	echo "		border-radius: ".($_SESSION['theme']['message_bubble_em_border_radius']['text'] ?? '0 20px 20px 20px').";\n";
+	echo "		border-color: ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0').";\n";
+	echo "		background: ".($_SESSION['theme']['message_bubble_em_background_color']['text'] ?? '#daffd4').";\n";
+	echo "		background: linear-gradient(180deg, ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0')." 0%, ".($_SESSION['theme']['message_bubble_em_background_color']['text'] ?? '#daffd4')." 15px);\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_em_text_color']['text'] ?? '#000').";\n";
 	echo "		}\n";
 
 	echo "	.message-bubble-me {\n";
 	echo "		float: right;\n";
-	echo "		margin-left: 30%;\n";
-	echo "		border-radius: 20px 20px 0 20px;\n";
-	echo "		border-color: ".$_SESSION['theme']['message_bubble_me_border_color']['text'].";\n";
-	echo "		background-color: ".$_SESSION['theme']['message_bubble_me_background_color']['text'].";\n";
-	echo "		color: ".$_SESSION['theme']['message_bubble_me_text_color']['text'].";\n";
-	echo "		clear: both;\n";
+	echo "		padding-left: 15px;\n";
+	echo "		border-radius: ".($_SESSION['theme']['message_bubble_me_border_radius']['text'] ?? '20px 20px 0 20px').";\n";
+	echo "		border-color: ".($_SESSION['theme']['message_bubble_me_border_color']['text'] ?? '#a3e1fd').";\n";
+	echo "		background: ".($_SESSION['theme']['message_bubble_me_background_color']['text'] ?? '#cbf0ff').";\n";
+	echo "		background: linear-gradient(180deg, ".($_SESSION['theme']['message_bubble_me_background_color']['text'] ?? '#cbf0ff')." calc(100% - 15px), ".($_SESSION['theme']['message_bubble_me_border_color']['text'] ?? '#a3e1fd')." 100%);\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_me_text_color']['text'] ?? '#000').";\n";
 	echo "		}\n";
 
 	echo "	img.message-bubble-image-em {\n";
@@ -201,60 +218,108 @@
 
 	echo "	div.message-bubble-image-em {\n";
 	echo "		float: left;\n";
-	echo "		margin-right: 15px;\n";
 	echo "		text-align: left;\n";
 	echo "		}\n";
 
 	echo "	div.message-bubble-image-me {\n";
 	echo "		float: right;\n";
-	echo "		margin-left: 15px;\n";
 	echo "		text-align: right;\n";
 	echo "		}\n";
 
-	echo "	.message-text {\n";
-	echo "		padding-bottom: 5px;\n";
-	echo "		font-size: 90%;\n";
+	echo "	.message-bubble-em-text {\n";
+	echo "		font-family: ".($_SESSION['theme']['message_bubble_em_text_color']['text'] ?? 'arial').";\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_em_text_color']['text'] ?? '#000').";\n";
+	echo "		font-size: ".($_SESSION['theme']['message_bubble_em_text_size']['text'] ?? '90%').";\n";
 	echo "		}\n";
 
-	echo "	.message-bubble-when {\n";
-	echo "		font-size: 71%;\n";
-	echo "		font-style: italic;\n";
+	echo "	.message-bubble-me-text {\n";
+	echo "		font-family: ".($_SESSION['theme']['message_bubble_me_text_color']['text'] ?? 'arial').";\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_me_text_color']['text'] ?? '#000').";\n";
+	echo "		font-size: ".($_SESSION['theme']['message_bubble_me_text_size']['text'] ?? '90%').";\n";
 	echo "		}\n";
 
-	echo "	.message-media-link-em {\n";
-	echo "		display: inline-block;\n";
-	echo "		margin: 5px 10px 5px 0;\n";
-	echo "		padding: 8px;\n";
-	echo "		background: #cffec7;\n";
-	echo "		border-radius: 7px;\n";
+	echo "	.message-bubble-when-em {\n";
+	echo "		font-family: ".($_SESSION['theme']['message_bubble_when_font']['text'] ?? 'arial').";\n";
+	echo "		font-size: ".($_SESSION['theme']['message_bubble_when_size']['text'] ?? '71%').";\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_em_when_color']['text'] ?? '#52b342').";\n";
+	echo "		letter-spacing: -0.02em;\n";
+	echo "		float: left;\n";
+	echo "		}\n";
+
+	echo "	.message-bubble-when-me {\n";
+	echo "		font-family: ".($_SESSION['theme']['message_bubble_when_font']['text'] ?? 'arial').";\n";
+	echo "		font-size: ".($_SESSION['theme']['message_bubble_when_size']['text'] ?? '71%').";\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_me_when_color']['text'] ?? '#4593b6').";\n";
+	echo "		letter-spacing: -0.02em;\n";
+	echo "		float: right;\n";
+	echo "		}\n";
+
+	echo "	div.message-media {\n";
+	echo "		margin: 8px 0 8px 0;\n";
 	echo "		text-align: center;\n";
+	echo "		font-family: ".($_SESSION['theme']['message_bubble_when_font']['text'] ?? 'arial').";\n";
+	echo "		font-size: ".($_SESSION['theme']['message_bubble_when_size']['text'] ?? '71%').";\n";
+	echo "		letter-spacing: -0.02em;\n";
+	echo "		white-space: nowrap;\n";
+	echo "		text-decoration: none;\n";
+	echo "		}\n";
+
+	echo "	a.message-media-link-me,\n";
+	echo "	a.message-media-link-em {\n";
+	echo "		text-decoration: none;\n";
+	echo "		}\n";
+
+	echo "	a.message-media-link-em {\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_em_when_color']['text'] ?? '#52b342').";\n";
 	echo "		}\n";
 
-	echo "	.message-media-link-me {\n";
-	echo "		display: inline-block;\n";
-	echo "		margin: 5px 10px 5px 0;\n";
-	echo "		padding: 8px;\n";
-	echo "		background: #cbf0ff;\n";
+	echo "	a.message-media-link-me {\n";
+	echo "		color: ".($_SESSION['theme']['message_bubble_me_when_color']['text'] ?? '#4593b6').";\n";
+	echo "		}\n";
+
+	echo "	a.message-media-link-me:hover,\n";
+	echo "	a.message-media-link-em:hover {\n";
+	echo "		text-decoration: underline;\n";
+	echo "		}\n";
+
+	echo "	a.message-media-link-me > img,\n";
+	echo "	a.message-media-link-em > img {\n";
 	echo "		border-radius: 7px;\n";
-	echo "		text-align: center;\n";
+	echo "		margin: 0 auto;\n";
+	echo "		margin-bottom: 3px;\n";
+	echo "		width: 100%;\n";
+	echo "		max-width: ".($_SESSION['theme']['message_bubble_media_width_max']['text'] ?? '300px').";\n";
+	echo "		height: auto;\n";
 	echo "		}\n";
 
-	echo "</style>\n";
+	echo "	a.message-media-link-em > img {\n";
+	echo "		border: 2px solid ".($_SESSION['theme']['message_bubble_em_border_color']['text'] ?? '#abefa0').";\n";
+	echo "		}\n";
 
-	//display media
-	echo "<script language='JavaScript' type='text/javascript'>\n";
-	echo "	function display_media(id, src) {\n";
-	echo "		$('#message_media_layer').load('message_media.php?id=' + id + '&src=' + src + '&action=display', function(){\n";
-	echo "			$('#message_media_layer').fadeIn(200);\n";
-	echo "		});\n";
-	echo "	}\n";
-	echo "</script>\n";
+	echo "	a.message-media-link-me > img {\n";
+	echo "		border: 2px solid ".($_SESSION['theme']['message_bubble_me_border_color']['text'] ?? '#a3e1fd').";\n";
+	echo "		}\n";
 
-	//message media layer
-	echo "<div id='message_media_layer' style='display: none;'></div>\n";
+	echo "</style>\n";
+
+//end the header and start the body
+	echo "</head>\n";
+	echo "<body>\n";
+
+// 	//display media
+// 	echo "<script language='JavaScript' type='text/javascript'>\n";
+// 	echo "	function display_media(id, src) {\n";
+// 	echo "		$('#message_media_layer').load('message_media.php?id=' + id + '&src=' + src + '&action=display', function(){\n";
+// 	echo "			$('#message_media_layer').fadeIn(200);\n";
+// 	echo "		});\n";
+// 	echo "	}\n";
+// 	echo "</script>\n";
+//
+// 	//message media layer
+// 	echo "<div id='message_media_layer' style='display: none;'></div>\n";
 
 	if (empty($refresh) || !$refresh) {
-		echo "<div id='thread_messages' style='min-height: 300px; overflow: auto; padding-right: 15px;'>\n";
+		echo "<div id='thread_messages' style='min-height: 300px; overflow: auto;'>\n";
 	}
 
 	//output messages
@@ -289,6 +354,25 @@
 								}
 							}
 						echo "<div style='display: table;'>\n";
+						//attachments
+							if (!empty($message_media[$message['message_uuid']]) && @sizeof($message_media[$message['message_uuid']]) != 0) {
+								foreach ($message_media[$message['message_uuid']] as $media) {
+									if ($media['type'] != 'txt') {
+										echo "<div class='message-media'>\n";
+										if (in_array($media['type'], ['jpg','jpeg','gif','png'])) {
+											echo "<a href='message_media.php?id=".$media['uuid']."&src=".$media_source."&action=download' class='message-media-link-".($message['message_direction'] == 'inbound' ? 'em' : 'me')."' title=\"".$text['label-download']."\">";
+										}
+										echo "<img src='message_media.php?id=".$media['uuid']."&src=".$media_source."&action=thumbnail&width=".($_SESSION['theme']['message_bubble_media_width_max']['text'] ?? '300px')."'><br />\n";
+										//echo "<img src='resources/images/attachment.png' style='width: 16px; height: 16px; border: none; margin-right: 10px;'>";
+										echo strtoupper($media['type']).' &middot; '.strtoupper(byte_convert($media['size']));
+										if (in_array($media['type'], ['jpg','jpeg','gif','png'])) {
+											echo "<i class='fas fa-download fa-xs' style='margin-left: 8px;'></i>";
+											echo "</a>\n";
+										}
+										echo "</div>\n";
+									}
+								}
+							}
 						//message
 							if (!empty($message['message_text'])) {
 								$allowed = ['http', 'https'];
@@ -305,34 +389,22 @@
 									// everything OK
 									$is_url = true;
 								}
+								echo "<div class='message-bubble-".($message['message_direction'] == 'inbound' ? 'em' : 'me')."-text'>\n";
 								if ($is_url) {
-									echo "<div class='message-text'><a href='".$message['message_text']."' target='_blank'>".escape($message['message_text'])."</a></div>\n";
+									echo "<a href='".$message['message_text']."' target='_blank'>".escape($message['message_text'])."</a>\n";
 								}
 								else {
-									echo "<div class='message-text'>".str_replace("\n",'<br />',escape($message['message_text']))."</div>\n";
+									echo str_replace("\n",'<br />',escape($message['message_text']))."\n";
 								}
-							}
-						//attachments
-							if (!empty($message_media[$message['message_uuid']]) && @sizeof($message_media[$message['message_uuid']]) != 0) {
-								foreach ($message_media[$message['message_uuid']] as $media) {
-									if ($media['type'] != 'txt') {
-										if ($media['type'] == 'jpg' || $media['type'] == 'jpeg' || $media['type'] == 'gif' || $media['type'] == 'png') {
-											echo "<a href='message_media.php?id=".$media['uuid']."&src=".$media_source."&action=download' class='message-media-link-".($message['message_direction'] == 'inbound' ? 'em' : 'me')."'>";
-										}
-										echo "<img src='message_media.php?id=".$media['uuid']."&src=".$media_source."&action=thumbnail&width=200' style='border: none; margin-right: 10px;'><br />\n";
-										//echo "<img src='resources/images/attachment.png' style='width: 16px; height: 16px; border: none; margin-right: 10px;'>";
-										echo "<span style='font-size: 85%; white-space: nowrap;'>".strtoupper($media['type']).' &middot; '.strtoupper(byte_convert($media['size']))."</span>";
-										echo "</a>\n";
-									}
-								}
-								echo "<br />\n";
+								echo "</div>\n";
 							}
 						//message when
-							echo "<span class='message-bubble-when'>".(date('m-d-Y') != format_when_local($message['message_date'],'d') ? format_when_local($message['message_date']) : format_when_local($message['message_date'],'t'))."</span>\n";
+							echo "<span class='message-bubble-when-".($message['message_direction'] == 'inbound' ? 'em' : 'me')."'>".(date('m-d-Y') != format_when_local($message['message_date'],'d') ? format_when_local($message['message_date']) : format_when_local($message['message_date'],'t'))."</span>\n";
 						echo "</div>\n";
 					echo "</span>\n";
 			}
-			echo "<span id='thread_bottom'></span>\n";
+// 			echo "<span id='thread_bottom'></span>\n";
+			echo "<a name='bottom'></a>\n";
 		}
 
 		echo "<script>\n";
@@ -347,4 +419,8 @@
 		echo "</div>\n";
 	}
 
+
+	echo "</body>\n";
+	echo "</html>\n";
+
 ?>

+ 12 - 0
resources/providers/settings.php

@@ -337,6 +337,18 @@
 	$array['providers'][$x]['provider_settings'][$y]['provider_setting_order'] = '';
 	$array['providers'][$x]['provider_settings'][$y]['provider_setting_enabled'] = 'true';
 	$array['providers'][$x]['provider_settings'][$y]['provider_setting_description'] = '';
+	$y = 0;
+	$array['providers'][$x]['provider_addresses'][$y]['provider_uuid'] = $provider_uuid;
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_uuid'] = 'a156a8e8-0ea4-4c9e-bedf-c27884dc3ea1';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_cidr'] = '1.2.3.4/32';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_enabled'] = 'false';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_description'] = '';
+	$y++;
+	$array['providers'][$x]['provider_addresses'][$y]['provider_uuid'] = $provider_uuid;
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_uuid'] = '4fd0a1db-19f7-46e1-91cc-b6633201a19f';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_cidr'] = '5.6.7.8/32';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_enabled'] = 'false';
+	$array['providers'][$x]['provider_addresses'][$y]['provider_address_description'] = '';
 	unset($provider_uuid);
 
 //bandwidth.com

+ 1 - 1
resources/service/message_send_inbound.php

@@ -142,7 +142,7 @@
 			//get variables from the array
 			$domain_name = $extension['domain_name'];
 			$extension = $extension['extension'];
-			$number_alias = $extension['number_alias'];
+			$number_alias = $extension['number_alias'] ?? null;
 
 			//user registered get the sip profile
 			//$command = "sofia_contact ".$extension."@".$domain_name;