5 * Functions for the interface to the call monitor recordings
14 var $protocol_config_files;
17 * rank (for prioritizing modules)
33 * Adds menu item to nav menu
38 function navMenu($args) {
40 global $SETTINGS_ALLOW_VMX_SETTINGS;
41 global $ARI_ADMIN_USERNAME;
45 // We are only going to show the menu
47 if ($SETTINGS_ALLOW_VMX_SETTINGS) {
49 $exten = $_SESSION['ari_user']['extension'];
51 // and we are not logged in as admin
52 if ($exten!=$ARI_ADMIN_USERNAME) {
54 $vmx_enabled = $this->getVmxState($exten,'unavail');
56 // and vmx is enabled for this user
57 if ($vmx_enabled !== false)
58 $ret .= "<p><small><small><a href='" . $_SESSION['ARI_ROOT'] . "?m=VmX&f=display'>" . _("VmX™ Locator") . "</a></small></small></p>";
66 * Acts on the user settings
73 function action($args) {
76 global $ARI_ADMIN_USERNAME;
77 global $SETTINGS_ALLOW_VMX_SETTINGS;
80 $m = getArgument($args,'m');
81 $a = getArgument($args,'a');
83 $follow_me_disabled = getArgument($args,'follow_me_disabled');
85 $vmx_option_0_number = getArgument($args, 'vmx_option_0_number');
86 $vmx_option_0_system_default = getArgument($args, 'vmx_option_0_system_default');
87 $vmx_option_1_number = getArgument($args, 'vmx_option_1_number');
88 $vmx_option_1_system_default = getArgument($args, 'vmx_option_1_system_default');
89 $vmx_option_2_number = getArgument($args, 'vmx_option_2_number');
90 $vmx_unavail_enabled = getArgument($args, 'vmx_unavail_enabled');
91 $vmx_busy_enabled = getArgument($args, 'vmx_busy_enabled');
92 $vmx_play_instructions = getArgument($args, 'vmx_play_instructions');
93 $vmx_disabled = getArgument($args, 'vmx_disabled');
95 $exten = $_SESSION['ari_user']['extension'];
97 // The action is 'update
100 $follow_me_disabled = ($this->getFollowMeListRingTime($exten) > 0)?0:1;
103 $vmx_disabled = $this->getVmxState($exten,'unavail');
104 if ($vmx_disabled === false) {
105 $vmx_disabled = true;
106 $SETTINGS_ALLOW_VMX_SETTINGS=false;
108 $vmx_disabled = false;
112 setcookie("ari_vmx_disabled", $vmx_disabled, time()+365*24*60*60);
113 $vmx_disabled_delayed = $vmx_disabled;
114 $_SESSION['ari_error'] =
115 _("Your Premium VmX Locator service has been disabled, REFRESH your browser to remove this message") . "<br>" .
116 sprintf(_("Check with your Telephone System Administrator if you think there is a problem"));
119 if (! $vmx_disabled) {
122 $this->setVmxState($exten,'unavail',$vmx_unavail_enabled);
123 $this->setVmxState($exten,'busy',$vmx_busy_enabled);
124 $this->setVmxPlayInstructions($exten,'unavail',$vmx_play_instructions);
125 $this->setVmxPlayInstructions($exten,'busy',$vmx_play_instructions);
128 setcookie("ari_vmx_unavail_enabled", $vmx_unavail_enabled, time()+365*24*60*60);
129 setcookie("ari_vmx_busy_enabled", $vmx_busy_enabled, time()+365*24*60*60);
130 setcookie("ari_vmx_play_instructions", $vmx_play_instructions, time()+365*24*60*60);
132 $stripped_vmx_option_0_number = preg_replace('/-|\(|\)|\s/','',$vmx_option_0_number);
134 if ($vmx_option_0_system_default) {
135 $this->setVmxOptionNumber($exten,'0','unavail',"");
136 $this->setVmxOptionNumber($exten,'0','busy',"");
137 setcookie("ari_vmx_option_0_system_default", $vmx_option_0_system_default, time()+365*24*60*60);
138 if (is_numeric($stripped_vmx_option_0_number) || !$stripped_vmx_option_0_number) {
139 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_vmx_option_0_number']);
140 if ($vmx_option_0_number && $stripped!=$stripped_vmx_option_0_number) {
141 setcookie("ari_vmx_option_0_number", $call_vmx_option_0_number, time()+365*24*60*60);
145 if (!is_numeric($stripped_vmx_option_0_number) && $stripped_vmx_option_0_number) {
146 $_SESSION['ari_error'] =
147 _("Option 0 not changed") . "<br>" .
148 sprintf(_("Number %s must contain dial numbers (characters like '(', '-', and ')' are ok)"),$vmx_option_0_number);
153 $this->setVmxOptionNumber($exten,'0','unavail',$stripped_vmx_option_0_number);
154 $this->setVmxOptionNumber($exten,'0','busy',$stripped_vmx_option_0_number);
157 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_vmx_option_0_number']);
158 if ($vmx_option_0_number && $stripped!=$stripped_vmx_option_0_number) {
159 setcookie("ari_vmx_option_0_number", $call_vmx_option_0_number, time()+365*24*60*60);
164 $stripped_vmx_option_1_number = preg_replace('/-|\(|\)|\s/','',$vmx_option_1_number);
165 if ($vmx_option_1_system_default && !$follow_me_disabled) {
166 $this->setVmxOptionFollowMe($exten,'1','unavail');
167 $this->setVmxOptionFollowMe($exten,'1','busy');
168 setcookie("ari_vmx_option_1_system_default", $vmx_option_1_system_default, time()+365*24*60*60);
169 if (is_numeric($stripped_vmx_option_1_number) || !$stripped_vmx_option_1_number) {
170 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_vmx_option_1_number']);
171 if ($vmx_option_1_number && $stripped!=$stripped_vmx_option_1_number) {
172 setcookie("ari_vmx_option_1_number", $call_vmx_option_1_number, time()+365*24*60*60);
178 if (!is_numeric($stripped_vmx_option_1_number) && $stripped_vmx_option_1_number) {
179 $_SESSION['ari_error'] =
180 _("Option 1 not changed") . "<br>" .
181 sprintf(_("Number %s must contain dial numbers (characters like '(', '-', and ')' are ok)"),$vmx_option_1_number);
186 $this->setVmxOptionNumber($exten,'1','unavail',$stripped_vmx_option_1_number);
187 $this->setVmxOptionNumber($exten,'1','busy',$stripped_vmx_option_1_number);
190 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_vmx_option_1_number']);
191 if ($vmx_option_1_number && $stripped!=$stripped_vmx_option_1_number) {
192 setcookie("ari_vmx_option_1_number", $call_vmx_option_1_number, time()+365*24*60*60);
197 $stripped_vmx_option_2_number = preg_replace('/-|\(|\)|\s/','',$vmx_option_2_number);
198 if (!is_numeric($stripped_vmx_option_2_number) && $stripped_vmx_option_2_number) {
199 $_SESSION['ari_error'] =
200 _("Option 2 not changed") . "<br>" .
201 sprintf(_("Number %s must contain dial numbers (characters like '(', '-', and ')' are ok)"),$vmx_option_2_number);
206 $this->setVmxOptionNumber($exten,'2','unavail',$stripped_vmx_option_2_number);
207 $this->setVmxOptionNumber($exten,'2','busy',$stripped_vmx_option_2_number);
210 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_vmx_option_2_number']);
211 if ($vmx_option_2_number && $stripped!=$stripped_vmx_option_2_number) {
212 setcookie("ari_vmx_option_2_number", $call_vmx_option_2_number, time()+365*24*60*60);
215 } // vmx_disabled false
218 // redirect to see updated page
223 window.location = \"" . $_SESSION['ARI_ROOT'] . "?m=" . $m . "\"
232 * Displays stats page
237 function display($args) {
238 global $SETTINGS_ALLOW_VMX_SETTINGS;
240 global $loaded_modules;
243 $m = getArgument($args,'m');
244 $q = getArgument($args,'q');
245 $start = getArgument($args,'start');
246 $span = getArgument($args,'span');
248 $displayname = $_SESSION['ari_user']['displayname'];
249 $exten = $_SESSION['ari_user']['extension'];
251 $display = new DisplaySearch();
253 $follow_me_listring_time = $this->getFollowMeListRingTime($exten);
255 //TODO: Set this better than this?
256 $follow_me_disabled = ($follow_me_listring_time > 0)?0:1;
257 setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60);
260 $vmx_unavail_enabled=$this->getVmxState($exten,'unavail');
261 if ($vmx_unavail_enabled === false) {
262 $vmx_disabled = true;
263 setcookie("ari_vmx_disabled", $vmx_disabled, time()+365*24*60*60);
264 $SETTINGS_ALLOW_VMX_SETTINGS=false;
266 $vmx_disabled = false;
267 setcookie("ari_vmx_disabled", false, time()+365*24*60*60);
268 $vmx_busy_enabled=$this->getVmxState($exten,'busy');
269 $vmx_play_instructions=$this->getVmxPlayInstructions($exten);
270 $vmx_option_0_number=$this->getVmxOptionNumber($exten,'0');;
271 $vmx_option_1_number=$this->getVmxOptionNumber($exten,'1');;
272 $vmx_option_2_number=$this->getVmxOptionNumber($exten,'2');;
274 if (is_numeric($vmx_option_0_number)) {
275 $vmx_option_0_system_default='';
276 $vmx_option_0_number_text_box_options='';
278 $vmx_option_0_system_default='checked';
279 $vmx_option_0_number_text_box_options="disabled style='background: #DDD;'";
282 // if follow-me is enabled then the options are a numberic value (dial a phone number)
283 // or a followme target (FMnnn) which should not be displayed but means the box is checked
284 // or otherwise blank (or garbage in which case blank it)
286 if (!$follow_me_disabled) {
287 $vmx_option_1_system_default=$this->getVmxOptionFollowMe($exten,'1');
288 if ($vmx_option_1_system_default) {
289 $vmx_option_1_number = '';
290 $vmx_option_1_number_text_box_options="disabled style='background: #DDD;'";
298 <table class='settings'>
300 <td><a href='#' class='info'>" . _("Use When:") . "<span>" . _("Menu options below are available during your personal voicemail greeting playback. <br/><br/>Check both to use at all times.") . "<br></span></a></td> <td>
301 <input " . $vmx_unavail_enabled . " type=checkbox name='vmx_unavail_enabled' value='checked'>
302 <small>" . _("unavailable") . "</small>
305 <input " . $vmx_busy_enabled . " type=checkbox name='vmx_busy_enabled' value='checked'>
306 <small>" . _("busy") . "</small>
310 <td><a href='#' class='info'>" . _("Voicemail Instructions:") ."<span>" . _("Uncheck to play a beep after your personal voicemail greeting.") . "<br></span></a></td>
312 <input " . $vmx_play_instructions . " type=checkbox name='vmx_play_instructions' value='checked'>
313 <small>" . _("Standard voicemail prompts.") . "</small>
319 <table class='settings'>
321 <td><a href='#' class='info'>" . _("Press 0:") . "<span>" . _("Pressing 0 during your personal voicemail greeing goes to the Operator.
322 Uncheck to enter another destination here.") . "<br></span></a>
325 <input " . $vmx_option_0_number_text_box_options . " name='vmx_option_0_number' type='text' size=24 value='" . $vmx_option_0_number . "'>
328 <input " . $vmx_option_0_system_default . " type=checkbox name='vmx_option_0_system_default' value='checked' OnClick=\"disable_fields(); return true;\">
329 <small>" . _("Go To Operator") . "</small>
333 <td><a href='#' class='info'>" . _("Press 1:") . "<span>";
335 if ($follow_me_disabled)
336 $set_vmx_text .= _("The remaining options can have internal extensions, ringgroups, queues and external numbers that may be rung. It is often used to include your cell phone. You should run a test to make sure that the number is functional any time a change is made so you don't leave a caller stranded or receiving invalid number messages.");
338 $set_vmx_text .= _("Enter an alternate number here, then change your personal voicemail greeting to let callers know to press 1 to reach that number. <br/><br/>If you'd like to use your Follow Me List, check \"Send to Follow Me\" and disable Follow Me above.");
345 <input " . $vmx_option_1_number_text_box_options . " name='vmx_option_1_number' type='text' size=24 value='" . $vmx_option_1_number . "'>
350 if (!$follow_me_disabled)
351 $set_vmx_text .= "<input " . $vmx_option_1_system_default . " type=checkbox name='vmx_option_1_system_default' value='checked' OnClick=\"disable_fields(); return true;\"><small>" . _("Send to Follow-Me") . "</small>";
359 <td><a href='#' class='info'>" . _("Press 2:") . "<span>" . _("Use any extensions, ringgroups, queues or external numbers. <br/><br/>Remember to re-record your personal voicemail greeting and include instructions. Run a test to make sure that the number is functional.") . "<br></span></a></td>
361 <input " . $vmx_option_2_number_text_box_options . " name='vmx_option_2_number' type='text' size=24 value='" . $vmx_option_2_number . "'>
370 // Now we should be ready to build the page
371 $ret .= checkErrorMessage();
373 $headerText = sprintf(_("VmX Locator™ Settings for %s (%s)"),$displayname,$exten);
375 $ret .= $display->displayHeaderText($headerText);
376 $ret .= $display->displayLine();
379 "<SCRIPT LANGUAGE='JavaScript'>
381 function disable_fields() {
383 if (document.ari_settings.vmx_option_0_system_default.checked) {
384 document.ari_settings.vmx_option_0_number.style.backgroundColor = '#DDD';
385 document.ari_settings.vmx_option_0_number.disabled = true;
388 document.ari_settings.vmx_option_0_number.style.backgroundColor = '#FFF';
389 document.ari_settings.vmx_option_0_number.disabled = false;
392 if (!$follow_me_disabled) {
394 if (document.ari_settings.vmx_option_1_system_default.checked) {
395 document.ari_settings.vmx_option_1_number.style.backgroundColor = '#DDD';
396 document.ari_settings.vmx_option_1_number.disabled = true;
399 document.ari_settings.vmx_option_1_number.style.backgroundColor = '#FFF';
400 document.ari_settings.vmx_option_1_number.disabled = false;
409 "<form class='settings' name='ari_settings' action='' method='GET'>
410 <input type=hidden name=m value=" . $m . ">
411 <input type=hidden name=f value='action'>
412 <input type=hidden name=a value='update'>
413 " . $set_vmx_text . "
415 <input name='submit' type='submit' value='" . _("Update") . "'>
422 * Gets VMX option FollowMe
425 * Extension to get information about
427 * Option number to get
429 * Mode to get (unavail/busy)
431 * checked if set to got to extesion's follow-me on this option
433 function getVmxOptionFollowMe($exten, $digit, $mode='unavail') {
435 global $asterisk_manager_interface;
437 $digit = trim($digit);
439 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/vmx/$mode/$digit/ext\r\n\r\n");
440 return (($response == 'FM'.$exten) ? 'checked':'');
444 * Sets VMX option FollowMe
447 * Extension to set information about
449 * Option number to set
451 * Mode to set (unavail/busy)
453 * Context to set ext to (default from-findmefollow)
455 * Priority to set ext to (default 1)
457 function setVmxOptionFollowMe($exten, $digit, $mode, $context='ext-findmefollow', $priority='1') {
459 global $asterisk_manager_interface;
461 $value_opt = "FM$exten";
463 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/ext $value_opt\r\n\r\n");
464 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/context $context\r\n\r\n");
465 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/pri $priority\r\n\r\n");
469 * Gets VMX option number
472 * Extension to get information about
474 * Option number to get
476 * Mode to get (unavail/busy)
478 * Number to use or blank if disabled
480 function getVmxOptionNumber($exten, $digit, $mode='unavail') {
482 global $asterisk_manager_interface;
485 $digit = trim($digit);
487 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/vmx/$mode/$digit/ext\r\n\r\n");
488 if (is_numeric($response)) {
492 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE["ari_vmx_option_${digit}_number"]);
493 if ($stripped==$number) {
494 $number = $_COOKIE["ari_vmx_option_${digit}_number"];
501 * Sets VMX option number
504 * Extension to set information about
506 * Option number to set
508 * Mode to set (unavail/busy)
510 * Number to set ext to (blank will delete it)
512 * Context to set ext to (default from-internal)
514 * Priority to set ext to (default 1)
516 function setVmxOptionNumber($exten, $digit, $mode, $number, $context='from-internal', $priority='1') {
518 global $asterisk_manager_interface;
520 $value_opt = trim($number);
522 if (is_numeric($value_opt)) {
523 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/ext $value_opt\r\n\r\n");
524 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/context $context\r\n\r\n");
525 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/$digit/pri $priority\r\n\r\n");
527 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database deltree AMPUSER $exten/vmx/$mode/$digit\r\n\r\n");
535 * Extension to modify
537 * Mode to set (unavail/busy)
539 * enabled/disabled state based on check box value
541 function setVmxState($exten,$mode,$vmx_state) {
543 global $asterisk_manager_interface;
545 $value_opt = ($vmx_state)?'enabled':'disabled';
547 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/state $value_opt\r\n\r\n");
554 * Extension to get information about
556 * Mode to get (unavail/busy)
558 * state of variable (checked/blank) or false if no poper value
560 function getVmxState($exten, $mode='unavail') {
562 global $asterisk_manager_interface;
564 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/vmx/$mode/state\r\n\r\n");
566 if (preg_match("/enabled/",$response)) {
569 elseif (preg_match("/disabled/",$response)) {
576 //TODO: really need to check for a bogus response, see how other side does it
583 * Sets VMX Play Instructions
586 * Extension to modify
587 * @param $vmx_play_instructions
588 * play instructions or just beep (checked, blank)
590 * Mode to set (unavail/busy)
592 function setVmxPlayInstructions($exten,$mode,$vmx_play_instructions) {
594 global $asterisk_manager_interface;
596 $value_opt = ($vmx_play_instructions)?'""':'s';
598 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/vmx/$mode/vmxopts/timeout $value_opt\r\n\r\n");
602 * Get VMX Play Instructions
605 * Extension to get information about
607 * Mode to get (unavail/busy)
609 * state of variable (checked/blank) or false if no poper value
611 function getVmxPlayInstructions($exten, $mode='unavail') {
613 global $asterisk_manager_interface;
615 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/vmx/$mode/vmxopts/timeout\r\n\r\n");
617 if (preg_match("/s/",$response)) {
624 //TODO: really need to check for a bogus response, see how other side does it
632 * Gets Follow Me List-Ring Time if set
635 * Extension to get information about
637 * follow me list-ring time returned if set
639 function getFollowMeListRingTime($exten) {
641 global $asterisk_manager_interface;
645 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grptime\r\n\r\n");
646 if (is_numeric($response)) {
650 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_listring_time']);
651 if ($stripped==$number) {
652 $number = $_COOKIE['ari_follow_me_listring_time'];