You are here

avatar_selection.module in Avatar Selection 6

The Avatar Selection module allows the user to pick an avatar image from a list already loaded by an administrative user, and to the administrator to disable uploading other avatar files by the user.

File

avatar_selection.module
View source
<?php

/**
 * @file
 * The Avatar Selection module allows the user to pick an avatar image from a
 * list already loaded by an administrative user, and to the administrator to
 * disable uploading other avatar files by the user.
 */

/**
 * Implementation of hook_help().
 */
function avatar_selection_help($path, $arg) {
  $output = '';
  switch ($path) {
    case 'admin/help#avatar_selection':
      $output .= '<p>' . t('Allows the user to pick an avatar from a list.') . '</p>';
      return $output;
    case 'admin/modules#description':
      return t('Allows the user to pick an avatar from a list.');
    case 'admin/settings/avatar_selection/images':
      return t('Upload images to display as a user avatar.  These images can be anything you like, but it is recommended that you maintain a uniform icon size for all of your avatars.  Maximum dimensions are 85x85 and the maximum size is 30 kB.');
  }
}

/**
 * Implementation of hook_perm().
 *
 * Define the permissions this module uses.
 */
function avatar_selection_perm() {
  return array(
    'administer avatar selection',
    'access avatars',
    'upload avatar in profile',
  );
}

/**
 * Implementation of hook_access().
 *
 * Define what does each permission means :
 * 'view' is included in the 'access avatars' permission; while 'create',
 * 'update' and 'delete' are included in the 'administrer avatar selection'.
 *
 * @param $op
 *   The action the user wants to do after the function checks the permission.
 * @param $node
 *   The node where the specific permission is requested.
 * @return
 *   The access needed to perform a certain operation.
 */
function avatar_selection_access($op, $node, $account) {
  if ($op == 'view') {
    return user_access('access avatars');
  }
  elseif ($op == 'create' || $op == 'update' || $op == 'delete') {
    return user_access('administer avatar selection');
  }
}

/**
 * Implementation of hook_menu().
 */
function avatar_selection_menu() {
  $items = array();
  $items['admin/settings/avatar_selection'] = array(
    'title' => 'Avatar Selection',
    'description' => 'Allows the user to upload and delete avatars.',
    'file' => 'avatar_selection.admin.inc',
    'page callback' => 'avatar_selection_settings_page',
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer avatar selection',
    ),
  );
  $items['admin/settings/avatar_selection/config'] = array(
    'title' => 'Configure',
    'description' => 'Allows the user to configure avatar settings.',
    'file' => 'avatar_selection.admin.inc',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'avatar_selection_config_form',
    ),
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer avatar selection',
    ),
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -10,
  );
  $items['admin/settings/avatar_selection/upload'] = array(
    'title' => 'Upload',
    'description' => 'Allows the user to upload avatars.',
    'file' => 'avatar_selection.admin.inc',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'avatar_selection_upload_form',
    ),
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer avatar selection',
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => -9,
  );
  $items['admin/settings/avatar_selection/edit'] = array(
    'title' => 'Manage avatars',
    'description' => 'Allows the user to modify or delete an avatar from a list.',
    'file' => 'avatar_selection.admin.inc',
    'page callback' => 'avatar_selection_roles_page',
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer avatar selection',
    ),
    'type' => MENU_LOCAL_TASK,
  );
  $items['admin/settings/avatar_selection/edit/role/%'] = array(
    'title' => 'Manage avatars',
    'description' => 'Allows the user to modify or delete an avatar from a list.',
    'file' => 'avatar_selection.admin.inc',
    'page callback' => 'avatar_selection_roles_page',
    'page arguments' => array(
      'op' => 'role',
    ),
    'access callback' => 'user_access',
    'access arguments' => array(
      'administer avatar selection',
    ),
  );
  if (module_exists('og')) {
    $items['admin/settings/avatar_selection/edit/og/%'] = array(
      'title' => 'Manage avatars',
      'description' => 'Allows the user to modify or delete an avatar from a list.',
      'file' => 'avatar_selection.admin.inc',
      'page callback' => 'avatar_selection_roles_page',
      'page arguments' => array(
        'op' => 'og',
      ),
      'access callback' => 'user_access',
      'access arguments' => array(
        'administer avatar selection',
      ),
    );
  }
  return $items;
}

