/**
     * Outputs the HTML for this widget.
     *
     * @global DPA_Achievement_Template $achievements_template Achievements template tag object
     * @global int $blog_id Site ID
     * @global object $bp BuddyPress global settings
     * @param array $args An array of standard parameters for widgets
     * @param array $instance An array of settings for this widget instance
     * @since 2.0
     */
    function widget($args, $instance)
    {
        global $achievements_template, $blog_id, $bp;
        extract($args, EXTR_SKIP);
        if (dpa_has_achievements('type=active&per_page=' . $instance['limit'] . '&max=' . $instance['limit'] . '&populate_extras=0')) {
            echo $before_widget;
            if ($instance['title']) {
                echo $before_title;
                echo esc_html(apply_filters('dpa_widget_title', $instance['title']));
                echo $after_title;
            }
            $show_sitewide_achievements = false;
            if (!$instance['showsitewide']) {
                $show_sitewide_achievements = true;
            }
            ?>

			<div class="avatar-block">
				<?php 
            while (dpa_achievements()) {
                dpa_the_achievement();
                if (!$show_sitewide_achievements && dpa_get_achievement_site_id() == -1) {
                    continue;
                }
                if (is_multisite() && (dpa_get_achievement_site_id() != $blog_id && dpa_get_achievement_site_id() != -1)) {
                    continue;
                }
                ?>
					<div class="item-avatar">
						<a href="<?php 
                dpa_achievement_slug_permalink();
                ?>
"><?php 
                dpa_achievement_picture();
                ?>
</a>
					</div>
				<?php 
            }
            ?>
			</div>
			<p class="achievements-widget-showall"><a href="<?php 
            dpa_achievements_permalink();
            ?>
"><?php 
            _e('Show All', 'dpa');
            ?>
</a></p>
			<div style="clear: right;"></div>

		<?php 
            echo $after_widget;
        }
        $achievements_template = null;
    }
/**
 * Implements the Achievement actions, and unlocks if criteria met.
 *
 * @global DPA_Achievement_Template $achievements_template Achievements template tag object
 * @global int $blog_id Site ID (variable is from NXTClass and hasn't been updated for 3.0; confusing name is confusing)
 * @global object $bp BuddyPress global settings
 * @param string $name Action name
 * @param array $func_args Optional; action's arguments, from func_get_args().
 * @param string $type Optional; if the Achievement's action is called from within the loop in this function (i.e. points awarded), set this to "latent" to avoid a single Achievement being awarded mulitple times.
 * @see dpa_setup_achievements()
 * @since 2.0
 * @uses DPA_Achievement
 */
function dpa_handle_action($name, $func_args = null, $type = '')
{
    global $achievements_template, $blog_id, $bp;
    do_action('dpa_before_handle_action', $name, $func_args, $type);
    if (!($name = apply_filters('dpa_handle_action', $name, $func_args, $type))) {
        return;
    }
    $user_id = apply_filters('dpa_handle_action_user_id', $bp->loggedin_user->id, $name, $func_args, $type);
    if (false === $user_id || empty($user_id)) {
        return;
    }
    if ('latent' == $type) {
        $latent_achievements = DPA_Achievement::get(array('user_id' => $user_id, 'type' => 'active_by_action', 'action' => $name));
        $achievements_template->achievements = array_merge($achievements_template->achievements, $latent_achievements['achievements']);
        $achievements_template->achievement_count += count($latent_achievements['achievements']);
        do_action('dpa_handle_latent_action', $name, $func_args, $is_latent, $latent_achievements);
        // Avoid duplicate invocations of latent Achievement actions
        if ('dpa_points_incremented' == $name) {
            remove_action('dpa_points_incremented', 'dpa_handle_action_dpa_points_incremented', 10, 10);
        }
        if ('dpa_achievement_unlocked' == $name) {
            remove_action('dpa_achievement_unlocked', 'dpa_handle_action_dpa_achievement_unlocked', 10, 10);
        }
        return;
    }
    // This is to support plugins which use the 'dpa_handle_action_user_id' filter to return an array of user IDs.
    if (is_array($user_id)) {
        $user_ids = $user_id;
    } else {
        $user_ids = array($user_id);
    }
    foreach ($user_ids as $user_id) {
        if (dpa_has_achievements(array('user_id' => $user_id, 'type' => 'active_by_action', 'action' => $name))) {
            while (dpa_achievements()) {
                dpa_the_achievement();
                $site_id = apply_filters('dpa_handle_action_site_id', dpa_get_achievement_site_id(), $name, $func_args, $type, $user_id);
                if (false === $site_id) {
                    continue;
                }
                $site_is_valid = false;
                if (!is_multisite() || $site_id < 1 || $blog_id == $site_id) {
                    $site_is_valid = true;
                }
                $group_is_valid = false;
                if (dpa_get_achievement_group_id() < 1 || dpa_is_group_achievement_valid($name, $func_args, $user_id)) {
                    $group_is_valid = true;
                }
                $site_is_valid = apply_filters('dpa_handle_action_site_is_valid', $site_is_valid, $name, $func_args, $type, $user_id);
                $group_is_valid = apply_filters('dpa_handle_action_group_is_valid', $group_is_valid, $name, $func_args, $type, $user_id);
                if ($site_is_valid && $group_is_valid) {
                    dpa_maybe_unlock_achievement($user_id);
                }
            }
        }
    }
    do_action('dpa_after_handle_action', $name, $func_args, $type);
    $achievements_template = null;
}