Voicemail Greetings: List view updates.

This commit is contained in:
Nate
2019-12-12 16:37:42 -07:00
parent 0d559e7c2f
commit 5972c5b279
3 changed files with 468 additions and 288 deletions
+96 -156
View File
@@ -21,145 +21,85 @@ $text['title']['ru-ru'] = "";
$text['title']['sv-se'] = "Röstbrevlåda Hälsningar"; $text['title']['sv-se'] = "Röstbrevlåda Hälsningar";
$text['title']['uk-ua'] = "Привітання"; $text['title']['uk-ua'] = "Привітання";
$text['table-size']['en-us'] = "Size"; $text['label-size']['en-us'] = "Size";
$text['table-size']['ar-eg'] = ""; $text['label-size']['ar-eg'] = "";
$text['table-size']['de-at'] = "Größe"; //copied from de-de $text['label-size']['de-at'] = "Größe"; //copied from de-de
$text['table-size']['de-ch'] = "Größe"; //copied from de-de $text['label-size']['de-ch'] = "Größe"; //copied from de-de
$text['table-size']['de-de'] = "Größe"; $text['label-size']['de-de'] = "Größe";
$text['table-size']['es-cl'] = "Tamaño"; $text['label-size']['es-cl'] = "Tamaño";
$text['table-size']['es-mx'] = "Tamaño"; //copied from es-cl $text['label-size']['es-mx'] = "Tamaño"; //copied from es-cl
$text['table-size']['fr-ca'] = "Taille"; //copied from fr-fr $text['label-size']['fr-ca'] = "Taille"; //copied from fr-fr
$text['table-size']['fr-fr'] = "Taille"; $text['label-size']['fr-fr'] = "Taille";
$text['table-size']['he-il'] = "גודל"; $text['label-size']['he-il'] = "גודל";
$text['table-size']['it-it'] = "Dimensione"; $text['label-size']['it-it'] = "Dimensione";
$text['table-size']['nl-nl'] = "Omvang"; $text['label-size']['nl-nl'] = "Omvang";
$text['table-size']['pl-pl'] = "Rozmiar"; $text['label-size']['pl-pl'] = "Rozmiar";
$text['table-size']['pt-br'] = "Tamanho"; //copied from pt-pt $text['label-size']['pt-br'] = "Tamanho"; //copied from pt-pt
$text['table-size']['pt-pt'] = "Tamanho"; $text['label-size']['pt-pt'] = "Tamanho";
$text['table-size']['ro-ro'] = ""; $text['label-size']['ro-ro'] = "";
$text['table-size']['ru-ru'] = ""; $text['label-size']['ru-ru'] = "";
$text['table-size']['sv-se'] = "Storlek"; $text['label-size']['sv-se'] = "Storlek";
$text['table-size']['uk-ua'] = "Розмір"; $text['label-size']['uk-ua'] = "Розмір";
$text['table-number']['en-us'] = "#"; $text['label-number']['en-us'] = "#";
$text['table-number']['ar-eg'] = ""; $text['label-number']['ar-eg'] = "#";
$text['table-number']['de-at'] = "#"; //copied from de-de $text['label-number']['de-at'] = "#"; //copied from de-de
$text['table-number']['de-ch'] = "#"; //copied from de-de $text['label-number']['de-ch'] = "#"; //copied from de-de
$text['table-number']['de-de'] = "#"; $text['label-number']['de-de'] = "#";
$text['table-number']['es-cl'] = "Número"; $text['label-number']['es-cl'] = "Número";
$text['table-number']['es-mx'] = "Número"; //copied from es-cl $text['label-number']['es-mx'] = "Número"; //copied from es-cl
$text['table-number']['fr-ca'] = "Nombre"; //copied from fr-fr $text['label-number']['fr-ca'] = "Nombre"; //copied from fr-fr
$text['table-number']['fr-fr'] = "Nombre"; $text['label-number']['fr-fr'] = "Nombre";
$text['table-number']['he-il'] = "#"; $text['label-number']['he-il'] = "#";
$text['table-number']['it-it'] = "#"; $text['label-number']['it-it'] = "#";
$text['table-number']['nl-nl'] = "Nummer"; $text['label-number']['nl-nl'] = "Nummer";
$text['table-number']['pl-pl'] = "liczba"; $text['label-number']['pl-pl'] = "liczba";
$text['table-number']['pt-br'] = "Número"; //copied from pt-pt $text['label-number']['pt-br'] = "Número"; //copied from pt-pt
$text['table-number']['pt-pt'] = "Número"; $text['label-number']['pt-pt'] = "Número";
$text['table-number']['ro-ro'] = ""; $text['label-number']['ro-ro'] = "#";
$text['table-number']['ru-ru'] = ""; $text['label-number']['ru-ru'] = "#";
$text['table-number']['sv-se'] = "#"; $text['label-number']['sv-se'] = "#";
$text['table-number']['uk-ua'] = "кількість"; $text['label-number']['uk-ua'] = "кількість";
$text['table-name']['en-us'] = "Name"; $text['label-name']['en-us'] = "Name";
$text['table-name']['ar-eg'] = ""; $text['label-name']['ar-eg'] = "";
$text['table-name']['de-at'] = "Name"; //copied from de-de $text['label-name']['de-at'] = "Name"; //copied from de-de
$text['table-name']['de-ch'] = "Name"; //copied from de-de $text['label-name']['de-ch'] = "Name"; //copied from de-de
$text['table-name']['de-de'] = "Name"; $text['label-name']['de-de'] = "Name";
$text['table-name']['es-cl'] = "Nombre"; $text['label-name']['es-cl'] = "Nombre";
$text['table-name']['es-mx'] = "Nombre"; //copied from es-cl $text['label-name']['es-mx'] = "Nombre"; //copied from es-cl
$text['table-name']['fr-ca'] = "Nom"; //copied from fr-fr $text['label-name']['fr-ca'] = "Nom"; //copied from fr-fr
$text['table-name']['fr-fr'] = "Nom"; $text['label-name']['fr-fr'] = "Nom";
$text['table-name']['he-il'] = "שם"; $text['label-name']['he-il'] = "שם";
$text['table-name']['it-it'] = "Nome"; $text['label-name']['it-it'] = "Nome";
$text['table-name']['nl-nl'] = "Naam"; $text['label-name']['nl-nl'] = "Naam";
$text['table-name']['pl-pl'] = "Nazwa"; $text['label-name']['pl-pl'] = "Nazwa";
$text['table-name']['pt-br'] = "Nome"; //copied from pt-pt $text['label-name']['pt-br'] = "Nome"; //copied from pt-pt
$text['table-name']['pt-pt'] = "Nome"; $text['label-name']['pt-pt'] = "Nome";
$text['table-name']['ro-ro'] = ""; $text['label-name']['ro-ro'] = "";
$text['table-name']['ru-ru'] = ""; $text['label-name']['ru-ru'] = "";
$text['table-name']['sv-se'] = "Namn"; $text['label-name']['sv-se'] = "Namn";
$text['table-name']['uk-ua'] = "Назва"; $text['label-name']['uk-ua'] = "Назва";
$text['table-filename']['en-us'] = "File Name"; $text['label-description']['en-us'] = "Description";
$text['table-filename']['ar-eg'] = ""; $text['label-description']['ar-eg'] = "";
$text['table-filename']['de-at'] = "Dateiname"; //copied from de-de $text['label-description']['de-at'] = "Beschreibung"; //copied from de-de
$text['table-filename']['de-ch'] = "Dateiname"; //copied from de-de $text['label-description']['de-ch'] = "Beschreibung"; //copied from de-de
$text['table-filename']['de-de'] = "Dateiname"; $text['label-description']['de-de'] = "Beschreibung";
$text['table-filename']['es-cl'] = "Nombre Del Archivo"; $text['label-description']['es-cl'] = "Descripción";
$text['table-filename']['es-mx'] = "Nombre Del Archivo"; //copied from es-cl $text['label-description']['es-mx'] = "Descripción"; //copied from es-cl
$text['table-filename']['fr-ca'] = "Nom de fichier"; //copied from fr-fr $text['label-description']['fr-ca'] = "Description"; //copied from fr-fr
$text['table-filename']['fr-fr'] = "Nom de fichier"; $text['label-description']['fr-fr'] = "Description";
$text['table-filename']['he-il'] = "שם קובץ"; $text['label-description']['he-il'] = "תיאור";
$text['table-filename']['it-it'] = "Nome File"; $text['label-description']['it-it'] = "Descrizione";
$text['table-filename']['nl-nl'] = "Bestandsnaam"; $text['label-description']['nl-nl'] = "Omschrijving";
$text['table-filename']['pl-pl'] = "Nazwa Pliku"; $text['label-description']['pl-pl'] = "Opis";
$text['table-filename']['pt-br'] = "Nome Do Arquivo"; //copied from pt-pt $text['label-description']['pt-br'] = "Descrição"; //copied from pt-pt
$text['table-filename']['pt-pt'] = "Nome Do Arquivo"; $text['label-description']['pt-pt'] = "Descrição";
$text['table-filename']['ro-ro'] = ""; $text['label-description']['ro-ro'] = "";
$text['table-filename']['ru-ru'] = ""; $text['label-description']['ru-ru'] = "";
$text['table-filename']['sv-se'] = "Filnamn"; $text['label-description']['sv-se'] = "Beskrivning";
$text['table-filename']['uk-ua'] = "ім'я Файлу"; $text['label-description']['uk-ua'] = "Опис";
$text['table-download']['en-us'] = "Download";
$text['table-download']['ar-eg'] = "";
$text['table-download']['de-at'] = "Download"; //copied from de-de
$text['table-download']['de-ch'] = "Download"; //copied from de-de
$text['table-download']['de-de'] = "Download";
$text['table-download']['es-cl'] = "Descargar";
$text['table-download']['es-mx'] = "Descargar"; //copied from es-cl
$text['table-download']['fr-ca'] = "Télécharger"; //copied from fr-fr
$text['table-download']['fr-fr'] = "Télécharger";
$text['table-download']['he-il'] = "הורדה";
$text['table-download']['it-it'] = "Scaricare";
$text['table-download']['nl-nl'] = "Ophalen";
$text['table-download']['pl-pl'] = "Numer";
$text['table-download']['pt-br'] = "Número";
$text['table-download']['pt-pt'] = "Descarregar";
$text['table-download']['ro-ro'] = "";
$text['table-download']['ru-ru'] = "";
$text['table-download']['sv-se'] = "Ladda Ned";
$text['table-download']['uk-ua'] = "Скачати";
$text['table-description']['en-us'] = "Description";
$text['table-description']['ar-eg'] = "";
$text['table-description']['de-at'] = "Beschreibung"; //copied from de-de
$text['table-description']['de-ch'] = "Beschreibung"; //copied from de-de
$text['table-description']['de-de'] = "Beschreibung";
$text['table-description']['es-cl'] = "Descripción";
$text['table-description']['es-mx'] = "Descripción"; //copied from es-cl
$text['table-description']['fr-ca'] = "Description"; //copied from fr-fr
$text['table-description']['fr-fr'] = "Description";
$text['table-description']['he-il'] = "תיאור";
$text['table-description']['it-it'] = "Descrizione";
$text['table-description']['nl-nl'] = "Omschrijving";
$text['table-description']['pl-pl'] = "Opis";
$text['table-description']['pt-br'] = "Descrição"; //copied from pt-pt
$text['table-description']['pt-pt'] = "Descrição";
$text['table-description']['ro-ro'] = "";
$text['table-description']['ru-ru'] = "";
$text['table-description']['sv-se'] = "Beskrivning";
$text['table-description']['uk-ua'] = "Опис";
$text['table-choose']['en-us'] = "Choose";
$text['table-choose']['ar-eg'] = "";
$text['table-choose']['de-at'] = "Wähle"; //copied from de-de
$text['table-choose']['de-ch'] = "Wähle"; //copied from de-de
$text['table-choose']['de-de'] = "Wähle";
$text['table-choose']['es-cl'] = "Escoger";
$text['table-choose']['es-mx'] = "Escoger"; //copied from es-cl
$text['table-choose']['fr-ca'] = "Choisir"; //copied from fr-fr
$text['table-choose']['fr-fr'] = "Choisir";
$text['table-choose']['he-il'] = "בחר";
$text['table-choose']['it-it'] = "Scegliere";
$text['table-choose']['nl-nl'] = "Kiezen";
$text['table-choose']['pl-pl'] = "Wybierz";
$text['table-choose']['pt-br'] = "Escolher"; //copied from pt-pt
$text['table-choose']['pt-pt'] = "Escolher";
$text['table-choose']['ro-ro'] = "";
$text['table-choose']['ru-ru'] = "";
$text['table-choose']['sv-se'] = "Välj";
$text['table-choose']['uk-ua'] = "Вибрати";
$text['message-uploaded']['en-us'] = "Upload Complete"; $text['message-uploaded']['en-us'] = "Upload Complete";
$text['message-uploaded']['ar-eg'] = ""; $text['message-uploaded']['ar-eg'] = "";
@@ -181,26 +121,6 @@ $text['message-uploaded']['ru-ru'] = "";
$text['message-uploaded']['sv-se'] = "Uppladdning Klar"; $text['message-uploaded']['sv-se'] = "Uppladdning Klar";
$text['message-uploaded']['uk-ua'] = "Завантажено"; $text['message-uploaded']['uk-ua'] = "Завантажено";
$text['message-unsupported_file_type']['en-us'] = "Unsupported File Type";
$text['message-unsupported_file_type']['ar-eg'] = "";
$text['message-unsupported_file_type']['de-at'] = "Nicht unterstütztes Dateiformat"; //copied from de-de
$text['message-unsupported_file_type']['de-ch'] = "Nicht unterstütztes Dateiformat"; //copied from de-de
$text['message-unsupported_file_type']['de-de'] = "Nicht unterstütztes Dateiformat";
$text['message-unsupported_file_type']['es-cl'] = "Tipo de archivo no compatible";
$text['message-unsupported_file_type']['es-mx'] = "Tipo de archivo no compatible"; //copied from es-cl
$text['message-unsupported_file_type']['fr-ca'] = "Type de fichier non pris en charge"; //copied from fr-fr
$text['message-unsupported_file_type']['fr-fr'] = "Type de fichier non pris en charge";
$text['message-unsupported_file_type']['he-il'] = "סוג הקובץ לא נתמך";
$text['message-unsupported_file_type']['it-it'] = "Tipo File Non Supportato";
$text['message-unsupported_file_type']['nl-nl'] = "Niet ondersteund bestands type";
$text['message-unsupported_file_type']['pl-pl'] = "Nieobsługiwany typ pliku";
$text['message-unsupported_file_type']['pt-br'] = "Não suportado Tipo de Arquivo"; //copied from pt-pt
$text['message-unsupported_file_type']['pt-pt'] = "Não suportado Tipo de Arquivo";
$text['message-unsupported_file_type']['ro-ro'] = "";
$text['message-unsupported_file_type']['ru-ru'] = "";
$text['message-unsupported_file_type']['sv-se'] = "Filtypen Supporteras Inte";
$text['message-unsupported_file_type']['uk-ua'] = "Тип файлу не підтримується";
$text['message-greeting_selected']['en-us'] = "Greeting Selected"; $text['message-greeting_selected']['en-us'] = "Greeting Selected";
$text['message-greeting_selected']['ar-eg'] = ""; $text['message-greeting_selected']['ar-eg'] = "";
$text['message-greeting_selected']['de-at'] = "Begrüßung ausgewählt"; //copied from de-de $text['message-greeting_selected']['de-at'] = "Begrüßung ausgewählt"; //copied from de-de
@@ -401,6 +321,26 @@ $text['label-add']['ru-ru'] = "";
$text['label-add']['sv-se'] = "Lägg Till Hälsning"; $text['label-add']['sv-se'] = "Lägg Till Hälsning";
$text['label-add']['uk-ua'] = "Додати привітання"; $text['label-add']['uk-ua'] = "Додати привітання";
$text['label-selected']['en-us'] = "Selected";
$text['label-selected']['ar-eg'] = "";
$text['label-selected']['de-at'] = "Ausgewählt"; //copied from de-de
$text['label-selected']['de-ch'] = "Ausgewählt"; //copied from de-de
$text['label-selected']['de-de'] = "Ausgewählt";
$text['label-selected']['es-cl'] = "Seleccionado";
$text['label-selected']['es-mx'] = "Seleccionado"; //copied from es-cl
$text['label-selected']['fr-ca'] = "Sélectionné"; //copied from fr-fr
$text['label-selected']['fr-fr'] = "Sélectionné";
$text['label-selected']['he-il'] = "";
$text['label-selected']['it-it'] = "Selezionato";
$text['label-selected']['nl-nl'] = "";
$text['label-selected']['pl-pl'] = "Wybrane";
$text['label-selected']['pt-br'] = "Selecionado"; //copied from pt-pt
$text['label-selected']['pt-pt'] = "Selecionado";
$text['label-selected']['ro-ro'] = "";
$text['label-selected']['ru-ru'] = "Выбор";
$text['label-selected']['sv-se'] = "Valt";
$text['label-selected']['uk-ua'] = "";
$text['description-name']['en-us'] = "A name for the greeting (not parsed)."; $text['description-name']['en-us'] = "A name for the greeting (not parsed).";
$text['description-name']['ar-eg'] = ""; $text['description-name']['ar-eg'] = "";
$text['description-name']['de-at'] = "Ein Namen für die Begrüßung."; //copied from de-de $text['description-name']['de-at'] = "Ein Namen für die Begrüßung."; //copied from de-de
@@ -0,0 +1,164 @@
<?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-2019
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//define the voicemail greetings class
if (!class_exists('voicemail_greetings')) {
class voicemail_greetings {
/**
* declare private variables
*/
private $app_name;
private $app_uuid;
private $permission_prefix;
private $list_page;
private $table;
private $uuid_prefix;
/**
* declare public variables
*/
public $voicemail_id;
/**
* called when the object is created
*/
public function __construct() {
//assign private variables
$this->app_name = 'voicemail_greetings';
$this->app_uuid = 'e4b4fbee-9e4d-8e46-3810-91ba663db0c2';
$this->permission_prefix = 'voicemail_greeting_';
if (is_numeric($this->voicemail_id)) {
$this->list_page = 'voicemail_greetings.php?id='.urlencode($this->voicemail_id).'&back='.urlencode(PROJECT_PATH.'/app/voicemail/voicemails.php');
}
else {
$this->list_page = PROJECT_PATH.'/app/voicemails/voicemails.php';
}
$this->table = 'voicemail_greetings';
$this->uuid_prefix = 'voicemail_greeting_';
}
/**
* called when there are no references to a particular object
* unset the variables used in the class
*/
public function __destruct() {
foreach ($this as $key => $value) {
unset($this->$key);
}
}
/**
* delete records
*/
public function delete($records) {
if (permission_exists($this->permission_prefix.'delete')) {
//add multi-lingual support
$language = new text;
$text = $language->get();
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: '.$this->list_page);
exit;
}
//check voicemail id
if (!is_numeric($this->voicemail_id)) {
header('Location: '.$this->list_page);
exit;
}
//delete multiple records
if (is_array($records) && @sizeof($records) != 0) {
//filter out unchecked records
foreach ($records as $x => $record) {
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
$uuids[] = "'".$record['uuid']."'";
}
}
//get necessary greeting details
if (is_array($uuids) && @sizeof($uuids) != 0) {
$sql = "select ".$this->uuid_prefix."uuid as uuid, greeting_filename from v_".$this->table." ";
$sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
$database = new database;
$rows = $database->select($sql, $parameters, 'all');
if (is_array($rows) && @sizeof($rows) != 0) {
foreach ($rows as $row) {
$greeting_filenames[$row['uuid']] = $row['greeting_filename'];
}
}
unset($sql, $parameters, $rows, $row);
}
//set the greeting directory
$greeting_directory = $_SESSION['switch']['storage']['dir'].'/voicemail/default/'.$_SESSION['domains'][$_SESSION['domain_uuid']]['domain_name'].'/'.$this->voicemail_id;
//loop through greetings
if (is_array($greeting_filenames) && @sizeof($greeting_filenames) != 0) {
$x = 0;
foreach ($greeting_filenames as $voicemail_greeting_uuid => $greeting_filename) {
//delete the recording file
@unlink($greeting_directory.'/'.$greeting_filename);
//build the delete array
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $voicemail_greeting_uuid;
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
$x++;
}
}
//delete the checked rows
if (is_array($array) && @sizeof($array) != 0) {
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
unset($array);
//set message
message::add($text['message-delete']);
}
unset($records);
}
}
} //method
} //class
}
?>
+208 -132
View File
@@ -17,7 +17,7 @@
The Initial Developer of the Original Code is The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com> Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2018 Portions created by the Initial Developer are Copyright (C) 2008-2019
the Initial Developer. All Rights Reserved. the Initial Developer. All Rights Reserved.
Contributor(s): Contributor(s):
@@ -81,7 +81,6 @@
//download the greeting //download the greeting
if ($_GET['a'] == "download" && (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download'))) { if ($_GET['a'] == "download" && (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download'))) {
session_cache_limiter('public');
if ($_GET['type'] == "rec") { if ($_GET['type'] == "rec") {
$voicemail_greeting_uuid = $_GET['uuid']; $voicemail_greeting_uuid = $_GET['uuid'];
//get voicemail greeting details from db //get voicemail greeting details from db
@@ -138,70 +137,81 @@
} }
//upload the greeting //upload the greeting
if (permission_exists('voicemail_greeting_upload')) { if (
if ($_POST['submit'] == $text['button-upload'] && $_POST['type'] == 'rec' && is_uploaded_file($_FILES['file']['tmp_name'])) { $_POST['a'] == "upload"
&& permission_exists('voicemail_greeting_upload')
&& $_POST['type'] == 'rec'
&& is_uploaded_file($_FILES['file']['tmp_name'])
) {
//get the file extension //validate the token
$file_ext = substr($_FILES['file']['name'], -4); $token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
//check file extension message::add($text['message-invalid_token'],'negative');
if ($file_ext == '.wav' || $file_ext != '.mp3') { header('Location: voicemail_greetings.php?id='.urlencode($voicemail_id));
exit;
//find the next available
for ($i = 1; $i < 10; $i++) {
//set the file name
$file_name = 'greeting_'.$i.$file_ext;
//check the database
if (is_uuid($domain_uuid) && is_numeric($voicemail_id) ) {
$sql = "select count(*) from v_voicemail_greetings ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and voicemail_id = :voicemail_id ";
$sql .= "and greeting_filename = :greeting_filename ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['voicemail_id'] = $voicemail_id;
$parameters['greeting_filename'] = $file_name;
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
if ($num_rows == 0 && !file_exists($v_greeting_dir.'/'.$file_name)) {
//move the uploaded greeting
event_socket_mkdir($v_greeting_dir);
if ($file_ext == '.wav' || $file_ext == '.mp3') {
move_uploaded_file($_FILES['file']['tmp_name'], $v_greeting_dir.'/'.$file_name);
}
//set newly uploaded greeting as active greeting for voicemail box
$sql = "update v_voicemails ";
$sql .= "set greeting_id = :greeting_id ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and voicemail_id = :voicemail_id ";
$parameters['greeting_id'] = $i;
$parameters['domain_uuid'] = $domain_uuid;
$parameters['voicemail_id'] = $voicemail_id;
$database = new database;
$database->execute($sql, $parameters);
unset($sql, $parameters);
//set message
message::add($text['message-uploaded'].": ".$_FILES['file']['name']);
//found available id, exit;
break;
}
else {
continue;
}
unset($num_rows);
}
}
} }
//set the file name to be inserted as the greeting description //get the file extension
$greeting_description = base64_encode($_FILES['file']['name']); $file_ext = substr($_FILES['file']['name'], -4);
header("Location: voicemail_greetings.php?id=".$voicemail_id."&order_by=".$order_by."&order=".$order."&gd=".$greeting_description);
exit; //check file extension
if ($file_ext == '.wav' || $file_ext != '.mp3') {
//find the next available
for ($i = 1; $i < 10; $i++) {
//set the file name
$file_name = 'greeting_'.$i.$file_ext;
//check the database
if (is_uuid($domain_uuid) && is_numeric($voicemail_id) ) {
$sql = "select count(*) from v_voicemail_greetings ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and voicemail_id = :voicemail_id ";
$sql .= "and greeting_filename = :greeting_filename ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['voicemail_id'] = $voicemail_id;
$parameters['greeting_filename'] = $file_name;
$database = new database;
$num_rows = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
if ($num_rows == 0 && !file_exists($v_greeting_dir.'/'.$file_name)) {
//move the uploaded greeting
event_socket_mkdir($v_greeting_dir);
if ($file_ext == '.wav' || $file_ext == '.mp3') {
move_uploaded_file($_FILES['file']['tmp_name'], $v_greeting_dir.'/'.$file_name);
}
//set newly uploaded greeting as active greeting for voicemail box
$sql = "update v_voicemails ";
$sql .= "set greeting_id = :greeting_id ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and voicemail_id = :voicemail_id ";
$parameters['greeting_id'] = $i;
$parameters['domain_uuid'] = $domain_uuid;
$parameters['voicemail_id'] = $voicemail_id;
$database = new database;
$database->execute($sql, $parameters);
unset($sql, $parameters);
//set message
message::add($text['message-uploaded'].": ".$_FILES['file']['name']);
//found available id, exit;
break;
}
else {
continue;
}
unset($num_rows);
}
}
} }
//set the file name to be inserted as the greeting description
$greeting_description = base64_encode($_FILES['file']['name']);
header("Location: voicemail_greetings.php?id=".urlencode($voicemail_id)."&order_by=".urlencode($order_by)."&order=".urlencode($order)."&gd=".$greeting_description);
exit;
} }
//check the permission //check the permission
@@ -347,6 +357,29 @@
} }
} }
//get the http post data
if (is_array($_POST['voicemail_greetings'])) {
$action = $_POST['action'];
$voicemail_id = $_POST['voicemail_id'];
$voicemail_greetings = $_POST['voicemail_greetings'];
}
//process the http post data by action
if ($action != '' && is_array($voicemail_greetings) && @sizeof($voicemail_greetings) != 0) {
switch ($action) {
case 'delete':
if (permission_exists('voicemail_greeting_delete')) {
$obj = new voicemail_greetings;
$obj->voicemail_id = $voicemail_id;
$obj->delete($voicemail_greetings);
}
break;
}
header('Location: voicemail_greetings.php?id='.urlencode($voicemail_id).'&back='.urlencode(PROJECT_PATH.'/app/voicemails/voicemails.php'));
exit;
}
//get the greetings list //get the greetings list
$sql = "select * from v_voicemail_greetings "; $sql = "select * from v_voicemail_greetings ";
$sql .= "where domain_uuid = :domain_uuid "; $sql .= "where domain_uuid = :domain_uuid ";
@@ -356,98 +389,132 @@
$parameters['voicemail_id'] = $voicemail_id; $parameters['voicemail_id'] = $voicemail_id;
$database = new database; $database = new database;
$greetings = $database->select($sql, $parameters, 'all'); $greetings = $database->select($sql, $parameters, 'all');
$num_rows = is_array($greetings) ? @sizeof($greetings) : 0;
unset($sql, $parameters); unset($sql, $parameters);
//set the row styles //create token
$c = 0; $object = new token;
$row_style["0"] = "row_style0"; $token = $object->create($_SERVER['PHP_SELF']);
$row_style["1"] = "row_style1";
//include the header //include the header
$document['title'] = $text['title']; $document['title'] = $text['title'];
require_once "resources/header.php"; require_once "resources/header.php";
//begin the content //file type check script
echo "<script language='JavaScript' type='text/javascript'>\n"; echo "<script language='JavaScript' type='text/javascript'>\n";
echo " function check_file_type(file_input) {\n";
echo " function check_filetype(file_input) {\n";
echo " file_ext = file_input.value.substr((~-file_input.value.lastIndexOf('.') >>> 0) + 2);\n"; echo " file_ext = file_input.value.substr((~-file_input.value.lastIndexOf('.') >>> 0) + 2);\n";
echo " if (file_ext != 'mp3' && file_ext != 'wav' && file_ext != 'ogg' && file_ext != '') {\n"; echo " if (file_ext != 'mp3' && file_ext != 'wav' && file_ext != 'ogg' && file_ext != '') {\n";
echo " display_message(\"".$text['message-unsupported_file_type']."\", 'negative', '2750');\n"; echo " display_message(\"".$text['message-unsupported_file_type']."\", 'negative', '2750');\n";
echo " document.getElementById('form_upload').reset();\n";
echo " }\n"; echo " }\n";
echo " var selected_file_path = file_input.value;\n";
echo " selected_file_path = selected_file_path.replace(\"C:\\\\fakepath\\\\\",'');\n";
echo " document.getElementById('file_label').innerHTML = selected_file_path;\n";
echo " document.getElementById('button_reset').style.display='inline';\n";
echo " }\n"; echo " }\n";
echo "</script>"; echo "</script>";
echo "<script language='JavaScript' type='text/javascript' src='".PROJECT_PATH."/resources/javascript/reset_file_input.js'></script>\n";
echo "<div style='float: right; white-space: nowrap;'>\n"; //show the content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title']." (".$num_rows.")</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'style'=>'margin-right: 15px;','link'=>$_SESSION['back'][$_SERVER['PHP_SELF']]]);
if (permission_exists('voicemail_greeting_upload')) { if (permission_exists('voicemail_greeting_upload')) {
echo " <form name='frm' method='POST' enctype='multipart/form-data' action=''>\n"; echo "<form id='form_upload' class='inline' method='post' enctype='multipart/form-data'>\n";
echo " <input type='hidden' name='id' value='".escape($voicemail_id)."'>\n"; echo "<input name='a' type='hidden' value='upload'>\n";
echo " <input type='hidden' name='type' value='rec'>\n"; echo "<input type='hidden' name='id' value='".escape($voicemail_id)."'>\n";
echo "<input type='hidden' name='type' value='rec'>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','onclick'=>"$(this).fadeOut(250, function(){ $('span#form_upload').fadeIn(250); document.getElementById('ulfile').click(); });"]);
echo "<span id='form_upload' style='display: none;'>";
echo button::create(['label'=>$text['button-reset'],'icon'=>$_SESSION['theme']['button_icon_reset'],'type'=>'button','id'=>'btn_upload_reset','onclick'=>"$('span#form_upload').fadeOut(250, function(){ document.getElementById('form_upload').reset(); $('#btn_add').fadeIn(250) });"]);
echo "<input type='text' class='txt' style='width: 100px; cursor: pointer;' id='filename' placeholder='Select...' onclick=\"document.getElementById('ulfile').click(); this.blur();\" onfocus='this.blur();'>";
echo "<input type='file' id='ulfile' name='file' style='display: none;' accept='.wav,.mp3,.ogg' onchange=\"document.getElementById('filename').value = this.files.item(0).name; check_file_type(this);\">";
echo button::create(['type'=>'submit','label'=>$text['button-upload'],'icon'=>$_SESSION['theme']['button_icon_upload']]);
echo "</span>\n";
echo "</form>";
} }
echo " <input type='button' class='btn' alt='back' onclick=\"window.location='".$_SESSION['back'][$_SERVER['PHP_SELF']]."';\" value='".$text['button-back']."'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n"; if (permission_exists('voicemail_greeting_delete') && $greetings) {
if (permission_exists('voicemail_greeting_upload')) { echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'onclick'=>"if (confirm('".$text['confirm-delete']."')) { list_action_set('delete'); list_form_submit('form_list'); } else { this.blur(); return false; }"]);
echo " <input name='file' id='file' type='file' style='display: none;' onchange='check_filetype(this);'>";
echo " <label id='file_label' for='file' class='txt' style='width: 200px; overflow: hidden; white-space: nowrap;'>".$text['label-select_a_file']."</label>\n";
echo " <input id='button_reset' type='reset' class='btn' style='display: none;' value='".$text['button-reset']."' onclick=\"reset_file_input('file'); document.getElementById('file_label').innerHTML = '".$text['label-select_a_file']."'; this.style.display='none'; return true;\">\n";
echo " <input name='submit' type='submit' class='btn' id='upload' value=\"".$text['button-upload']."\">\n";
echo " </form>";
} }
echo "</div>"; echo " </div>\n";
echo "<span class='title'>".$text['title']."</span>\n"; echo " <div style='clear: both;'></div>\n";
echo "<br><br>\n"; echo "</div>\n";
echo $text['description']." <strong>".escape($voicemail_id)."</strong>\n"; echo $text['description']." <strong>".escape($voicemail_id)."</strong>\n";
echo "<br /><br />\n"; echo "<br /><br />\n";
echo "<table class='tr_hover' width='100%' border='0' cellpadding='0' cellspacing='0'>\n"; echo "<form id='form_list' method='post'>\n";
echo "<tr>\n"; echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<th width='2'>&nbsp;</th>\n"; echo "<input type='hidden' id='voicemail_id' name='voicemail_id' value='".escape($voicemail_id)."'>\n";
echo th_order_by('greeting_id', $text['table-number'], $order_by, $order, '', "width='20'", "id=".escape($voicemail_id));
echo th_order_by('greeting_name', $text['table-name'], $order_by, $order, '', '', "id=".escape($voicemail_id)); echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
$col_count = 0;
if (permission_exists('voicemail_greeting_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle();' ".($greetings ?: "style='visibility: hidden;'").">\n";
echo " </th>\n";
$col_count++;
}
echo "<th class='shrink center'>".$text['label-selected']."</th>\n";
$col_count++;
echo th_order_by('greeting_id', $text['label-number'], $order_by, $order, null, "class='center shrink'", "id=".urlencode($voicemail_id));
$col_count++;
echo th_order_by('greeting_name', $text['label-name'], $order_by, $order, null, null, "id=".urlencode($voicemail_id));
$col_count++;
if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') { if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') {
echo th_order_by('greeting_filename', $text['table-filename'], $order_by, $order, '', '', "id=".escape($voicemail_id)); echo th_order_by('greeting_filename', $text['label-filename'], $order_by, $order, null, "class='hide-sm-dn'", "id=".urlencode($voicemail_id));
echo "<th class='listhdr' style='text-align: right;' nowrap='nowrap'>".$text['table-size']."</th>\n"; $col_count++;
} }
if (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download')) { if (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download')) {
echo "<th>".$text['label-tools']."</th>\n"; echo "<th class='center'>".$text['label-tools']."</th>\n";
$col_count++;
}
if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') {
echo "<th class='center no-wrap hide-xs'>".$text['label-size']."</th>\n";
echo "<th class='center no-wrap hide-xs'>".$text['label-uploaded']."</th>\n";
$col_count += 2;
}
echo th_order_by('greeting_description', $text['label-description'], $order_by, $order, null, "class='hide-sm-dn pct-25'", "id=".urlencode($voicemail_id));
if (permission_exists('voicemail_greeting_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
echo " <td class='action-button'>&nbsp;</td>\n";
} }
echo th_order_by('greeting_description', $text['table-description'], $order_by, $order, '', '', "id=".escape($voicemail_id));
echo "<td align='right' width='21'>\n";
echo "</td>\n";
echo "</tr>\n"; echo "</tr>\n";
//calculate colspan for progress bar
$colspan = 7; //max
if ($_SESSION['voicemail']['storage_type']['text'] == 'base64') { $colspan = $colspan - 2; }
if (!(permission_exists('voicemail_greeting_edit') || permission_exists('voicemail_greeting_delete'))) { $colspan = $colspan - 1; }
if (is_array($greetings) && @sizeof($greetings) != 0) { if (is_array($greetings) && @sizeof($greetings) != 0) {
foreach($greetings as $row) { $x = 0;
foreach ($greetings as $row) {
//playback progress bar //playback progress bar
if (permission_exists('voicemail_greeting_play')) { if (permission_exists('voicemail_greeting_play')) {
echo "<tr id='recording_progress_bar_".escape($row['voicemail_greeting_uuid'])."' style='display: none;'><td colspan='".$colspan."' class='".$row_style[$c]." playback_progress_bar_background'><span class='playback_progress_bar' id='recording_progress_".escape($row['voicemail_greeting_uuid'])."'></span></td></tr>\n"; echo "<tr class='list-row' id='recording_progress_bar_".escape($row['voicemail_greeting_uuid'])."' style='display: none;'><td class='playback_progress_bar_background' style='padding: 0; border: none;' colspan='".$col_count."'><span class='playback_progress_bar' id='recording_progress_".escape($row['voicemail_greeting_uuid'])."'></span></td><td class='description hide-sm-dn' style='border-bottom: none !important;'></td></tr>\n";
echo "<tr class='list-row' style='display: none;'><td></td></tr>\n"; // dummy row to maintain alternating background color
}
if (permission_exists('voicemail_greeting_edit')) {
$list_row_url = "voicemail_greeting_edit.php?id=".urlencode($row['voicemail_greeting_uuid'])."&voicemail_id=".urlencode($voicemail_id);
} }
$tr_link = (permission_exists('voicemail_greeting_edit')) ? "href='voicemail_greeting_edit.php?id=".escape($row['voicemail_greeting_uuid'])."&voicemail_id=".escape($voicemail_id)."'" : null; echo "<tr class='list-row' href='".$list_row_url."'>\n";
echo "<tr ".$tr_link.">\n"; if (permission_exists('voicemail_greeting_delete')) {
echo " <td class='".$row_style[$c]." row_style_slim tr_link_void' width='30px;' valign='top'>"; echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='voicemail_greetings[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"if (!this.checked) { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='voicemail_greetings[$x][uuid]' value='".escape($row['voicemail_greeting_uuid'])."' />\n";
echo " </td>\n";
}
echo " <td class='center no-link'>";
$selected = ($row['greeting_id'] == $selected_greeting_id) ? true : false; $selected = ($row['greeting_id'] == $selected_greeting_id) ? true : false;
echo "<input type='radio' onclick=\"window.location='".PROJECT_PATH."/app/voicemail_greetings/voicemail_greetings.php?id=".escape($voicemail_id)."&greeting_id=".escape($row['greeting_id'])."&action=set&order_by=".$order_by."&order=".$order."';\" name='greeting_id' value='".escape($row['greeting_id'])."' ".(($selected) ? "checked='checked'" : null)." style='margin-top: 7px;'>\n"; echo "<input type='radio' onclick=\"window.location='".PROJECT_PATH."/app/voicemail_greetings/voicemail_greetings.php?id=".escape($voicemail_id)."&greeting_id=".escape($row['greeting_id'])."&action=set&order_by=".$order_by."&order=".$order."';\" name='greeting_id' value='".escape($row['greeting_id'])."' ".(($selected) ? "checked='checked'" : null)." style='display: block; width: 20px; height: auto; margin: auto calc(50% - 10px);'>\n";
echo " </td>\n";
echo " <td class='center'>".escape($row['greeting_id'])."</td>\n";
echo " <td class='no-wrap'>";
if (permission_exists('voicemail_greeting_edit')) {
echo "<a href='".$list_row_url."' title=\"".$text['button-edit']."\">".escape($row['greeting_name'])."</a>";
}
else {
echo escape($row['greeting_name']);
}
echo " </td>\n"; echo " </td>\n";
echo " <td valign='top' class='".$row_style[$c]."'>".escape($row['greeting_id'])."</td>\n";
echo " <td valign='top' class='".$row_style[$c]."'>".escape($row['greeting_name'])."</td>\n";
if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') { if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') {
echo " <td valign='top' class='".$row_style[$c]."'>".escape($row['greeting_filename'])."</td>\n"; echo " <td class='hide-sm-dn'>".escape($row['greeting_filename'])."</td>\n";
$tmp_filesize = filesize($v_greeting_dir.'/'.$row['greeting_filename']);
$tmp_filesize = byte_convert($tmp_filesize);
echo " <td class='".$row_style[$c]."' style='text-align: right;' nowrap>".$tmp_filesize."</td>\n";
} }
if (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download')) { if (permission_exists('voicemail_greeting_play') || permission_exists('voicemail_greeting_download')) {
echo " <td valign='top' class='".$row_style[$c]." row_style_slim tr_link_void'>"; echo " <td class='middle button center no-link no-wrap'>";
if (permission_exists('voicemail_greeting_play')) { if (permission_exists('voicemail_greeting_play')) {
$greeting_file_path = $row['greeting_filename']; $greeting_file_path = $row['greeting_filename'];
$greeting_file_name = strtolower(pathinfo($greeting_file_path, PATHINFO_BASENAME)); $greeting_file_name = strtolower(pathinfo($greeting_file_path, PATHINFO_BASENAME));
@@ -458,32 +525,41 @@
case "ogg" : $greeting_type = "audio/ogg"; break; case "ogg" : $greeting_type = "audio/ogg"; break;
} }
echo "<audio id='recording_audio_".escape($row['voicemail_greeting_uuid'])."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".escape($row['voicemail_greeting_uuid'])."')\" onended=\"recording_reset('".escape($row['voicemail_greeting_uuid'])."');\" src=\"voicemail_greetings.php?id=".escape($voicemail_id)."&a=download&type=rec&uuid=".escape($row['voicemail_greeting_uuid'])."\" type='".$greeting_type."'></audio>"; echo "<audio id='recording_audio_".escape($row['voicemail_greeting_uuid'])."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".escape($row['voicemail_greeting_uuid'])."')\" onended=\"recording_reset('".escape($row['voicemail_greeting_uuid'])."');\" src=\"voicemail_greetings.php?id=".escape($voicemail_id)."&a=download&type=rec&uuid=".escape($row['voicemail_greeting_uuid'])."\" type='".$greeting_type."'></audio>";
echo "<span id='recording_button_".escape($row['voicemail_greeting_uuid'])."' onclick=\"recording_play('".escape($row['voicemail_greeting_uuid'])."')\" title='".$text['label-play']." / ".$text['label-pause']."'>".$v_link_label_play."</span>"; echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.escape($row['voicemail_greeting_uuid']),'onclick'=>"recording_play('".escape($row['voicemail_greeting_uuid'])."')"]);
} }
if (permission_exists('voicemail_greeting_download')) { if (permission_exists('voicemail_greeting_download')) {
echo "<a href=\"voicemail_greetings.php?a=download&type=rec&t=bin&id=".escape($voicemail_id)."&uuid=".escape($row['voicemail_greeting_uuid'])."\" title='".$text['label-download']."'>".$v_link_label_download."</a>"; echo button::create(['type'=>'button','title'=>$text['label-download'],'icon'=>$_SESSION['theme']['button_icon_download'],'link'=>"voicemail_greetings.php?a=download&type=rec&t=bin&id=".urlencode($voicemail_id)."&uuid=".escape($row['voicemail_greeting_uuid'])]);
} }
echo " </td>\n"; echo " </td>\n";
} }
echo " <td width='30%' valign='top' class='row_stylebg'>".escape($row['greeting_description'])."&nbsp;</td>\n"; if ($_SESSION['voicemail']['storage_type']['text'] != 'base64') {
echo " <td class='list_control_icons'>\n"; $file_size = byte_convert(filesize($v_greeting_dir.'/'.$row['greeting_filename']));
if (permission_exists('voicemail_greeting_edit')) { $file_date = date("M d, Y H:i:s", filemtime($v_greeting_dir.'/'.$row['greeting_filename']));
echo "<a href='voicemail_greeting_edit.php?id=".escape($row['voicemail_greeting_uuid'])."&voicemail_id=".escape($voicemail_id)."' alt='edit'>$v_link_label_edit</a>"; echo " <td class='center no-wrap hide-xs'>".$file_size."</td>\n";
echo " <td class='center no-wrap hide-xs'>".$file_date."</td>\n";
} }
if (permission_exists('voicemail_greeting_delete')) { echo " <td class='description overflow hide-sm-dn'>".escape($row['greeting_description'])."&nbsp;</td>\n";
echo "<a href='voicemail_greeting_delete.php?id=".escape($row['voicemail_greeting_uuid'])."&voicemail_id=".escape($voicemail_id)."' alt='delete' onclick=\"return confirm('Do you really want to delete this?')\">$v_link_label_delete</a>"; if (permission_exists('voicemail_greeting_edit') && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
} }
echo " </td>\n";
echo "</tr>\n"; echo "</tr>\n";
$x++;
$c = ($c) ? 0 : 1; /*
echo "<a href='voicemail_greeting_delete.php?id=".escape($row['voicemail_greeting_uuid'])."&voicemail_id=".escape($voicemail_id)."' alt='delete' onclick=\"return confirm('Do you really want to delete this?')\">$v_link_label_delete</a>";
*/
} }
unset($greetings);
} }
unset($result, $row);
echo "</table>\n"; echo "</table>\n";
echo "<br /><br /><br />\n"; echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//include the footer //include the footer
require_once "resources/footer.php"; require_once "resources/footer.php";
?> ?>