/**
 * Implementation of hook_form_alter().
 *
 * Create the form structure for adding an avatar in the user registration page.
 *
 * @param &$form
 *   General reference used in drupal, defining the structure & the fields of
 *   a form.
 * @param $form_state
 *   General variable, used to control the processing of the form.
 * @param $form_id
 *   The default is 'user_register'; hold the page where the function is being
 *   used.
 * @return
 *   Return the structure of the form.
 */
function avatar_selection_form_user_register_alter(&$form, $form_state, $form_id = 'user_register') {

  // We need the pager global variables.
  global $_GET;

  // If user pictures aren't enabled, nothing to do here.
  if (!variable_get('user_pictures', 0)) {
    return;
  }
  $anon_user = drupal_anonymous_user();

  // See if user has access to avatars.
  $disable_upload = variable_get('avatar_selection_disable_user_upload', 0) && !user_access('upload avatar in profile');
  if (!user_access('access avatars')) {

    // If uploads also disabled, remove the field altogether.
    if ($disable_upload) {
      unset($form['picture']);
    }

    // To allow random avatars to be assigned on registration.
    $form['#validate'][] = 'avatar_selection_validate_user_avatar';
    return $form;
  }

  // We find out the current page number.
  $page = 0;
  if (isset($_GET['page']) && is_numeric($_GET['page'])) {
    $page = $_GET['page'];
  }
  $force_choose = variable_get('avatar_selection_force_user_avatar_reg', 0);
  $avatars_per_page = variable_get('avatar_selection_avatar_per_page', 30);
  $selects = _avatar_selection_image_list($anon_user, '', 0, $page * $avatars_per_page, $avatars_per_page);
  if (count($selects['avatars'])) {
    drupal_add_css(drupal_get_path('module', 'avatar_selection') . '/avatar_selection.css');
    $upload = 1;
    if (empty($form['picture']) || !is_array($form['picture'])) {
      $upload = 0;

      // I.e. Not provided by 'register with picture' contributed module.
      $form['picture'] = array(
        '#type' => 'fieldset',
        '#title' => t('Picture'),
        '#weight' => 1,
      );
    }
    drupal_add_js(drupal_get_path('module', 'avatar_selection') . '/js/avatar_selection_pager.js', 'module', 'header');
    $form['picture']['select_avatar'] = array(
      '#type' => 'radios',
      '#title' => $upload == 0 ? t('Select an avatar') : t('Or simply select an icon'),
      '#description' => $upload ? '' : t('Your virtual face or picture.'),
      '#options' => $selects['avatars'],
      '#required' => $force_choose ? TRUE : FALSE,
      '#attributes' => array(
        'class' => 'user-avatar-select',
      ),
      '#prefix' => '<div id="avatar-selection-loading"></div>',
      '#suffix' => theme('avatar_selection_pager', 'form#user-register', 'div.user-avatar-select', $selects['total'], $avatars_per_page),
    );
    $form['#validate'][] = 'avatar_selection_validate_user_avatar';
  }
  else {
    $form['#validate'][] = 'avatar_selection_validate_user_avatar';
  }
  $js_file = drupal_get_path('module', 'avatar_selection') . '/js/avatar_selection.js';
  drupal_add_js($js_file, 'module', 'header');
  return $form;
}

/**
 * Implementation of hook_form_alter().
 *
 * Create the form structure for adding an avatar in the user profile page.
 *
 * @param &$form
 *   General reference used in drupal, defining the structure & the fields of
 *   a form.
 * @param $form_state
 *   General variable, used to control the processing of the form.
 * @param $form_id
 *   The default is 'user_profile_form'; holds the form name.
 * @return
 *   Return the structure of the form.
 */
