--- user_badges.module.orig	Wed Aug 12 22:54:00 2009
+++ user_badges.module	Thu Aug 13 15:57:23 2009
@@ -120,6 +120,7 @@
     case 'load':
       if ($account->uid > 0) {
         $account->badges = user_badges_get_badges($account->uid);
+        $account->all_badges = user_badges_get_all_badges_for_user($account->uid);
       }
       break;
 
@@ -162,7 +163,7 @@
         $added = array_diff(array_keys($new_roles), array_keys((array)$account->roles));
         foreach ($added as $rid) {
           // if this role has a badge
-          if (key_exists($rid, $roles) && !key_exists($roles[$rid], $account->badges)) {
+          if (key_exists($rid, $roles) && !key_exists($roles[$rid], $account->all_badges)) {
             $success = user_badges_user_add_badge($account->uid, $roles[$rid], 'role');
             if ($success && $message) {
               drupal_set_message(t('User assigned %name badge.', array('%name' => $badges[$roles[$rid]])));
@@ -174,11 +175,13 @@
         $removed = array_diff(array_keys((array)$account->roles), array_keys($new_roles));
         foreach ($removed as $rid) {
           // If this role has a badge and user has this badge..
-          if (key_exists($rid, $roles) && key_exists($roles[$rid], $account->badges)) {
+          if (key_exists($rid, $roles) && key_exists($roles[$rid], $account->all_badges)) {
             $success = user_badges_user_remove_badge($account->uid, $roles[$rid], 'role');
             drupal_set_message(t('%name badge removed from user.', array('%name' => $badges[$roles[$rid]])));
           }
         }
+        $account->badges = user_badges_get_badges($account->uid);
+        $account->all_badges = user_badges_get_all_badges_for_user($account->uid);
       }
       break;
 
@@ -422,6 +425,26 @@
   return $badges;
 }
 
+/**
+ * Return array of all badges of user with user id = $uid
+ *  where keys are badge ids (bid) and values are object containing badge info
+ */
+function user_badges_get_all_badges_for_user($uid) {
+  $badges = array();
+  $sql = db_query('
+    SELECT DISTINCT b.bid, b.weight, b.name, b.image, b.href
+    FROM {user_badges_badges} b
+      INNER JOIN {user_badges_user} u ON b.bid = u.bid
+    WHERE u.uid = %d
+    ORDER BY b.weight, b.name',
+    $uid
+  );
+  while ($badge = db_fetch_object($sql)) {
+    $badges[$badge->bid] = $badge;
+  }
+
+  return $badges;
+}
 
 /**
  * Return badge object for given badge id
