public function pre_dispatch()
 {
     global $context, $txt;
     // These are all the possible fields.
     $this->_search_fields = array('name' => $txt['mlist_search_name'], 'email' => $txt['mlist_search_email'], 'website' => $txt['mlist_search_website'], 'group' => $txt['mlist_search_group']);
     // Are there custom fields they can search?
     require_once SUBSDIR . '/Memberlist.subs.php';
     ml_findSearchableCustomFields();
     // These are handy later
     $context['old_search_value'] = '';
     $context['in_search'] = !empty($_REQUEST['search']);
     foreach ($context['custom_search_fields'] as $field) {
         $this->_search_fields['cust_' . $field['colname']] = sprintf($txt['mlist_search_by'], $field['name']);
     }
 }
 /**
  * Search for members, or display search results.
  * If variable $_REQUEST['search'] is empty displays search dialog box, using the search sub-template.
  * Calls printMemberListRows to retrieve the results of the query.
  */
 public function action_mlsearch()
 {
     global $txt, $scripturl, $context, $modSettings;
     $context['page_title'] = $txt['mlist_search'];
     $context['can_moderate_forum'] = allowedTo('moderate_forum');
     // Are there custom fields they can search?
     ml_findSearchableCustomFields();
     // They're searching..
     if (isset($_REQUEST['search']) && isset($_REQUEST['fields'])) {
         $search = Util::htmlspecialchars(trim(isset($_GET['search']) ? $_GET['search'] : $_POST['search']), ENT_QUOTES);
         $input_fields = isset($_GET['fields']) ? explode(',', $_GET['fields']) : $_POST['fields'];
         $context['old_search'] = $_REQUEST['search'];
         $context['old_search_value'] = urlencode($_REQUEST['search']);
         // No fields?  Use default...
         if (empty($input_fields)) {
             $input_fields = array('name');
         }
         // Set defaults for how the results are sorted
         if (!isset($_REQUEST['sort']) || !isset($context['columns'][$_REQUEST['sort']])) {
             $_REQUEST['sort'] = 'real_name';
         }
         // Build the column link / sort information.
         foreach ($context['columns'] as $col => $column_details) {
             $context['columns'][$col]['href'] = $scripturl . '?action=memberlist;sa=search;start=0;sort=' . $col;
             if (!isset($_REQUEST['desc']) && $col == $_REQUEST['sort'] || $col != $_REQUEST['sort'] && !empty($column_details['default_sort_rev'])) {
                 $context['columns'][$col]['href'] .= ';desc';
             }
             $context['columns'][$col]['href'] .= ';search=' . $search . ';fields=' . implode(',', $input_fields);
             $context['columns'][$col]['link'] = '<a href="' . $context['columns'][$col]['href'] . '" rel="nofollow">' . $context['columns'][$col]['label'] . '</a>';
             $context['columns'][$col]['selected'] = $_REQUEST['sort'] == $col;
         }
         // set up some things for use in the template
         $context['sort_direction'] = !isset($_REQUEST['desc']) ? 'up' : 'down';
         $context['sort_by'] = $_REQUEST['sort'];
         $query_parameters = array('regular_id_group' => 0, 'is_activated' => 1, 'blank_string' => '', 'search' => '%' . strtr($search, array('_' => '\\_', '%' => '\\%', '*' => '%')) . '%', 'sort' => $context['columns'][$_REQUEST['sort']]['sort'][$context['sort_direction']]);
         // Search for a name
         if (in_array('name', $input_fields)) {
             $fields = allowedTo('moderate_forum') ? array('member_name', 'real_name') : array('real_name');
         } else {
             $fields = array();
         }
         // Search for websites.
         if (in_array('website', $input_fields)) {
             $fields += array(7 => 'website_title', 'website_url');
         }
         // Search for groups.
         if (in_array('group', $input_fields)) {
             $fields += array(9 => 'IFNULL(group_name, {string:blank_string})');
         }
         // Search for an email address?
         if (in_array('email', $input_fields)) {
             $fields += array(2 => allowedTo('moderate_forum') ? 'email_address' : '(hide_email = 0 AND email_address');
             $condition = allowedTo('moderate_forum') ? '' : ')';
         } else {
             $condition = '';
         }
         if (defined('DB_CASE_SENSITIVE')) {
             foreach ($fields as $key => $field) {
                 $fields[$key] = 'LOWER(' . $field . ')';
             }
         }
         $customJoin = array();
         $customCount = 10;
         $validFields = array();
         // Any custom fields to search for - these being tricky?
         foreach ($input_fields as $field) {
             $curField = substr($field, 5);
             if (substr($field, 0, 5) === 'cust_' && isset($context['custom_search_fields'][$curField])) {
                 $customJoin[] = 'LEFT JOIN {db_prefix}custom_fields_data AS cfd' . $curField . ' ON (cfd' . $curField . '.variable = {string:cfd' . $curField . '} AND cfd' . $curField . '.id_member = mem.id_member)';
                 $query_parameters['cfd' . $curField] = $curField;
                 $fields += array($customCount++ => 'IFNULL(cfd' . $curField . '.value, {string:blank_string})');
                 $validFields[] = $field;
             }
         }
         if (empty($fields)) {
             redirectexit('action=memberlist');
         }
         $query = $search == '' ? '= {string:blank_string}' : (defined('DB_CASE_SENSITIVE') ? 'LIKE LOWER({string:search})' : 'LIKE {string:search}');
         $where = implode(' ' . $query . ' OR ', $fields) . ' ' . $query . $condition;
         // Find the members from the database.
         $numResults = ml_searchMembers($query_parameters, $customJoin, $where, $_REQUEST['start']);
         $context['page_index'] = constructPageIndex($scripturl . '?action=memberlist;sa=search;search=' . $search . ';fields=' . implode(',', $validFields), $_REQUEST['start'], $numResults, $modSettings['defaultMaxMembers']);
     } else {
         redirectexit('action=memberlist');
     }
     $context['linktree'][] = array('url' => $scripturl . '?action=memberlist;sa=search', 'name' => &$context['page_title']);
     // Highlight the correct button, too!
     unset($context['memberlist_buttons']['view_all_members']['active']);
 }