function avatar_selection_form_user_profile_form_alter(&$form, $form_state, $form_id = 'user_profile_form') {

  // We need the pager global variables.
  global $_GET;

  // If user pictures aren't enabled, nothing to do here.
  if (!variable_get('user_pictures', 0) || empty($form['picture'])) {
    return;
  }
  $user = user_load(array(
    'uid' => $form['#uid'],
  ));

  // See if user has access to avatars.
  $disable_upload = variable_get('avatar_selection_disable_user_upload', 0) && !user_access('upload avatar in profile');
  if (!user_access('access avatars')) {

    // If uploads also disabled, remove the field altogether.
    if ($disable_upload) {
      unset($form['picture']);
    }
    return;
  }

  // We find out the current page number.
  $page = 0;
  if (isset($_GET['page']) && is_numeric($_GET['page'])) {
    $page = $_GET['page'];
  }
  if (is_array($form['picture'])) {
    drupal_add_css(drupal_get_path('module', 'avatar_selection') . '/avatar_selection.css');
    $force_choose = variable_get('avatar_selection_force_user_avatar', 0);

    // If upload support has been disabled, remove the ability to upload and
    // delete pictures.
    if ($disable_upload) {
      unset($form['picture']['picture_delete']);
      unset($form['picture']['picture_upload']);
    }
    else {
      $force_choose = 0;
    }

    // Show selection options.
    if (!isset($user->og_groups)) {
      $user->og_groups = '';
    }
    $avatars_per_page = variable_get('avatar_selection_avatar_per_page', 30);
    $selects = _avatar_selection_image_list($user, '', 0, $page * $avatars_per_page, $avatars_per_page);
    if (count($selects['avatars']) && isset($form['picture']['#type'])) {
      $current_avatar = basename($user->picture);
      drupal_add_js(drupal_get_path('module', 'avatar_selection') . '/js/avatar_selection_pager.js', 'module', 'header');
      $form['picture']['select_avatar'] = array(
        '#type' => 'radios',
        '#title' => $disable_upload ? t('Select an avatar') : t('Or simply select an icon'),
        '#description' => $disable_upload ? t('Your virtual face or picture.') : '',
        '#options' => $selects['avatars'],
        '#default_value' => array_key_exists($current_avatar, $selects['avatars']) ? $current_avatar : '',
        '#required' => $force_choose ? TRUE : FALSE,
        '#attributes' => array(
          'class' => 'user-avatar-select',
        ),
        '#prefix' => '<div id="avatar-selection-loading"></div>',
        '#suffix' => theme('avatar_selection_pager', 'form#user-profile-form', 'div.user-avatar-select', $selects['total'], $avatars_per_page),
      );
      $form['#validate'][] = 'avatar_selection_validate_user_avatar';
    }
    else {
      $form['#validate'][] = 'avatar_selection_validate_user_avatar';
    }

    // Don't allow user to delete a selected avatar.
    $path = '/avatar_selection/';
    if (!empty($form['picture']['current_picture']['#value']) && preg_match($path, $form['picture']['current_picture']['#value'])) {
      $form['_account']['#value']->picture = NULL;
      unset($form['picture']['picture_delete']);
    }
    $js_file = drupal_get_path('module', 'avatar_selection') . '/js/avatar_selection.js';
    drupal_add_js($js_file, 'module', 'header');
  }
  return $form;
}

/**
 * Validate and upload the user's picture.
 *
 * @param &$form
 *   General reference used in drupal, defining the structure & the fields of a
 *   form.
 * @param &$form_state
 *   General reference, used to control the processing of the form.
 */
function avatar_selection_validate_user_avatar(&$form, &$form_state) {

  // If required, validate the uploaded picture.
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(
      variable_get('user_picture_dimensions', '85x85'),
    ),
    'file_validate_size' => array(
      variable_get('user_picture_file_size', 30) * 1024,
    ),
  );
  $file = file_save_upload('picture_upload', $validators);
  if (!$file && !empty($form_state['values']['select_avatar'])) {
    unset($form_state['values']['picture_delete']);
    $path = file_create_path('avatar_selection') . '/';
    $form_state['values']['picture'] = $path . $form_state['values']['select_avatar'];
  }
  elseif (!$file && variable_get('avatar_selection_set_random_default', FALSE)) {
    if (isset($form_state['values']['_account'])) {
      $user = $form_state['values']['_account'];
    }
    else {
      $user = drupal_anonymous_user();
    }
    if ($user->picture && $form_state['values']['picture_delete'] != 1) {
      $form_state['values']['picture'] = $user->picture;
    }
    else {
      unset($form_state['values']['picture_delete']);
      $form_state['values']['picture'] = avatar_selection_get_random_image($user);
    }
  }
}

/**
 * Select a random avatar picture for a certain user.
 *
 * @param $user
 *   User object.
 * @return
 *   Return the path to the image to be shown as avatar.
 */
