-  // The markDeleted function marks the team and everything in it as deleted.
-  static function markDeleted($team_id) {
-
-    // Iterate through team users and mark them as deleted.
-    $users = ttTeamHelper::getAllUsers($team_id);
-    foreach ($users as $one_user) {
-      if (!ttUserHelper::markDeleted($one_user['id'])) return false;
-    }
-
-    // Mark tasks deleted.
-    if (!ttTeamHelper::markTasksDeleted($team_id)) return false;
-
-    $mdb2 = getConnection();
-
-    // Mark projects deleted.
-    $sql = "update tt_projects set status = NULL where team_id = $team_id";
-    $affected = $mdb2->exec($sql);
-    if (is_a($affected, 'PEAR_Error')) return false;
-
-    // Mark clients deleted.
-    $sql = "update tt_clients set status = NULL where team_id = $team_id";
-    $affected = $mdb2->exec($sql);
-    if (is_a($affected, 'PEAR_Error')) return false;
-
-    // Mark custom fields deleted.
-    $sql = "update tt_custom_fields set status = NULL where team_id = $team_id";
-    $affected = $mdb2->exec($sql);
-    if (is_a($affected, 'PEAR_Error')) return false;
-
-    // Mark team deleted.
-    $sql = "update tt_teams set status = NULL where id = $team_id";
-    $affected = $mdb2->exec($sql);
-    if (is_a($affected, 'PEAR_Error')) return false;
-
-    return true;
-  }
-
-  // The getTeamDetails function returns team details.
-  static function getTeamDetails($team_id) {
-    $result = array();
-    $mdb2 = getConnection();
-
-    $role_manager = ROLE_MANAGER;
-    $sql = "select t.name as team_name, u.id as manager_id, u.name as manager_name, u.login as manager_login, u.email as manager_email
-      from tt_teams t
-      inner join tt_users u on (u.team_id = t.id and u.role = $role_manager)
-      where t.id = $team_id";
-
-    $res = $mdb2->query($sql);
-    if (!is_a($res, 'PEAR_Error')) {
-      $val = $res->fetchRow();
-      return $val;
-    }
-
-    return false;
-  }
-
-  // The insert function creates a new team.
-  static function insert($fields) {
-
-    $mdb2 = getConnection();
-
-    $lock_spec = $fields['lock_spec'];
-    if ($lock_spec !== null) {
-      $lockspec_f = ', lock_spec';
-      $lockspec_v = ', ' . $mdb2->quote($lock_spec);
-    } else {
-      $lockspec_f = '';
-      $lockspec_v = '';
-    }
-
-    $lang = $fields['lang'];
-    if (!$lang) {
-      global $i18n;
-      $lang = $i18n->lang;
-    }
-
-    $decimal_mark = $fields['decimal_mark'];
-    if ($decimal_mark !== null) {
-      $decimal_mark_f = ', decimal_mark';
-      $decimal_mark_v = ', ' . $mdb2->quote($decimal_mark);
-    } else {
-      $decimal_mark_f = '';
-      $decimal_mark_v = '';
-    }
-
-    $date_format = $fields['date_format'];
-    if ($date_format !== null) {
-      $date_format_f = ', date_format';
-      $date_format_v = ', ' . $mdb2->quote($date_format);
-    } elseif (defined('DATE_FORMAT_DEFAULT')) {
-      $date_format_f = ', date_format';
-      $date_format_v = ', ' . $mdb2->quote(DATE_FORMAT_DEFAULT);
-    } else {
-      $date_format_f = '';
-      $date_format_v = '';
-    }
-
-    $time_format = $fields['time_format'];
-    if ($time_format !== null) {
-      $time_format_f = ', time_format';
-      $time_format_v = ', ' . $mdb2->quote($time_format);
-    } elseif (defined('TIME_FORMAT_DEFAULT')) {
-      $time_format_f = ', time_format';
-      $time_format_v = ', ' . $mdb2->quote(TIME_FORMAT_DEFAULT);
-    } else {
-      $time_format_f = '';
-      $time_format_v = '';
-    }
-
-    $week_start = $fields['week_start'];
-    if ($week_start !== null) {
-      $week_start_f = ', week_start';
-      $week_start_v = ', ' . (int)$week_start;
-    } elseif (defined('WEEK_START_DEFAULT')) {
-      $week_start_f = ', week_start';
-      $week_start_v = ', ' . (int)WEEK_START_DEFAULT;
-    } else {
-      $week_start_f = '';
-      $week_start_v = '';
-    }
-
-    $plugins = $fields['plugins'];
-    if ($plugins !== null) {
-      $plugins_f = ', plugins';
-      $plugins_v = ', ' . $mdb2->quote($plugins);
-    } else {
-      $plugins_f = '';
-      $plugins_v = '';
-    }
-
-    $tracking_mode = $fields['tracking_mode'];
-    if ($tracking_mode !== null) {
-      $tracking_mode_f = ', tracking_mode';
-      $tracking_mode_v = ', ' . (int)$tracking_mode;
-    } else {
-      $tracking_mode_f = '';
-      $tracking_mode_v = '';
-    }
-
-    $task_required = $fields['task_required'];
-    if ($task_required !== null) {
-      $task_required_f = ', task_required';
-      $task_required_v = ', ' . (int)$task_required;
-    } else {
-      $task_required_f = '';
-      $task_required_v = '';
-    }
-
-    $record_type = $fields['record_type'];
-    if ($record_type !== null) {
-      $record_type_f = ', record_type';
-      $record_type_v = ', ' . (int)$record_type;
-    } else {
-      $record_type_f = '';
-      $record_type_v = '';
-    }
-
-    $uncompleted_indicators = $fields['uncompleted_indicators'];
-    if ($uncompleted_indicators !== null) {
-      $uncompleted_indicators_f = ', uncompleted_indicators';
-      $uncompleted_indicators_v = ', ' . (int)$uncompleted_indicators;
-    } else {
-      $uncompleted_indicators_f = '';
-      $uncompleted_indicators_v = '';
-    }
-
-    $workday_hours = $fields['workday_hours'];
-    if ($workday_hours !== null) {
-      $workday_hours_f = ', workday_hours';
-      $workday_hours_v = ', ' . (int)$workday_hours;
-    } else {
-      $workday_hours_f = '';
-      $workday_hours_v = '';
-    }
-
-    $sql = "insert into tt_teams (name, address, currency $lockspec_f, lang $decimal_mark_f $date_format_f $time_format_f $week_start_f $plugins_f $tracking_mode_f $task_required_f $record_type_f $uncompleted_indicators_f $workday_hours_f)
-      values(".$mdb2->quote(trim($fields['name'])).
-      ", ".$mdb2->quote(trim($fields['address'])).
-      ", ".$mdb2->quote(trim($fields['currency']))." $lockspec_v, ".$mdb2->quote($lang).
-      "$decimal_mark_v $date_format_v $time_format_v $week_start_v $plugins_v $tracking_mode_v $task_required_v $record_type_v $uncompleted_indicators_v $workday_hours_v)";
-    $affected = $mdb2->exec($sql);
-
-    if (!is_a($affected, 'PEAR_Error')) {
-      $team_id = $mdb2->lastInsertID('tt_teams', 'id');
-      return $team_id;
-    }
-
-    return false;
-  }
-
-  // The update function updates team information.
-  static function update($team_id, $fields)
-  {
-    $mdb2 = getConnection();
-    $name_part = 'name = '.$mdb2->quote($fields['name']);
-    $currency_part = '';
-    $addr_part = '';
-    $lang_part = '';
-    $decimal_mark_part = '';
-    $date_format_part = '';
-    $time_format_part = '';
-    $week_start_part = '';
-    $tracking_mode_part = '';
-    $task_required_part = ' , task_required = '.intval($fields['task_required']);
-    $record_type_part = '';
-    $uncompleted_indicators_part = '';
-    $bcc_email_part = '';
-    $plugins_part = '';
-    $lock_spec_part = '';
-    $workday_hours_part = '';
-
-    if (isset($fields['address'])) $addr_part = ', address = '.$mdb2->quote($fields['address']);
-    if (isset($fields['currency'])) $currency_part = ', currency = '.$mdb2->quote($fields['currency']);
-    if (isset($fields['lang'])) $lang_part = ', lang = '.$mdb2->quote($fields['lang']);
-    if (isset($fields['decimal_mark'])) $decimal_mark_part = ', decimal_mark = '.$mdb2->quote($fields['decimal_mark']);
-    if (isset($fields['date_format'])) $date_format_part = ', date_format = '.$mdb2->quote($fields['date_format']);
-    if (isset($fields['time_format'])) $time_format_part = ', time_format = '.$mdb2->quote($fields['time_format']);
-    if (isset($fields['week_start'])) $week_start_part = ', week_start = '.intval($fields['week_start']);
-    if (isset($fields['tracking_mode'])) $tracking_mode_part = ', tracking_mode = '.intval($fields['tracking_mode']);
-    if (isset($fields['record_type'])) $record_type_part = ', record_type = '.intval($fields['record_type']);
-    if (isset($fields['uncompleted_indicators'])) $uncompleted_indicators_part = ', uncompleted_indicators = '.intval($fields['uncompleted_indicators']);
-    if (!empty($fields['bcc_email'])) $bcc_email_part = ', bcc_email = '.$mdb2->quote($fields['bcc_email']);
-    if (isset($fields['plugins'])) $plugins_part = ', plugins = '.$mdb2->quote($fields['plugins']);
-    if (isset($fields['lock_spec'])) $lock_spec_part = ', lock_spec = '.$mdb2->quote($fields['lock_spec']);
-    if (isset($fields['workday_hours'])) $workday_hours_part = ', workday_hours = '.$mdb2->quote($fields['workday_hours']);
-
-    $sql = "update tt_teams set $name_part $addr_part $currency_part $lang_part $decimal_mark_part
-      $date_format_part $time_format_part $week_start_part $tracking_mode_part $task_required_part $record_type_part
-      $uncompleted_indicators_part $bcc_email_part $plugins_part $lock_spec_part $workday_hours_part where id = $team_id";
-    $affected = $mdb2->exec($sql);
-    if (is_a($affected, 'PEAR_Error')) return false;
-
-    return true;
-  }
-
-  // The getInactiveTeams is a maintenance function that returns an array of inactive team ids (max 50).
-  static function getInactiveTeams() {
-    $inactive_teams = array();
-    $mdb2 = getConnection();
-
-    // Get all team ids for teams created or modified more than 1 year ago.
-    // $ts = date('Y-m-d', strtotime('-1 year'));
-    $ts = date('Y-m-d', strtotime('-4 month'));
-    $sql =  "select id from tt_teams where timestamp < '$ts' order by id";
-    $res = $mdb2->query($sql);
-
-    $count = 0;
-    if (!is_a($res, 'PEAR_Error')) {
-      while ($val = $res->fetchRow()) {
-        $team_id = $val['id'];
-        if (ttTeamHelper::isTeamActive($team_id) == false) {
-          $count++;
-          $inactive_teams[] = $team_id;
-          // Limit the array size for perfomance by allowing this operation on small chunks only.
-          if ($count >= 50) break;
-        }
-      }
-      return $inactive_teams;
-    }
-    return false;
-  }
-
-  // The isTeamActive determines if a team is using Time Tracker or abandoned it.
-  static function isTeamActive($team_id) {
-    $users = array();
-
-    $mdb2 = getConnection();
-    $sql = "select id from tt_users where team_id = $team_id";
-    $res = $mdb2->query($sql);
-    if (is_a($res, 'PEAR_Error')) die($res->getMessage());
-    while ($val = $res->fetchRow()) {
-      $users[] = $val['id'];
-    }
-    $user_list = implode(',', $users); // This is a comma-separated list of user ids.
-    if (!$user_list)
-      return false; // No users in team.
-
-    $count = 0;
-    $ts = date('Y-m-d', strtotime('-2 years'));
-    $sql = "select count(*) as cnt from tt_log where user_id in ($user_list) and timestamp > '$ts'";
-    $res = $mdb2->query($sql);
-    if (!is_a($res, 'PEAR_Error')) {
-      if ($val = $res->fetchRow()) {
-        $count = $val['cnt'];
-      }
-    }
-
-    if ($count == 0)
-      return false;  // No time entries for the last 2 years.
-
-    if ($count <= 5) {
-      // We will consider a team inactive if it has 5 or less time entries made more than 1 year ago.
-      $count_last_year = 0;
-      $ts = date('Y-m-d', strtotime('-1 year'));
-      $sql = "select count(*) as cnt from tt_log where user_id in ($user_list) and timestamp > '$ts'";
-      $res = $mdb2->query($sql);
-      if (!is_a($res, 'PEAR_Error')) {
-        if ($val = $res->fetchRow()) {
-          $count_last_year = $val['cnt'];
-        }
-        if ($count_last_year == 0)
-          return false;  // No time entries for the last year and only a few entries before that.
-      }
-    }
-    return true;
-  }
-
-  // The delete function permanently deletes all data for a team.
-  static function delete($team_id) {