mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2026-01-25 10:09:21 +00:00
Merge branch 'master' of https://github.com/fusionpbx/fusionpbx
This commit is contained in:
@@ -1729,6 +1729,17 @@ $text['button-save']['ro'] = "Salvează";
|
||||
$text['button-save']['ar-eg'] = "حفظ";
|
||||
$text['button-save']['he'] = "שמור";
|
||||
|
||||
$text['button-export']['en-us'] = "Export";
|
||||
$text['button-export']['es-cl'] = "Exportación";
|
||||
$text['button-export']['pt-pt'] = "Exportação";
|
||||
$text['button-export']['fr-fr'] = "Exportation";
|
||||
$text['button-export']['pt-br'] = "Exportação ";
|
||||
$text['button-export']['pl'] = "Eksportuj";
|
||||
$text['button-export']['sv-se'] = "Export";
|
||||
$text['button-export']['uk'] = "";
|
||||
$text['button-export']['de-at'] = "Export";
|
||||
$text['button-export']['he'] = "יצוא";
|
||||
|
||||
$text['button-edit']['en-us'] = "Edit";
|
||||
$text['button-edit']['es-cl'] = "Editar";
|
||||
$text['button-edit']['pt-pt'] = "Editar";
|
||||
|
||||
187
app/extensions/extension_download.php
Normal file
187
app/extensions/extension_download.php
Normal file
@@ -0,0 +1,187 @@
|
||||
<?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-2012
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Mark J Crane <markjcrane@fusionpbx.com>
|
||||
*/
|
||||
include "root.php";
|
||||
require_once "resources/require.php";
|
||||
require_once "resources/check_auth.php";
|
||||
require_once "resources/paging.php";
|
||||
if (if_group("superadmin")) {
|
||||
//access granted
|
||||
}
|
||||
else {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//add multi-lingual support
|
||||
$language = new text;
|
||||
$text = $language->get();
|
||||
|
||||
function array2csv(array &$array)
|
||||
{
|
||||
if (count($array) == 0) {
|
||||
return null;
|
||||
}
|
||||
ob_start();
|
||||
$df = fopen("php://output", 'w');
|
||||
fputcsv($df, array_keys(reset($array)));
|
||||
foreach ($array as $row) {
|
||||
fputcsv($df, $row);
|
||||
}
|
||||
fclose($df);
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
function download_send_headers($filename) {
|
||||
// disable caching
|
||||
$now = gmdate("D, d M Y H:i:s");
|
||||
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
|
||||
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
|
||||
header("Last-Modified: {$now} GMT");
|
||||
|
||||
// force download
|
||||
header("Content-Type: application/force-download");
|
||||
header("Content-Type: application/octet-stream");
|
||||
header("Content-Type: application/download");
|
||||
|
||||
// disposition / encoding on response body
|
||||
header("Content-Disposition: attachment;filename={$filename}");
|
||||
header("Content-Transfer-Encoding: binary");
|
||||
}
|
||||
|
||||
if (isset($_REQUEST["column_group"])) {
|
||||
|
||||
$columns = implode(",",$_REQUEST["column_group"]);
|
||||
$sql = "select " . $columns . " from v_extensions ";
|
||||
$sql .= " where domain_uuid = '".$domain_uuid."' ";
|
||||
$prep_statement = $db->prepare(check_sql($sql));
|
||||
$prep_statement->execute();
|
||||
$extensions = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
|
||||
unset ($sql, $prep_statement);
|
||||
// print_r($extensions);
|
||||
|
||||
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
|
||||
echo array2csv($extensions);
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
$columns[] = 'extension_uuid';
|
||||
$columns[] = 'domain_uuid';
|
||||
$columns[] = 'extension';
|
||||
$columns[] = 'number_alias';
|
||||
$columns[] = 'password';
|
||||
$columns[] = 'accountcode';
|
||||
$columns[] = 'effective_caller_id_name';
|
||||
$columns[] = 'effective_caller_id_number';
|
||||
$columns[] = 'outbound_caller_id_name';
|
||||
$columns[] = 'outbound_caller_id_number';
|
||||
$columns[] = 'emergency_caller_id_name';
|
||||
$columns[] = 'emergency_caller_id_number';
|
||||
$columns[] = 'directory_full_name';
|
||||
$columns[] = 'directory_visible';
|
||||
$columns[] = 'directory_exten_visible';
|
||||
$columns[] = 'limit_max';
|
||||
$columns[] = 'limit_destination';
|
||||
$columns[] = 'missed_call_app';
|
||||
$columns[] = 'missed_call_data';
|
||||
$columns[] = 'user_context';
|
||||
$columns[] = 'toll_allow';
|
||||
$columns[] = 'call_timeout';
|
||||
$columns[] = 'call_group';
|
||||
$columns[] = 'call_screen_enabled';
|
||||
$columns[] = 'user_record';
|
||||
$columns[] = 'hold_music';
|
||||
$columns[] = 'auth_acl';
|
||||
$columns[] = 'cidr';
|
||||
$columns[] = 'sip_force_contact';
|
||||
$columns[] = 'nibble_account';
|
||||
$columns[] = 'sip_force_expires';
|
||||
$columns[] = 'mwi_account';
|
||||
$columns[] = 'sip_bypass_media';
|
||||
$columns[] = 'unique_id';
|
||||
$columns[] = 'dial_string';
|
||||
$columns[] = 'dial_user';
|
||||
$columns[] = 'dial_domain';
|
||||
$columns[] = 'do_not_disturb';
|
||||
$columns[] = 'forward_all_destination';
|
||||
$columns[] = 'forward_all_enabled';
|
||||
$columns[] = 'forward_busy_destination';
|
||||
$columns[] = 'forward_busy_enabled';
|
||||
$columns[] = 'forward_no_answer_destination';
|
||||
$columns[] = 'forward_no_answer_enabled';
|
||||
$columns[] = 'follow_me_uuid';
|
||||
$columns[] = 'enabled';
|
||||
$columns[] = 'description';
|
||||
$columns[] = 'forward_caller_id_uuid';
|
||||
$columns[] = 'absolute_codec_string';
|
||||
$columns[] = 'forward_user_not_registered_destination';
|
||||
$columns[] = 'forward_user_not_registered_enabled';
|
||||
|
||||
$c = 0;
|
||||
$row_style["0"] = "row_style0";
|
||||
$row_style["1"] = "row_style1";
|
||||
|
||||
//begin the page content
|
||||
require_once "resources/header.php";
|
||||
|
||||
echo "<form method='post' name='frm' action='' autocomplete='off'>\n";
|
||||
echo "<table class='tr_hover' width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
|
||||
echo "<tr>\n";
|
||||
echo "<tr>\n";
|
||||
echo "<th><input type=\"checkbox\" id=\"selecctall\"/>";
|
||||
echo "</th>";
|
||||
echo "<th> Column Name";
|
||||
echo "</th>";
|
||||
echo "<th> Description";
|
||||
echo "</th>";
|
||||
echo "</tr>";
|
||||
echo "</tr>";
|
||||
foreach ($columns as $value) {
|
||||
echo "<tr>\n";
|
||||
echo " <td width = '20px' valign='top' class='".$row_style[$c]."'><input class=\"checkbox1\" type=\"checkbox\" name=\"column_group[]\" value=\"$value\"/>";
|
||||
echo "</td>";
|
||||
echo " <td valign='top' class='".$row_style[$c]."'> $value";
|
||||
echo "</td>";
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>";
|
||||
echo "</td>";
|
||||
echo "</tr>";
|
||||
if ($c==0) { $c=1; } else { $c=0; }
|
||||
}
|
||||
|
||||
echo " <tr>\n";
|
||||
echo " <td colspan='3' align='right'>\n";
|
||||
echo " <br>";
|
||||
echo " <input type='submit' class='btn' value='".$text['button-export']."'>\n";
|
||||
echo " </td>\n";
|
||||
echo " </tr>";
|
||||
|
||||
echo "</table>";
|
||||
echo "<br><br>";
|
||||
echo "</form>";
|
||||
|
||||
//include the footer
|
||||
require_once "resources/footer.php";
|
||||
?>
|
||||
@@ -123,6 +123,9 @@ require_once "resources/paging.php";
|
||||
echo " </td>\n";
|
||||
echo " <form method='get' action=''>\n";
|
||||
echo " <td width='30%' align='right'>\n";
|
||||
if (if_group("superadmin")) {
|
||||
echo " <input type='button' class='btn' value='".$text['button-export']."' onclick=\"window.location.href='extension_download.php'\">\n";
|
||||
}
|
||||
echo " <input type='text' class='txt' style='width: 150px' name='search' value='".$search."'>";
|
||||
echo " <input type='submit' class='btn' name='submit' value='".$text['button-search']."'>";
|
||||
echo " </td>\n";
|
||||
|
||||
@@ -146,6 +146,13 @@
|
||||
$apps[$x]['permissions'][$y]['name'] = 'fax_file_delete';
|
||||
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
|
||||
$apps[$x]['permissions'][$y]['groups'][] = 'admin';
|
||||
$y++;
|
||||
$apps[$x]['permissions'][$y]['name'] = 'fax_active_view';
|
||||
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
|
||||
$apps[$x]['permissions'][$y]['groups'][] = 'admin';
|
||||
$y++;
|
||||
$apps[$x]['permissions'][$y]['name'] = 'fax_active_all';
|
||||
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
|
||||
|
||||
//schema details
|
||||
$y = 0; //table array index
|
||||
|
||||
@@ -330,6 +330,17 @@ $text['label-log']['de-at'] = "Log";
|
||||
$text['label-log']['ro'] = "Log";
|
||||
$text['label-log']['he'] = "";
|
||||
|
||||
$text['label-active']['en-us'] = "Active";
|
||||
$text['label-active']['es-cl'] = "";
|
||||
$text['label-active']['pt-pt'] = "";
|
||||
$text['label-active']['fr-fr'] = "";
|
||||
$text['label-active']['pt-br'] = "";
|
||||
$text['label-active']['pl'] = "";
|
||||
$text['label-active']['sv-se'] = "";
|
||||
$text['label-active']['de-at'] = "";
|
||||
$text['label-active']['ro'] = "";
|
||||
$text['label-active']['he'] = "";
|
||||
|
||||
$text['label-location']['en-us'] = "Location";
|
||||
$text['label-location']['es-cl'] = "Localización";
|
||||
$text['label-location']['pt-pt'] = "Localização";
|
||||
@@ -2068,4 +2079,38 @@ $text['button-add']['de-at'] = "Hinzufügen";
|
||||
$text['button-add']['ro'] = "Adaugă";
|
||||
$text['button-add']['he'] = "הוספה";
|
||||
|
||||
$text['button-show_all']['en-us'] = "Show All";
|
||||
$text['button-show_all']['es-cl'] = "Mostrar Todos";
|
||||
$text['button-show_all']['pt-pt'] = "Mostrar Todos";
|
||||
$text['button-show_all']['fr-fr'] = "Montrer Tout";
|
||||
$text['button-show_all']['pt-br'] = "Mostrar Todos";
|
||||
$text['button-show_all']['pl'] = "Pokaż Wszystkie";
|
||||
$text['button-show_all']['uk'] = "Показати всі";
|
||||
$text['button-show_all']['de-at'] = "Alle anzeigen";
|
||||
$text['button-show_all']['he'] = "";
|
||||
|
||||
$text['fax-active_title']['en-us'] = "Fax queue";
|
||||
|
||||
$text['fax-active_description']['en-us'] = "Current status of fax queue";
|
||||
|
||||
$text['fax-active_title_fax_server']['en-us'] = "Fax";
|
||||
|
||||
$text['fax-active_title_enabled']['en-us'] = "Enabled";
|
||||
|
||||
$text['fax-active_title_status']['en-us'] = "Status";
|
||||
|
||||
$text['fax-active_title_next_time']['en-us'] = "Next time";
|
||||
|
||||
$text['fax-active_title_files']['en-us'] = "Files";
|
||||
|
||||
$text['fax-active_title_uri']['en-us'] = "URI";
|
||||
|
||||
$text['fax-active_status_wait']['en-us'] = "Wait";
|
||||
|
||||
$text['fax-active_status_execute']['en-us'] = "Execute";
|
||||
|
||||
$text['fax-active_status_success']['en-us'] = "Success";
|
||||
|
||||
$text['fax-active_status_fail']['en-us'] = "Fail";
|
||||
|
||||
?>
|
||||
@@ -170,6 +170,9 @@ else {
|
||||
if (permission_exists('fax_log_view')) {
|
||||
echo " <a href='fax_logs.php?id=".$row['fax_uuid']."'>".$text['label-log']."</a>";
|
||||
}
|
||||
if (permission_exists('fax_active_view')) {
|
||||
echo " <a href='fax_active.php?id=".$row['fax_uuid']."'>".$text['label-active']."</a>";
|
||||
}
|
||||
echo " </td>\n";
|
||||
echo " <td valign='top' class='row_stylebg' width='35%'>".$row['fax_description']." </td>\n";
|
||||
echo " <td class='list_control_icons'>";
|
||||
|
||||
136
app/fax/fax_active.php
Normal file
136
app/fax/fax_active.php
Normal file
@@ -0,0 +1,136 @@
|
||||
<?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-2012
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Mark J Crane <markjcrane@fusionpbx.com>
|
||||
*/
|
||||
include "root.php";
|
||||
require_once "resources/require.php";
|
||||
require_once "resources/check_auth.php";
|
||||
if (permission_exists('fax_active_view')) {
|
||||
//access granted
|
||||
}
|
||||
else {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//add multi-lingual support
|
||||
$language = new text;
|
||||
$text = $language->get();
|
||||
|
||||
//get the HTTP values and set as variables
|
||||
$show = trim($_REQUEST["show"]);
|
||||
if ($show != "all") { $show = ''; }
|
||||
|
||||
//
|
||||
$fax_uuid = false;
|
||||
if(isset($_REQUEST['id'])) {
|
||||
$fax_uuid = check_str($_REQUEST["id"]);
|
||||
}
|
||||
|
||||
//show the header
|
||||
$document['title'] = $text['title'];
|
||||
require_once "resources/header.php";
|
||||
|
||||
//ajax for refresh
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
//define refresh function, initial start
|
||||
var refresh = 1500;
|
||||
var source_url = 'fax_active_inc.php?';
|
||||
var timer_id;
|
||||
<?php
|
||||
if ($show == 'all') {
|
||||
echo "source_url = source_url + '&show=all';";
|
||||
}
|
||||
if ($fax_uuid) {
|
||||
echo "source_url = source_url + '&id=" . $fax_uuid . "';";
|
||||
}
|
||||
if (isset($_REQUEST["debug"])) {
|
||||
echo "source_url = source_url + '&debug';";
|
||||
}
|
||||
?>
|
||||
var ajax_get = function () {
|
||||
$.ajax({
|
||||
url: source_url, success: function(response){
|
||||
$("#ajax_reponse").html(response);
|
||||
}
|
||||
});
|
||||
timer_id = setTimeout(ajax_get, refresh);
|
||||
};
|
||||
|
||||
refresh_start();
|
||||
|
||||
//refresh controls
|
||||
function refresh_stop() {
|
||||
clearTimeout(timer_id);
|
||||
document.getElementById('refresh_state').innerHTML = "<img src='resources/images/refresh_paused.png' style='width: 16px; height: 16px; border: none; margin-top: 1px; cursor: pointer;' onclick='refresh_start();' alt=\"<?php echo $text['label-refresh_enable']?>\" title=\"<?php echo $text['label-refresh_enable']?>\">";
|
||||
}
|
||||
|
||||
function refresh_start() {
|
||||
if (document.getElementById('refresh_state')) { document.getElementById('refresh_state').innerHTML = "<img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; margin-top: 3px; cursor: pointer;' alt=\"<?php echo $text['label-refresh_pause']?>\" title=\"<?php echo $text['label-refresh_pause']?>\">"; }
|
||||
ajax_get();
|
||||
}
|
||||
|
||||
//call controls
|
||||
function hangup(uuid) {
|
||||
if (confirm("<?php echo $text['confirm-hangup']?>")) {
|
||||
send_cmd('fax_active_exec.php?cmd=delete&id='+uuid);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function send_cmd(url) {
|
||||
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
|
||||
xmlhttp=new XMLHttpRequest();
|
||||
}
|
||||
else {// code for IE6, IE5
|
||||
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
|
||||
}
|
||||
xmlhttp.open("GET",url,false);
|
||||
xmlhttp.send(null);
|
||||
document.getElementById('cmd_reponse').innerHTML=xmlhttp.responseText;
|
||||
}
|
||||
|
||||
</script>
|
||||
<?php
|
||||
echo "<div id='ajax_reponse'></div>\n";
|
||||
echo "<div id='time_stamp' style='visibility:hidden'>".date('Y-m-d-s')."</div>\n";
|
||||
echo "<br><br><br>";
|
||||
|
||||
require_once "resources/footer.php";
|
||||
|
||||
/*
|
||||
// deprecated functions for this page
|
||||
|
||||
function get_park_cmd(uuid, context) {
|
||||
cmd = \"uuid_transfer \"+uuid+\" -bleg *6000 xml \"+context;
|
||||
return escape(cmd);
|
||||
}
|
||||
|
||||
function get_record_cmd(uuid, prefix, name) {
|
||||
cmd = \"uuid_record \"+uuid+\" start ".$_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/archive/".date("Y")."/".date("M")."/".date("d")."/\"+uuid+\".wav\";
|
||||
return escape(cmd);
|
||||
}
|
||||
*/
|
||||
?>
|
||||
74
app/fax/fax_active_exec.php
Normal file
74
app/fax/fax_active_exec.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/* $Id$ */
|
||||
/*
|
||||
v_exec.php
|
||||
Copyright (C) 2008 Mark J Crane
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
include "root.php";
|
||||
require_once "resources/require.php";
|
||||
require_once "resources/check_auth.php";
|
||||
if (permission_exists('fax_active_view')) {
|
||||
//access granted
|
||||
}
|
||||
else {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//authorized referrer
|
||||
if(stristr($_SERVER["HTTP_REFERER"], '/fax_active.php') === false) {
|
||||
echo " access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//http get variables set to php variables
|
||||
if (count($_GET)>0) {
|
||||
$cmd = trim(check_str($_GET['cmd']));
|
||||
$fax_uuid = trim(check_str($_GET['id']));
|
||||
}
|
||||
|
||||
//authorized commands
|
||||
if ($cmd == 'delete') {
|
||||
//authorized;
|
||||
} else {
|
||||
//not found. this command is not authorized
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//Command
|
||||
if ($cmd == 'delete') {
|
||||
if($fax_uuid){
|
||||
$sql = <<<HERE
|
||||
delete from v_fax_tasks
|
||||
where fax_task_uuid='$fax_uuid'
|
||||
HERE;
|
||||
$result = $db->exec($sql);
|
||||
// if($result === false){
|
||||
// var_dump($db->errorInfo());
|
||||
// }
|
||||
}
|
||||
}
|
||||
?>
|
||||
222
app/fax/fax_active_inc.php
Normal file
222
app/fax/fax_active_inc.php
Normal file
@@ -0,0 +1,222 @@
|
||||
<?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-2012
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Mark J Crane <markjcrane@fusionpbx.com>
|
||||
*/
|
||||
include "root.php";
|
||||
require_once "resources/require.php";
|
||||
require_once "resources/check_auth.php";
|
||||
if (permission_exists('fax_active_view')) {
|
||||
//access granted
|
||||
}
|
||||
else {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
if ((!permission_exists('fax_active_all')) && ($show == 'all')) {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
$fax_uuid = false;
|
||||
if(isset($_REQUEST['id'])) {
|
||||
$fax_uuid = check_str($_REQUEST["id"]);
|
||||
}
|
||||
|
||||
//add multi-lingual support
|
||||
$language = new text;
|
||||
$text = $language->get();
|
||||
|
||||
//get the HTTP values and set as variables
|
||||
$show = trim($_REQUEST["show"]);
|
||||
if ($show != "all") { $show = ''; }
|
||||
|
||||
//include theme config for button images
|
||||
include_once("themes/".$_SESSION['domain']['template']['name']."/config.php");
|
||||
|
||||
$where = 'where (1 = 1)';
|
||||
|
||||
if($show !== 'all'){
|
||||
$where .= 'and (t3.domain_name = \'' . check_str($_SESSION['domain_name']) . '\')';
|
||||
}
|
||||
else if($fax_uuid){
|
||||
if(!permission_exists('fax_active_all')){
|
||||
$where .= 'and (t3.domain_name = \'' . check_str($_SESSION['domain_name']) . '\')';
|
||||
}
|
||||
$where .= 'and (t1.fax_uuid =\'' . check_str($fax_uuid) . '\')';
|
||||
}
|
||||
|
||||
$sql = <<<HERE
|
||||
select
|
||||
t1.fax_task_uuid as uuid,
|
||||
t1.fax_uuid as fax_uuid,
|
||||
t3.domain_name,
|
||||
t3.domain_uuid,
|
||||
t1.task_next_time as next_time,
|
||||
t1.task_interrupted as interrupted,
|
||||
t1.task_status as status,
|
||||
t1.task_uri as uri,
|
||||
t1.task_dial_string as dial_string,
|
||||
t1.task_dtmf as dtmf,
|
||||
t1.task_fax_file as fax_file,
|
||||
t1.task_wav_file as wav_file,
|
||||
t1.task_reply_address as reply_address,
|
||||
t1.task_no_answer_counter as no_answer_counter,
|
||||
t1.task_no_answer_retry_counter as no_answer_retry_counter,
|
||||
t1.task_retry_counter as retry_counter,
|
||||
t2.fax_send_greeting as greeting,
|
||||
t2.fax_name as fax_server_name
|
||||
from v_fax_tasks t1
|
||||
inner join v_fax t2 on t2.fax_uuid = t1.fax_uuid
|
||||
inner join v_domains t3 on t2.domain_uuid = t3.domain_uuid
|
||||
$where
|
||||
order by domain_name, fax_server_name, next_time
|
||||
HERE;
|
||||
|
||||
$result = false;
|
||||
$prep_statement = $db->prepare(check_sql($sql));
|
||||
if ($prep_statement) {
|
||||
if($prep_statement->execute()) {
|
||||
$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
|
||||
}
|
||||
}
|
||||
unset($prep_statement, $sql, $where);
|
||||
|
||||
//if the connnection is available then run it and return the results
|
||||
if ($result === false) {
|
||||
var_dump($db->errorInfo());
|
||||
$msg = "<div align='center'>".$text['message-fail']."<br /></div>";
|
||||
echo "<div align='center'>\n";
|
||||
echo "<table width='40%'>\n";
|
||||
echo "<tr>\n";
|
||||
echo "<th align='left'>".$text['label-message']."</th>\n";
|
||||
echo "</tr>\n";
|
||||
echo "<tr>\n";
|
||||
echo "<td class='row_style1'><strong>$msg</strong></td>\n";
|
||||
echo "</tr>\n";
|
||||
echo "</table>\n";
|
||||
echo "</div>\n";
|
||||
}
|
||||
else {
|
||||
//define js function call var
|
||||
$onhover_pause_refresh = " onmouseover='refresh_stop();' onmouseout='refresh_start();'";
|
||||
|
||||
//show buttons
|
||||
echo "<table cellpadding='0' cellspacing='0' border='0' align='right'>";
|
||||
echo " <tr>";
|
||||
echo " <td valign='middle' nowrap='nowrap' style='padding-right: 15px' id='refresh_state'>";
|
||||
echo " <img src='resources/images/refresh_active.gif' style='width: 16px; height: 16px; border: none; margin-top: 3px; cursor: pointer;' onclick='refresh_stop();' alt=\"".$text['label-refresh_pause']."\" title=\"".$text['label-refresh_pause']."\">";
|
||||
echo " </td>";
|
||||
echo " <td valign='top' nowrap='nowrap'>";
|
||||
if (permission_exists('fax_active_all')) {
|
||||
if ($show == "all") {
|
||||
echo " <input type='button' class='btn' name='' alt='".$text['button-back']."' onclick=\"document.location='fax_active.php';\" value='".$text['button-back']."' ".$onhover_pause_refresh.">\n";
|
||||
}
|
||||
else {
|
||||
echo " <input type='button' class='btn' name='' alt='".$text['button-show_all']."' onclick=\"document.location='fax_active.php?show=all';\" value='".$text['button-show_all']."' ".$onhover_pause_refresh.">\n";
|
||||
}
|
||||
}
|
||||
echo " </td>";
|
||||
echo " </tr>";
|
||||
echo "</table>";
|
||||
|
||||
// show title
|
||||
echo "<b>".$text['fax-active_title']."</b>";
|
||||
echo "<br><br>\n";
|
||||
echo $text['fax-active_description']."\n";
|
||||
echo "<br><br>\n";
|
||||
|
||||
//set the alternating color for each row
|
||||
$c = 0;
|
||||
$row_style["0"] = "row_style0";
|
||||
$row_style["1"] = "row_style1";
|
||||
|
||||
//show the results
|
||||
echo "<div id='cmd_reponse'></div>\n";
|
||||
|
||||
//show headers
|
||||
echo "<table class='tr_hover' width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
|
||||
echo "<tr>\n";
|
||||
echo "<th>" . $text['fax-active_title_fax_server'] . "</th>\n";
|
||||
echo "<th>" . $text['fax-active_title_enabled'] . "</th>\n";
|
||||
echo "<th>" . $text['fax-active_title_status'] . "</th>\n";
|
||||
echo "<th>" . $text['fax-active_title_next_time'] . "</th>\n";
|
||||
echo "<th>" . $text['fax-active_title_files'] . "</th>\n";
|
||||
echo "<th>" . $text['fax-active_title_uri'] . "</th>\n";
|
||||
|
||||
echo "<td class='list_control_icon'></td>\n";
|
||||
echo "</tr>\n";
|
||||
|
||||
foreach ($result as &$row) {
|
||||
$fax_uri = $row['uri'];
|
||||
$domain_name = $row['domain_name'];
|
||||
$task_enabled = ($row['interrupted'] == 'true') ? 'Disable': 'Enable';
|
||||
$task_status = $text['fax-active_status_wait'];
|
||||
$task_next_time = $row['next_time'];
|
||||
|
||||
if($row['status'] > 0){
|
||||
if($row['status'] <= 3){
|
||||
$task_status = $text['fax-active_status_execute'];
|
||||
}
|
||||
else if($row['status'] == 10){
|
||||
$task_status = $text['fax-active_status_success'];
|
||||
}
|
||||
else{
|
||||
$task_status = $text['fax-active_status_fail'];
|
||||
}
|
||||
}
|
||||
|
||||
$fax_server = $row['fax_server_name'];
|
||||
if ($show == 'all') {
|
||||
$fax_server .= '@' . $domain_name;
|
||||
}
|
||||
|
||||
$task_files = '';
|
||||
if(!empty($row['fax_file'])){
|
||||
$task_files .= ' ' . basename($row['fax_file']);
|
||||
}
|
||||
if(!empty($row['wav_file'])){
|
||||
$task_files .= '<br/> ' . basename($row['wav_file']);
|
||||
} else if(!empty($row['greeting'])){
|
||||
$task_files .= '<br/> ' . basename($row['greeting']);
|
||||
}
|
||||
|
||||
echo "<tr>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $fax_server . " </td>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $task_enabled . " </td>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $task_status . " </td>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $task_next_time . " </td>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $task_files . " </td>\n";
|
||||
echo "<td valign='top' class='".$row_style[$c]."'>" . $fax_uri . " </td>\n";
|
||||
|
||||
echo "<td class='list_control_icons' style='width: 25px; text-align: left;'><a href='javascript:void(0);' alt='".$text['label-hangup']."' onclick=\"hangup(escape('".$row['uuid']."'));\">".$v_link_label_delete."</a></td>\n";
|
||||
echo "</tr>\n";
|
||||
$c = ($c) ? 0 : 1;
|
||||
}
|
||||
|
||||
echo "</td>\n";
|
||||
echo "</tr>\n";
|
||||
echo "</table>\n";
|
||||
}
|
||||
?>
|
||||
@@ -686,7 +686,108 @@ if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) {
|
||||
echo " ".$text['label-fax_send_greeting']."\n";
|
||||
echo "</td>\n";
|
||||
echo "<td class='vtable' align='left'>\n";
|
||||
echo " <input class='formfld' type='text' name='fax_send_greeting' maxlength='255' value=\"$fax_send_greeting\">\n";
|
||||
if (permission_exists('fax_extension_add') || permission_exists('fax_extension_edit')) {
|
||||
echo "<script>\n";
|
||||
echo "var Objs;\n";
|
||||
echo "\n";
|
||||
echo "function changeToInput(obj){\n";
|
||||
echo " tb=document.createElement('INPUT');\n";
|
||||
echo " tb.type='text';\n";
|
||||
echo " tb.name=obj.name;\n";
|
||||
echo " tb.setAttribute('class', 'formfld');\n";
|
||||
echo " tb.setAttribute('style', 'width: 350px;');\n";
|
||||
echo " tb.value=obj.options[obj.selectedIndex].value;\n";
|
||||
echo " tbb=document.createElement('INPUT');\n";
|
||||
echo " tbb.setAttribute('class', 'btn');\n";
|
||||
echo " tbb.setAttribute('style', 'margin-left: 4px;');\n";
|
||||
echo " tbb.type='button';\n";
|
||||
echo " tbb.value=$('<div />').html('◁').text();\n";
|
||||
echo " tbb.objs=[obj,tb,tbb];\n";
|
||||
echo " tbb.onclick=function(){ Replace(this.objs); }\n";
|
||||
echo " obj.parentNode.insertBefore(tb,obj);\n";
|
||||
echo " obj.parentNode.insertBefore(tbb,obj);\n";
|
||||
echo " obj.parentNode.removeChild(obj);\n";
|
||||
echo "}\n";
|
||||
echo "\n";
|
||||
echo "function Replace(obj){\n";
|
||||
echo " obj[2].parentNode.insertBefore(obj[0],obj[2]);\n";
|
||||
echo " obj[0].parentNode.removeChild(obj[1]);\n";
|
||||
echo " obj[0].parentNode.removeChild(obj[2]);\n";
|
||||
echo "}\n";
|
||||
echo "</script>\n";
|
||||
echo "\n";
|
||||
}
|
||||
echo " <select name='fax_send_greeting' class='formfld' ".((permission_exists('fax_extension_add') || permission_exists('fax_extension_edit')) ? "onchange='changeToInput(this);'" : null).">\n";
|
||||
echo " <option></option>\n";
|
||||
//recordings
|
||||
if($dh = opendir($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/")) {
|
||||
$tmp_selected = false;
|
||||
$files = Array();
|
||||
echo "<optgroup label='Recordings'>\n";
|
||||
while ($file = readdir($dh)) {
|
||||
if ($file != "." && $file != ".." && $file[0] != '.') {
|
||||
if (!is_dir($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$file)) {
|
||||
$selected = ($fax_send_greeting == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$file && strlen($fax_send_greeting) > 0) ? true : false;
|
||||
echo " <option value='".$_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$file."' ".(($selected) ? "selected='selected'" : null).">".$file."</option>\n";
|
||||
if ($selected) { $tmp_selected = true; }
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
echo "</optgroup>\n";
|
||||
}
|
||||
//phrases
|
||||
$sql = "select * from v_phrases where domain_uuid = '".$domain_uuid."' ";
|
||||
$prep_statement = $db->prepare(check_sql($sql));
|
||||
$prep_statement->execute();
|
||||
$result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
|
||||
if (count($result) > 0) {
|
||||
echo "<optgroup label='Phrases'>\n";
|
||||
foreach ($result as &$row) {
|
||||
$selected = ($fax_send_greeting == "phrase:".$row["phrase_name"].".".$domain_uuid) ? true : false;
|
||||
echo " <option value='phrase:".$row["phrase_name"].".".$domain_uuid."' ".(($selected) ? "selected='selected'" : null).">".$row["phrase_name"]."</option>\n";
|
||||
if ($selected) { $tmp_selected = true; }
|
||||
}
|
||||
unset ($prep_statement);
|
||||
echo "</optgroup>\n";
|
||||
}
|
||||
//sounds
|
||||
$dir_path = $_SESSION['switch']['sounds']['dir'];
|
||||
recur_sounds_dir($_SESSION['switch']['sounds']['dir']);
|
||||
if (count($dir_array) > 0) {
|
||||
echo "<optgroup label='Sounds'>\n";
|
||||
foreach ($dir_array as $key => $value) {
|
||||
if (strlen($value) > 0) {
|
||||
if (substr($fax_send_greeting, 0, 71) == "\$\${sounds_dir}/\${default_language}/\${default_dialect}/\${default_voice}/") {
|
||||
$fax_send_greeting = substr($fax_send_greeting, 71);
|
||||
}
|
||||
$selected = ($fax_send_greeting == $key) ? true : false;
|
||||
echo " <option value='".$key."' ".(($selected) ? "selected='selected'" : null).">".$key."</option>\n";
|
||||
if ($selected) { $tmp_selected = true; }
|
||||
}
|
||||
}
|
||||
echo "</optgroup>\n";
|
||||
}
|
||||
//select
|
||||
if (strlen($fax_send_greeting) > 0) {
|
||||
if (permission_exists('conference_center_add') || permission_exists('conference_center_edit')) {
|
||||
if (!$tmp_selected) {
|
||||
echo "<optgroup label='selected'>\n";
|
||||
if (file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$fax_send_greeting)) {
|
||||
echo " <option value='".$_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/".$fax_send_greeting."' selected='selected'>".$ivr_menu_greet_long."</option>\n";
|
||||
}
|
||||
else if (substr($fax_send_greeting, -3) == "wav" || substr($fax_send_greeting, -3) == "mp3") {
|
||||
echo " <option value='".$fax_send_greeting."' selected='selected'>".$fax_send_greeting."</option>\n";
|
||||
}
|
||||
else {
|
||||
echo " <option value='".$fax_send_greeting."' selected='selected'>".$fax_send_greeting."</option>\n";
|
||||
}
|
||||
echo "</optgroup>\n";
|
||||
}
|
||||
unset($tmp_selected);
|
||||
}
|
||||
}
|
||||
echo " </select>\n";
|
||||
echo "<br />\n";
|
||||
echo " ".$text['description-fax_send_greeting']."\n";
|
||||
echo "</td>\n";
|
||||
|
||||
@@ -706,6 +706,7 @@ function fax_split_dtmf(&$fax_number, &$fax_dtmf){
|
||||
|
||||
foreach ($fax_numbers as $fax_number) {
|
||||
$dial_string = $common_dial_string;
|
||||
|
||||
fax_split_dtmf($fax_number, $fax_dtmf);
|
||||
|
||||
//prepare the fax command
|
||||
@@ -767,7 +768,12 @@ function fax_split_dtmf(&$fax_number, &$fax_dtmf){
|
||||
if (!$included) {
|
||||
//redirect the browser
|
||||
$_SESSION["message"] = $response;
|
||||
header("Location: fax_files.php?id=".$fax_uuid."&box=sent");
|
||||
if (permission_exists('fax_active_view')) {
|
||||
header("Location: fax_active.php?id=".$fax_uuid);
|
||||
}
|
||||
else {
|
||||
header("Location: fax_files.php?id=".$fax_uuid."&box=sent");
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
BIN
app/fax/resources/images/refresh_active.gif
Normal file
BIN
app/fax/resources/images/refresh_active.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
app/fax/resources/images/refresh_paused.png
Normal file
BIN
app/fax/resources/images/refresh_paused.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 501 B |
@@ -100,15 +100,15 @@ $text['label-git_info']['sv-se'] = "";
|
||||
$text['label-git_info']['uk'] = "";
|
||||
$text['label-git_info']['de-at'] = "";
|
||||
|
||||
$text['label-switch_version']['en-us'] = "Switch Version";
|
||||
$text['label-switch_version']['es-cl'] = "";
|
||||
$text['label-switch_version']['pt-pt'] = "";
|
||||
$text['label-switch_version']['fr-fr'] = "";
|
||||
$text['label-switch_version']['pt-br'] = "";
|
||||
$text['label-switch_version']['pl'] = "";
|
||||
$text['label-switch_version']['sv-se'] = "";
|
||||
$text['label-switch_version']['uk'] = "";
|
||||
$text['label-switch_version']['de-at'] = "";
|
||||
$text['label-switch']['en-us'] = "Switch";
|
||||
$text['label-switch']['es-cl'] = "";
|
||||
$text['label-switch']['pt-pt'] = "";
|
||||
$text['label-switch']['fr-fr'] = "";
|
||||
$text['label-switch']['pt-br'] = "";
|
||||
$text['label-switch']['pl'] = "";
|
||||
$text['label-switch']['sv-se'] = "";
|
||||
$text['label-switch']['uk'] = "";
|
||||
$text['label-switch']['de-at'] = "";
|
||||
|
||||
$text['label-git_branch']['en-us'] = "Branch:";
|
||||
$text['label-git_branch']['es-cl'] = "";
|
||||
|
||||
@@ -87,11 +87,13 @@ $document['title'] = $text['title-sys-status'];
|
||||
|
||||
$git_path = normalize_path_to_os($_SERVER["DOCUMENT_ROOT"]."/.git");
|
||||
if(file_exists($git_path)){
|
||||
$git_branch = shell_exec('git --git-dir='.$git_path.' name-rev --name-only HEAD');
|
||||
$git_exe = 'git';
|
||||
if (strtoupper(substr(PHP_OS, 0, 3)) === 'SUN') { $git_exe = shell_exec('which git')); }
|
||||
$git_branch = shell_exec($git_exe.' --git-dir='.$git_path.' name-rev --name-only HEAD');
|
||||
rtrim($git_branch);
|
||||
$git_commit = shell_exec('git --git-dir='.$git_path.' rev-parse HEAD');
|
||||
$git_commit = shell_exec($git_exe.' --git-dir='.$git_path.' rev-parse HEAD');
|
||||
rtrim($git_commit);
|
||||
$git_origin = shell_exec('git --git-dir='.$git_path.' config --get remote.origin.url');
|
||||
$git_origin = shell_exec($git_exe.' --git-dir='.$git_path.' config --get remote.origin.url');
|
||||
rtrim($git_commit);
|
||||
echo "<tr>\n";
|
||||
echo " <td width='20%' class=\"vncell\" style='text-align: left;'>\n";
|
||||
@@ -108,15 +110,25 @@ $document['title'] = $text['title-sys-status'];
|
||||
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
|
||||
if ($fp) {
|
||||
$switch_version = event_socket_request($fp, 'api version');
|
||||
preg_match("/FreeSWITCH Version (\d+\.\d+\.\d+(?:\.\d+)?).*\(\s*(\d+\w+)\s*\)/", $switch_version, $matches);
|
||||
preg_match("/FreeSWITCH Version (\d+\.\d+\.\d+(?:\.\d+)?).*\(.*?(\d+\w+)\s*\)/", $switch_version, $matches);
|
||||
$switch_version = $matches[1];
|
||||
$switch_bits = $matches[2];
|
||||
echo "<tr>\n";
|
||||
echo " <td width='20%' class=\"vncell\" style='text-align: left;'>\n";
|
||||
echo " ".$text['label-switch_version']."\n";
|
||||
echo " ".$text['label-switch']." ".$text['label-version']."\n";
|
||||
echo " </td>\n";
|
||||
echo " <td class=\"row_style1\">$switch_version ($switch_bits)</td>\n";
|
||||
echo "</tr>\n";
|
||||
preg_match("/\(git\s*(.*?)\s*\d+\w+\s*\)/", $switch_version, $matches);
|
||||
$switch_git_info = $matches[1];
|
||||
if(strlen($switch_git_info) > 0){
|
||||
echo "<tr>\n";
|
||||
echo " <td width='20%' class=\"vncell\" style='text-align: left;'>\n";
|
||||
echo " ".$text['label-switch']." ".$text['label-git_info']."\n";
|
||||
echo " </td>\n";
|
||||
echo " <td class=\"row_style1\">$switch_git_info</td>\n";
|
||||
echo "</tr>\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "<!--\n";
|
||||
|
||||
@@ -354,6 +354,7 @@
|
||||
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));
|
||||
ob_end_clean();
|
||||
fpassthru($fd);
|
||||
}
|
||||
|
||||
|
||||
@@ -53,8 +53,12 @@ echo " if ($('#caller_id_number').is(':visible')) { $('#caller_id_number').foc
|
||||
echo " }";
|
||||
echo " }";
|
||||
echo "</script>";
|
||||
|
||||
echo "<form method='post' action='xml_cdr.php'>\n";
|
||||
|
||||
if (strlen(check_str($_GET['redirect'])) > 0) {
|
||||
echo "<form method='get' action='" . $_GET['redirect'] . ".php'>\n";
|
||||
} else {
|
||||
echo "<form method='post' action='xml_cdr.php'>\n";
|
||||
}
|
||||
|
||||
echo "<table width='100%' cellpadding='0' cellspacing='0'>\n";
|
||||
echo " <tr>\n";
|
||||
|
||||
@@ -43,10 +43,14 @@ else {
|
||||
require_once "resources/header.php";
|
||||
|
||||
//page title and description
|
||||
|
||||
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
|
||||
echo "<tr>\n";
|
||||
echo " <td width='30%' align='left' valign='top' nowrap='nowrap'><b>".$text['label-call-statistics']."</b></td>\n";
|
||||
echo " <td width='70%' align='right' valign='top'>\n";
|
||||
if (permission_exists('xml_cdr_search_advanced')) {
|
||||
echo " <input type='button' class='btn' value='".$text['button-advanced_search']."' onclick=\"window.location='xml_cdr_search.php?redirect=xml_cdr_statistics';\">\n";
|
||||
}
|
||||
if (permission_exists('xml_cdr_all')) {
|
||||
if ($_GET['showall'] != 'true') {
|
||||
echo "<input type='button' class='btn' value='".$text['button-show_all']."' onclick=\"window.location='xml_cdr_statistics.php?showall=true';\">\n";
|
||||
@@ -75,6 +79,7 @@ else {
|
||||
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="<?php echo PROJECT_PATH; ?>/resources/jquery/flot/excanvas.min.js"></script><![endif]-->
|
||||
<script language="javascript" type="text/javascript" src="<?php echo PROJECT_PATH; ?>/resources/jquery/jquery-1.8.3.js"></script>
|
||||
<script language="javascript" type="text/javascript" src="<?php echo PROJECT_PATH; ?>/resources/jquery/flot/jquery.flot.js"></script>
|
||||
<script language="javascript" type="text/javascript" src="<?php echo PROJECT_PATH; ?>/resources/jquery/flot/jquery.flot.time.js"></script>
|
||||
<div align='center'>
|
||||
<table>
|
||||
<tr>
|
||||
@@ -147,7 +152,17 @@ else {
|
||||
if (data.length > 0)
|
||||
$.plot($("#placeholder"), data, {
|
||||
yaxis: { min: 0 },
|
||||
xaxis: { tickDecimals: 0 }
|
||||
<?php
|
||||
if ($hours <= 48) {
|
||||
echo "xaxis: {mode: \"time\",timeformat: \"%d:%H\",minTickSize: [1, \"hour\"]}";
|
||||
} else if ($hours > 48 && $hours < 168) {
|
||||
echo "xaxis: {mode: \"time\",timeformat: \"%m:%d\",minTickSize: [1, \"day\"]}";
|
||||
} else {
|
||||
echo "xaxis: {mode: \"time\",timeformat: \"%m:%d\",minTickSize: [1, \"month\"]}";
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@@ -173,10 +188,10 @@ else {
|
||||
$i = 0;
|
||||
foreach ($stats as $row) {
|
||||
echo "<tr >\n";
|
||||
if ($i < 24) {
|
||||
if ($i <= $hours) {
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>".($i+1)."</td>\n";
|
||||
}
|
||||
elseif ($i == 24) {
|
||||
elseif ($i == $hours+1) {
|
||||
echo " <br /><br />\n";
|
||||
echo "</tr>\n";
|
||||
echo "<tr>\n";
|
||||
@@ -198,14 +213,14 @@ else {
|
||||
echo "<tr>\n";
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>1</td>\n";
|
||||
}
|
||||
elseif ($i == 25) {
|
||||
elseif ($i == $hours+2) {
|
||||
echo "<tr>\n";
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>7</td>\n";
|
||||
}
|
||||
elseif ($i == 26) {
|
||||
elseif ($i == $hours+3) {
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>30</td>\n";
|
||||
}
|
||||
if ($i < 24) {
|
||||
if ($i <= $hours) {
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>".date('j M', $row['start_epoch'])."</td>\n";
|
||||
echo " <td valign='top' class='".$row_style[$c]."'>".date('H:i', $row['start_epoch'])." - ".date('H:i', $row['stop_epoch'])." </td>\n";
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ else {
|
||||
exit;
|
||||
}
|
||||
|
||||
//show all call detail records to admin and superadmin. for everyone else show only the call details for extensions assigned to them
|
||||
/*//show all call detail records to admin and superadmin. for everyone else show only the call details for extensions assigned to them
|
||||
if (!if_group("admin") && !if_group("superadmin")) {
|
||||
// select caller_id_number, destination_number from v_xml_cdr where domain_uuid = ''
|
||||
// and (caller_id_number = '1001' or destination_number = '1001' or destination_number = '*991001')
|
||||
@@ -68,6 +68,166 @@ else {
|
||||
//create the sql query to get the xml cdr records
|
||||
if (strlen($order_by) == 0) { $order_by = "start_epoch"; }
|
||||
if (strlen($order) == 0) { $order = "desc"; }
|
||||
*/
|
||||
|
||||
//get post or get variables from http
|
||||
if (count($_REQUEST) > 0) {
|
||||
$cdr_id = check_str($_REQUEST["cdr_id"]);
|
||||
$missed = check_str($_REQUEST["missed"]);
|
||||
$direction = check_str($_REQUEST["direction"]);
|
||||
$caller_id_name = check_str($_REQUEST["caller_id_name"]);
|
||||
$caller_id_number = check_str($_REQUEST["caller_id_number"]);
|
||||
$caller_extension_uuid = check_str($_REQUEST["caller_extension_uuid"]);
|
||||
$destination_number = check_str($_REQUEST["destination_number"]);
|
||||
$context = check_str($_REQUEST["context"]);
|
||||
$start_stamp_begin = check_str($_REQUEST["start_stamp_begin"]);
|
||||
$start_stamp_end = check_str($_REQUEST["start_stamp_end"]);
|
||||
$answer_stamp_begin = check_str($_REQUEST["answer_stamp_begin"]);
|
||||
$answer_stamp_end = check_str($_REQUEST["answer_stamp_end"]);
|
||||
$end_stamp_begin = check_str($_REQUEST["end_stamp_begin"]);
|
||||
$end_stamp_end = check_str($_REQUEST["end_stamp_end"]);
|
||||
$start_epoch = check_str($_REQUEST["start_epoch"]);
|
||||
$stop_epoch = check_str($_REQUEST["stop_epoch"]);
|
||||
$duration = check_str($_REQUEST["duration"]);
|
||||
$billsec = check_str($_REQUEST["billsec"]);
|
||||
$hangup_cause = check_str($_REQUEST["hangup_cause"]);
|
||||
$uuid = check_str($_REQUEST["uuid"]);
|
||||
$bleg_uuid = check_str($_REQUEST["bleg_uuid"]);
|
||||
$accountcode = check_str($_REQUEST["accountcode"]);
|
||||
$read_codec = check_str($_REQUEST["read_codec"]);
|
||||
$write_codec = check_str($_REQUEST["write_codec"]);
|
||||
$remote_media_ip = check_str($_REQUEST["remote_media_ip"]);
|
||||
$network_addr = check_str($_REQUEST["network_addr"]);
|
||||
$bridge_uuid = check_str($_REQUEST["network_addr"]);
|
||||
$order_by = check_str($_REQUEST["order_by"]);
|
||||
$order = check_str($_REQUEST["order"]);
|
||||
if (strlen(check_str($_REQUEST["mos_comparison"])) > 0) {
|
||||
switch(check_str($_REQUEST["mos_comparison"])) {
|
||||
case 'less':
|
||||
$mos_comparison = "<";
|
||||
break;
|
||||
case 'greater':
|
||||
$mos_comparison = ">";
|
||||
break;
|
||||
case 'lessorequal':
|
||||
$mos_comparison = "<=";
|
||||
break;
|
||||
case 'greaterorequal':
|
||||
$mos_comparison = ">=";
|
||||
break;
|
||||
case 'equal':
|
||||
$mos_comparison = "<";
|
||||
break;
|
||||
case 'notequal':
|
||||
$mos_comparison = "<>";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
$mos_comparison = '';
|
||||
}
|
||||
//$mos_comparison = check_str($_REQUEST["mos_comparison"]);
|
||||
$mos_score = check_str($_REQUEST["mos_score"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//build the sql where string
|
||||
if ($missed == true) {
|
||||
$sql_where_ands[] = "billsec = '0'";
|
||||
}
|
||||
if (strlen($start_epoch) > 0 && strlen($stop_epoch) > 0) {
|
||||
$sql_where_ands[] = "start_epoch BETWEEN ".$start_epoch." AND ".$stop_epoch." ";
|
||||
}
|
||||
if (strlen($cdr_id) > 0) { $sql_where_ands[] = "cdr_id like '%".$cdr_id."%'"; }
|
||||
if (strlen($direction) > 0) { $sql_where_ands[] = "direction = '".$direction."'"; }
|
||||
if (strlen($caller_id_name) > 0) {
|
||||
$mod_caller_id_name = str_replace("*", "%", $caller_id_name);
|
||||
$sql_where_ands[] = "caller_id_name like '".$mod_caller_id_name."'";
|
||||
}
|
||||
if (strlen($caller_extension_uuid) > 0) {
|
||||
$sql_where_ands[] = "extension_uuid = '".$caller_extension_uuid."'";
|
||||
}
|
||||
if (strlen($caller_id_number) > 0) {
|
||||
$mod_caller_id_number = str_replace("*", "%", $caller_id_number);
|
||||
$sql_where_ands[] = "caller_id_number like '".$mod_caller_id_number."'";
|
||||
}
|
||||
if (strlen($destination_number) > 0) {
|
||||
$mod_destination_number = str_replace("*", "%", $destination_number);
|
||||
$sql_where_ands[] = "destination_number like '".$mod_destination_number."'";
|
||||
}
|
||||
if (strlen($context) > 0) { $sql_where_ands[] = "context like '%".$context."%'"; }
|
||||
/* if (strlen($start_stamp_begin) > 0 && strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp BETWEEN '".$start_stamp_begin.":00.000' AND '".$start_stamp_end.":59.999'"; }
|
||||
else {
|
||||
if (strlen($start_stamp_begin) > 0) { $sql_where_ands[] = "start_stamp >= '".$start_stamp_begin.":00.000'"; }
|
||||
if (strlen($start_stamp_end) > 0) { $sql_where_ands[] = "start_stamp <= '".$start_stamp_end.":59.999'"; }
|
||||
}
|
||||
*/ if (strlen($answer_stamp_begin) > 0 && strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp BETWEEN '".$answer_stamp_begin.":00.000' AND '".$answer_stamp_end.":59.999'"; }
|
||||
else {
|
||||
if (strlen($answer_stamp_begin) > 0) { $sql_where_ands[] = "answer_stamp >= '".$answer_stamp_begin.":00.000'"; }
|
||||
if (strlen($answer_stamp_end) > 0) { $sql_where_ands[] = "answer_stamp <= '".$answer_stamp_end.":59.999'"; }
|
||||
}
|
||||
if (strlen($end_stamp_begin) > 0 && strlen($end_stamp_end) > 0) { $sql_where_ands[] = "end_stamp BETWEEN '".$end_stamp_begin.":00.000' AND '".$end_stamp_end.":59.999'"; }
|
||||
else {
|
||||
if (strlen($end_stamp_begin) > 0) { $sql_where_ands[] = "end_stamp >= '".$end_stamp_begin.":00.000'"; }
|
||||
if (strlen($end_stamp_end) > 0) { $sql_where_ands[] = "end_stamp <= '".$end_stamp_end.":59.999'"; }
|
||||
}
|
||||
if (strlen($duration) > 0) { $sql_where_ands[] = "duration like '%".$duration."%'"; }
|
||||
if (strlen($billsec) > 0) { $sql_where_ands[] = "billsec like '%".$billsec."%'"; }
|
||||
if (strlen($hangup_cause) > 0) { $sql_where_ands[] = "hangup_cause like '%".$hangup_cause."%'"; }
|
||||
if (strlen($uuid) > 0) { $sql_where_ands[] = "uuid = '".$uuid."'"; }
|
||||
if (strlen($bleg_uuid) > 0) { $sql_where_ands[] = "bleg_uuid = '".$bleg_uuid."'"; }
|
||||
if (strlen($accountcode) > 0) { $sql_where_ands[] = "accountcode = '".$accountcode."'"; }
|
||||
if (strlen($read_codec) > 0) { $sql_where_ands[] = "read_codec like '%".$read_codec."%'"; }
|
||||
if (strlen($write_codec) > 0) { $sql_where_ands[] = "write_codec like '%".$write_codec."%'"; }
|
||||
if (strlen($remote_media_ip) > 0) { $sql_where_ands[] = "remote_media_ip like '%".$remote_media_ip."%'"; }
|
||||
if (strlen($network_addr) > 0) { $sql_where_ands[] = "network_addr like '%".$network_addr."%'"; }
|
||||
if (strlen($mos_comparison) > 0 && strlen($mos_score) > 0 ) { $sql_where_ands[] = "rtp_audio_in_mos " . $mos_comparison . " ".$mos_score.""; }
|
||||
|
||||
//if not admin or superadmin, only show own calls
|
||||
if (!permission_exists('xml_cdr_domain')) {
|
||||
if (count($_SESSION['user']['extension']) > 0) { // extensions are assigned to this user
|
||||
// create simple user extension array
|
||||
foreach ($_SESSION['user']['extension'] as $row) { $user_extensions[] = $row['user']; }
|
||||
// if both a source and destination are submitted, but neither are an assigned extension, restrict results
|
||||
if (
|
||||
$caller_id_number != '' &&
|
||||
$destination_number != '' &&
|
||||
array_search($caller_id_number, $user_extensions) === false &&
|
||||
array_search($destination_number, $user_extensions) === false
|
||||
) {
|
||||
$sql_where_ors[] = "caller_id_number like '".$user_extension."'";
|
||||
$sql_where_ors[] = "destination_number like '".$user_extension."'";
|
||||
$sql_where_ors[] = "destination_number like '*99".$user_extension."'";
|
||||
}
|
||||
// if source submitted is blank, implement restriction for assigned extension(s)
|
||||
if ($caller_id_number == '') { // if source criteria is blank, then restrict to assigned ext
|
||||
foreach ($user_extensions as $user_extension) {
|
||||
if (strlen($user_extension) > 0) { $sql_where_ors[] = "caller_id_number like '".$user_extension."'"; }
|
||||
}
|
||||
}
|
||||
// if destination submitted is blank, implement restriction for assigned extension(s)
|
||||
if ($destination_number == '') {
|
||||
foreach ($user_extensions as $user_extension) {
|
||||
if (strlen($user_extension) > 0) {
|
||||
$sql_where_ors[] = "destination_number like '".$user_extension."'";
|
||||
$sql_where_ors[] = "destination_number like '*99".$user_extension."'";
|
||||
}
|
||||
}
|
||||
}
|
||||
// concatenate the 'or's array, then add to the 'and's array
|
||||
if (sizeof($sql_where_ors) > 0) {
|
||||
$sql_where_ands[] = "( ".implode(" or ", $sql_where_ors)." )";
|
||||
}
|
||||
}
|
||||
else {
|
||||
$sql_where_ands[] = "1 <> 1"; //disable viewing of cdr records by users with no assigned extensions
|
||||
}
|
||||
}
|
||||
|
||||
// concatenate the 'ands's array, add to where clause
|
||||
if (sizeof($sql_where_ands) > 0) {
|
||||
$sql_where = " where ".implode(" and ", $sql_where_ands)." and ";
|
||||
}
|
||||
|
||||
//calculate the seconds in different time frames
|
||||
$seconds_hour = 3600;
|
||||
@@ -89,6 +249,7 @@ else {
|
||||
$sql = "select count(*) as count from v_xml_cdr ";
|
||||
$sql .= $where;
|
||||
$sql .= " start_epoch BETWEEN ".$start." AND ".$end." ";
|
||||
|
||||
$prep_statement = $db->prepare(check_sql($sql));
|
||||
$prep_statement->execute();
|
||||
$result = $prep_statement->fetchAll(PDO::FETCH_ASSOC);
|
||||
@@ -141,11 +302,20 @@ else {
|
||||
//$call_seconds_1st_hour = get_call_seconds_between(3600, 0);
|
||||
//if (strlen($call_seconds_1st_hour) == 0) { $call_seconds_1st_hour = 0; }
|
||||
|
||||
//round down to the nearest hour
|
||||
$time = time() - time() % 3600;
|
||||
if (strlen(check_str($_GET['start_stamp_begin'])) > 0 && strlen(check_str($_GET['start_stamp_end'])) > 0 ) {
|
||||
$start_date = new DateTime(check_str($_GET['start_stamp_begin']));
|
||||
$end_date = new DateTime(check_str($_GET['start_stamp_end']));
|
||||
$time = $end_date->getTimestamp();
|
||||
$time = $time - $time % 3600;
|
||||
$hours = ($end_date->getTimestamp() - $start_date->getTimestamp()) / 3600;
|
||||
} else {
|
||||
//round down to the nearest hour
|
||||
$time = time() - time() % 3600;
|
||||
$hours = 23;
|
||||
}
|
||||
|
||||
//call info hour by hour
|
||||
for ($i = 0; $i <= 23; $i++) {
|
||||
for ($i = 0; $i <= $hours; $i++) {
|
||||
$start_epoch = $time - 3600*$i;
|
||||
$stop_epoch = $start_epoch + 3600;
|
||||
$stats[$i]['hours'] = $i + 1;
|
||||
@@ -153,7 +323,7 @@ else {
|
||||
$stats[$i]['stop_stamp'] = date('Y-m-d h:n:s', $stop_epoch);
|
||||
$stats[$i]['start_epoch'] = $start_epoch;
|
||||
$stats[$i]['stop_epoch'] = $stop_epoch;
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
|
||||
$stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
|
||||
$stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume'];
|
||||
@@ -175,7 +345,7 @@ else {
|
||||
}
|
||||
|
||||
//call info for a day
|
||||
$i = 24;
|
||||
$i = $hours+1;
|
||||
$start_epoch = time() - $seconds_day;
|
||||
$stop_epoch = time();
|
||||
$stats[$i]['hours'] = 24;
|
||||
@@ -183,7 +353,7 @@ else {
|
||||
$stats[$i]['stop_stamp'] = date('Y-m-d h:n:s', $stop_epoch);
|
||||
$stats[$i]['start_epoch'] = $start_epoch;
|
||||
$stats[$i]['stop_epoch'] = $stop_epoch;
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
|
||||
$stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
|
||||
$stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume'];
|
||||
@@ -208,7 +378,7 @@ else {
|
||||
$stats[$i]['stop_stamp'] = date('Y-m-d h:n:s', $stop_epoch);
|
||||
$stats[$i]['start_epoch'] = $start_epoch;
|
||||
$stats[$i]['stop_epoch'] = $stop_epoch;
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
|
||||
$stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
|
||||
$stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume'];
|
||||
@@ -233,7 +403,7 @@ else {
|
||||
$stats[$i]['stop_stamp'] = date('Y-m-d h:n:s', $stop_epoch);
|
||||
$stats[$i]['start_epoch'] = $start_epoch;
|
||||
$stats[$i]['stop_epoch'] = $stop_epoch;
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $sql_where);
|
||||
$stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], '');
|
||||
$stats[$i]['minutes'] = $stats[$i]['seconds'] / 60;
|
||||
$stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume'];
|
||||
@@ -251,47 +421,47 @@ else {
|
||||
$i++;
|
||||
|
||||
//show the graph
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['volume'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['volume'][$x][] = $row['volume']/1;
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['minutes'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['minutes'][$x][] = round($row['minutes'],2);
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['call_per_min'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['call_per_min'][$x][] = round($row['avg_min'],2);
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['missed'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['missed'][$x][] = $row['missed']/1;
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['asr'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['asr'][$x][] = round($row['asr'],2)/100;
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['aloc'][$x][] = date('H', $row['start_epoch']);
|
||||
$graph['aloc'][$x][] = round($row['aloc'],2);
|
||||
if ($x == 23) { break; }
|
||||
$x++;
|
||||
}
|
||||
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['volume'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['volume'][$x][] = $row['volume']/1;
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['minutes'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['minutes'][$x][] = round($row['minutes'],2);
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['call_per_min'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['call_per_min'][$x][] = round($row['avg_min'],2);
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['missed'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['missed'][$x][] = $row['missed']/1;
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['asr'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['asr'][$x][] = round($row['asr'],2)/100;
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
$x = 0;
|
||||
foreach ($stats as $row) {
|
||||
$graph['aloc'][$x][] = $row['start_epoch'] * 1000;
|
||||
$graph['aloc'][$x][] = round($row['aloc'],2);
|
||||
if ($x == $hours) { break; }
|
||||
$x++;
|
||||
}
|
||||
?>
|
||||
@@ -40,10 +40,12 @@ require_once "resources/classes/EventSocket.php";
|
||||
protected $_major;
|
||||
protected $_minor;
|
||||
protected $_build;
|
||||
protected $_bits;
|
||||
public function major() { return $this->_major; }
|
||||
public function minor() { return $this->_minor; }
|
||||
public function build() { return $this->_build; }
|
||||
public function version() { return $this->_major.".".$this->_minor.".".$this->_build; }
|
||||
public function bits() { return $this->_bits; }
|
||||
public function version() { return $this->_major.".".$this->_minor.".".$this->_build." (".$this->_bits.")"; }
|
||||
|
||||
// dirs - detected by from the switch
|
||||
protected $_base_dir = '';
|
||||
@@ -126,10 +128,11 @@ require_once "resources/classes/EventSocket.php";
|
||||
throw new Exception('Failed to use event socket');
|
||||
}
|
||||
$FS_Version = $this->event_socket_request('api version');
|
||||
preg_match("/FreeSWITCH Version (\d+)\.(\d+)\.(\d+(?:\.\d+)?)/", $FS_Version, $matches);
|
||||
preg_match("/FreeSWITCH Version (\d+)\.(\d+)\.(\d+(?:\.\d+)?).*\(.*?(\d+\w+)\s*\)/", $FS_Version, $matches);
|
||||
$this->_major = $matches[1];
|
||||
$this->_minor = $matches[2];
|
||||
$this->_build = $matches[3];
|
||||
$this->_bits = $matches[4];
|
||||
$FS_Vars = $this->event_socket_request('api global_getvar');
|
||||
foreach (explode("\n",$FS_Vars) as $FS_Var){
|
||||
preg_match("/(\w+_dir)=(.*)/", $FS_Var, $matches);
|
||||
|
||||
9
resources/install/scripts/app/fax/app_languages.lua
Normal file
9
resources/install/scripts/app/fax/app_languages.lua
Normal file
@@ -0,0 +1,9 @@
|
||||
text = text or {};
|
||||
|
||||
text['message-send_success'] = {}
|
||||
text['message-send_success']['en-us'] = "We are happy to report the fax was sent successfully. It has been attached for your records."
|
||||
|
||||
text['message-send_fail'] = {}
|
||||
text['message-send_fail']['en-us'] = "We are sorry the fax failed to go through. It has been attached. Please check the number, and if it was correct you might consider emailing it instead."
|
||||
|
||||
return text
|
||||
@@ -1,6 +1,7 @@
|
||||
require "resources.functions.config"
|
||||
|
||||
require "resources.functions.sleep"
|
||||
require "resources.functions.file_exists"
|
||||
local log = require "resources.functions.log".next_fax_task
|
||||
local Tasks = require "app.fax.resources.scripts.queue.tasks"
|
||||
local Esl = require "resources.functions.esl"
|
||||
@@ -13,17 +14,27 @@ local FAX_OPTIONS = {
|
||||
"fax_use_ecm=false,fax_enable_t38=false,fax_enable_t38_request=false,fax_disable_v17=false";
|
||||
}
|
||||
|
||||
local function task_send_mail(task)
|
||||
local function task_send_mail(task, err)
|
||||
local number_dialed = task.uri:match("/([^/]-)%s*$")
|
||||
|
||||
Tasks.send_mail_task(task, {
|
||||
"Fax to: " .. number_dialed .. " FAILED",
|
||||
table.concat{
|
||||
"We are sorry the fax failed to go through. ",
|
||||
"It has been attached. Please check the number " .. number_dialed .. ", ",
|
||||
"and if it was correct you might consider emailing it instead.",
|
||||
}}
|
||||
)
|
||||
local Text = require "resources.functions.text"
|
||||
local text = Text.new("app.fax.app_languages")
|
||||
|
||||
local env = {
|
||||
destination_number = number_dialed:match("^([^@]*)");
|
||||
hangup_cause = err;
|
||||
message = text['message-send_fail'];
|
||||
}
|
||||
|
||||
local body = Tasks.build_template(task, 'outbound/fail/body', env)
|
||||
local subject = Tasks.build_template(task, 'outbound/fail/subject', env)
|
||||
|
||||
if not subject then
|
||||
log.warning("Can not find template for email")
|
||||
subject = "Fax to: " .. number_dialed .. " FAILED"
|
||||
end
|
||||
|
||||
Tasks.send_mail_task(task, {subject, body}, nil, file_exists(task.fax_file))
|
||||
end
|
||||
|
||||
local function next_task()
|
||||
@@ -56,7 +67,7 @@ local function next_task()
|
||||
Tasks.wait_task(task, false, info)
|
||||
if task.status ~= 0 then
|
||||
Tasks.remove_task(task)
|
||||
task_send_mail(task)
|
||||
task_send_mail(task, tostring(info))
|
||||
end
|
||||
log.noticef('Can not originate to `%s` cause: %s: %s ', task.uri, tostring(status), tostring(info))
|
||||
else
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
-- include libraries
|
||||
require "resources.functions.config";
|
||||
require "resources.functions.explode";
|
||||
require "resources.functions.split";
|
||||
require "resources.functions.count";
|
||||
require "resources.functions.file_exists";
|
||||
|
||||
local log = require "resources.functions.log".fax_retry
|
||||
local Database = require "resources.functions.database"
|
||||
@@ -28,6 +27,10 @@
|
||||
|
||||
local dbh = Database.new('system')
|
||||
|
||||
-- Global environment
|
||||
default_language = env:getHeader("default_language")
|
||||
default_dialect = env:getHeader("default_dialect")
|
||||
|
||||
-- Channel/FusionPBX variables
|
||||
local uuid = env:getHeader("uuid")
|
||||
local fax_queue_task_session = env:getHeader('fax_queue_task_session')
|
||||
@@ -312,18 +315,32 @@
|
||||
--Success
|
||||
log.infof("RETRY STATS SUCCESS: GATEWAY[%s]", fax_options);
|
||||
|
||||
Tasks.remove_task(task)
|
||||
|
||||
local Text = require "resources.functions.text"
|
||||
local text = Text.new("app.fax.app_languages")
|
||||
|
||||
local env = {
|
||||
fax_options = fax_options;
|
||||
destination_number = number_dialed:match("^([^@]*)");
|
||||
document_transferred_pages = fax_document_transferred_pages;
|
||||
document_total_pages = fax_document_total_pages;
|
||||
message = text['message-send_success'];
|
||||
}
|
||||
|
||||
local body = Tasks.build_template(task, 'outbound/success/body', env)
|
||||
local subject = Tasks.build_template(task, 'outbound/success/subject', env)
|
||||
|
||||
if not subject then
|
||||
log.warning("Can not find template for email")
|
||||
subject = "Fax to: " .. number_dialed .. " SENT"
|
||||
end
|
||||
|
||||
Tasks.send_mail_task(task, {subject, body}, uuid, file_exists(fax_file))
|
||||
|
||||
if keep_local == "false" then
|
||||
os.remove(fax_file);
|
||||
end
|
||||
|
||||
Tasks.remove_task(task)
|
||||
Tasks.send_mail_task(task, {
|
||||
"Fax to: " .. number_dialed .. " SENT",
|
||||
table.concat{
|
||||
"We are happy to report the fax was sent successfully.",
|
||||
"It has been attached for your records.",
|
||||
}}, uuid
|
||||
)
|
||||
end
|
||||
|
||||
if fax_success ~= "1" then
|
||||
@@ -345,14 +362,32 @@
|
||||
Tasks.wait_task(task, answered, hangup_cause_q850)
|
||||
if task.status ~= 0 then
|
||||
Tasks.remove_task(task)
|
||||
Tasks.send_mail_task(task, {
|
||||
"Fax to: " .. number_dialed .. " FAILED",
|
||||
table.concat{
|
||||
"We are sorry the fax failed to go through. ",
|
||||
"It has been attached. Please check the number "..number_dialed..", ",
|
||||
"and if it was correct you might consider emailing it instead.",
|
||||
}}, uuid
|
||||
)
|
||||
|
||||
local Text = require "resources.functions.text"
|
||||
local text = Text.new("app.fax.app_languages")
|
||||
|
||||
local env = {
|
||||
fax_options = fax_options;
|
||||
destination_number = number_dialed:match("^([^@]*)");
|
||||
document_transferred_pages = fax_document_transferred_pages;
|
||||
document_total_pages = fax_document_total_pages;
|
||||
hangup_cause = hangup_cause;
|
||||
hangup_cause_q850 = hangup_cause_q850;
|
||||
fax_result_code = fax_result_code;
|
||||
fax_result_text = fax_result_text;
|
||||
message = text['message-send_fail'];
|
||||
}
|
||||
|
||||
local body = Tasks.build_template(task, 'outbound/fail/body', env)
|
||||
local subject = Tasks.build_template(task, 'outbound/fail/subject', env)
|
||||
|
||||
if not subject then
|
||||
log.warning("Can not find template for email")
|
||||
subject = "Fax to: " .. number_dialed .. " FAILED"
|
||||
end
|
||||
|
||||
Tasks.send_mail_task(task, {subject, body}, uuid, file_exists(fax_file))
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -203,8 +203,6 @@ local function wait_task(task, answered, q850)
|
||||
task.uuid
|
||||
)
|
||||
|
||||
print(sql)
|
||||
|
||||
local ok, err = db:query( sql )
|
||||
|
||||
if not ok then return nil, err end
|
||||
@@ -245,7 +243,7 @@ local function cleanup_tasks()
|
||||
db:query(remove_finished_tasks_sql)
|
||||
end
|
||||
|
||||
local function send_mail_task(task, message, call_uuid)
|
||||
local function send_mail_task(task, message, call_uuid, file)
|
||||
if not task.reply_address or #task.reply_address == 0 then
|
||||
return
|
||||
end
|
||||
@@ -257,7 +255,61 @@ local function send_mail_task(task, message, call_uuid)
|
||||
["X-FusionPBX-Email-Type"] = 'email2fax';
|
||||
}
|
||||
|
||||
return send_mail(mail_x_headers, task.reply_address, message)
|
||||
return send_mail(mail_x_headers, task.reply_address, message, file)
|
||||
end
|
||||
|
||||
local function read_file(name, mode)
|
||||
local f, err, code = io.open(name, mode or 'rb')
|
||||
if not f then return nil, err, code end
|
||||
local data = f:read("*all")
|
||||
f:close()
|
||||
return data
|
||||
end
|
||||
|
||||
local function read_template(app, name, lang)
|
||||
local default_language_path = 'en/us'
|
||||
|
||||
local full_path_tpl = scripts_dir .. '/app/' .. app .. '/resources/templates/{lang}/' .. name .. '.tpl'
|
||||
|
||||
local path
|
||||
|
||||
if lang then
|
||||
path = file_exists((full_path_tpl:gsub('{lang}', lang)))
|
||||
end
|
||||
|
||||
if (not path) and (lang ~= default_language_path) then
|
||||
path = file_exists((full_path_tpl:gsub('{lang}', default_language_path)))
|
||||
end
|
||||
|
||||
if path then
|
||||
return read_file(path)
|
||||
end
|
||||
end
|
||||
|
||||
local function build_template(task, templ, env)
|
||||
local lang
|
||||
|
||||
if default_language and default_dialect then
|
||||
lang = (default_language .. '/' .. default_dialect):lower()
|
||||
else
|
||||
local settings = Settings.new(get_db(), task.domain_name, task.domain_uuid)
|
||||
lang = settings:get('domain', 'language', 'code')
|
||||
if lang then lang = lang:gsub('%-', '/'):lower() end
|
||||
end
|
||||
|
||||
local body = read_template('fax', templ, lang)
|
||||
|
||||
body = body:gsub("[^\\](${.-})", function(name)
|
||||
name = name:sub(3, -2)
|
||||
if type(env) == 'table' then
|
||||
return env[name] or ''
|
||||
end
|
||||
if type(env) == 'function' then
|
||||
return env(name) or ''
|
||||
end
|
||||
end)
|
||||
|
||||
return body
|
||||
end
|
||||
|
||||
return {
|
||||
@@ -274,4 +326,5 @@ return {
|
||||
release_task = release_task;
|
||||
cleanup_tasks = cleanup_tasks;
|
||||
send_mail_task = send_mail_task;
|
||||
build_template = build_template;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<html>
|
||||
<table width="400" border="0" cellspacing="0" cellpadding="0" align="center"
|
||||
style="border: 1px solid #cbcfd5;-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px; border-radius: 4px;">
|
||||
<tr>
|
||||
<td valign="middle" align="center" bgcolor="#ff7174" style="background-color: #ff7174;
|
||||
color: #000; font-family: Arial; font-size: 14px; padding: 7px;-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px; border-radius: 4px;">
|
||||
<strong>Send fax fail</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" style="padding: 15px;">
|
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>To</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${destination_number}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Pages</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${document_transferred_pages}/${document_total_pages}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Message</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${message}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Error</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${hangup_cause}/${fax_result_code}/${fax_result_text}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</html>
|
||||
@@ -0,0 +1 @@
|
||||
Fax to: ${destination_number} FAILED
|
||||
@@ -0,0 +1,51 @@
|
||||
<html>
|
||||
<table width="400" border="0" cellspacing="0" cellpadding="0" align="center"
|
||||
style="border: 1px solid #cbcfd5;-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px; border-radius: 4px;">
|
||||
<tr>
|
||||
<td valign="middle" align="center" bgcolor="#e5e9f0" style="background-color: #e5e9f0;
|
||||
color: #000; font-family: Arial; font-size: 14px; padding: 7px;-moz-border-radius: 4px;
|
||||
-webkit-border-radius: 4px; border-radius: 4px;">
|
||||
<strong>Send fax successfully</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" style="padding: 15px;">
|
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>To</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${destination_number}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Pages</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${document_transferred_pages}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Message</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${message}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="color: #333; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
<strong>Options</strong>
|
||||
</td>
|
||||
<td style="color: #666; font-family: Arial; font-size: 12px; padding-bottom: 11px;">
|
||||
${fax_options}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</html>
|
||||
@@ -0,0 +1 @@
|
||||
Fax to: ${destination_number} sent
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
--check if a file exists
|
||||
function file_exists(name)
|
||||
local f=io.open(name,"r")
|
||||
if f~=nil then io.close(f) return true else return false end
|
||||
local f = io.open(name, "r")
|
||||
if not f then return end
|
||||
f:close()
|
||||
return name
|
||||
end
|
||||
432
resources/jquery/flot/jquery.flot.time.js
Normal file
432
resources/jquery/flot/jquery.flot.time.js
Normal file
@@ -0,0 +1,432 @@
|
||||
/* Pretty handling of time axes.
|
||||
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
Set axis.mode to "time" to enable. See the section "Time series data" in
|
||||
API.txt for details.
|
||||
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var options = {
|
||||
xaxis: {
|
||||
timezone: null, // "browser" for local to the client or timezone for timezone-js
|
||||
timeformat: null, // format string to use
|
||||
twelveHourClock: false, // 12 or 24 time in time mode
|
||||
monthNames: null // list of names of months
|
||||
}
|
||||
};
|
||||
|
||||
// round to nearby lower multiple of base
|
||||
|
||||
function floorInBase(n, base) {
|
||||
return base * Math.floor(n / base);
|
||||
}
|
||||
|
||||
// Returns a string with the date d formatted according to fmt.
|
||||
// A subset of the Open Group's strftime format is supported.
|
||||
|
||||
function formatDate(d, fmt, monthNames, dayNames) {
|
||||
|
||||
if (typeof d.strftime == "function") {
|
||||
return d.strftime(fmt);
|
||||
}
|
||||
|
||||
var leftPad = function(n, pad) {
|
||||
n = "" + n;
|
||||
pad = "" + (pad == null ? "0" : pad);
|
||||
return n.length == 1 ? pad + n : n;
|
||||
};
|
||||
|
||||
var r = [];
|
||||
var escape = false;
|
||||
var hours = d.getHours();
|
||||
var isAM = hours < 12;
|
||||
|
||||
if (monthNames == null) {
|
||||
monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||
}
|
||||
|
||||
if (dayNames == null) {
|
||||
dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
||||
}
|
||||
|
||||
var hours12;
|
||||
|
||||
if (hours > 12) {
|
||||
hours12 = hours - 12;
|
||||
} else if (hours == 0) {
|
||||
hours12 = 12;
|
||||
} else {
|
||||
hours12 = hours;
|
||||
}
|
||||
|
||||
for (var i = 0; i < fmt.length; ++i) {
|
||||
|
||||
var c = fmt.charAt(i);
|
||||
|
||||
if (escape) {
|
||||
switch (c) {
|
||||
case 'a': c = "" + dayNames[d.getDay()]; break;
|
||||
case 'b': c = "" + monthNames[d.getMonth()]; break;
|
||||
case 'd': c = leftPad(d.getDate()); break;
|
||||
case 'e': c = leftPad(d.getDate(), " "); break;
|
||||
case 'h': // For back-compat with 0.7; remove in 1.0
|
||||
case 'H': c = leftPad(hours); break;
|
||||
case 'I': c = leftPad(hours12); break;
|
||||
case 'l': c = leftPad(hours12, " "); break;
|
||||
case 'm': c = leftPad(d.getMonth() + 1); break;
|
||||
case 'M': c = leftPad(d.getMinutes()); break;
|
||||
// quarters not in Open Group's strftime specification
|
||||
case 'q':
|
||||
c = "" + (Math.floor(d.getMonth() / 3) + 1); break;
|
||||
case 'S': c = leftPad(d.getSeconds()); break;
|
||||
case 'y': c = leftPad(d.getFullYear() % 100); break;
|
||||
case 'Y': c = "" + d.getFullYear(); break;
|
||||
case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
|
||||
case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
|
||||
case 'w': c = "" + d.getDay(); break;
|
||||
}
|
||||
r.push(c);
|
||||
escape = false;
|
||||
} else {
|
||||
if (c == "%") {
|
||||
escape = true;
|
||||
} else {
|
||||
r.push(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return r.join("");
|
||||
}
|
||||
|
||||
// To have a consistent view of time-based data independent of which time
|
||||
// zone the client happens to be in we need a date-like object independent
|
||||
// of time zones. This is done through a wrapper that only calls the UTC
|
||||
// versions of the accessor methods.
|
||||
|
||||
function makeUtcWrapper(d) {
|
||||
|
||||
function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {
|
||||
sourceObj[sourceMethod] = function() {
|
||||
return targetObj[targetMethod].apply(targetObj, arguments);
|
||||
};
|
||||
};
|
||||
|
||||
var utc = {
|
||||
date: d
|
||||
};
|
||||
|
||||
// support strftime, if found
|
||||
|
||||
if (d.strftime != undefined) {
|
||||
addProxyMethod(utc, "strftime", d, "strftime");
|
||||
}
|
||||
|
||||
addProxyMethod(utc, "getTime", d, "getTime");
|
||||
addProxyMethod(utc, "setTime", d, "setTime");
|
||||
|
||||
var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"];
|
||||
|
||||
for (var p = 0; p < props.length; p++) {
|
||||
addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]);
|
||||
addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]);
|
||||
}
|
||||
|
||||
return utc;
|
||||
};
|
||||
|
||||
// select time zone strategy. This returns a date-like object tied to the
|
||||
// desired timezone
|
||||
|
||||
function dateGenerator(ts, opts) {
|
||||
if (opts.timezone == "browser") {
|
||||
return new Date(ts);
|
||||
} else if (!opts.timezone || opts.timezone == "utc") {
|
||||
return makeUtcWrapper(new Date(ts));
|
||||
} else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") {
|
||||
var d = new timezoneJS.Date();
|
||||
// timezone-js is fickle, so be sure to set the time zone before
|
||||
// setting the time.
|
||||
d.setTimezone(opts.timezone);
|
||||
d.setTime(ts);
|
||||
return d;
|
||||
} else {
|
||||
return makeUtcWrapper(new Date(ts));
|
||||
}
|
||||
}
|
||||
|
||||
// map of app. size of time units in milliseconds
|
||||
|
||||
var timeUnitSize = {
|
||||
"second": 1000,
|
||||
"minute": 60 * 1000,
|
||||
"hour": 60 * 60 * 1000,
|
||||
"day": 24 * 60 * 60 * 1000,
|
||||
"month": 30 * 24 * 60 * 60 * 1000,
|
||||
"quarter": 3 * 30 * 24 * 60 * 60 * 1000,
|
||||
"year": 365.2425 * 24 * 60 * 60 * 1000
|
||||
};
|
||||
|
||||
// the allowed tick sizes, after 1 year we use
|
||||
// an integer algorithm
|
||||
|
||||
var baseSpec = [
|
||||
[1, "second"], [2, "second"], [5, "second"], [10, "second"],
|
||||
[30, "second"],
|
||||
[1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
|
||||
[30, "minute"],
|
||||
[1, "hour"], [2, "hour"], [4, "hour"],
|
||||
[8, "hour"], [12, "hour"],
|
||||
[1, "day"], [2, "day"], [3, "day"],
|
||||
[0.25, "month"], [0.5, "month"], [1, "month"],
|
||||
[2, "month"]
|
||||
];
|
||||
|
||||
// we don't know which variant(s) we'll need yet, but generating both is
|
||||
// cheap
|
||||
|
||||
var specMonths = baseSpec.concat([[3, "month"], [6, "month"],
|
||||
[1, "year"]]);
|
||||
var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"],
|
||||
[1, "year"]]);
|
||||
|
||||
function init(plot) {
|
||||
plot.hooks.processOptions.push(function (plot, options) {
|
||||
$.each(plot.getAxes(), function(axisName, axis) {
|
||||
|
||||
var opts = axis.options;
|
||||
|
||||
if (opts.mode == "time") {
|
||||
axis.tickGenerator = function(axis) {
|
||||
|
||||
var ticks = [];
|
||||
var d = dateGenerator(axis.min, opts);
|
||||
var minSize = 0;
|
||||
|
||||
// make quarter use a possibility if quarters are
|
||||
// mentioned in either of these options
|
||||
|
||||
var spec = (opts.tickSize && opts.tickSize[1] ===
|
||||
"quarter") ||
|
||||
(opts.minTickSize && opts.minTickSize[1] ===
|
||||
"quarter") ? specQuarters : specMonths;
|
||||
|
||||
if (opts.minTickSize != null) {
|
||||
if (typeof opts.tickSize == "number") {
|
||||
minSize = opts.tickSize;
|
||||
} else {
|
||||
minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < spec.length - 1; ++i) {
|
||||
if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]
|
||||
+ spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2
|
||||
&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var size = spec[i][0];
|
||||
var unit = spec[i][1];
|
||||
|
||||
// special-case the possibility of several years
|
||||
|
||||
if (unit == "year") {
|
||||
|
||||
// if given a minTickSize in years, just use it,
|
||||
// ensuring that it's an integer
|
||||
|
||||
if (opts.minTickSize != null && opts.minTickSize[1] == "year") {
|
||||
size = Math.floor(opts.minTickSize[0]);
|
||||
} else {
|
||||
|
||||
var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));
|
||||
var norm = (axis.delta / timeUnitSize.year) / magn;
|
||||
|
||||
if (norm < 1.5) {
|
||||
size = 1;
|
||||
} else if (norm < 3) {
|
||||
size = 2;
|
||||
} else if (norm < 7.5) {
|
||||
size = 5;
|
||||
} else {
|
||||
size = 10;
|
||||
}
|
||||
|
||||
size *= magn;
|
||||
}
|
||||
|
||||
// minimum size for years is 1
|
||||
|
||||
if (size < 1) {
|
||||
size = 1;
|
||||
}
|
||||
}
|
||||
|
||||
axis.tickSize = opts.tickSize || [size, unit];
|
||||
var tickSize = axis.tickSize[0];
|
||||
unit = axis.tickSize[1];
|
||||
|
||||
var step = tickSize * timeUnitSize[unit];
|
||||
|
||||
if (unit == "second") {
|
||||
d.setSeconds(floorInBase(d.getSeconds(), tickSize));
|
||||
} else if (unit == "minute") {
|
||||
d.setMinutes(floorInBase(d.getMinutes(), tickSize));
|
||||
} else if (unit == "hour") {
|
||||
d.setHours(floorInBase(d.getHours(), tickSize));
|
||||
} else if (unit == "month") {
|
||||
d.setMonth(floorInBase(d.getMonth(), tickSize));
|
||||
} else if (unit == "quarter") {
|
||||
d.setMonth(3 * floorInBase(d.getMonth() / 3,
|
||||
tickSize));
|
||||
} else if (unit == "year") {
|
||||
d.setFullYear(floorInBase(d.getFullYear(), tickSize));
|
||||
}
|
||||
|
||||
// reset smaller components
|
||||
|
||||
d.setMilliseconds(0);
|
||||
|
||||
if (step >= timeUnitSize.minute) {
|
||||
d.setSeconds(0);
|
||||
}
|
||||
if (step >= timeUnitSize.hour) {
|
||||
d.setMinutes(0);
|
||||
}
|
||||
if (step >= timeUnitSize.day) {
|
||||
d.setHours(0);
|
||||
}
|
||||
if (step >= timeUnitSize.day * 4) {
|
||||
d.setDate(1);
|
||||
}
|
||||
if (step >= timeUnitSize.month * 2) {
|
||||
d.setMonth(floorInBase(d.getMonth(), 3));
|
||||
}
|
||||
if (step >= timeUnitSize.quarter * 2) {
|
||||
d.setMonth(floorInBase(d.getMonth(), 6));
|
||||
}
|
||||
if (step >= timeUnitSize.year) {
|
||||
d.setMonth(0);
|
||||
}
|
||||
|
||||
var carry = 0;
|
||||
var v = Number.NaN;
|
||||
var prev;
|
||||
|
||||
do {
|
||||
|
||||
prev = v;
|
||||
v = d.getTime();
|
||||
ticks.push(v);
|
||||
|
||||
if (unit == "month" || unit == "quarter") {
|
||||
if (tickSize < 1) {
|
||||
|
||||
// a bit complicated - we'll divide the
|
||||
// month/quarter up but we need to take
|
||||
// care of fractions so we don't end up in
|
||||
// the middle of a day
|
||||
|
||||
d.setDate(1);
|
||||
var start = d.getTime();
|
||||
d.setMonth(d.getMonth() +
|
||||
(unit == "quarter" ? 3 : 1));
|
||||
var end = d.getTime();
|
||||
d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
|
||||
carry = d.getHours();
|
||||
d.setHours(0);
|
||||
} else {
|
||||
d.setMonth(d.getMonth() +
|
||||
tickSize * (unit == "quarter" ? 3 : 1));
|
||||
}
|
||||
} else if (unit == "year") {
|
||||
d.setFullYear(d.getFullYear() + tickSize);
|
||||
} else {
|
||||
d.setTime(v + step);
|
||||
}
|
||||
} while (v < axis.max && v != prev);
|
||||
|
||||
return ticks;
|
||||
};
|
||||
|
||||
axis.tickFormatter = function (v, axis) {
|
||||
|
||||
var d = dateGenerator(v, axis.options);
|
||||
|
||||
// first check global format
|
||||
|
||||
if (opts.timeformat != null) {
|
||||
return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);
|
||||
}
|
||||
|
||||
// possibly use quarters if quarters are mentioned in
|
||||
// any of these places
|
||||
|
||||
var useQuarters = (axis.options.tickSize &&
|
||||
axis.options.tickSize[1] == "quarter") ||
|
||||
(axis.options.minTickSize &&
|
||||
axis.options.minTickSize[1] == "quarter");
|
||||
|
||||
var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
|
||||
var span = axis.max - axis.min;
|
||||
var suffix = (opts.twelveHourClock) ? " %p" : "";
|
||||
var hourCode = (opts.twelveHourClock) ? "%I" : "%H";
|
||||
var fmt;
|
||||
|
||||
if (t < timeUnitSize.minute) {
|
||||
fmt = hourCode + ":%M:%S" + suffix;
|
||||
} else if (t < timeUnitSize.day) {
|
||||
if (span < 2 * timeUnitSize.day) {
|
||||
fmt = hourCode + ":%M" + suffix;
|
||||
} else {
|
||||
fmt = "%b %d " + hourCode + ":%M" + suffix;
|
||||
}
|
||||
} else if (t < timeUnitSize.month) {
|
||||
fmt = "%b %d";
|
||||
} else if ((useQuarters && t < timeUnitSize.quarter) ||
|
||||
(!useQuarters && t < timeUnitSize.year)) {
|
||||
if (span < timeUnitSize.year) {
|
||||
fmt = "%b";
|
||||
} else {
|
||||
fmt = "%b %Y";
|
||||
}
|
||||
} else if (useQuarters && t < timeUnitSize.year) {
|
||||
if (span < timeUnitSize.year) {
|
||||
fmt = "Q%q";
|
||||
} else {
|
||||
fmt = "Q%q %Y";
|
||||
}
|
||||
} else {
|
||||
fmt = "%Y";
|
||||
}
|
||||
|
||||
var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);
|
||||
|
||||
return rt;
|
||||
};
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$.plot.plugins.push({
|
||||
init: init,
|
||||
options: options,
|
||||
name: 'time',
|
||||
version: '1.0'
|
||||
});
|
||||
|
||||
// Time-axis support used to be in Flot core, which exposed the
|
||||
// formatDate function on the plot object. Various plugins depend
|
||||
// on the function, so we need to re-expose it here.
|
||||
|
||||
$.plot.formatDate = formatDate;
|
||||
$.plot.dateGenerator = dateGenerator;
|
||||
|
||||
})(jQuery);
|
||||
@@ -1254,6 +1254,10 @@ SPAN.playback_progress_bar {
|
||||
}
|
||||
});
|
||||
|
||||
$("#selecctall").change(function(){
|
||||
$(".checkbox1").prop('checked', $(this).prop("checked"));
|
||||
});
|
||||
|
||||
// linkify rows (except the last - the list_control_icons cell)
|
||||
// on a table with a class of 'tr_hover', according to the href
|
||||
// attribute of the <tr> tag
|
||||
|
||||
Reference in New Issue
Block a user