function avatar_selection_get_random_image($user) {
  $avatars = _avatar_selection_image_list($user);
  if ($avatars['total'] > 0) {
    $avatar = array_rand($avatars['avatars'], 1);
    if ($avatar) {
      $path = file_create_path('avatar_selection');
      $avatar = $path . '/' . $avatar;
      return $avatar;
    }
  }
  return ' ';
}

/**
 * Get the list of avatars available to a certain user.
 *
 * @param $user
 *   User object (optional).
 * @param $set_type
 *   Set type, can be 'role' or 'og' (optional).
 * @param $set_id
 *   The unique identifier of the set (optional).
 * @param $from
 *   The offset.
 * @param $count
 *   Number of avatars to return.
 * @return
 *   Return an array with the list of avatars for the current user, together
 *   with the number of avatars.
 */
function _avatar_selection_image_list($user = '', $set_type = '', $set_id = 0, $from = 0, $count = 0) {
  $avatars = array();
  $dir = file_create_path('avatar_selection');
  $url = file_create_url($dir);
  $total = 0;

  // If we're searching on a particular role.
  if ($set_type == 'role') {
    if ($set_id) {
      $total = db_result(db_query("SELECT count(*) FROM {avatar_selection} avs, {avatar_selection_roles} avsr WHERE avs.aid = avsr.aid AND avsr.rid = %d", $set_id));
      $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs, {avatar_selection_roles} avsr WHERE avs.aid = avsr.aid AND avsr.rid = %d ORDER BY weight, name, avatar", $set_id, $from, $count);
    }
    else {
      $total = db_result(db_query("SELECT count(*) FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE avsr.rid IS NULL"));
      $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE avsr.rid IS NULL ORDER BY weight, name, avatar", $from, $count);
    }
  }
  elseif ($set_type == 'og') {
    if ($set_id) {
      $total = db_result(db_query("SELECT count(*) FROM {avatar_selection} avs, {avatar_selection_og} og WHERE avs.aid = og.aid AND og.ogid = %d", $set_id));
      $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs, {avatar_selection_og} og WHERE avs.aid = og.aid AND og.ogid = %d ORDER BY weight, name, avatar", $set_id, $from, $count);
    }
    else {
      $total = db_result(db_query("SELECT count(*) FROM {avatar_selection} avs LEFT JOIN {avatar_selection_og} og ON avs.aid = og.aid WHERE og.ogid IS NULL"));
      $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs LEFT JOIN {avatar_selection_og} og ON avs.aid = og.aid WHERE og.ogid IS NULL ORDER BY weight, name, avatar", $from, $count);
    }
  }
  elseif (!empty($user)) {

    // Set up some variables.
    $user_roles = array_keys($user->roles);
    $user_og = array();
    if (module_exists('og')) {
      if (!empty($user->og_groups) && is_array($user->og_groups)) {
        $user_og = array_keys($user->og_groups);
      }
    }

    // Distinct avatars are enabled.
    if (variable_get('avatar_selection_distinctive_avatars', FALSE)) {

      // Organic groups enabled.
      if (module_exists('og') && !empty($user_og)) {
        $total = db_result(db_query("SELECT count(distinct avs.aid) FROM {avatar_selection} avs LEFT JOIN {users} u ON u.picture = concat('%s/', avs.avatar) LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid LEFT JOIN {avatar_selection_og} avso ON avs.aid = avso.aid WHERE u.picture IS NULL AND (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")) AND (avso.ogid IS NULL OR avso.ogid IN (" . db_placeholders($user_og) . "))", array_merge(array(
          $dir,
        ), $user_roles, $user_og)));
        if ($count == 0) {
          $count = $total;
        }
        $result = db_query_range("SELECT DISTINCT avatar, avs.name, avs.weight FROM {avatar_selection} avs LEFT JOIN {users} u ON u.picture = concat('%s/', avs.avatar) LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid LEFT JOIN {avatar_selection_og} avso ON avs.aid = avso.aid WHERE u.picture IS NULL AND (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")) AND (avso.ogid IS NULL OR avso.ogid IN (" . db_placeholders($user_og) . ")) ORDER BY avs.weight, avs.name, avatar", array_merge(array(
          $dir,
        ), $user_roles, $user_og), $from, $count);
      }
      else {
        $total = db_result(db_query("SELECT count(distinct avs.aid) FROM {avatar_selection} avs LEFT JOIN {users} u ON u.picture = concat('%s/', avs.avatar) LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE u.picture IS NULL AND (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . "))", array_merge(array(
          $dir,
        ), $user_roles)));
        if ($count == 0) {
          $count = $total;
        }
        $result = db_query_range("SELECT DISTINCT avatar, avs.name, avs.weight FROM {avatar_selection} avs LEFT JOIN {users} u ON u.picture = concat('%s/', avs.avatar) LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE u.picture IS NULL AND (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")) ORDER BY avs.weight, avs.name, avatar", array_merge(array(
          $dir,
        ), $user_roles), $from, $count);
      }
    }
    elseif ($user->uid > 1 || in_array(1, array_keys($user->roles))) {

      // Organic groups enabled.
      if (module_exists('og') && !empty($user_og)) {
        $total = db_result(db_query("SELECT count(distinct avs.aid) FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid LEFT JOIN {avatar_selection_og} avso ON avs.aid = avso.aid WHERE (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")) AND (avso.ogid IS NULL OR avso.ogid IN (" . db_placeholders($user_og) . "))", array_merge($user_roles, $user_og)));
        if ($count == 0) {
          $count = $total;
        }
        $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid LEFT JOIN {avatar_selection_og} avso ON avs.aid = avso.aid WHERE (avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")) AND (avso.ogid IS NULL OR avso.ogid IN (" . db_placeholders($user_og) . ")) ORDER BY weight, name, avatar", array_merge($user_roles, $user_og), $from, $count);
      }
      else {
        $total = db_result(db_query("SELECT count(distinct avs.aid) FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ")", $user_roles));
        if ($count == 0) {
          $count = $total;
        }
        $result = db_query_range("SELECT DISTINCT avatar, name, weight FROM {avatar_selection} avs LEFT JOIN {avatar_selection_roles} avsr ON avs.aid = avsr.aid WHERE avsr.rid IS NULL OR avsr.rid IN (" . db_placeholders($user_roles) . ") ORDER BY weight, name, avatar", $user_roles, $from, $count);
      }
    }
    else {
      $total = db_result(db_query("SELECT count(*) FROM {avatar_selection} avs"));
      if ($count == 0) {
        $count = $total;
      }
      $result = db_query_range("SELECT aid, avatar, name, weight FROM {avatar_selection} avs ORDER BY weight, name, avatar", $from, $count);
    }
  }
  if (module_exists('imagecache')) {
    $imagecache_preset = variable_get('avatar_selection_imagecache_preset', 0);
  }
  while ($avatar = db_fetch_object($result)) {
    $avs_image = $avatar->avatar;
    $name = $avatar->name;
    if (module_exists('imagecache') && $imagecache_preset) {
      $avatars[$avs_image] = theme('imagecache', $imagecache_preset, $dir . '/' . $avs_image, $name, $name);
    }
    else {
      $avatars[$avs_image] = theme('image', $url . '/' . $avs_image, $name, $name, NULL, FALSE);
    }
  }
  $selects['avatars'] = $avatars;
  $selects['total'] = $total;
  return $selects;
}

