<?php
/**
 * @file
 * Integrate mailman api into Drupal.
 */

require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'mailman_integration') . '/mailman_integration_admin.inc';

/**
 * Implements hook_permission().
 */
function mailman_integration_permission() {
  return array(
    'administer mailman_integration' => array(
      'title' => t('Admin Access Mailman integration'),
      'description' => t('Access the Mailman integration configuration admin pages'),
    ),
    'access mailman_integration' => array(
      'title' => t('Access Mailman integration'),
      'description' => t('Access the Mailman integration pages'),
    ),
  );
}

/**
 * Implements hook_views_api().
 */
function mailman_integration_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'mailman_integration') . '/views/',
  );
}

/**
 * Implements hook_help().
 */
function mailman_integration_help($path, $arg) {
  switch ($path) {
    case 'admin/help#mailman_integration':
      return check_markup(file_get_contents(dirname(__FILE__) . "/README.txt"));
  }
}

/**
 * Menu callback for the Mailman admin settings form.
 */
function mailman_integration_admin_settings_form() {
  $form['mailman_integration_admin_url'] = array(
    '#type' => 'textfield',
    '#title' => t('Mailman Integration URL'),
    '#required' => TRUE,
    '#default_value' => variable_get('mailman_integration_admin_url', ''),
    '#description' => t("Mailman Integration Url. Note: If your mailman url like as http://demo.com/mailman/admin then give the url as http://demo.com/mailman"),
  );
  $form['mailman_integration_domain_name'] = array(
    '#type' => 'textfield',
    '#title' => t('Mailman Integration Domain Name'),
    '#required' => TRUE,
    '#default_value' => variable_get('mailman_integration_domain_name', ''),
    '#description' => t("List Domain Name. Note: Don't include http://www. It should be like demo.com"),
  );
  $form['mailman_integration_authenticate_password'] = array(
    '#type' => 'password',
    '#title' => t('Mailman Integration Authentication Password'),
    '#required' => TRUE,
    '#default_value' => variable_get('mailman_integration_authenticate_password', ''),
    '#description' => t("Mailman Integration Authentication Password"),
  );
  $form['mailman_integration_sub_acknowledgement_to_user'] = array(
    '#type' => 'checkbox',
    '#title' => t('Send Subscription acknowledgement to the user'),
    '#default_value' => variable_get('mailman_integration_sub_acknowledgement_to_user', 0),
    '#description' => t('If checked, Send Subscription acknowledgement to the user.'),
  );
  $form['mailman_integration_sub_acknowledgement_to_owner'] = array(
    '#type' => 'checkbox',
    '#title' => t('Send Subscription acknowledgement to the List Owner'),
    '#default_value' => variable_get('mailman_integration_sub_acknowledgement_to_owner', 0),
    '#description' => t('If checked, Send Subscription acknowledgement to the List Owner.'),
  );
  $form['mailman_integration_unsub_acknowledgement_to_user'] = array(
    '#type' => 'checkbox',
    '#title' => t('Send Unsubscription acknowledgement to the user'),
    '#default_value' => variable_get('mailman_integration_unsub_acknowledgement_to_user', 0),
    '#description' => t('If checked, Send Unsubscription acknowledgement to the user.'),
  );
  $form['mailman_integration_unsub_acknowledgement_to_owner'] = array(
    '#type' => 'checkbox',
    '#title' => t('Send Unsubscription acknowledgement to the List Owner'),
    '#default_value' => variable_get('mailman_integration_unsub_acknowledgement_to_owner', 0),
    '#description' => t('If checked, Send Unsubscription acknowledgement to the List Owner.'),
  );
  $options = array(
    10 => 10,
    20 => 20,
    30 => 30,
    40 => 40,
    50 => 50,
  );
  $form['mailman_integration_list_pagination'] = array(
    '#type' => 'select',
    '#title' => t('Mailman List Per Page'),
    '#default_value' => variable_get('mailman_integration_list_pagination', 10),
    '#options' => $options,
  );
  $form['mailman_integration_auto_sync'] = array(
    '#type' => 'checkbox',
    '#title' => t('Mailman list Sync Cron'),
    '#default_value' => variable_get('mailman_integration_auto_sync', 0),
    '#description' => t('If checked, When the Cron is run automatically sync the mailman list.'),
  );
  $form = system_settings_form($form);
  $form['#submit'][] = 'mailman_integration_admin_settings_form_submit';
  return $form;
}

