Operator Panel: Simplify and enhance filter, updates for PHP 8.1.

This commit is contained in:
fusionate
2023-06-08 19:16:38 +00:00
parent fb3d416c76
commit 1b3af9fb36
4 changed files with 133 additions and 99 deletions

View File

@@ -432,6 +432,30 @@ $text['label-call_direction']['zh-cn'] = "呼叫方向";
$text['label-call_direction']['ja-jp'] = "通話方向";
$text['label-call_direction']['ko-kr'] = "통화 방향";
$text['label-filter']['en-us'] = "Filter...";
$text['label-filter']['en-gb'] = "Filter...";
$text['label-filter']['ar-eg'] = "فيلم";
$text['label-filter']['de-at'] = "Filter...";
$text['label-filter']['de-ch'] = "Filter...";
$text['label-filter']['de-de'] = "Filter...";
$text['label-filter']['es-cl'] = "Filtro...";
$text['label-filter']['es-mx'] = "Filtro...";
$text['label-filter']['fr-ca'] = "Filtre...";
$text['label-filter']['fr-fr'] = "Filtre...";
$text['label-filter']['he-il'] = "Filter...";
$text['label-filter']['it-it'] = "Filtro...";
$text['label-filter']['nl-nl'] = "Filter...";
$text['label-filter']['pl-pl'] = "Filter...";
$text['label-filter']['pt-br'] = "Filtro...";
$text['label-filter']['pt-pt'] = "Filtro...";
$text['label-filter']['ro-ro'] = "Filtru...";
$text['label-filter']['ru-ru'] = "Фильтр";
$text['label-filter']['sv-se'] = "Filter...";
$text['label-filter']['uk-ua'] = "Фільтри";
$text['label-filter']['zh-cn'] = "筛选";
$text['label-filter']['ja-jp'] = "フィルター";
$text['label-filter']['ko-kr'] = "필터";
$text['description-eavesdrop_destination']['en-us'] = "Select the Eavesdrop Destination";
$text['description-eavesdrop_destination']['en-gb'] = "Select the Eavesdrop Destination";
$text['description-eavesdrop_destination']['ar-eg'] = "حدد وجهة Eavesdrop";
@@ -480,4 +504,4 @@ $text['button-all']['zh-cn'] = "全部";
$text['button-all']['ja-jp'] = "全て";
$text['button-all']['ko-kr'] = "모두";
?>
?>

View File

@@ -270,8 +270,7 @@ unset($refresh_default);
url += '&vd_ext_from=' + document.getElementById('vd_ext_from').value;
url += '&vd_ext_to=' + document.getElementById('vd_ext_to').value;
url += '&group=' + ((document.getElementById('group')) ? document.getElementById('group').value : '');
url += '&extension_filter=' + ((document.getElementById('extension_filter')) ? document.getElementById('extension_filter').value : '');
url += '&name_filter=' + ((document.getElementById('name_filter')) ? document.getElementById('name_filter').value : '');
url += '&filter=' + ((document.getElementById('search')) ? document.getElementById('search').value : '');
url += '&eavesdrop_dest=' + ((document.getElementById('eavesdrop_dest')) ? document.getElementById('eavesdrop_dest').value : '');
if (document.getElementById('sort1'))
if (document.getElementById('sort1').value == '1') url += '&sort';
@@ -359,8 +358,7 @@ unset($refresh_default);
url += '&vd_ext_from=' + document.getElementById('vd_ext_from').value;
url += '&vd_ext_to=' + document.getElementById('vd_ext_to').value;
url += '&group=' + ((document.getElementById('group')) ? document.getElementById('group').value : '');
url += '&extension_filter=' + ((document.getElementById('extension_filter')) ? document.getElementById('extension_filter').value : '');
url += '&name_filter=' + ((document.getElementById('name_filter')) ? document.getElementById('name_filter').value : '');
url += '&filter=' + ((document.getElementById('search')) ? document.getElementById('search').value : '');
url += '&eavesdrop_dest=' + ((document.getElementById('eavesdrop_dest')) ? document.getElementById('eavesdrop_dest').value : '');
if (document.getElementById('sort1'))
if (document.getElementById('sort1').value == '1') url += '&sort';

