" . $_SESSION['ari_error'] . "
             
             
";
    unset($_SESSION['ari_error']);
  }
  return $ret;
}
/*
 * Checks modules directory, and configuration, and loaded modules 
 */
function loadModules() {
  global $ARI_ADMIN_MODULES;
  global $ARI_DISABLED_MODULES;
  global $loaded_modules;
  $modules_path = "./modules";
  if (is_dir($modules_path)) {
    $filter = ".module";
    $recursive_max = 1;
    $recursive_count = 0;
    $files = getFiles($modules_path,$filter,$recursive_max,$recursive_count);
    foreach($files as $key => $path) {
      // build module object 
      include_once($path); 
      $path_parts = pathinfo($path);
      list($name,$ext) = split("\.",$path_parts['basename']);
      // check for module and get rank
      if (class_exists($name)) {
        $module = new $name();
        // check if admin module
        $found = 0;
        if ($ARI_ADMIN_MODULES) {
          $admin_modules = split(',',$ARI_ADMIN_MODULES);
          foreach ($admin_modules as $key => $value) {
            if ($name==$value) {
              $found = 1;
              break;
            }
          }
        }
        // check if disabled module
        $disabled = 0;
        if ($ARI_DISABLED_MODULES) {
          $disabled_modules = split(',',$ARI_DISABLED_MODULES);
          foreach ($disabled_modules as $key => $value) {
            if ($name==$value) {
              $disabled = 1;
              break;
            }
          }
        }
        // if not admin module or admin user add to module name to array
        if (!$disabled && (!$found || $_SESSION['ari_user']['admin'])) {
          $loaded_modules[$name] = $module;
        }
      }
    }
  }
  else {
    $_SESSION['ari_error'] = _("$path not a directory or not readable");
  }
}
/**
 * Builds database connections
 */
function databaseLogon() {
  global $STANDALONE;
  global $ASTERISKMGR_DBHOST;
  global $AMP_FUNCTIONS_FILES;
  global $AMPORTAL_CONF_FILE;
  global $LEGACY_AMP_DBENGINE;
  global $LEGACY_AMP_DBFILE;
  global $LEGACY_AMP_DBHOST;
  global $LEGACY_AMP_DBNAME;
  global $ASTERISKCDR_DBENGINE;
  global $ASTERISKCDR_DBFILE;
  global $ASTERISKCDR_DBHOST;
  global $ASTERISKCDR_DBNAME;
  global $ARI_DISABLED_MODULES;
  global $loaded_modules;
	// This variable is a global in the FreePBX function.inc.php but needs to be
	// declared here or the is not seen when parse_amprotaconf() is eventually called
	// ?php bug?
	//
	global $amp_conf_defaults;
  // get user
  if ($STANDALONE['use']) {
    $mgrhost = $ASTERISKMGR_DBHOST;
    $mgruser = $STANDALONE['asterisk_mgruser'];
    $mgrpass = $STANDALONE['asterisk_mgrpass'];
    $asteriskcdr_dbengine = $ASTERISKCDR_DBENGINE;
    $asteriskcdr_dbfile = $ASTERISKCDR_DBFILE;
    $asteriskcdr_dbuser = $STANDALONE['asteriskcdr_dbuser'];
    $asteriskcdr_dbpass = $STANDALONE['asteriskcdr_dbpass'];
    $asteriskcdr_dbhost = $ASTERISKCDR_DBHOST;
    $asteriskcdr_dbname = $ASTERISKCDR_DBNAME;
  } 
  else {
    $include = 0;
    $files = split(';',$AMP_FUNCTIONS_FILES);
    foreach ($files as $file) {
      if (is_file($file)) {
        include_once($file);
        $include = 1;
      }
    }
    if ($include) {
      $amp_conf = parse_amportal_conf($AMPORTAL_CONF_FILE);
      $mgrhost = $ASTERISKMGR_DBHOST;
      $mgruser = $amp_conf['AMPMGRUSER'];
      $mgrpass = $amp_conf['AMPMGRPASS'];
      $amp_dbengine = isset($amp_conf["AMPDBENGINE"]) ? $amp_conf["AMPDBENGINE"] : $LEGACY_AMP_DBENGINE;
      $amp_dbfile = isset($amp_conf["AMPDBFILE"]) ? $amp_conf["AMPDBFILE"] : $LEGACY_AMP_DBFILE;
      $amp_dbuser = $amp_conf["AMPDBUSER"];
      $amp_dbpass = $amp_conf["AMPDBPASS"];
      $amp_dbhost = isset($amp_conf["AMPDBHOST"]) ? $amp_conf["AMPDBHOST"] : $LEGACY_AMP_DBHOST;
      $amp_dbname = isset($amp_conf["AMPDBNAME"]) ? $amp_conf["AMPDBNAME"] : $LEGACY_AMP_DBNAME;
      $asteriskcdr_dbengine = $ASTERISKCDR_DBENGINE;
      $asteriskcdr_dbfile = $ASTERISKCDR_DBFILE;
      $asteriskcdr_dbuser = $amp_conf["AMPDBUSER"];
      $asteriskcdr_dbpass = $amp_conf["AMPDBPASS"];
      $asteriskcdr_dbhost = $ASTERISKCDR_DBHOST;
      $asteriskcdr_dbhost = isset($amp_conf["AMPDBHOST"]) ? $amp_conf["AMPDBHOST"] : $ASTERISKCDR_DBHOST;
      $asteriskcdr_dbname = $ASTERISKCDR_DBNAME;
      unset($amp_conf);
    } 
  }
  // asterisk manager interface (berkeley database I think)
  global $asterisk_manager_interface;
  $asterisk_manager_interface = new AsteriskManagerInterface();
  $success = $asterisk_manager_interface->Connect($mgrhost,$mgruser,$mgrpass);
  if (!$success) {
    $_SESSION['ari_error'] =  
      _("ARI does not appear to have access to the Asterisk Manager.") . " ($errno)
" . 
      _("Check the ARI 'main.conf.php' configuration file to set the Asterisk Manager Account.") . "
" . 
      _("Check /etc/asterisk/manager.conf for a proper Asterisk Manager Account") . "
" .
      _("make sure [general] enabled = yes and a 'permit=' line for localhost or the webserver.");
    return FALSE;
  }
  // pear interface databases
  $db = new Database();
  // AMP asterisk database
  if (!$STANDALONE['use']) {
    $_SESSION['dbh_asterisk'] = $db->logon($amp_dbengine,
                                           $amp_dbfile,
                                           $amp_dbuser, 
                                           $amp_dbpass,
                                           $amp_dbhost,
                                           $amp_dbname);
    if (!isset($_SESSION['dbh_asterisk'])) {
      $_SESSION['ari_error'] .= _("Cannot connect to the $amp_dbname database") . "
" .
                               _("Check AMP installation, asterisk, and ARI main.conf");
      return FALSE;
    }
  }
  // cdr database
  if (in_array('callmonitor',array_keys($loaded_modules))) {
    $_SESSION['dbh_cdr'] = $db->logon($asteriskcdr_dbengine,
                                      $asteriskcdr_dbfile,
                                      $asteriskcdr_dbuser, 
                                      $asteriskcdr_dbpass,
                                      $asteriskcdr_dbhost,
                                      $asteriskcdr_dbname);
    if (!isset($_SESSION['dbh_cdr'])) {
      $_SESSION['ari_error'] .= sprintf(_("Cannot connect to the $asteriskcdr_dbname database"),$asteriskcdr_dbname) . "
" .
                               _("Check AMP installation, asterisk, and ARI main.conf");
      return FALSE;
    }
  }
  return TRUE;
}
/**
 * Logout if needed for any databases
 */
