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) {
39 global $ARI_ADMIN_USERNAME;
41 $exten = $_SESSION['ari_user']['extension'];
42 if ($exten!=$ARI_ADMIN_USERNAME) {
43 $ret .= "<p><small><small><a href='" . $_SESSION['ARI_ROOT'] . "?m=followme&f=display'>" . _("Follow Me") . "</a></small></small></p>";
50 * Acts on the user settings
57 function action($args) {
60 global $ARI_ADMIN_USERNAME;
61 global $SETTINGS_ALLOW_VMX_SETTINGS;
64 $m = getArgument($args,'m');
65 $a = getArgument($args,'a');
67 $lang_code = getArgument($args,'lang_code');
69 $follow_me_prering_time = getArgument($args,'follow_me_prering_time');
70 $follow_me_listring_time = getArgument($args,'follow_me_listring_time');
71 $follow_me_list = getArgument($args,'follow_me_list');
72 $follow_me_confirm = getArgument($args,'follow_me_confirm');
73 $follow_me_ddial = getArgument($args,'follow_me_ddial');
74 $follow_me_disabled = getArgument($args,'follow_me_disabled');
76 $language = new Language();
78 // Lets see if we can make heads or tails of this code?!?
80 // The action is 'update
83 // Get the extension and make sure we are not in
85 $exten = $_SESSION['ari_user']['extension'];
86 if ($exten!=$ARI_ADMIN_USERNAME) {
89 // Make sure Follow-Me setup has not been deleted for this user since the last refresh
90 $follow_me_disabled_delayed = $_COOKIE['ari_follow_me_disabled'];
91 if (! $_COOKIE['ari_follow_me_disabled']) {
93 $follow_me_disabled = ($this->getFollowMeListRingTime($exten) > 0)?0:1;
95 if ($follow_me_disabled) {
97 setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60);
98 $follow_me_disabled_delayed = $follow_me_disabled;
99 $_SESSION['ari_error'] =
100 _("Your Follow-Me has been disabled, REFRESH your browser to remove this message") . "<br>" .
101 sprintf(_("Check with your Telephone System Administrator if you think there is a problem"));
107 if (! $follow_me_disabled_delayed) {
109 // assume no errors, don't update SQL if errors occured
110 $follow_me_update_succeeded=1;
112 // update follow me pre-ring time
113 if (!$STANDALONE['use']) {
115 $stripped_follow_me_prering_time = preg_replace('/-|\s/','',$follow_me_prering_time);
116 if (!is_numeric($stripped_follow_me_prering_time)) {
117 $_SESSION['ari_error'] =
118 _("Follow-Me pre-ring time not changed") . "<br>" .
119 sprintf(_("Number %s must be an interger number of seconds"),$follow_me_prering_time);
120 $follow_me_update_succeeded=0;
125 $this->setFollowMePreRingTime($exten,$stripped_follow_me_prering_time);
128 $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_prering_time']);
129 if ($follow_me_prering_time && $stripped!=$stripped_follow_me_prering_time) {
130 setcookie("ari_follow_me_prering_time", $follow_me_prering_time, time()+365*24*60*60);
135 // update follow me list ring time
136 if (!$STANDALONE['use']) {
138 $stripped_follow_me_listring_time = preg_replace('/-|\s/','',$follow_me_listring_time);
139 if (!is_numeric($stripped_follow_me_listring_time)) {
140 $_SESSION['ari_error'] =
141 _("Follow-Me list ring time not changed") . "<br>" .
142 sprintf(_("Number %s must be an interger number of seconds"),$follow_me_listring_time);
143 $follow_me_update_succeeded=0;
148 $this->setFollowMeListRingTime($exten,$stripped_follow_me_listring_time);
151 $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_listring_time']);
152 if ($follow_me_listring_time && $stripped!=$stripped_follow_me_listring_time) {
153 setcookie("ari_follow_me_listring_time", $follow_me_listring_time, time()+365*24*60*60);
158 // update follow me list
159 if (!$STANDALONE['use']) {
161 $grplist = explode("\n", $follow_me_list);
167 foreach (array_keys($grplist) as $key) {
169 $grplist[$key] = trim($grplist[$key]);
171 // Lookup the extension and append hash if not a user, and remove invalid chars
172 $grplist[$key] = $this->lookupSetExtensionFormat($grplist[$key]);
175 if ($grplist[$key] == "") unset($grplist[$key]);
178 // check for duplicates, and re-sequence
179 $grplist = array_values(array_unique($grplist));
181 $stripped_follow_me_list = implode("-",$grplist);
183 if ($stripped_follow_me_list == "") {
184 $_SESSION['ari_error'] =
185 _("Follow-Me list must contain at least one valid number") . "<br>" .
186 sprintf(_("The following: %s is not valid"),$follow_me_list);
187 $follow_me_update_succeeded=0;
192 $this->setFollowMeList($exten,$stripped_follow_me_list);
195 $stripped = preg_replace('/|\(|\)|\s/','',$_COOKIE['ari_follow_me_list']);
196 if ($follow_me_list && $stripped!=$stripped_follow_me_list) {
197 setcookie("ari_follow_me_list", $follow_me_list, time()+365*24*60*60);
202 // update follow me confirm
203 if (!$STANDALONE['use']) {
206 $this->setFollowMeConfirm($exten,$follow_me_confirm);
207 $this->setFollowMeDDial($exten,$follow_me_ddial);
210 setcookie("ari_follow_me_confirm", $follow_me_confirm, time()+365*24*60*60);
211 setcookie("ari_follow_me_ddial", $follow_me_ddial, time()+365*24*60*60);
214 //If no errors than update the SQL table to keep in sync
215 if ($follow_me_update_succeeded) {
216 $this->setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm);
219 } //if !follow_me_disabled
223 // redirect to see updated page
228 window.location = \"" . $_SESSION['ARI_ROOT'] . "?m=" . $m . "\"
237 * Displays stats page
242 function display($args) {
245 global $ARI_ADMIN_USERNAME;
246 global $SETTINGS_PRERING_LOW;
247 global $SETTINGS_PRERING_HIGH;
248 global $SETTINGS_LISTRING_LOW;
249 global $SETTINGS_LISTRING_HIGH;
251 global $SETTINGS_FOLLOW_ME_LIST_MAX;
253 global $loaded_modules;
256 $m = getArgument($args,'m');
257 $q = getArgument($args,'q');
258 $start = getArgument($args,'start');
259 $span = getArgument($args,'span');
261 $displayname = $_SESSION['ari_user']['displayname'];
262 $exten = $_SESSION['ari_user']['extension'];
264 $language = new Language();
265 $display = new DisplaySearch();
268 if ($exten!=$ARI_ADMIN_USERNAME) {
270 // call forward settings
271 if (!$STANDALONE['use']) {
273 $follow_me_prering_time = $this->getFollowMePreRingTime($exten);
274 $follow_me_listring_time = $this->getFollowMeListRingTime($exten);
275 $follow_me_list = explode("-", $this->getFollowMeList($exten) );
276 $follow_me_confirm = $this->getFollowMeConfirm($exten);
277 $follow_me_ddial = $this->getFollowMeDDial($exten);
279 $FOLLOW_ME_LIST_MAX = (count($follow_me_list) > $SETTINGS_FOLLOW_ME_LIST_MAX) ? count($follow_me_list):$SETTINGS_FOLLOW_ME_LIST_MAX;
281 //TODO: Set this better than this?
282 $follow_me_disabled = ($follow_me_listring_time > 0)?0:1;
283 setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60);
285 $followme_text.= "<table class='settings'>";
287 if (!$follow_me_disabled) {
288 // $followme_text .= "<tr><td><h3><br>" . _("Follow Me") . "</h3></td></tr>";
289 $followme_text .= "<tr><td> </td></tr>"; // Blank Line
291 $followme_text .= "<tr><td><a href='#' class='info'>" . _("Enable") . "<span>";
292 $followme_text .= _( "Dial-by-name Directory, IVR, and internal
293 calls will ring the numbers in the FollowMe
294 List. Any FreePBX routes that directly
295 reference a FollowMe are unaffected by this
296 enable/disable setting.");
297 $followme_text .= "<br></span></a></td>";
299 $followme_text .= "<td><input " . $follow_me_ddial . " type=checkbox name='follow_me_ddial' value='checked'></td></tr>";
301 $followme_text .= "<tr><td> </td></tr>"; // Blank Line
302 $followme_text .= "<tr><td valign='top'><a href='#' class='info'>" . _("Follow Me List:");
303 $followme_text .= "<span>" . sprintf(_("Extensions and outside numbers to ring next.")) ."<br/><br/>";
304 $followme_text .= sprintf(_("Include %s to keep it ringing."),"<strong>".$exten."</strong>") . "<br></span></a></td>";
305 $followme_text .= "<td><textarea " . $follow_me_list_options . " id='follow_me_list' name='follow_me_list' type='text' cols='20' rows='".$FOLLOW_ME_LIST_MAX."' value='' onKeyUp='rowCounter(this.form.follow_me_list, ".$FOLLOW_ME_LIST_MAX.");' onKeyDown='rowCounter(this.form.follow_me_list, ".$FOLLOW_ME_LIST_MAX.");'>".implode("\n",$follow_me_list)."</textarea>";
306 $followme_text .= "</td></tr>";
308 $followme_text .= "<tr><td> </td></tr>"; // Blank Line
309 $followme_text .= "<tr><td><a href='#' class='info'>";
310 $followme_text .= sprintf(_("Ring %s First For:"), $exten);
311 $followme_text .= "<span>" . sprintf( _("Time to ring extension %s before ringing the %s Follow Me List %s"), "<strong>".$exten."</strong>","<strong>","</strong>");
312 $followme_text .= "<br></span></a></td><td>";
314 $followme_text .= "<select " . $follow_me_prering_time_text_box_options . " name='follow_me_prering_time'/>";
315 $default_prering = $follow_me_prering_time;
316 for ($i=$SETTINGS_PRERING_LOW; $i <= $SETTINGS_PRERING_HIGH; $i++) {
317 $followme_text .= '<option value="'.$i.'" '.($i == $default_prering ? 'SELECTED' : '').'>'.$i.'</option>';
319 $followme_text .= "</select>";
321 $followme_text .= "<small>" . _("seconds") . "</small>";
322 $followme_text .= "</td></tr>";
324 $followme_text .= "<tr><td><a href='#' class='info'>" . _("Ring Followme List for:") . "<span>" . _("Time to ring the Follow Me List.") . "<br></span></a></td>";
325 $followme_text .= "<td>";
327 $followme_text .= "<select " . $follow_me_listring_time_text_box_options . " name='follow_me_listring_time'/>";
328 $default_listring = $follow_me_listring_time;
329 for ($i=$SETTINGS_LISTRING_LOW; $i <= $SETTINGS_LISTRING_HIGH; $i++) {
330 $followme_text .= '<option value="'.$i.'" '.($i == $default_listring ? 'SELECTED' : '').'>'.$i.'</option>';
332 $followme_text .= "</select>";
334 $followme_text .= "<small>" . _("seconds") . "</small></td></tr>";
337 $followme_text .= "<tr><td> </td></tr>"; // Blank Line
339 $followme_text .= "<tr><td><a href='#' class='info'>" . _("Use Confirmation:") . "<span>". _("Outside lines that are part of the Follow Me List will be called and offered a menu:<br/><br/> \"You have an incoming call. Press 1 to accept or 2 to decline.\"<br/><br/> This keeps calls from ending up in external voicemail. Make sure that the List Ring Time is long enough to allow for you to hear and react to this message.");
340 $followme_text .= "<br></span></a></td><td>";
341 $followme_text .= "<input " . $follow_me_confirm . " type=checkbox name='follow_me_confirm' value='checked'>";
342 $followme_text .= "<small>" . _("Enable") . "</small></td></tr>";
343 $followme_text .= "<tr><td> </td></tr>"; // Blank Line
344 $followme_text .= "</table>";
350 // build page content
351 $ret .= checkErrorMessage();
353 if ($_SESSION['ari_user']['admin_settings']) {
354 $headerText = _("Followme Settings");
356 $headerText = sprintf(_("Followme Settings for %s (%s)"),$displayname,$exten);
359 $ret .= $display->displayHeaderText($headerText);
360 $ret .= $display->displayLine();
363 "\n<SCRIPT LANGUAGE='JavaScript'>
365 function rowCounter(field, maxlimit) {
366 temp = field.value.split('\u000A',maxlimit+1)
367 field.value = temp.join('\u000A')
368 if (temp.length == maxlimit+1) {
369 field.value = field.value.substring(0, field.value.length-1)
376 "<form class='settings' name='ari_settings' action='' method='GET'>
377 <input type=hidden name=m value=" . $m . ">
378 <input type=hidden name=f value='action'>
379 <input type=hidden name=a value='update'>
380 " . $followme_text . "
382 <input name='submit' type='submit' value='" . _("Update") . "'>
390 * Sets Follow Me Pre-Ring Time
393 * Extension to modify
394 * @param $follow_me_prering_time
395 * Pre-Ring Time to ring
397 function setFollowMePreRingTime($exten,$follow_me_prering_time) {
399 global $asterisk_manager_interface;
401 $value_opt = $follow_me_prering_time;
403 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/prering $value_opt\r\n\r\n");
407 * Gets Follow Me Pre-Ring Time if set
410 * Extension to get information about
412 * follow me pre-ring time returned if set
414 function getFollowMePreRingTime($exten) {
416 global $asterisk_manager_interface;
420 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/prering\r\n\r\n");
421 if (is_numeric($response)) {
425 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_prering_time']);
426 if ($stripped==$number) {
427 $number = $_COOKIE['ari_follow_me_prering_time'];
434 * Sets Follow Me List Ring Time
437 * Extension to modify
438 * @param $follow_me_listring_time
439 * List Ring Time to ring
441 function setFollowMeListRingTime($exten,$follow_me_listring_time) {
443 global $asterisk_manager_interface;
445 $value_opt = $follow_me_listring_time;
447 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grptime $value_opt\r\n\r\n");
451 * Gets Follow Me List-Ring Time if set
454 * Extension to get information about
456 * follow me list-ring time returned if set
458 function getFollowMeListRingTime($exten) {
460 global $asterisk_manager_interface;
464 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grptime\r\n\r\n");
465 if (is_numeric($response)) {
469 $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_listring_time']);
470 if ($stripped==$number) {
471 $number = $_COOKIE['ari_follow_me_listring_time'];
478 * Sets Follow Me List
481 * Extension to modify
482 * @param $follow_me_list
485 function setFollowMeList($exten,$follow_me_list) {
487 global $asterisk_manager_interface;
489 $value_opt = $follow_me_list;
491 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grplist $value_opt\r\n\r\n");
495 * Gets Follow Me List if set
498 * Extension to get information about
500 * follow me list if set
502 function getFollowMeList($exten) {
504 global $asterisk_manager_interface;
508 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grplist\r\n\r\n");
510 //TODO: really need to check for a bogus response, see how other side does it
512 return preg_replace("/[^0-9*\-]/", "", $response);
516 * Sets Follow Confirmation Setting
519 * Extension to modify
520 * @param $follow_me_cofirm
521 * Follow Me Confirm Setting
523 function setFollowMeConfirm($exten,$follow_me_confirm) {
525 global $asterisk_manager_interface;
527 $value_opt = ($follow_me_confirm)?'ENABLED':'DISABLED';
529 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grpconf $value_opt\r\n\r\n");
533 * Gets Follow Me Confirmation Setting
536 * Extension to get information about
538 * follow me confirm setting
540 function getFollowMeConfirm($exten) {
542 global $asterisk_manager_interface;
546 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grpconf\r\n\r\n");
548 if (preg_match("/ENABLED/",$response)) {
555 //TODO: really need to check for a bogus response, see how other side does it
562 * Sets Follow Ddial Setting
565 * Extension to modify
566 * @param $follow_me_ddial
567 * Follow Me Ddial Setting
569 function setFollowMeDDial($exten,$follow_me_ddial) {
571 global $asterisk_manager_interface;
573 $value_opt = ($follow_me_ddial)?'DIRECT':'EXTENSION';
575 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/ddial $value_opt\r\n\r\n");
579 * Gets Follow Me Ddial Setting
582 * Extension to get information about
584 * follow me ddial setting
586 function getFollowMeDDial($exten) {
588 global $asterisk_manager_interface;
590 $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/ddial\r\n\r\n");
592 if (preg_match("/EXTENSION/",$response)) {
599 //TODO: really need to check for a bogus response, see how other side does it
610 * Gets FreePBX Version
612 function getFreePBXVersion() {
614 if (isset($_SESSION['dbh_asterisk'])) {
615 $sql = "SELECT * FROM admin WHERE variable = 'version'";
616 $results = $_SESSION['dbh_asterisk']->getAll($sql);
617 if(DB::IsError($results)) {
618 $_SESSION['ari_error'] = $results->getMessage();
621 return $results[0][1];
626 * Sets Follow-Me Settings in FreePBX MySQL Database
629 * Extension to modify
630 * @param $follow_me_prering_time
631 * Pre-Ring Time to ring
632 * @param $follow_me_listring_time
633 * List Ring Time to ring
634 * @param $follow_me_list
636 * @param $follow_me_list
637 * Follow Me Confirm Setting
640 function setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm) {
642 if (isset($_SESSION['dbh_asterisk'])) {
644 //format for SQL database
645 $follow_me_confirm = ($follow_me_confirm)?'CHECKED':'';
647 $sql = "UPDATE findmefollow SET grptime = '" . $follow_me_listring_time . "', grplist = '".
648 str_replace("'", "''", trim($follow_me_list)) . "', pre_ring = '" . $follow_me_prering_time .
649 "', needsconf = '" . $follow_me_confirm . "' WHERE grpnum = $exten LIMIT 1";
650 $results = $_SESSION['dbh_asterisk']->query($sql);
652 if(DB::IsError($results)) {
653 $_SESSION['ari_error'] = $results->getMessage();
660 function lookupSetExtensionFormat($exten) {
662 if (trim($exten) == "") return $exten;
664 $exten = preg_replace("/[^0-9*]/", "", $exten);
666 $sql = "SELECT extension FROM users WHERE extension = '".$exten."'";
667 $asa = $_SESSION['dbh_asterisk']->getrow($sql, DB_FETCHMODE_ASSOC);
668 if (!is_array($asa)) {