/**
 * Implementation of hook_file_download().
 *
 * Ensure that user pictures (avatars) are always downloadable.
 *
 * @param $file
 *   The path to the file that will be checked if downloadable.
 * @return
 *   An array containing the file mime type and size, generated by the array()
 *   function, if everything is fine.  NULL, if the file is not downloadable.
 */
function avatar_selection_file_download($file) {
  if (user_access('access content')) {
    $data = explode('/', $file);
    $icon = array_pop($data);
    $folder = implode('/', $data);
    if ('avatar_selection' == $folder) {
      $info = image_get_info(file_create_path($file));
      return array(
        'Content-type: ' . $info['mime_type'],
        'Content-length: ' . $info['file_size'],
      );
    }
    else {
      return NULL;
    }
  }
}

/**
 * Implementation of hook_theme().
 */
function avatar_selection_theme() {
  return array(
    'avatar_selection_pager' => array(
      'arguments' => array(
        'form_id' => NULL,
        'class' => NULL,
        'total' => 10,
        'limit' => 10,
      ),
    ),
    'avatar_selection_pager_link' => array(
      'arguments' => array(
        'text' => NULL,
        'url' => NULL,
        'page' => 0,
        'form_id' => NULL,
        'dom_identifier' => NULL,
      ),
    ),
  );
}