/**
 * Validate function of mailman_integration_admin_settings form.
 */
function mailman_integration_admin_settings_form_validate($form, &$form_state) {
  $authenticate_pass   = $form_state['values']['mailman_integration_authenticate_password'];
  $admin_url           = $form_state['values']['mailman_integration_admin_url'];
  $list_mail_address  = variable_get('site_mail', 'test-connection@' . $form_state['values']['mailman_integration_domain_name']);
  $mailman = new MailmanIntegration($admin_url);
  $lists = $mailman->getMailmanlists();
  $list_name = isset($lists[0]['name']) ? $lists[0]['name'] : '';
  if (!$list_name) {
    $list_name = 'test-connection';
    $mailman = new MailmanIntegration($admin_url, $authenticate_pass, $authenticate_pass, $list_name);
    $params = array();
    $params['autogen'] = 0;
    $params['doit']    = 'Create List';
    $params['langs']   = 'en';
    $params['listname'] = $list_name;
    $params['moderate'] = 0;
    $params['notify']  = 0;
    $params['owner']   = $list_mail_address;
    $mailman->mailmanListCreate($params);
  }
  variable_set('mailman_domain_url', 0);
  $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
  $list_val = $mailman->getMailmanListGeneral();
  if (!isset($list_val['real_name']) ||  strtolower($list_val['real_name']) != strtolower($list_name)) {
    $list_name_with_domain = $list_name . '_' . $form_state['values']['mailman_integration_domain_name'];
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $list_val = $mailman->getMailmanListGeneral($list_name_with_domain);
    if (!isset($list_val['real_name']) ||  strtolower($list_val['real_name']) != strtolower($list_name)) {
      form_set_error('mailman_integration_authenticate_password', t('Mailman Authentication Failed.'));
    }
    else {
      variable_set('mailman_domain_url', 1);
    }
  }
}

/**
 * Submit function of mailman_integration_admin_settings form.
 */
function mailman_integration_admin_settings_form_submit($form, &$form_state) {
  variable_set('mailman_connection_error', 0);
}

/**
 * Implements hook_menu().
 */
function mailman_integration_menu() {
  $menus['admin/config/user-interface/mailman-integration'] = array(
    'title' => 'Mailman Integration',
    'description' => 'Configuration for the Mailman Integration module.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mailman_integration_admin_settings_form'),
    'access arguments' => array('administer mailman_integration'),
    'weight' => 0,
  );
  $menus['admin/config/system/mailman_integration/list'] = array(
    'title' => 'Mailman Mailing Lists',
    'page callback' => 'mailman_integration_view_list',
    'access arguments' => array('access mailman_integration'),
    'description' => 'View Mailman Mailing Lists',
    'type' => MENU_NORMAL_ITEM,
  );
  $menus['admin/config/system/mailman_integration/list/add'] = array(
    'title' => 'Add Mailman Lists',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mailman_integration_create_list_form'),
    'access arguments' => array('administer mailman_integration'),
    'description' => 'Add Manual Mailman Mailing Lists',
    'type' => MENU_NORMAL_ITEM,
    'file' => 'mailman_integration_admin.inc',
    'weight' => 1,
  );
  $menus['admin/config/system/mailman_integration/list/user/%'] = array(
    'title' => 'Subscribe a Member in Manual Mailing List',
    'page callback' => 'mailman_integration_add_user_callback',
    'page arguments' => array(6),
    'access arguments' => array('access mailman_integration'),
    'description' => 'View and Add Users in Manual Mailman Mailing Lists',
    'type' => MENU_NORMAL_ITEM,
    'file' => 'mailman_integration_admin.inc',
    'weight' => 2,
  );
  $menus['mailman_integration/ajax/user_ac_callback'] = array(
    'page callback' => 'mailman_integration_user_ac_callback',
    'file' => 'mailman_integration_admin.inc',
    'type' => MENU_CALLBACK,
    'access arguments' => array('access mailman_integration'),
    'weight' => 3,
  );
  $menus['admin/config/system/mailman_integration/list/remove/%'] = array(
    'title' => 'Remove Mailman List',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mailman_integration_list_delete_confirm', 6),
    'access arguments' => array('administer mailman_integration'),
    'type' => MENU_NORMAL_ITEM,
    'weight' => 4,
  );
  $menus['admin/config/system/mailman_integration/list/rolelist/add'] = array(
    'title' => 'Add Role Based Mailing List',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mailman_integration_add_rolelist_form'),
    'access arguments' => array('administer mailman_integration'),
    'description' => 'Add Role Based Mailman Mailing Lists',
    'type' => MENU_NORMAL_ITEM,
    'file' => 'mailman_integration_admin.inc',
    'weight' => 5,
  );
  $menus['admin/config/system/mailman_integration/list/rolelist/user'] = array(
    'title' => 'Subscribe a Member in Role Based Mailing List',
    'page callback' => 'mailman_integration_add_role_user_callback',
    'access arguments' => array('access mailman_integration'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'mailman_integration_admin.inc',
    'description' => 'View and Add Users in Role Based Mailman Mailing Lists',
    'weight' => 6,
  );
  $menus['user/%user/mailman_integration'] = array(
    'title' => 'Mailing Lists',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mailman_integration_user_form', 1),
    'access arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'file' => 'mailman_integration_admin.inc',
    'access callback' => 'mailman_integration_user_access',
    'weight' => 7,
  );
  return $menus;
}