function databaseLogoff() {
  global $asterisk_manager_interface;
  $asterisk_manager_interface->Disconnect();
}
/*
 * Checks if user is set and sets
 */
function loginBlock() {
  $login = new Login();
  if (isset($_REQUEST['logout'])) {
    $login->Unauth();
  }
  if (!isset($_SESSION['ari_user'])) {
    $login->Auth();
  }
  if (!isset($_SESSION['ari_user'])) {
    // login form
    $ret .= $login->GetForm();
    return $ret;
  }
}
/*
 * Main handler for website
 */
function handleBlock() {
  global $ARI_NO_LOGIN;
  global $loaded_modules;
  // check errors here and in login block
  $content .= checkErrorMessage();
  // check logout
  if ($_SESSION['ari_user'] && !$ARI_NO_LOGIN) {
    $logout = 1;
  }
  // if nothing set goto user default page
  if (!isset($_REQUEST['m'])) {
    $_REQUEST['m'] = $_SESSION['ari_user']['default_page'];
  }
  // if not function specified then use display page function
  if (!isset($_REQUEST['f'])) {
    $_REQUEST['f'] = 'display';
  }
  $m = $_REQUEST['m'];     // module
  $f = $_REQUEST['f'];     // function
  $a = $_REQUEST['a'];     // action
  // set arguments
  $args = array();
  foreach($_REQUEST as $key => $value) {
    $args[$key] = $value;
  }
  // set rank
  $ranked_modules = array();
  foreach ($loaded_modules as $module) {
    $module_methods = get_class_methods($module);    // note that PHP4 returns all lowercase
    while (list($index, $value) = each($module_methods)) {
      $module_methods[strtolower($index)] = strtolower($value);
    }
    reset($module_methods);
        
    $rank = 99999;
    $rank_function = "rank";
    if (in_array(strtolower($rank_function), $module_methods)) {
      $rank = $module->$rank_function(); 
    }
    $ranked_modules[$rank] = $module;
  }
  ksort($ranked_modules);
  // process modules
  foreach ($ranked_modules as $module) {
    // process module
    $name = get_class($module);    // note PHP4 returns all lowercase
    $module_methods = get_class_methods($module);    // note PHP4 returns all lowercase
    while (list($index, $value) = each($module_methods)) {
      $module_methods[strtolower($index)] = strtolower($value);
    }
    reset($module_methods);
    // init module
    $module->init();
    // add nav menu items
    $nav_menu_function = "navMenu";
    if (in_array(strtolower($nav_menu_function), $module_methods)) {
      $nav_menu .= $module->$nav_menu_function($args); 
    }      
    if (strtolower($m)==strtolower($name)) {
      // build sub menu 
      $subnav_menu_function = "navSubMenu";
      if (in_array(strtolower($subnav_menu_function), $module_methods)) {
        $subnav_menu .= $module->$subnav_menu_function($args); 
      }
      // execute function (usually to build content)
      if (in_array(strtolower($f), $module_methods)) {
        $content .= $module->$f($args);
      }
    }
  }
  // add logout link
  if ($logout != '') { 
    $nav_menu .= "