/**
 * Output themed pager navigation.
 *
 * @param $form_id
 *   CSS identifier for the form to modify.
 * @param $dom_identifier
 *   CSS identifier of form element to replace.
 * @param $total
 *   Total number of elements to navigate through.
 * @param $limit
 *   Maximum number of elements to show on one page.
 * @return
 *   HTML formatted pager navigation.
 */
function theme_avatar_selection_pager($form_id, $dom_identifier, $total = 10, $limit = 10) {
  $path = $_GET['q'];
  $total_pages = ceil($total / $limit);
  $current_page = isset($_GET['page']) ? $_GET['page'] : 0;

  // Calculate various markers within this pager piece:
  // Middle is used to 'center' pages around the current page.
  $middle_page = 5;
  $first_page = $current_page - $middle_page + 1;
  $last_page = $current_page + $middle_page + 1;
  $output = '<div class="avatar-selection-pager-nav">';
  if ($current_page > 0) {
    $output .= theme('avatar_selection_pager_link', t('« first'), $path, 0, $form_id, $dom_identifier);
    $output .= theme('avatar_selection_pager_link', t('‹ previous'), $path, $current_page - 1, $form_id, $dom_identifier);
  }
  $i = $first_page;

  // Adjust 'center' if at end of query.
  if ($last_page > $total_pages) {
    $i = $i + ($total_pages - $last_page);
    $last_page = $total_pages;
  }

  // Adjust 'center' if at start of query.
  if ($i <= 0) {
    $last_page = $last_page + (1 - $i);
    $i = 1;
  }

  // When there is more than one page, create the pager list.
  if ($total_pages > 1) {
    for (; $i <= $last_page && $i <= $total_pages; $i++) {
      if ($i < $current_page + 1) {
        $output .= theme('avatar_selection_pager_link', $i, $path, $i - 1, $form_id, $dom_identifier);
      }
      if ($i == $current_page + 1) {
        $output .= '<strong class="pager-current">' . $i . '</strong>';
      }
      if ($i > $current_page + 1) {
        $output .= theme('avatar_selection_pager_link', $i, $path, $i - 1, $form_id, $dom_identifier);
      }
    }
  }
  if ($current_page + 1 < $total_pages) {
    $output .= theme('avatar_selection_pager_link', t('next ›'), $path, $current_page + 1, $form_id, $dom_identifier);
    $output .= theme('avatar_selection_pager_link', t('last »'), $path, $total_pages - 1, $form_id, $dom_identifier);
  }
  $output .= '</div>';
  return $output;
}

/**
 * Output themed pager navigation link.
 *
 * @param $text
 *   Link (human-readable) text.
 * @param $path
 *   Current page.
 * @param $page
 *   Page number to display.
 * @param $form_id
 *   CSS identifier for the form to modify.
 * @param $dom_identifier
 *   CSS identifier of form element to replace.
 * @return
 *   HTML formatted link for pager.
 */
function theme_avatar_selection_pager_link($text, $path, $page, $form_id, $dom_identifier) {
  $url = url($path);
  $clean_urls = variable_get('clean_url', TRUE);
  $onclick = "return fetchPage('{$form_id}', '{$dom_identifier}', '{$url}', {$page}, {$clean_urls});";
  $output .= l($text, $path, array(
    'attributes' => array(
      'onclick' => $onclick,
    ),
    'query' => "page={$page}",
  ));
  return $output;
}

Functions

Namesort descending Description
avatar_selection_access Implementation of hook_access().
avatar_selection_file_download Implementation of hook_file_download().
avatar_selection_form_user_profile_form_alter Implementation of hook_form_alter().
avatar_selection_form_user_register_alter Implementation of hook_form_alter().
avatar_selection_get_random_image Select a random avatar picture for a certain user.
avatar_selection_help Implementation of hook_help().
avatar_selection_menu Implementation of hook_menu().
avatar_selection_perm Implementation of hook_perm().
avatar_selection_theme Implementation of hook_theme().
avatar_selection_validate_user_avatar Validate and upload the user's picture.
theme_avatar_selection_pager Output themed pager navigation.
theme_avatar_selection_pager_link Output themed pager navigation link.
_avatar_selection_image_list Get the list of avatars available to a certain user.