/**
 * User can access the mailman integration List.
 */
function mailman_integration_user_access($account) {
  global $user;
  if (($account && $account->uid && $user->uid == $account->uid) || user_access('administer mailman_integration')) {
    return TRUE;
  }
  return FALSE;
}

/**
 * Inserts list data into Mailman Integration Custom table.
 */
function mailman_integration_migrate_maillist() {
  $list = mailman_integration_get_mail_list();
  $params = array();
  $params['entity_id']    = '';
  $params['entity_type']  = '';
  $params['bundle']       = '';
  $params['listname']     = '';
  $params['list_type']    = 1;
  $mailman_data     = mailman_integration_select_list_data($params);
  $changecase_mm_data = array_change_key_case($mailman_data, CASE_LOWER);
  $insert_list = array();
  foreach ($list as $key => $value) {
    $list_name = strtolower($value['name']);
    if (!array_key_exists($list_name, $changecase_mm_data) && $list_name) {
      $list_val                   = mailman_integration_get_list_general($list_name);
      $owner = isset($list_val['owner']) ? $list_val['owner'] : '';
      $desc  = isset($list_val['desc']) ? $list_val['desc'] : '';
      $insert_list[$key]['name']  = $list_name;
      $insert_list[$key]['owner'] = $owner;
      $insert_list[$key]['desc']  = $desc;
    }
  }
  // Insert manually created list from Mailman into Custom table.
  foreach ($insert_list as $key => $list) {
    if ($list['name']) {
      $params = array();
      $params['entity_id']    = '';
      $params['entity_type']  = '';
      $params['bundle']       = 'manual';
      $params['listname']     = $list['name'];
      $params['list_owner']   = $list['owner'];
      $params['list_desc']    = $list['desc'];
      mailman_integration_insert_list_data($params);
    }
  }
}

/**
 * Implements hook_cron().
 */
function mailman_integration_cron() {
  if (variable_get('mailman_integration_auto_sync', 0)) {
    $list = mailman_integration_get_mail_list();
    variable_set('mailman_connection_error', 0);
    $list_name = isset($list[0]['name']) ? $list[0]['name'] : '';
    if ($list_name) {
      $authenticate_pass = mailman_integration_get_auth_pass();
      $admin_url = mailman_integration_get_admin_url();
      $mailman  = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
      $list_val  = $mailman->getMailmanListGeneral();
      if (!isset($list_val['real_name']) || strtolower($list_val['real_name']) != strtolower($list_name)) {
        variable_set('mailman_connection_error', 1);
      }
      else {
        mailman_integration_migrate_maillist();
      }
    }
    else {
      variable_set('mailman_connection_error', 1);
    }
  }
}

/**
 * Implements hook_user_insert().
 */
