Files
fusionpbx/app/fax/fax_send.php
FusionPBX 7f9064fadb Update boolean toggle and the database boolean type (#7522)
* Change the data type to boolean

* Use boolean values in SQL and Conditional Statements

* Schema Data Types: Drop views so that alter tables statements complete

* Update settings.php

* Add extension for call_screen_enabled

* Gateway handle boolean
Add the boolean toggle
- distinct_to
- caller_id_in_from
- supress_cng
- extension_in_contact
- contact_in_ping

* Update gateways.php

* Update voicemail_edit.php

* Replace the ${caller_id_name} with the extensions caller id name

* Phrase - Edit: Update slide toggle with new select beneath.

* Update the input toggle style

* Set the input_toggle_style_switch as boolean

* Update the input toggle style

* Theme: Adjust CSS to wrap description text on form fields.

* Add domain_uuid and domain_name to the SQL SELECT

* Unset the parameters to fix the next query

* Gateway: Integrate new slide toggle switch.

* Dashboard: Update the input toggle style (#7499)

* Dashboard: Update the input toggle style

* Update dashboard_widget_edit.php

* Update dashboard_edit.php

* Inbound Route - Add: Integrate new slide toggle switch and boolean.

* User Settings: Integrate new slide toggle switch.

* Call Block Edit: Update the input toggle style (#7500)

* Bridge Edit: Update the input toggle style (#7501)

* Update phrases.php

* Update domain_edit.php

* Domain Settings Edit: Update the input toggle style

* User Edit: Update the input toggle style

* Update install.php

* Remove fields marked as deprecated

* Use boolean in the select statement

* Streams: New slide toggle and boolean.

* Streams: Remove unnecessary default.

* Queues (FIFO): New slide toggle.

* Call Detail Records: Update the input toggle style (#7503)

* Call Detail Records: Update the input toggle style

* Update xml_cdr_extension_summary.php

* Update xml_cdr_extension_summary.php

* Update xml_cdr_extension_summary.php

* Call Centers: Update the input toggle style (#7502)

* Call Centers: Update the input toggle style

* Update call_center_agent_edit.php

* Conference Centers: Update the input toggle style (#7506)

* Conference Centers: Update the input toggle style

* Update app_config.php

* Update conference_center_edit.php

* Use boolean data type (#7505)

* Call Flow Edit: Update the input toggle style (#7504)

* Devices: Update the input toggle style

* IVR Menus: New slide toggle.

* IVR Menu: Remove deprected file.

* SIP Profile - Edit: New slide toggle.

* Device Profiles: Update the input toggle style

* Ring Groups - List: Fix syntax.

* Theme: Fire onchange event when switching slide toggle control.

* Device Vendors: Update the input toggle style

* Update enabled boolean

* Update device_edit.php

* Ring Groups: New slide toggle.

* Update domain_edit.php

* Email Templates: Update the input toggle style

* Header: Correct default value on input toggle style.

* Default/Domain/User Settings: Adjust Select option label for better clarity.

* Use true boolean types for switch theme toggle or drop-down box (#7507)

* Groups: Update the input toggle style

* Conference Controls: Update the input toggle style (#7509)

* Conference Controls: Update the input toggle style

* Update conference_control_edit.php

* Update conference_control_details.php

* Update conference_control_detail_edit.php

* Conferences: Update the input toggle style (#7511)

* Use true boolean types for switch theme toggle or drop-down box (#7513)

* Dialplans: Update the input toggle style
Also updated outbound route add

* Ring Group: Only adjust ring group forward destination top margin when slide toggle enabled.

* Default/Domain/User Settings - List: Adjust for new 'Select Box' label on input_toggle_style value.

* Use true boolean types for switch theme toggle or drop-down box (#7514)

* Call Forward / Follow Me: Minor javascript adjustments to mirror previous behavior.

* Ring Groups [Dashboard]: New slide toggle.

* Get the contacts details with a seperate SQL Query

* Remove debug info

* Destinations: Update the input toggle style

* Conference Profiles: Update the input toggle style (#7515)

* Conference Profiles: Update the input toggle style

* Update conference_profiles.php

* Update conference_profile_params.php

* Update conference_profile_param_edit.php

* Update conference_profile_edit.php

* Extensions: Update the input toggle style

* Contacts: Update the input toggle style (#7517)

* Contacts: Update the input toggle style

* Update contact_address_edit.php

* Update contact_attachment_edit.php

* Update contact_edit.php

* Update contact_email_edit.php

* Update contact_phone_edit.php

* Update contact_relation_edit.php

* Update contact_setting_edit.php

* Update contact_url_edit.php

* Update contacts.php

* Voicemails: New slide toggle.

* Voicemail Greeting: New slide toggle.

* Modules: New slide toggle.

* Recordings: New slide toggle

* Variables: New slide toggle.

* Time Conditions: New slide toggle.

* Extensions - List: Remove invalid column name.

* Extension Settings: New slide toggle.

* Number Translations: New slide toggle and boolean.

* Sofia global settings: Update the input toggle style

* Update alter table convert to boolean

* Fix contact relation search (#7518)

* Sip Profile Edit: Fix setting enabled labels (#7519)

* Sip Profile Edit: Fix setting enabled labels

* Update sip_profile_edit.php

* Update dialplan_edit.php (#7520)

* Update SQL queries to use true/false for contact primary settings (#7521)

* Update SQL queries to use true/false for contact primary settings

* Update contacts_vcard.php

* Update email.php

* Update totp.php

* Update contact_url_edit.php

* Update contact_email_edit.php

* Update contact_address_edit.php

* Update contact_attachment_edit.php

* Update contact_phone_edit.php

* Add a database views method

* Add database view groups

* Add database users view

* Add database call_recordings view

* Update users.php

* Add  database view call block

* Update schema to use the database views method

* Update conference.conf.lua boolean

* Update directory.lua boolean

* Update callcenter.conf.lua agent_status boolean

* Update sofia.conf.lua boolean

* Update number translations lua boolean

* Update directory.lua boolean

* Update group_call.lua fix the cache

* Update reverse-auth-lookup.lua boolean

* Update directory.lua boolean

* Use concat instead of ||

* Update index.lua

---------

Co-authored-by: fusionate <nate@fusionpbx.com>
Co-authored-by: Alex <alex@fusionpbx.com>
Co-authored-by: frytimo <tim@fusionpbx.com>
2025-09-20 18:42:05 -06:00

1229 lines
45 KiB
PHP

<?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 <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
James Rose <james.o.rose@gmail.com>
Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
Errol Samuels <voiptology@gmail.com>
Corey Moullas <cmoullas@emak.tech>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
//check if windows
if (stristr(PHP_OS, 'WIN')) { $IS_WINDOWS = true; } else { $IS_WINDOWS = false; }
//command line
if (defined('STDIN')) {
//add multi-lingual support
$language = new text;
$text = $language->get($settings->get('domain','language','en-us'), 'app/fax');
}
//web server
if (!defined('STDIN')) {
//additional include
require_once "resources/check_auth.php";
//set the domain_uuid and domain_name
$domain_uuid = $_SESSION['domain_uuid'];
$domain_name = $_SESSION['domain_name'];
$user_uuid = $_SESSION['user_uuid'];
//check permissions
if (permission_exists('fax_send')) {
//access granted
}
else {
echo "access denied";
exit;
}
//add multi-lingual support
$language = new text;
$text = $language->get();
//get the fax_extension and save it as a variable
if (isset($_REQUEST["fax_extension"]) && is_numeric($_REQUEST["fax_extension"])) {
$fax_extension = $_REQUEST["fax_extension"];
}
//pre-populate the form
if (!empty($_REQUEST['id']) && is_uuid($_REQUEST['id']) && (empty($_POST["persistformvar"]) || $_POST["persistformvar"] != "true")) {
$fax_uuid = $_REQUEST["id"];
if (permission_exists('fax_extension_view_domain')) {
//show all fax extensions
$sql = "select fax_uuid, fax_extension, fax_caller_id_name, fax_caller_id_number, ";
$sql .= "fax_toll_allow, accountcode ";
$sql .= "from v_fax ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and fax_uuid = :fax_uuid ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['fax_uuid'] = $fax_uuid;
}
else {
//show only assigned fax extensions
$sql = "select f.fax_uuid, f.fax_extension, f.fax_caller_id_name, f.fax_caller_id_number, ";
$sql .= "f.fax_toll_allow, f.accountcode ";
$sql .= "from v_fax as f, v_fax_users as u ";
$sql .= "where f.fax_uuid = u.fax_uuid ";
$sql .= "and f.domain_uuid = :domain_uuid ";
$sql .= "and f.fax_uuid = :fax_uuid ";
$sql .= "and u.user_uuid = :user_uuid ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['fax_uuid'] = $fax_uuid;
$parameters['user_uuid'] = $user_uuid;
}
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
//set database fields as variables
$fax_uuid = $row["fax_uuid"];
$fax_extension = $row["fax_extension"];
$fax_caller_id_name = $row["fax_caller_id_name"];
$fax_caller_id_number = $row["fax_caller_id_number"];
$fax_toll_allow = $row["fax_toll_allow"];
$fax_accountcode = $row["accountcode"];
}
else {
if (!permission_exists('fax_extension_view_domain')) {
echo "access denied";
exit;
}
}
unset($sql, $parameters, $row);
}
//set the fax directory
if (!empty($settings->get('switch','storage'))) {
$fax_dir = $settings->get('switch','storage').'/fax/'.$domain_name;
}
//set fax cover font to generate pdf
$fax_cover_font = $settings->get('fax','cover_font') ?? null;
}
//define function correct_path
if (!function_exists('correct_path')) {
function correct_path($p) {
global $IS_WINDOWS;
if ($IS_WINDOWS) {
return str_replace('/', '\\', $p);
}
return $p;
}
}
//define function gs_cmd
if (!function_exists('gs_cmd')) {
function gs_cmd($args) {
global $IS_WINDOWS;
if ($IS_WINDOWS) {
return 'gswin32c '.$args;
}
return 'gs '.$args;
}
}
//define function fax_split dtmf
if (!function_exists('fax_split_dtmf')) {
function fax_split_dtmf(&$fax_number, &$fax_dtmf){
$tmp = array();
$fax_dtmf = '';
if (preg_match('/^\s*(.*?)\s*\((.*)\)\s*$/', $fax_number, $tmp)){
$fax_number = $tmp[1];
$fax_dtmf = $tmp[2];
}
}
}
//get the fax extension
if (isset($fax_dir) && isset($fax_extension) && is_numeric($fax_extension)) {
//set the fax directories. example /usr/local/freeswitch/storage/fax/329/inbox
$dir_fax_inbox = $fax_dir.'/'.$fax_extension.'/inbox';
$dir_fax_sent = $fax_dir.'/'.$fax_extension.'/sent';
$dir_fax_temp = $fax_dir.'/'.$fax_extension.'/temp';
//make sure the directories exist
if (!empty($settings->get('switch','storage')) && !is_dir($settings->get('switch','storage'))) {
mkdir($settings->get('switch','storage'), 0770);
}
if (!empty($settings->get('switch','storage')) && !is_dir($settings->get('switch','storage').'/fax')) {
mkdir($settings->get('switch','storage').'/fax', 0770);
}
if (!empty($settings->get('switch','storage')) && !is_dir($settings->get('switch','storage').'/fax/'.$domain_name)) {
mkdir($settings->get('switch','storage').'/fax/'.$domain_name, 0770);
}
if (!is_dir($fax_dir.'/'.$fax_extension)) {
mkdir($fax_dir.'/'.$fax_extension, 0770);
}
if (!is_dir($dir_fax_inbox)) {
mkdir($dir_fax_inbox, 0770);
}
if (!is_dir($dir_fax_sent)) {
mkdir($dir_fax_sent, 0770);
}
if (!is_dir($dir_fax_temp)) {
mkdir($dir_fax_temp, 0770);
}
}
//check if the domain is enabled
$sql = "select domain_enabled::text from v_domains where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $domain_uuid;
$row = $database->select($sql, $parameters, 'row');
if ($row['domain_enabled']) {
$domain_enabled = true;
}
else {
$domain_enabled = false;
}
unset($sql, $parameters, $row);
//initialize database and settings
$settings = new settings(['database' => $database, 'domain_uuid' => $domain_uuid, 'user_uuid' => $user_uuid]);
//clear file status cache
clearstatcache();
//send the fax
$continue = false;
if (!defined('STDIN')) {
if (!empty($_POST['action']) && $_POST['action'] == "send" && $domain_enabled == true) {
//get the values from the HTTP POST
$fax_numbers = $_POST['fax_numbers'];
$fax_uuid = $_POST["id"];
$fax_caller_id_name = $_POST['fax_caller_id_name'];
$fax_caller_id_number = $_POST['fax_caller_id_number'];
$fax_header = $_POST['fax_header'];
$fax_sender = $_POST['fax_sender'];
$fax_recipient = $_POST['fax_recipient'];
$fax_subject = $_POST['fax_subject'];
$fax_message = $_POST['fax_message'];
$fax_resolution = $_POST['fax_resolution'];
$fax_page_size = $_POST['fax_page_size'];
$fax_footer = $_POST['fax_footer'];
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: fax_send.php'.(is_uuid($fax_uuid) ? '?id='.$fax_uuid : null));
exit;
}
$continue = true;
}
}
else {
//all necessary local and session variables should
//be already set by now by file including this one
$continue = true;
}
//cleanup numbers
if (isset($fax_numbers)) {
foreach ($fax_numbers as $index => $fax_number) {
fax_split_dtmf($fax_number, $fax_dtmf);
$fax_number = preg_replace("~[^0-9]~", "", $fax_number);
$fax_dtmf = preg_replace("~[^0-9Pp*#]~", "", $fax_dtmf);
if ($fax_number != ''){
if ($fax_dtmf != '') {$fax_number .= " (" . $fax_dtmf . ")";}
$fax_numbers[$index] = $fax_number;
}
else{
unset($fax_numbers[$index]);
}
}
sort($fax_numbers);
}
if ($continue) {
//determine page size
switch ($fax_page_size) {
case 'a4' :
$page_width = 8.3; //in
$page_height = 11.7; //in
break;
case 'legal' :
$page_width = 8.5; //in
$page_height = 14; //in
break;
case 'letter' :
$page_width = 8.5; //in
$page_height = 11; //in
break;
default :
$page_width = 8.5; //in
$page_height = 11; //in
$fax_page_size = 'letter';
}
//set resolution
switch ($fax_resolution) {
case 'fine':
$gs_r = '204x196';
$gs_g = ((int) ($page_width * 204)).'x'.((int) ($page_height * 196));
break;
case 'superfine':
$gs_r = '204x392';
$gs_g = ((int) ($page_width * 204)).'x'.((int) ($page_height * 392));
break;
case 'normal':
default:
$gs_r = '204x98';
$gs_g = ((int) ($page_width * 204)).'x'.((int) ($page_height * 98));
break;
}
//un/authorized file extensions
$allowed_file_extensions = $settings->get('fax','allowed_extension');
$disallowed_file_extensions = explode(',','sh,ssh,so,dll,exe,bat,vbs,zip,rar,z,tar,tbz,tgz,gz');
//process uploaded or emailed files (if any)
$fax_page_count = 0;
$_files = (!defined('STDIN')) ? $_FILES['fax_files'] : $emailed_files;
unset($tif_files);
foreach ($_files['tmp_name'] as $index => $fax_tmp_name) {
$uploaded_file = (!defined('STDIN')) ? is_uploaded_file($fax_tmp_name) : true;
if ( $uploaded_file && $_files['error'][$index] == 0 && $_files['size'][$index] > 0 ) {
//get the file extension
$fax_file_extension = strtolower(pathinfo($_files['name'][$index], PATHINFO_EXTENSION));
if ($fax_file_extension == "tiff") { $fax_file_extension = "tif"; }
//block unauthorized files
if (in_array($fax_file_extension, $disallowed_file_extensions) || $fax_file_extension == '') { continue; }
if (is_array($allowed_file_extensions) && !in_array('.'.$fax_file_extension, $allowed_file_extensions)) { continue; }
//use a safe file name
$fax_name = md5($_files['name'][$index]);
//rename the file
$attachment_file_name = $_files['name'][$index];
if ($attachment_file_name != $fax_name.'.'.$fax_file_extension) {
rename($dir_fax_temp.'/'.$attachment_file_name, $dir_fax_temp.'/'.$fax_name.'.'.$fax_file_extension);
}
unset($attachment_file_name);
if (!defined('STDIN')) {
//check if directory exists
if (!is_dir($dir_fax_temp)) {
mkdir($dir_fax_temp, 0770);
}
//move uploaded file
move_uploaded_file($_files['tmp_name'][$index], $dir_fax_temp.'/'.$fax_name.'.'.$fax_file_extension);
}
//convert uploaded file to pdf, if necessary
if ($fax_file_extension != "pdf" && $fax_file_extension != "tif") {
chdir($dir_fax_temp);
$command = $IS_WINDOWS ? '' : 'export HOME=/tmp && ';
$command .= 'libreoffice --headless --convert-to pdf --outdir '.$dir_fax_temp.' '.$dir_fax_temp.'/'.escapeshellarg($fax_name).'.'.escapeshellarg($fax_file_extension);
exec($command);
@unlink($dir_fax_temp.'/'.$fax_name.'.'.$fax_file_extension);
}
//convert uploaded pdf to tif
if (file_exists($dir_fax_temp.'/'.$fax_name.'.pdf')) {
chdir($dir_fax_temp);
//convert pdf to tif
$cmd = exec('which gs')." -q -r".$gs_r." -g".$gs_g." -dBATCH -dPDFFitPage -dNOSAFER -dNOPAUSE -dBATCH -sOutputFile=".escapeshellarg($fax_name).".tif -sDEVICE=tiffg4 -Ilib stocht.ps -c \"{ .75 gt { 1 } { 0 } ifelse} settransfer\" -- ".escapeshellarg($fax_name).".pdf -c quit";
// echo($cmd . "<br/>\n");
exec($cmd);
@unlink($dir_fax_temp.'/'.$fax_name.'.pdf');
}
//get the page count
$cmd = exec('which tiffinfo')." ".correct_path($dir_fax_temp.'/'.$fax_name).".tif | grep \"Page Number\" | grep -c \"P\"";
// echo($cmd . "<br/>\n");
$tif_page_count = exec($cmd);
if ($tif_page_count != '') {
$fax_page_count += $tif_page_count;
}
//add file to array
$tif_files[] = $dir_fax_temp.'/'.$fax_name.'.tif';
} //if
} //foreach
// unique id for this fax
$fax_instance_uuid = uuid();
//generate cover page, merge with pdf
if ($fax_subject != '' || $fax_message != '') {
//load pdf libraries
require_once("resources/tcpdf/tcpdf.php");
require_once("resources/fpdi/fpdi.php");
// initialize pdf
$pdf = new FPDI('P', 'in');
$pdf->SetAutoPageBreak(false);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(0, 0, 0, true);
if (!empty($fax_cover_font)) {
if (substr($fax_cover_font, -4) == '.ttf') {
$pdf_font = TCPDF_FONTS::addTTFfont($fax_cover_font);
}
else {
$pdf_font = $fax_cover_font;
}
}
if (empty($pdf_font) || !$pdf_font) {
$pdf_font = 'times';
}
//add blank page
$pdf->AddPage('P', array($page_width, $page_height));
// content offset, if necessary
$x = 0;
$y = 0;
//logo
$display_logo = false;
if (empty($settings->get('fax','cover_logo'))) {
$logo = ''; //explicitly empty
}
else if ($settings->get('fax','cover_logo') != '') {
if (substr($settings->get('fax','cover_logo'), 0, 4) == 'http') {
$logo = $settings->get('fax','cover_logo');
}
else if (substr($settings->get('fax','cover_logo'), 0, 1) == '/') {
if (substr($settings->get('fax','cover_logo'), 0, strlen($_SERVER['DOCUMENT_ROOT'])) != $_SERVER['DOCUMENT_ROOT']) {
$logo = $_SERVER['DOCUMENT_ROOT'].$settings->get('fax','cover_logo');
}
else {
$logo = $settings->get('fax','cover_logo');
}
}
}
if (isset($logo) && $logo) {
$logo_dirname = strtolower(pathinfo($logo, PATHINFO_DIRNAME));
$logo_filename = strtolower(pathinfo($logo, PATHINFO_BASENAME));
$logo_fileext = pathinfo($logo_filename, PATHINFO_EXTENSION);
if (in_array($logo_fileext, ['gif','jpg','jpeg','png','bmp'])) {
if (file_exists($logo_dirname.'/'.$logo_filename)) {
$logo = $logo_dirname.'/'.$logo_filename;
$display_logo = true;
}
else {
$raw = file_get_contents($logo);
if (file_put_contents($dir_fax_temp.'/'.$logo_filename, $raw)) {
$logo = $dir_fax_temp.'/'.$logo_filename;
$display_logo = true;
}
else {
unset($logo);
}
}
}
else {
unset($logo);
}
}
if ($display_logo) {
$pdf->Image($logo, 0.5, 0.4, 2.5, 0.9, null, null, 'N', true, 300, null, false, false, 0, true);
}
else {
//set position for header text, if enabled
$pdf->SetXY($x + 0.5, $y + 0.4);
}
//header
if ($fax_header != '') {
$pdf->SetLeftMargin(0.5);
$pdf->SetFont($pdf_font, "", 10);
$pdf->Write(0.3, $fax_header);
}
//fax, cover sheet
$pdf->SetTextColor(0,0,0);
$pdf->SetFont($pdf_font, "B", 55);
$pdf->SetXY($x + 4.55, $y + 0.25);
$pdf->Cell($x + 3.50, $y + 0.4, $text['label-fax-fax'], 0, 0, 'R', false, null, 0, false, 'T', 'T');
$pdf->SetFont($pdf_font, "", 12);
$pdf->SetFontSpacing(0.0425);
$pdf->SetXY($x + 4.55, $y + 1.0);
$pdf->Cell($x + 3.50, $y + 0.4, $text['label-fax-cover-sheet'], 0, 0, 'R', false, null, 0, false, 'T', 'T');
$pdf->SetFontSpacing(0);
//field labels
$pdf->SetFont($pdf_font, "B", 12);
$pdf->Text($x + 0.5, $y + 1.7, strtoupper($text['label-sent']).":");
if ($fax_recipient != '' || sizeof($fax_numbers) > 0) {
$pdf->Text($x + 0.5, $y + 2.0, strtoupper($text['label-fax-recipient']).":");
}
if ($fax_sender != '' || $fax_caller_id_number != '') {
$pdf->Text($x + 0.5, $y + 2.3, strtoupper($text['label-fax-sender']).":");
}
if ($fax_page_count > 0) {
$pdf->Text($x + 0.5, $y + 2.6, strtoupper($text['label-fax-attached']).":");
}
if ($fax_subject != '') {
$pdf->Text($x + 0.5, $y + 2.9, strtoupper($text['label-fax-subject']).":");
}
//field values
$pdf->SetFont($pdf_font, "", 12);
$pdf->SetXY($x + 2.0, $y + 1.65);
if (defined('STDIN') || ($_REQUEST['submit'] != '' && $_REQUEST['submit'] != 'preview')) {
$date = new DateTime('now', new DateTimeZone( $settings->get('domain','time_zone', date_default_timezone_get() ) ));
$pdf->Write(0.3, $date->format('d M Y @ h:i:s A'));
}
$pdf->SetXY($x + 2.0, $y + 1.95);
if ($fax_recipient != '') {
$pdf->Write(0.3, $fax_recipient);
}
if (sizeof($fax_numbers) > 0) {
$fax_number_string = ($fax_recipient != '') ? ' (' : null;
$fax_number_string .= format_phone($fax_numbers[0]);
if (sizeof($fax_numbers) > 1) {
for ($n = 1; $n <= sizeof($fax_numbers); $n++) {
if ($n == 4) { break; }
$fax_number_string .= ', '.format_phone($fax_numbers[$n]);
}
}
$fax_number_string .= (sizeof($fax_numbers) > 4) ? ', +'.(sizeof($fax_numbers) - 4) : null;
$fax_number_string .= ($fax_recipient != '') ? ')' : null;
$pdf->Write(0.3, $fax_number_string);
}
$pdf->SetXY($x + 2.0, $y + 2.25);
if ($fax_sender != '') {
$pdf->Write(0.3, $fax_sender);
if ($fax_caller_id_number != '') {
$pdf->Write(0.3, ' ('.format_phone($fax_caller_id_number).')');
}
}
else {
if ($fax_caller_id_number != '') {
$pdf->Write(0.3, format_phone($fax_caller_id_number));
}
}
if ($fax_page_count > 0) {
$pdf->Text($x + 2.0, $y + 2.6, $fax_page_count.' '.$text['label-fax-page'.(($fax_page_count > 1) ? 's' : null)]);
}
if ($fax_subject != '') {
$pdf->Text($x + 2.0, $y + 2.9, $fax_subject);
}
//message
if ($fax_message != '') {
$pdf->SetAutoPageBreak(true, 0.6);
$pdf->SetTopMargin(0.6);
$pdf->SetFont($pdf_font, "", 12);
$pdf->SetXY($x + 0.75, $y + 3.65);
$pdf->MultiCell(7, 5.40, $fax_message, 0, 'L', false);
}
$pages = $pdf->getNumPages();
if ($pages > 1) {
//save ynew for last page
$yn = $pdf->GetY();
//first page
$pdf->setPage(1, 0);
$pdf->Rect($x + 0.5, $y + 3.4, 7.5, $page_height - 3.9, 'D');
//2nd to n-th page
for ($n = 2; $n < $pages; $n++) {
$pdf->setPage($n, 0);
$pdf->Rect($x + 0.5, $y + 0.5, 7.5, $page_height - 1, 'D');
}
//last page
$pdf->setPage($pages, 0);
$pdf->Rect($x + 0.5, 0.5, 7.5, $yn, 'D');
$y = $yn;
unset($yn);
}
else {
//determine cover message box height, and difference, to adjust footer position accordingly
$cover_message_height = $settings->get('fax','cover_message_height');
$cover_message_height = (float) ($cover_message_height ?? 6.15);
$height_difference = 6.15 - $cover_message_height;
// draw message box
$pdf->Rect($x + 0.5, $y + 3.4, 7.5, $cover_message_height, 'D');
$y = $pdf->GetY();
}
//footer
if ($fax_footer != '') {
$pdf->SetAutoPageBreak(true, 0.6);
$pdf->SetTopMargin(0.6);
$pdf->SetFont("helvetica", "", 8);
$pdf->SetXY($x + 0.5, $y + 0.6 - (float) ($height_difference ?? 0));
$pdf->MultiCell(7.5, 0.75, $fax_footer, 0, 'C', false);
}
$pdf->SetAutoPageBreak(false);
$pdf->SetTopMargin(0);
//save cover pdf
$pdf->Output($dir_fax_temp.'/'.$fax_instance_uuid.'_cover.pdf', "F"); // Display [I]nline, Save to [F]ile, [D]ownload
//convert pdf to tif, add to array of pages, delete pdf
if (file_exists($dir_fax_temp.'/'.$fax_instance_uuid.'_cover.pdf')) {
chdir($dir_fax_temp);
$cmd = gs_cmd("-q -sDEVICE=tiffg32d -r".$gs_r." -g".$gs_g." -dBATCH -dPDFFitPage -dNOSAFER -dNOPAUSE -sOutputFile=".correct_path($fax_instance_uuid)."_cover.tif -- ".correct_path($fax_instance_uuid)."_cover.pdf -c quit");
// echo($cmd . "<br/>\n");
exec($cmd);
if (!empty($tif_files) && is_array($tif_files) && sizeof($tif_files) > 0) {
array_unshift($tif_files, $dir_fax_temp.'/'.$fax_instance_uuid.'_cover.tif');
}
else {
$tif_files[] = $dir_fax_temp.'/'.$fax_instance_uuid.'_cover.tif';
}
@unlink($dir_fax_temp.'/'.$fax_instance_uuid.'_cover.pdf');
}
}
//combine tif files into single multi-page tif
if (!empty($tif_files) && is_array($tif_files) && sizeof($tif_files) > 0) {
$cmd = exec('which tiffcp')." -c none ";
foreach ($tif_files as $tif_file) {
$cmd .= correct_path($tif_file) . ' ';
}
$cmd .= correct_path($dir_fax_sent.'/'.$fax_instance_uuid.'.tif');
//echo($cmd . "<br/>\n");
exec($cmd);
//generate pdf from tif
$cmd = exec('which tiff2pdf').' -u i -p '.$fax_page_size.
' -w '.$page_width.
' -l '.$page_height.
' -f -o '.
correct_path($dir_fax_sent.'/'.$fax_instance_uuid.'.pdf').' '.
correct_path($dir_fax_sent.'/'.$fax_instance_uuid.'.tif');
exec($cmd);
//echo $cmd."<br />\n";
//remove the extra files
foreach ($tif_files as $tif_file) {
@unlink($tif_file);
}
}
elseif (!defined('STDIN')) {
//nothing to send, redirect the browser
message::add($text['message-invalid-fax'], 'negative', 4000);
header("Location: fax_send.php?id=".$fax_uuid);
exit;
}
//preview, if requested
if (($_REQUEST['submit'] != '') && ($_REQUEST['submit'] == 'preview')) {
unset($file_type);
if (file_exists($dir_fax_sent.'/'.$fax_instance_uuid.'.pdf')) {
$file_path = $dir_fax_sent.'/'.$fax_instance_uuid.".pdf";
$file_type = 'pdf';
$content_type = 'application/pdf';
@unlink($dir_fax_sent.'/'.$fax_instance_uuid.".tif");
}
else if (file_exists($dir_fax_sent.'/'.$fax_instance_uuid.'.tif')) {
$file_path = $dir_fax_sent.'/'.$fax_instance_uuid.".tif";
$file_type = 'tif';
$content_type = 'image/tiff';
@unlink($dir_fax_sent.'/'.$fax_instance_uuid.".pdf");
}
if ($file_type != '') {
//push download
$fd = fopen($file_path, "rb");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header('Content-Disposition: attachment; filename="'.$fax_instance_uuid.'.'.$file_type.'"');
header("Content-Type: ".$content_type);
header('Accept-Ranges: bytes');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // date in the past
header("Content-Length: ".filesize($file_path));
fpassthru($fd);
@unlink($file_path);
}
exit;
}
//prepare variables send the fax
$mail_from_address = (!empty($settings->get('fax','smtp_from'))) ? $settings->get('fax','smtp_from') : $settings->get('email','smtp_from');
//get the fax mail to address and fax prefix
$sql = "select * from v_fax where fax_uuid = :fax_uuid ";
$parameters['fax_uuid'] = $fax_uuid;
$row = $database->select($sql, $parameters, 'row');
//$mail_to_address = $row["fax_email"];
$fax_prefix = $row["fax_prefix"];
unset($sql, $parameters);
//Get the currently logged in user's email
if(isset($_SESSION["user_email"])) {
$mail_to_address = $_SESSION["user_email"];
} else {
$sql = "select user_email from v_users where user_uuid = :user_uuid ";
$parameters['user_uuid'] = $user_uuid;
$user_settings = $database->select($sql, $parameters, 'row');
$mail_to_address = $user_settings["user_email"];
unset($sql, $parameters, $user_settings);
}
//Get a list of emails to send confirmation emails to, including that of the fax sender
if(!empty($row["fax_email_confirmation"])) {
$tmp_emails = explode(',', $row["fax_email_confirmation"]);
foreach ($tmp_emails as $email) {
if(strpos($mail_to_address, $email) === false) {
$mail_to_address .= ','.$email;
}
}
}
unset($row);
//for email to fax send email notification back to the email sender
if (defined('STDIN')) {
//use email-to-fax from address
$mail_to_address = $sender_email;
}
//move the generated tif (and pdf) files to the sent directory
//if (file_exists($dir_fax_temp.'/'.$fax_instance_uuid.".tif")) {
// copy($dir_fax_temp.'/'.$fax_instance_uuid.".tif", $dir_fax_sent.'/'.$fax_instance_uuid.".tif");
//}
//if (file_exists($dir_fax_temp.'/'.$fax_instance_uuid.".pdf")) {
// copy($dir_fax_temp.'/'.$fax_instance_uuid.".pdf ", $dir_fax_sent.'/'.$fax_instance_uuid.".pdf");
//}
//get the provider_prefix from the domain_variables dialplan
$sql = "select dialplan_detail_data from v_dialplan_details ";
$sql .= "where dialplan_uuid in ( ";
$sql .= " select dialplan_uuid from v_dialplans ";
$sql .= " where dialplan_name = 'domain-variables' ";
$sql .= " and domain_uuid = :domain_uuid ";
$sql .= ") ";
$sql .= "and dialplan_detail_data like 'provider_prefix%' ";
$sql .= "and dialplan_detail_enabled = true ";
$parameters['domain_uuid'] = $domain_uuid;
$row = $database->select($sql, $parameters, 'row');
$dialplan_detail_data = $row["dialplan_detail_data"];
unset($sql, $parameters, $row);
if (!empty($dialplan_detail_data)) {
$provider_prefix = explode('=', $dialplan_detail_data)[1];
}
//set the fax
$fax_queue_uuid = uuid();
//send the fax
$fax_file = $dir_fax_sent."/".$fax_instance_uuid.".tif";
$common_variables = "fax_queue_uuid=".$fax_queue_uuid.",";
$common_variables .= "fax_uuid=" . $fax_uuid . ",";
$common_variables .= "accountcode='".$fax_accountcode."',";
$common_variables .= "sip_h_accountcode='".$fax_accountcode."',";
$common_variables .= "domain_uuid=".$domain_uuid.",";
$common_variables .= "domain_name=".$domain_name.",";
if (!empty($fax_caller_id_name)) {
$common_variables .= "origination_caller_id_name='".$fax_caller_id_name."',";
}
$common_variables .= "origination_caller_id_number='".$fax_caller_id_number."',";
$common_variables .= "fax_ident='".$fax_caller_id_number."',";
//$common_variables .= "fax_header='".$fax_caller_id_name."',";
$common_variables .= "fax_file='".$fax_file."',";
if (!empty($provider_prefix)) {
$common_variables .= "provider_prefix='".$provider_prefix."',";
}
$common_variables .= "hangup_after_bridge=true,";
$common_variables .= "continue_on_fail=true,";
if (!empty($fax_numbers)) {
foreach ($fax_numbers as $fax_number) {
$fax_number = trim($fax_number);
fax_split_dtmf($fax_number, $fax_dtmf);
//prepare the fax command
$channel_variables["toll_allow"] = !empty($fax_toll_allow) ? $fax_toll_allow : null;
$route_array = outbound_route_to_bridge($domain_uuid, $fax_prefix . $fax_number, $channel_variables);
if (empty($route_array)) {
//send the internal call to the registered extension
$fax_uri = "user/".$fax_number."@".$domain_name;
$fax_variables = '';
}
else {
foreach($route_array as $key => $bridge) {
//add the bridge to the fax_uri, after first iteration add the delimiter
if ($key == 0) {
$fax_uri = $bridge;
}
else {
$fax_uri .= '|'.$bridge;
}
//add the provider_prefix
if (!empty($provider_prefix)) {
$fax_uri = preg_replace('/\${provider_prefix}/', $provider_prefix, $fax_uri);
}
//remove switch ${variables} from the bridge statement
$fax_uri = preg_replace('/\${[^}]+}/', '', $fax_uri);
}
//send the external call
$fax_variables = '';
foreach($settings->get('fax','variable') as $variable) {
$fax_variables .= $variable.",";
}
}
//build the fax dial string
$dial_string = $common_variables;
$dial_string .= $fax_variables;
$dial_string .= "mailto_address='" . $mail_to_address . "',";
$dial_string .= "mailfrom_address='" . $mail_from_address . "',";
//$dial_string .= "fax_uri=" . $fax_uri . ",";
//$dial_string .= "fax_retry_attempts=1" . ",";
//$dial_string .= "fax_retry_limit=20" . ",";
//$dial_string .= "fax_retry_sleep=180" . ",";
//$dial_string .= "fax_verbose=true" . ",";
$dial_string .= "fax_use_ecm=off" . ",";
$dial_string .= "api_hangup_hook='lua app/fax/resources/scripts/hangup_tx.lua'";
$dial_string = "{" . $dial_string . "}" . $fax_uri." &txfax('".$fax_file."')";
//build an array to add the fax to the queue
$array['fax_queue'][0]['fax_queue_uuid'] = $fax_queue_uuid;
$array['fax_queue'][0]['domain_uuid'] = $domain_uuid;
$array['fax_queue'][0]['fax_uuid'] = $fax_uuid;
$array['fax_queue'][0]['fax_date'] = 'now()';
$array['fax_queue'][0]['hostname'] = gethostname();
$array['fax_queue'][0]['fax_caller_id_name'] = $fax_caller_id_name;
$array['fax_queue'][0]['fax_caller_id_number'] = $fax_caller_id_number;
$array['fax_queue'][0]['fax_recipient'] = $fax_recipient;
$array['fax_queue'][0]['fax_number'] = $fax_number;
$array['fax_queue'][0]['fax_prefix'] = $fax_prefix;
$array['fax_queue'][0]['fax_email_address'] = $mail_to_address;
$array['fax_queue'][0]['fax_file'] = $fax_file;
$array['fax_queue'][0]['fax_status'] = 'waiting';
//$array['fax_queue'][0]['fax_retry_date'] = $fax_retry_date;
$array['fax_queue'][0]['fax_retry_count'] = 0;
$array['fax_queue'][0]['fax_accountcode'] = $fax_accountcode;
$array['fax_queue'][0]['fax_command'] = 'originate '.$dial_string;
//add temporary permisison
$p = permissions::new();
$p->add('fax_queue_add', 'temp');
//save the data
$database->app_name = 'fax queue';
$database->app_uuid = '3656287f-4b22-4cf1-91f6-00386bf488f4';
$database->save($array);
//remove temporary permisison
$p->delete('fax_queue_add', 'temp');
//add message to show in the browser
message::add($text['confirm-queued']);
}
}
//redirect the browser
if (!defined('STDIN') && is_uuid($fax_uuid)) {
header("Location: fax_files.php?id=".$fax_uuid."&box=sent");
//header("Location: fax_outbox.php?id=".$fax_uuid);
exit;
}
} //end upload and send fax
//show content in the browser
if (!defined('STDIN')) {
//retrieve current user's assigned groups (uuids)
foreach ($_SESSION['groups'] as $group_data) {
$user_group_uuids[] = $group_data['group_uuid'];
}
//add user's uuid to group uuid list to include private (non-shared) contacts
$user_group_uuids[] = $user_uuid;
$sql = "select ";
$sql .= "c.contact_organization, ";
$sql .= "c.contact_name_given, ";
$sql .= "c.contact_name_family, ";
$sql .= "c.contact_nickname, ";
$sql .= "cp.phone_number ";
$sql .= "from ";
$sql .= "v_contacts as c, ";
$sql .= "v_contact_phones as cp ";
$sql .= "where ";
$sql .= "c.contact_uuid = cp.contact_uuid ";
$sql .= "and c.domain_uuid = :domain_uuid ";
$sql .= "and cp.domain_uuid = :domain_uuid ";
$sql .= "and cp.phone_type_fax = 1 ";
$sql .= "and cp.phone_number is not null ";
$sql .= "and cp.phone_number <> '' ";
if ($settings->get('contact','permissions', false)) {
if (is_array($user_group_uuids) && @sizeof($user_group_uuids) != 0) {
//only show contacts assigned to current user's group(s) and those not assigned to any group
$sql .= "and (";
$sql .= " c.contact_uuid in ( ";
$sql .= " select contact_uuid from v_contact_groups ";
$sql .= " where (";
foreach ($user_group_uuids as $index => $user_group_uuid) {
$sql .= $or;
$sql .= " group_uuid = :group_uuid_".$index." ";
$parameters['group_uuid_'.$index] = $user_group_uuid;
$or = " or ";
}
unset($user_group_uuids, $index, $user_group_uuid, $or);
$sql .= " ) ";
$sql .= " and domain_uuid = :domain_uuid ";
$sql .= " ) ";
$sql .= " or ";
$sql .= " c.contact_uuid not in ( ";
$sql .= " select contact_uuid from v_contact_groups ";
$sql .= " where domain_uuid = :domain_uuid ";
$sql .= " ) ";
$sql .= ") ";
}
}
$parameters['domain_uuid'] = $domain_uuid;
$contacts = $database->select($sql, $parameters, 'all');
unset($sql, $parameters, $row);
//build the contact labels
if (is_array($contacts) && @sizeof($contacts) != 0) {
foreach ($contacts as $row) {
if ($row['contact_organization'] != '') {
$contact_option_label = $row['contact_organization'];
}
if ($row['contact_name_given'] != '' || $row['contact_name_family'] != '' || $row['contact_nickname'] != '') {
$contact_option_label .= ($row['contact_organization'] != '') ? "," : null;
$contact_option_label .= ($row['contact_name_given'] != '') ? (($row['contact_organization'] != '') ? " " : null).$row['contact_name_given'] : null;
$contact_option_label .= ($row['contact_name_family'] != '') ? (($row['contact_organization'] != '' || $row['contact_name_given'] != '') ? " " : null).$row['contact_name_family'] : null;
$contact_option_label .= ($row['contact_nickname'] != '') ? (($row['contact_organization'] != '' || $row['contact_name_given'] != '' || $row['contact_name_family'] != '') ? " (".$row['contact_nickname'].")" : $row['contact_nickname']) : null;
}
$contact_option_value_recipient = $contact_option_label;
$contact_option_value_faxnumber = $row['phone_number'];
$contact_option_label .= " ".escape(format_phone($row['phone_number']));
$contact_labels[] = $contact_option_label;
$contact_values[] = $contact_option_value_faxnumber."|".$contact_option_value_recipient;
unset($contact_option_label);
}
if (is_array($contact_labels)) {
//sort by name(s)
asort($contact_labels, SORT_NATURAL);
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//show the header
$document['title'] = $text['title-new_fax'];
require_once "resources/header.php";
//javascript to toggle input/select boxes, add fax numbers
echo "<script language='JavaScript' type='text/javascript' src='".PROJECT_PATH."/resources/javascript/reset_file_input.js'></script>\n";
echo "<script language='JavaScript' type='text/javascript'>";
echo " function toggle(field) {";
echo " if (field == 'fax_recipient') {";
echo " document.getElementById('fax_recipient_select').selectedIndex = 0;";
echo " $('#fax_recipient_select').toggle();";
echo " $('#fax_recipient').toggle();";
echo " if ($('#fax_recipient').is(':visible')) { $('#fax_recipient').trigger('focus'); } else { $('#fax_recipient_select').trigger('focus'); }";
echo " }";
echo " }";
echo " function contact_load(obj_sel) {";
echo " obj_sel.style.display='none';";
echo " document.getElementById('fax_recipient').style.display='';";
echo " var selected_option_value = obj_sel.options[obj_sel.selectedIndex].value;";
echo " var selected_option_values = selected_option_value.split('|', 2);";
echo " document.getElementById('fax_recipient').value = selected_option_values[1];";
echo " document.getElementById('fax_number').value = selected_option_values[0];";
echo " $('#fax_recipient').css({width: '50%'});";
echo " $('#fax_number').css({width: '120px'});";
echo " }";
echo " function list_selected_files(file_input_number) {";
echo " var inp = document.getElementById('fax_files_'+file_input_number);";
echo " var files_selected = [];";
echo " for (var i = 0; i < inp.files.length; ++i) {";
echo " var file_name = inp.files.item(i).name;";
echo " files_selected.push(file_name);";
echo " }";
echo " document.getElementById('file_list_'+file_input_number).innerHTML = '';";
echo " if (files_selected.length > 1) {";
echo " document.getElementById('file_list_'+file_input_number).innerHTML = '<strong>".$text['label-selected']."</strong>: ';";
echo " document.getElementById('file_list_'+file_input_number).innerHTML += files_selected.join(', ');";
echo " document.getElementById('file_list_'+file_input_number).innerHTML += '<br />';";
echo " }";
echo " }";
echo " function add_fax_number() {\n";
echo " var newdiv = document.createElement('div');\n";
echo " newdiv.innerHTML = \"<input type='text' name='fax_numbers[]' class='formfld' style='width: 150px; min-width: 150px; max-width: 150px; margin-top: 3px;' maxlength='25'>\";";
echo " document.getElementById('fax_numbers').appendChild(newdiv);";
echo " }\n";
echo "</script>";
//show the content
echo "<form method='post' name='frm' id='frm' enctype='multipart/form-data'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-new_fax']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$settings->get('theme','button_icon_back'),'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'fax.php']);
if ($domain_enabled == true) {
echo button::create(['type'=>'submit','label'=>$text['button-preview'],'icon'=>'eye','name'=>'submit','value'=>'preview']);
echo button::create(['type'=>'submit','label'=>$text['button-send'],'icon'=>'paper-plane','id'=>'btn_save','name'=>'submit','value'=>'send','style'=>'margin-left: 15px;']);
}
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-2']." ".(permission_exists('fax_extension_view_domain') ? $text['description-3'] : null)."\n";
echo "<br /><br />\n";
if ($domain_enabled == false) {
echo "<div class='warning_bar'>".$text['notice-sending-disabled']."</div>\n";
}
echo "<div class='card'>\n";
echo "<table width='100%' border='0' cellspacing='0' cellpadding='0'>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-header']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input type='text' name='fax_header' class='formfld' style='' value='".($settings->get('fax','cover_header') ?? '')."'>\n";
echo " <br />\n";
echo " ".$text['description-fax-header']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-sender']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input type='text' name='fax_sender' class='formfld' style='' value='".escape($fax_caller_id_name)."'>\n";
echo " <br />\n";
echo " ".$text['description-fax-sender']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-recipient']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
if (is_array($contacts) && @sizeof($contacts) != 0) {
echo " <select class='formfld' style='display: none;' id='fax_recipient_select' onchange='contact_load(this);'>\n";
echo " <option value=''></option>\n";
if (is_array($contact_labels) && @sizeof($contact_labels) != 0) {
foreach ($contact_labels as $index => $contact_label) {
echo " <option value=\"".escape($contact_values[$index])."\">".$contact_label."</option>\n";
}
}
echo " </select>\n";
}
echo " <input type='text' name='fax_recipient' id='fax_recipient' class='formfld' style='max-width: 250px;' value=''>\n";
if (is_array($contacts)) {
echo " <input type='button' id='btn_toggle_recipient' class='btn' name='' alt='".$text['button-back']."' value='&#9665;' onclick=\"toggle('fax_recipient');\">\n";
}
echo " <br />\n";
echo " ".$text['description-fax-recipient']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-number']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <table cellpadding='0' cellspacing='0' border='0'>";
echo " <tr>";
echo " <td id='fax_numbers'>";
echo " <input type='text' name='fax_numbers[]' id='fax_number' class='formfld' style='width: 150px; min-width: 150px; max-width: 150px;' maxlength='25'>\n";
echo " </td>";
echo " <td style='vertical-align: bottom;'>";
echo " <a href='javascript:void(0);' onclick='add_fax_number();'>$v_link_label_add</a>";
echo " </td>";
echo " </tr>";
echo " </table>";
echo " ".$text['description-fax-number']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax_files']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
$upload_file_limit = (int)$settings->get('fax','upload_file_limit',5);
for ($f = 1; $f <= $upload_file_limit; $f++) {
echo " <span id='fax_file_".$f."' ".(($f > 1) ? "style='display: none;'" : null).">";
echo " <input name='fax_files[]' id='fax_files_".$f."' type='file' class='formfld fileinput' style='margin-right: 3px; ".(($f > 1) ? "margin-top: 3px;" : null)."' onchange=\"".(($f < $upload_file_limit) ? "document.getElementById('fax_file_".($f+1)."').style.display='';" : null)." list_selected_files(".$f.");\" multiple='multiple'>";
echo button::create(['type'=>'button','label'=>$text['button-clear'],'icon'=>$settings->get('theme','button_icon_reset'),'onclick'=>"reset_file_input('fax_files_".$f."'); document.getElementById('file_list_".$f."').innerHTML='';"]);
echo "<br />";
echo " <span id='file_list_".$f."'></span>";
echo " </span>\n";
}
echo " ".$text['description-fax_files']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-resolution']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select name='fax_resolution' class='formfld'>\n";
echo " <option value='normal' ".(($settings->get('fax','resolution') == 'normal') ? 'selected' : null).">".$text['option-fax-resolution-normal']."</option>\n";
echo " <option value='fine' ".(($settings->get('fax','resolution') == 'fine') ? 'selected' : null).">".$text['option-fax-resolution-fine']."</option>\n";
echo " <option value='superfine' ".(($settings->get('fax','resolution') == 'superfine') ? 'selected' : null).">".$text['option-fax-resolution-superfine']."</option>\n";
echo " </select>\n";
echo " <br />\n";
echo " ".$text['description-fax-resolution']."\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-page-size']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select name='fax_page_size' class='formfld'>\n";
echo " <option value='letter' ".(($settings->get('fax','page_size') == 'letter') ? 'selected' : null).">Letter</option>\n";
echo " <option value='legal' ".(($settings->get('fax','page_size') == 'legal') ? 'selected' : null).">Legal</option>\n";
echo " <option value='a4' ".(($settings->get('fax','page_size') == 'a4') ? 'selected' : null).">A4</option>\n";
echo " </select>\n";
echo " <br />\n";
echo " ".$text['description-fax-page-size']."\n";
echo "</td>\n";
echo "</tr>\n";
if (permission_exists('fax_subject')) {
$cover_subject_required = $settings->get('fax','cover_subject_required') ?? '';
$class = ($cover_subject_required == 'true') ? 'vncellreq' : 'vncell';
$required = ($cover_subject_required == 'true') ? 'required' : '';
echo "<tr>\n";
echo "<td class='".$class."' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-subject']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input type='text' name='fax_subject' class='formfld' ".$required." style='' value=''>\n";
echo " <br />\n";
echo " ".$text['description-fax-subject']."\n";
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('fax_message')) {
$cover_message_required = $settings->get('fax','cover_message_required') ?? '';
$class = ($cover_message_required == 'true') ? 'vncellreq' : 'vncell';
$required = ($cover_message_required == 'true') ? 'required' : '';
echo "<tr>\n";
echo "<td class='".$class."' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-message']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <textarea type='text' name='fax_message' class='formfld' ".$required." style='width: 65%; height: 175px;'>".$settings->get('fax','cover_message')."</textarea>\n";
echo "<br />\n";
echo " ".$text['description-fax-message']."\n";
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('fax_footer')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap>\n";
echo " ".$text['label-fax-footer']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <textarea type='text' name='fax_footer' class='formfld' style='width: 65%; height: 100px;'>".$settings->get('fax','cover_footer')."</textarea>\n";
echo " <br />\n";
echo " ".$text['description-fax-footer']."\n";
echo "</td>\n";
echo "</tr>\n";
}
echo "</table>";
echo "</div>\n";
echo "<br /><br />\n";
echo "<input type='hidden' name='fax_caller_id_name' value='".escape($fax_caller_id_name)."'>\n";
echo "<input type='hidden' name='fax_caller_id_number' value='".escape($fax_caller_id_number)."'>\n";
echo "<input type='hidden' name='fax_extension' value='".escape($fax_extension)."'>\n";
echo "<input type='hidden' name='id' value='".escape($fax_uuid)."'>\n";
echo "<input type='hidden' name='action' value='send'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//show the footer
require_once "resources/footer.php";
}
// used for initial element alignment during pdf generation
/*
function showgrid($pdf) {
// generate a grid for placement
for ($x=0; $x<=8.5; $x+=0.1) {
for ($y=0; $y<=11; $y+=0.1) {
$pdf->SetTextColor(0,0,0);
$pdf->SetFont("courier", "", 3);
$pdf->Text($x-0.01,$y-0.01,".");
}
}
for ($x=0; $x<=9; $x+=1) {
for ($y=0; $y<=11; $y+=1) {
$pdf->SetTextColor(255,0,0);
$pdf->SetFont("times", "", 10);
$pdf->Text($x-.02,$y-.01,".");
$pdf->SetFont("courier", "", 4);
$pdf->Text($x+0.01,$y+0.035,$x.",".$y);
}
}
}
*/
?>