View File

@@ -57,7 +57,6 @@ if (!class_exists('basic_operator_panel')) {
$sql .= "e.extension, ";
$sql .= "e.number_alias, ";
$sql .= "e.effective_caller_id_name, ";
$sql .= "lower(e.effective_caller_id_name) as filter_name, ";
$sql .= "e.effective_caller_id_number, ";
$sql .= "e.call_group, ";
$sql .= "e.description, ";

View File

@@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2022
Portions created by the Initial Developer are Copyright (C) 2008-2023
the Initial Developer. All Rights Reserved.
Contributor(s):
@@ -189,27 +189,30 @@ if (!empty($groups)) {
echo " <select class='formfld' onchange=\"document.getElementById('group').value = this.options[this.selectedIndex].value; refresh_start();\" onfocus='refresh_stop();'>\n";
echo " <option value='' ".(($_REQUEST['group'] == '') ? "selected" : null).">".$text['label-call_group']."</option>\n";
echo " <option value=''>".$text['button-all']."</option>\n";
if (is_array($groups)) foreach ($groups as $group) {
echo " <option value='".escape($group)."' ".(($_REQUEST['group'] == $group) ? "selected" : null).">".escape($group)."</option>\n";
if (is_array($groups)) {
foreach ($groups as $group) {
echo " <option value='".escape($group)."' ".(($_REQUEST['group'] == $group) ? "selected" : null).">".escape($group)."</option>\n";
}
}
echo " </select>\n";
}
else {
//show buttons
echo " <input type='button' class='btn' title=\"".$text['label-call_group']."\" value=\"".$text['button-all']."\" onclick=\"document.getElementById('group').value = '';\" ".$onhover_pause_refresh.">\n";
if (is_array($groups)) foreach ($groups as $group) {
echo " <input type='button' class='btn' title=\"".$text['label-call_group']."\" value=\"".escape($group)."\" ".(($_REQUEST['group'] == $group) ? "disabled='disabled'" : null)." onclick=\"document.getElementById('group').value = this.value;\" ".$onhover_pause_refresh.">\n";
if (is_array($groups)) {
foreach ($groups as $group) {
echo " <input type='button' class='btn' title=\"".$text['label-call_group']."\" value=\"".escape($group)."\" ".(($_REQUEST['group'] == $group) ? "disabled='disabled'" : null)." onclick=\"document.getElementById('group').value = this.value;\" ".$onhover_pause_refresh.">\n";
}
}
}
echo " </td>\n";
}
echo " <td valign='top' nowrap='nowrap'>\n";
echo " <input type='hidden' id='extension_filter' value=\"".escape($_REQUEST['extension_filter'])."\">\n";
echo " <input type='hidden' id='name_filter' value=\"".strtolower(escape($_REQUEST['name_filter']))."\">\n";
echo " <input type='text' class='formfld' placeholder='Filter Extension' value=\"".escape($_REQUEST['extension_filter'])."\" onkeyup=\"document.getElementById('extension_filter').value = this.value; refresh_start();\" onfocus='refresh_stop();'>\n";
echo " <input type='text' class='formfld' placeholder='Filter Name' value=\"".strtolower(escape($_REQUEST['name_filter']))."\" onkeyup=\"document.getElementById('name_filter').value = this.value; refresh_start();\" onfocus='refresh_stop();'>\n";
echo " <input type='button' class='btn' title=\"Clear\" value=\"Clear\" onclick=\"document.getElementById('extension_filter').value = ''; document.getElementById('name_filter').value = '';\" ".$onhover_pause_refresh.">\n";
echo " <input type='text' class='txt list-search' id='search' placeholder=\"".$text['label-filter']."\" value=\"".escape($_REQUEST['filter'] ?? '')."\" onfocus='refresh_stop();' onkeyup='refresh_start();' onblur='refresh_start();'>\n";
if (!empty($_REQUEST['filter'])) {
echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_reset','style'=>(empty($_REQUEST['filter']) ? 'display: none;' : null),'onclick'=>"document.getElementById('search').value = '';",'onmouseover'=>'refresh_stop();','onmouseout'=>'refresh_start();']);
}
echo " </td>\n";
echo " </tr>\n";
echo " </table>\n";
@@ -233,8 +236,15 @@ if (is_array($activity)) {
if ($_REQUEST['group'] != '' && substr_count($ext['call_group'], $_REQUEST['group']) == 0 && !in_array($extension, $_SESSION['user']['extensions'])) { continue; }
//filter by extension or name, if defined
if ($_REQUEST['extension_filter'] != '' && substr_count($ext['extension'], $_REQUEST['extension_filter']) == 0 && !in_array($extension, $_SESSION['user']['extensions'])) { continue; }
if ($_REQUEST['name_filter'] != '' && substr_count($ext['filter_name'], $_REQUEST['name_filter']) == 0 && !in_array($extension, $_SESSION['user']['extensions'])) { continue; }
if (!empty($_REQUEST['filter'])) {
if (
!in_array($extension, $_SESSION['user']['extensions']) && (
substr_count($ext['extension'], $_REQUEST['filter']) == 0 &&
substr_count(strtolower($ext['description'] ?? ''), strtolower($_REQUEST['filter'])) == 0 &&
substr_count(strtolower($ext['effective_caller_id_name'] ?? ''), strtolower($_REQUEST['filter'])) == 0
)
) { continue; }
}
//check if feature code being called
$format_number = (!empty($ext['dest']) && substr($ext['dest'], 0, 1) == '*') ? false : true;
@@ -332,8 +342,9 @@ if (is_array($activity)) {
}
if ($found_count > 0) {
//determine block style by state (if any) and register status
$style = ($ext_state != '') ? "op_ext op_state_".$ext_state : "op_ext";
} else {
$style = !empty($ext_state) ? "op_ext op_state_".$ext_state : "op_ext";
}
else {
$style = "off_ext";
}
unset($extension_number, $found_count, $array);
@@ -383,10 +394,10 @@ if (is_array($activity)) {
if ($ext['uuid'] != '' && $ext['uuid'] == $ext['call_uuid'] && $ext['variable_bridge_uuid'] == '') {
$draggable = false;
}
else if ($ext_state == 'ringing' && $ext['variable_call_direction'] == 'local') {
else if (!empty($ext_state) && $ext_state == 'ringing' && $ext['variable_call_direction'] == 'local') {
$draggable = false;
}
else if ($ext_state != '' && !$format_number) {
else if (!empty($ext_state) && !$format_number) {
$draggable = false;
}
else {
@@ -543,87 +554,89 @@ if (sizeof($user_extensions) > 0) {
}
}
foreach($valet_array as $row) {
$extension = $row['extension'];
$ext_state = 'active';
$style = "op_ext op_valet_park_active";
$draggable = false;
if (!empty($valet_array) && is_array($valet_array) && @sizeof($valet_array) != 0) {
foreach ($valet_array as $row) {
$extension = $row['extension'];
$ext_state = 'active';
$style = "op_ext op_valet_park_active";
$draggable = false;
//build the list of park extensions
$valet_block .= "<div id='".escape($extension)."' class='".$style."' ".(($_GET['vd_ext_from'] == $extension || $_GET['vd_ext_to'] == $extension) ? "style='border-style: dotted;'" : null)." ondrop='drop(event, this.id);' ondragover='allowDrop(event, this.id);' ondragleave='discardDrop(event, this.id);'>\n"; // DRAG TO
$valet_block .= "<table class='".$style."'>\n";
$valet_block .= " <tr>\n";
$valet_block .= " <td class='op_ext_icon'>\n";
$valet_block .= " <span name='".escape($extension)."'>"; // DRAG FROM
$valet_block .= "<img id='".escape($call_identifier)."' class='op_ext_icon' src='resources/images/status_".$status_icon.".png' title='".$status_hover."' ".(($draggable) ? "draggable='true' ondragstart=\"drag(event, this.parentNode.getAttribute('name'));\" onclick=\"virtual_drag('".escape($call_identifier)."', '".escape($extension)."');\"" : "onfocus='this.blur();' draggable='false' style='cursor: not-allowed;'").">\n";
$valet_block .= "</span>\n";
$valet_block .= " </td>\n";
$valet_block .= " <td class='op_ext_info ".$style."'>\n";
if ($dir_icon != '') {
$valet_block .= " <img src='resources/images/".$dir_icon.".png' align='right' style='margin-top: 3px; margin-right: 1px; width: 12px; height: 12px; cursor: help;' draggable='false' alt=\"".$text['label-call_direction']."\" title=\"".$text['label-call_direction']."\">\n";
}
$valet_block .= " <span class='op_user_info'>\n";
//$valet_block .= " <strong class='strong'>".escape($extension)."</strong>";
$valet_block .= " <strong class='strong'>Park </strong> (".escape($extension).")\n";
$valet_block .= " </span><br>\n";
//if ($ext_state != '') {
$valet_block .= " <span class='op_caller_info'>\n";
$valet_block .= " <table align='right'><tr><td style='text-align: right;'>\n";
$valet_block .= " <span class='op_call_info'>".escape($ext['call_length'])."</span><br>\n";
$valet_block .= " <span class='call_control'>\n";
$call_identifier_record = $ext['call_uuid'];
$valet_block .= "</span>\n";
//transfer
//if (in_array($extension, $_SESSION['user']['extensions']) && $ext_state == 'active') {
// $valet_block .= "<img id='destination_control_".escape($extension)."_transfer' class='destination_control' src='resources/images/keypad_transfer.png' style='width: 12px; height: 12px; border: none; margin: 4px 0px 0px 5px; cursor: pointer;' onclick=\"toggle_destination('".escape($extension)."', 'transfer');\" ".$onhover_pause_refresh.">";
//}
$valet_block .= " </td></tr></table>\n";
if (permission_exists('operator_panel_call_details')) {
$valet_block .= " <span id='op_caller_details_".escape($extension)."'><strong>".escape($row['caller_id_name'])."</strong><br>".escape($row['caller_id_number'])."</span>\n";
//build the list of park extensions
$valet_block .= "<div id='".escape($extension)."' class='".$style."' ".(($_GET['vd_ext_from'] == $extension || $_GET['vd_ext_to'] == $extension) ? "style='border-style: dotted;'" : null)." ondrop='drop(event, this.id);' ondragover='allowDrop(event, this.id);' ondragleave='discardDrop(event, this.id);'>\n"; // DRAG TO
$valet_block .= "<table class='".$style."'>\n";
$valet_block .= " <tr>\n";
$valet_block .= " <td class='op_ext_icon'>\n";
$valet_block .= " <span name='".escape($extension)."'>"; // DRAG FROM
$valet_block .= "<img id='".escape($call_identifier)."' class='op_ext_icon' src='resources/images/status_".$status_icon.".png' title='".$status_hover."' ".(($draggable) ? "draggable='true' ondragstart=\"drag(event, this.parentNode.getAttribute('name'));\" onclick=\"virtual_drag('".escape($call_identifier)."', '".escape($extension)."');\"" : "onfocus='this.blur();' draggable='false' style='cursor: not-allowed;'").">\n";
$valet_block .= "</span>\n";
$valet_block .= " </td>\n";
$valet_block .= " <td class='op_ext_info ".$style."'>\n";
if ($dir_icon != '') {
$valet_block .= " <img src='resources/images/".$dir_icon.".png' align='right' style='margin-top: 3px; margin-right: 1px; width: 12px; height: 12px; cursor: help;' draggable='false' alt=\"".$text['label-call_direction']."\" title=\"".$text['label-call_direction']."\">\n";
}
$valet_block .= " </span>\n";
//transfer
//if (in_array($extension, $_SESSION['user']['extensions']) && $ext_state == 'active') {
$call_identifier_transfer = $ext['variable_bridge_uuid'];
$valet_block .= " <form id='frm_destination_".escape($extension)."_transfer' onsubmit=\"go_destination('".escape($extension)."', document.getElementById('destination_".escape($extension)."_transfer').value, 'transfer', '".escape($call_identifier_transfer)."'); return false;\">\n";
$valet_block .= " <input type='text' class='formfld' id='destination_".escape($extension)."_transfer' style='width: 100px; min-width: 100px; max-width: 100px; margin-top: 3px; text-align: center; display: none;' onblur=\"toggle_destination('".escape($extension)."', 'transfer');\">\n";
$valet_block .= " </form>\n";
//}
//}
//else {
// //call
// if (in_array($extension, $_SESSION['user']['extensions'])) {
// $valet_block .= " <img id='destination_control_".escape($extension)."_call' class='destination_control' src='resources/images/keypad_call.png' style='width: 12px; height: 12px; border: none; margin-top: 26px; margin-right: 1px; cursor: pointer;' align='right' onclick=\"toggle_destination('".escape($extension)."', 'call');\" ".$onhover_pause_refresh.">";
// $valet_block .= " <form id='frm_destination_".escape($extension)."_call' onsubmit=\"go_destination('".escape($extension)."', document.getElementById('destination_".escape($extension)."_call').value, 'call'); return false;\">";
// $valet_block .= " <input type='text' class='formfld' id='destination_".escape($extension)."_call' style='width: 100px; min-width: 100px; max-width: 100px; margin-top: 10px; text-align: center; display: none;' onblur=\"toggle_destination('".escape($extension)."', 'call');\">";
// $valet_block .= " </form>\n";
// }
//}
$valet_block .= " </td>\n";
$valet_block .= " </tr>\n";
$valet_block .= "</table>\n";
$valet_block .= " <span class='op_user_info'>\n";
//$valet_block .= " <strong class='strong'>".escape($extension)."</strong>";
$valet_block .= " <strong class='strong'>Park </strong> (".escape($extension).")\n";
$valet_block .= " </span><br>\n";
//if ($ext_state != '') {
$valet_block .= " <span class='op_caller_info'>\n";
$valet_block .= " <table align='right'><tr><td style='text-align: right;'>\n";
$valet_block .= " <span class='op_call_info'>".escape($ext['call_length'])."</span><br>\n";
$valet_block .= " <span class='call_control'>\n";
if (if_group("superadmin") && isset($_GET['debug'])) {
$valet_block .= "<span style='font-size: 10px;'>\n";
$valet_block .= "From ID<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: maroon'>".escape($extension)."</strong><br>\n";
$valet_block .= "uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['uuid'] ? 'blue' : 'black').";'>".escape($ext['uuid'])."</strong><br>\n";
$valet_block .= "call_uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['call_uuid'] ? 'blue' : 'black').";'>".escape($ext['call_uuid'])."</strong><br>\n";
$valet_block .= "variable_bridge_uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['variable_bridge_uuid'] ? 'blue' : 'black').";'>".escape($ext['variable_bridge_uuid'])."</strong><br>\n";
$valet_block .= "direction<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['direction'])."</strong><br>\n";
$valet_block .= "variable_call_direction<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['variable_call_direction'])."</strong><br>\n";
$valet_block .= "state<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['state'])."</strong><br>\n";
$valet_block .= "cid_num<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['cid_num'])."</strong><br>\n";
$valet_block .= "dest<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['dest'])."</strong><br>\n";
$valet_block .= "context<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['context'])."</strong><br>\n";
$valet_block .= "presence_id<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['presence_id'])."</strong><br>\n";
$valet_block .= "callstate<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['callstate'])."</strong><br>\n";
$valet_block .= "</span>\n";
$call_identifier_record = $ext['call_uuid'];
$valet_block .= "</span>\n";
//transfer
//if (in_array($extension, $_SESSION['user']['extensions']) && $ext_state == 'active') {
// $valet_block .= "<img id='destination_control_".escape($extension)."_transfer' class='destination_control' src='resources/images/keypad_transfer.png' style='width: 12px; height: 12px; border: none; margin: 4px 0px 0px 5px; cursor: pointer;' onclick=\"toggle_destination('".escape($extension)."', 'transfer');\" ".$onhover_pause_refresh.">";
//}
$valet_block .= " </td></tr></table>\n";
if (permission_exists('operator_panel_call_details')) {
$valet_block .= " <span id='op_caller_details_".escape($extension)."'><strong>".escape($row['caller_id_name'])."</strong><br>".escape($row['caller_id_number'])."</span>\n";
}
$valet_block .= " </span>\n";
//transfer
//if (in_array($extension, $_SESSION['user']['extensions']) && $ext_state == 'active') {
$call_identifier_transfer = $ext['variable_bridge_uuid'];
$valet_block .= " <form id='frm_destination_".escape($extension)."_transfer' onsubmit=\"go_destination('".escape($extension)."', document.getElementById('destination_".escape($extension)."_transfer').value, 'transfer', '".escape($call_identifier_transfer)."'); return false;\">\n";
$valet_block .= " <input type='text' class='formfld' id='destination_".escape($extension)."_transfer' style='width: 100px; min-width: 100px; max-width: 100px; margin-top: 3px; text-align: center; display: none;' onblur=\"toggle_destination('".escape($extension)."', 'transfer');\">\n";
$valet_block .= " </form>\n";
//}
//}
//else {
// //call
// if (in_array($extension, $_SESSION['user']['extensions'])) {
// $valet_block .= " <img id='destination_control_".escape($extension)."_call' class='destination_control' src='resources/images/keypad_call.png' style='width: 12px; height: 12px; border: none; margin-top: 26px; margin-right: 1px; cursor: pointer;' align='right' onclick=\"toggle_destination('".escape($extension)."', 'call');\" ".$onhover_pause_refresh.">";
// $valet_block .= " <form id='frm_destination_".escape($extension)."_call' onsubmit=\"go_destination('".escape($extension)."', document.getElementById('destination_".escape($extension)."_call').value, 'call'); return false;\">";
// $valet_block .= " <input type='text' class='formfld' id='destination_".escape($extension)."_call' style='width: 100px; min-width: 100px; max-width: 100px; margin-top: 10px; text-align: center; display: none;' onblur=\"toggle_destination('".escape($extension)."', 'call');\">";
// $valet_block .= " </form>\n";
// }
//}
$valet_block .= " </td>\n";
$valet_block .= " </tr>\n";
$valet_block .= "</table>\n";
if (if_group("superadmin") && isset($_GET['debug'])) {
$valet_block .= "<span style='font-size: 10px;'>\n";
$valet_block .= "From ID<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: maroon'>".escape($extension)."</strong><br>\n";
$valet_block .= "uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['uuid'] ? 'blue' : 'black').";'>".escape($ext['uuid'])."</strong><br>\n";
$valet_block .= "call_uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['call_uuid'] ? 'blue' : 'black').";'>".escape($ext['call_uuid'])."</strong><br>\n";
$valet_block .= "variable_bridge_uuid<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: ".($call_identifier == $ext['variable_bridge_uuid'] ? 'blue' : 'black').";'>".escape($ext['variable_bridge_uuid'])."</strong><br>\n";
$valet_block .= "direction<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['direction'])."</strong><br>\n";
$valet_block .= "variable_call_direction<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['variable_call_direction'])."</strong><br>\n";
$valet_block .= "state<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['state'])."</strong><br>\n";
$valet_block .= "cid_num<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['cid_num'])."</strong><br>\n";
$valet_block .= "dest<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['dest'])."</strong><br>\n";
$valet_block .= "context<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['context'])."</strong><br>\n";
$valet_block .= "presence_id<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['presence_id'])."</strong><br>\n";
$valet_block .= "callstate<br>&nbsp;&nbsp;&nbsp;&nbsp;<strong style='color: black;'>".escape($ext['callstate'])."</strong><br>\n";
$valet_block .= "</span>\n";
}
$valet_block .= "</div>\n";
echo $valet_block;
unset($valet_block);
}
$valet_block .= "</div>\n";
echo $valet_block;
unset($valet_block);
}
echo "</td></tr></table><br>\n";