function mailman_integration_user_insert(&$edit, $account, $category) {
  if (!isset($edit['roles']) || !is_array($edit['roles'])) {
    return;
  }
  $uid    = $edit['uid'];
  $name   = $edit['name'];
  $mail   = $edit['mail'];
  $roles  = $edit['roles'];
  unset($roles[DRUPAL_AUTHENTICATED_RID]);
  $added_role        = array_keys($roles);
  if (count($added_role)) {
    foreach ($added_role as $role_val) {
      $params = array();
      $params['role_id']      = $role_val;
      $params['list_id']      = '';
      $params['listname']     = '';
      // $params['role_list']    = 1;
      $mailman_roles           = mailman_integration_select_list_roles($params);
      foreach ($mailman_roles as $val) {
        $list_name = $val->list_name;
        $already_member = mailman_integration_is_member_inlist($list_name, $mail);
        if (!count($already_member)) {
          mailman_integration_subscribe($list_name, $mail);
          // Update user option.
          mailman_integration_set_user_option($list_name, $mail, 'fullname', $name);
          // Insert into mailman user table.
          mailman_integration_insert_users($list_name, $mail, 0, $uid);
        }
      }
    }
  }
}

/**
 * Implements hook_user_update().
 */
function mailman_integration_user_update(&$edit, $account, $category) {
  if (!isset($edit['roles']) || !is_array($edit['roles'])) {
    return;
  }
  $is_single = 0;
  if (isset($edit['name']) && $edit['name']) {
    $is_single = 1;
  }
  $uid    = $edit['original']->uid;
  if ($is_single) {
    $name   = $edit['name'];
    $mail   = $edit['mail'];
    if (($key = array_search(DRUPAL_ANONYMOUS_RID, $edit['roles'])) !== FALSE) {
      unset($edit['roles'][$key]);
    }
    $roles  = array_flip($edit['roles']);
    unset($roles[0]);
    $submitted_roles   = array_keys($roles);
    $user_roles        = $submitted_roles;
    // By Default authenticated rid not comes in submits.
    $submitted_roles[] = DRUPAL_AUTHENTICATED_RID;
  }
  else {
    $name   = $account->name;
    $mail   = $account->mail;
    $roles  = $edit['roles'];
    $submitted_roles   = array_keys($roles);
    unset($roles[DRUPAL_AUTHENTICATED_RID]);
    $user_roles        = array_keys($roles);
  }
  $old_roles         = array_keys($edit['original']->roles);
  $removed_role      = array_diff($old_roles, $submitted_roles);
  $added_role        = array_diff($submitted_roles, $old_roles);
  if (count($added_role)) {
    foreach ($added_role as $role_val) {
      $params = array();
      $params['role_id']      = $role_val;
      $params['list_id']      = '';
      $params['listname']     = '';
      // $params['role_list']    = 1;
      $mailman_add_roles        = mailman_integration_select_list_roles($params);
      foreach ($mailman_add_roles as $val) {
        $list_name = $val->list_name;
        $already_member = mailman_integration_is_member_inlist($list_name, $mail);
        if (!count($already_member)) {
          mailman_integration_subscribe($list_name, $mail);
          // Update user option.
          mailman_integration_set_user_option($list_name, $mail, 'fullname', $name);
          // Insert into mailman user table.
          mailman_integration_insert_users($list_name, $mail, 0, $uid);
        }
      }
    }
  }
  if (count($removed_role)) {
    foreach ($removed_role as $role_val) {
      $params = array();
      $params['role_id']      = $role_val;
      $params['list_id']      = '';
      $params['listname']     = '';
      $mailman_roles           = mailman_integration_select_list_roles($params);
      foreach ($mailman_roles as $val) {
        $list_name = $val->list_name;
        $params = array();
        $params['role_id']      = '';
        $params['list_id']      = '';
        $params['listname']     = $list_name;
        $params['role_list']    = 1;
        $mailman_list_roles       = mailman_integration_select_list_roles($params);
        $is_deleted = 1;
        foreach ($mailman_list_roles as $listed_role) {
          if (in_array($listed_role, $user_roles)) {
            $is_deleted = 0;
          }
        }
        if ($is_deleted) {
          mailman_integration_unsubscribe($list_name, $mail);
          // Remove from mailman user table.
          mailman_integration_remove_users($list_name, $mail, 0);
        }
      }
    }
  }
}

/**
 * Implements hook_user_delete().
 *
 * Remove the member from mail lists when admin delete the users.
 */
function mailman_integration_user_delete($account) {
  $user_mail = $account->mail;
  if ($user_mail) {
    $lists = mailman_integration_get_userlist($account->uid);
    foreach ($lists as $list) {
      mailman_integration_unsubscribe($list->list_name, $user_mail);
      // Remove from mailman user table.
      mailman_integration_remove_users($list->list_name, $user_mail, $list->list_id);
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mailman_integration_form_user_admin_role_delete_confirm_alter(&$form, $form_state) {
  // Store Deleted Role user mail id.
  $user_list = mailman_integration_get_role_list(array($form['rid']['#value']));
  $_SESSION['del_role_mail_list'] = $user_list;
}

/**
 * Implements hook_user_role_delete().
 */
function mailman_integration_user_role_delete($role) {
  $role_id = $role->rid;
  $params = array();
  $params['role_id']      = $role_id;
  $params['list_id']      = '';
  $params['listname']     = '';
  $mailman_roles           = mailman_integration_select_list_roles($params);

  $removed_role_list        = $_SESSION['del_role_mail_list'];
  unset($_SESSION['del_role_mail_list']);
  foreach ($mailman_roles as $val) {
    $list_name = $val->list_name;
    $params = array();
    $params['role_id']      = '';
    $params['list_id']      = '';
    $params['listname']     = $list_name;
    $params['role_list']    = 1;
    $mailman_del_roles        = mailman_integration_select_list_roles($params);
    if (count($mailman_del_roles) == 1) {
      if ($list_name) {
        mailman_integration_remove_list($list_name);
      }
    }
    else {
      $other_role_list  = mailman_integration_get_role_list($mailman_del_roles);
      $want_to_remove_mailman = array_diff($removed_role_list, $other_role_list);
      if (count($want_to_remove_mailman)) {
        // Unsubcribe $want_to_remove_mailman list.
        foreach ($want_to_remove_mailman as $mail => $name) {
          mailman_integration_unsubscribe($list_name, $mail);
          // Remove from mailman user table.
          mailman_integration_remove_users($list_name, $mail, 0);
        }
      }
      $params = array();
      $params['role_id']    = $role_id;
      $params['list_id']    = '';
      $params['listname']   = $list_name;
      mailman_integration_delete_list_role($params);
    }
  }
}

/**
 * Get the mailman admin url.
 */
function mailman_integration_get_admin_url() {
  return variable_get('mailman_integration_admin_url', '');
}

/**
 * Get the mailman authentication password.
 */
function mailman_integration_get_auth_pass() {
  return variable_get('mailman_integration_authenticate_password', '');
}

/**
 * Get the mailman Lists.
 */
function mailman_integration_view_list() {
  $build = array();
  $build['mm_head']['#markup'] = mailman_integration_list_header();
  $build['search_form'] = drupal_get_form('mailman_integration_search_list_form');
  return $build;
}

/**
 * Mailman Lists page Header.
 */
function mailman_integration_list_header() {
  $build    = '<div class="mailman-button-link">';
  $build .= '<ul class="action-links">';
  if (user_access('administer mailman_integration')) {
    $build .= '<li>';
    $build .= l(t('Add Manual Mailing List'), 'admin/config/system/mailman_integration/list/add', array('attributes' => array('id' => 'add_list')));
    $build .= '</li>';
    $build .= '<li>';
    $build .= l(t('Add Role Based Mailing List'), 'admin/config/system/mailman_integration/list/rolelist/add', array('attributes' => array('id' => 'add_rolelist')));
    $build .= '</li>';
  }
  $build .= '</ul>';
  $build .= '</div>';
  return $build;
}

/**
 * Mailman lists search form.
 */
function mailman_integration_search_list_form($form, &$form_state) {
  $form = array();
  $ptions = array(
    'all'     => 'All',
    'manual'  => 'Manual',
    'role'    => 'Role',
  );
  $form['list_type'] = array(
    '#type' => 'select',
    '#title' => t('List Type'),
    '#options' => $ptions,
    '#default_value' => (isset($_GET['type']) && $_GET['type']) ? $_GET['type'] : 'all',
  );
  $form['name'] = array(
    '#title' => t('Name/Email'),
    '#type' => 'textfield',
    '#attributes' => array(
      'id' => 'search-name',
    ),
    '#default_value' => isset($_GET['name']) && $_GET['name'] ? $_GET['name'] : '',
  );
  $form['submit'] = array(
    '#value' => 'Search',
    '#type' => 'submit',
    '#prefix' => '<div id="list-search-submit">',
    '#limit_validation_errors' => array(),
    '#name' => 'search_submit',
  );
  $form['reset_but'] = array(
    '#value' => 'Reset',
    '#type' => 'submit',
    '#suffix' => '</div>',
    '#attributes' => array(
      'class' => array('btn-primary'),
      'id' => 'reset-submit',
    ),
    '#name' => 'search_reset',
    '#limit_validation_errors' => array(),
  );
  $header = array(
    array(
      'data' => t('Name'),
      'width' => '20%',
      'field' => 'list_name',
      'sort' => 'asc',
    ),
    array('data' => t('Email'), 'width' => '30%', 'field' => 'list_owners'),
    array('data' => t('Description'), 'width' => '30%'),
    array('data' => t('Action'), 'width' => '20%'),
  );
  $select_stmt = db_select('mailman_integration_list', 'ma');
  $select_stmt->fields('ma', array('entity_id',
    'entity_type',
    'bundle',
    'list_name',
    'list_owners',
    'description',
    )
  );
  if (isset($_GET['type']) && $_GET['type']) {
    if ($_GET['type'] != 'all') {
      $select_stmt->condition('ma.bundle', $_GET['type']);
    }
    if (isset($_GET['name']) && $_GET['name']) {
      $select_stmt->condition(db_or()
        ->condition('ma.list_name', '%' . db_like($_GET['name']) . '%', 'LIKE')
        ->condition('ma.list_owners', '%' . db_like($_GET['name']) . '%', 'LIKE')
      );
    }
  }
  $select_stmt->groupBy('ma.list_name');
  $select_stmt = $select_stmt->extend('TableSort')->orderByHeader($header)->extend('PagerDefault')->limit(variable_get('mailman_integration_list_pagination', 10));
  $lists = $select_stmt->execute();
  $rows = array();
  foreach ($lists as $key => $list) {
    $desc = mailman_integration_match_desc($list->description);
    $link = '<div>';
    if ($list->bundle == 'role') {
      $link .= l(t('Add/View Users'), 'admin/config/system/mailman_integration/list/rolelist/user/' . $list->list_name, array('attributes' => array('id' => 'view_user')));
    }
    else {
      $link .= l(t('Add/View Users'), 'admin/config/system/mailman_integration/list/user/' . $list->list_name, array('attributes' => array('id' => 'view_user')));
    }
    if (user_access('administer mailman_integration')) {
      $link .= '<span> | </span>';
      $link .= l(t('delete'), 'admin/config/system/mailman_integration/list/remove/' . $list->list_name);
    }
    $link .= '</div>';
    $owner = nl2br($list->list_owners);
    $rows[] = array(
      'class' => array('list-name-' . $key),
      'data' => array(
        $list->list_name,
        $owner,
        check_plain($desc['description']),
        $link,
      ),
    );
  }
  $form['table']  = array(
    '#theme'      => 'table',
    '#header'     => $header,
    '#rows'       => $rows,
    '#attributes' => array('class' => array('mailman-list'), 'id' => 'mailman-list-table'),
    '#empty'      => t('No List found.'),
  );
  $form['pager']  = array('#theme' => 'pager');
  return $form;
}

/**
 * Mailman lists search form validation.
 */
function mailman_integration_search_list_form_validate($form, &$form_state) {
  $trigger_element = $form_state['triggering_element']['#name'];
  if ($trigger_element == 'search_reset') {
    $form_state['redirect'] = 'admin/config/system/mailman_integration/list';
    return;
  }
  elseif ($trigger_element == 'search_submit') {
    $list_type = $form_state['values']['list_type'];
    $name      = $form_state['values']['name'];
    $qs = array();
    if (isset($list_type) && $list_type) {
      $qs['type'] = $list_type;
    }
    if (isset($name) && $name) {
      $qs['name'] = $name;
    }
    $options = array('query' => $qs);
    drupal_goto($_GET['q'], $options);
  }
}

/**
 * Form constructor for the Mail list deletion confirmation form.
 *
 * @see mailman_integration_list_delete_confirm()
 */
function mailman_integration_list_delete_confirm($form, &$form_state, $list_name) {
  $form['list_name'] = array('#type' => 'value', '#value' => $list_name);
  return confirm_form($form,
    t('Are you sure you want to delete %title?', array('%title' => $list_name)),
    'admin/config/system/mailman_integration/list',
    t('This action cannot be undone.'),
    t('Delete'),
    t('Cancel')
  );
}

/**
 * Executes Mail list deletion.
 *
 * @see mailman_integration_list_delete_confirm()
 */
function mailman_integration_list_delete_confirm_submit($form, &$form_state) {
  if ($form_state['values']['confirm']) {
    $list_name = $form_state['values']['list_name'];
    mailman_integration_remove_list($list_name);
    drupal_set_message(t('%title has been deleted.', array('%title' => $list_name)));
  }
  $form_state['redirect'] = 'admin/config/system/mailman_integration/list';
}

/**
 * Mailman connection error.
 */
function mailman_integration_set_error_msg($e) {
  drupal_set_message(t('Unable to connect Mailman.'), 'error', FALSE);
}

/**
 * Get all Mailman lists.
 */
function mailman_integration_get_mail_list() {
  $admin_url = mailman_integration_get_admin_url();
  try {
    $mailman = new MailmanIntegration($admin_url);
    $lists = $mailman->getMailmanlists();
    // $lists = $mailman->getListsByCommand();
    return $lists;
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}

/**
 * Get all the members lists from given list.
 *
 * @param string $list_name
 *   The list name.
 */
function mailman_integration_get_members_list($list_name) {
  $admin_url = mailman_integration_get_admin_url();
  if (!$admin_url) {
    return array();
  }
  $authenticate_pass = mailman_integration_get_auth_pass();
  try {
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $lists_members = $mailman->mailmanListMembers();
    return $lists_members;
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}

/**
 * Check given member exists in mentioned lists.
 *
 * @param string $list_name
 *   The list name.
 * @param string $email
 *   User email address.
 */
function mailman_integration_is_member_inlist($list_name, $email = '') {
  $admin_url = mailman_integration_get_admin_url();
  $authenticate_pass = mailman_integration_get_auth_pass();
  try {
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $lists_member = $mailman->getMemberInList($email);
    return $lists_member;
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}

/**
 * Subcribe the member to given list.
 *
 * @param string $list_name
 *   The list name.
 * @param string $email
 *   User email address.
 */
function mailman_integration_subscribe($list_name, $email = '') {
  $admin_url = mailman_integration_get_admin_url();
  $authenticate_pass = mailman_integration_get_auth_pass();
  try {
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $mailman->subscribeMember($email);
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}

/**
 * Unsubcribe the member to given list.
 *
 * @param string $list_name
 *   The list name.
 * @param string $email
 *   User email address.
 */
function mailman_integration_unsubscribe($list_name, $email = '') {
  $admin_url = mailman_integration_get_admin_url();
  $authenticate_pass = mailman_integration_get_auth_pass();
  try {
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $unsubscribe = $mailman->unSubscribeMember($email);
    return $unsubscribe;
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}

/**
 * Remove the list from mailman.
 *
 * @param string $list_name
 *   The list name.
 */
function mailman_integration_remove_list($list_name) {
  $admin_url = mailman_integration_get_admin_url();
  $authenticate_pass = mailman_integration_get_auth_pass();
  try {
    $mailman = new MailmanIntegration($admin_url, '', $authenticate_pass, $list_name);
    $upd_params = array();
    $upd_params['delarchives'] = 1;
    $rm_list = $mailman->mailmanRemoveList($upd_params);
    // $rm_list = $mailman->removeMailmanListByCmd($upd_params);
    if ($rm_list['status']) {
      $list_id = mailman_integration_get_list_id($list_name);
      // Delete Mailman data.
      $params = array();
      $params['entity_id']    = '';
      $params['entity_type']  = '';
      $params['bundle']       = '';
      $params['listname']     = $list_name;
      mailman_integration_delete_list_data($params);
      // Delete Mailman Roles record.
      $params = array();
      $params['role_id']    = '';
      $params['list_id']    = $list_id;
      $params['listname']   = $list_name;
      mailman_integration_delete_list_role($params);
      // Delete List Users  table.
      mailman_integration_remove_users($list_name, 0, $list_id, 1);
    }
    return $rm_list['status'];
  }
  catch (MailmanIntegrationException $e) {
    mailman_integration_set_error_msg($e);
  }
}
