private function loadOwnerBadges()
 {
     global $wgCityId, $wgExternalSharedDB;
     global $wgEnableAchievementsStoreLocalData;
     wfProfileIn(__METHOD__);
     $where = array('user_id' => $this->mUserOwner->getId());
     if (empty($wgEnableAchievementsStoreLocalData)) {
         $dbr = wfGetDB(DB_SLAVE, array(), $wgExternalSharedDB);
         $where['wiki_id'] = $wgCityId;
     } else {
         $dbr = wfGetDB(DB_SLAVE);
     }
     $res = $dbr->select('ach_user_badges', 'badge_type_id, badge_lap', $where, __METHOD__, array('ORDER BY' => 'date DESC, badge_lap DESC'));
     while ($row = $dbr->fetchObject($res)) {
         if (AchConfig::getInstance()->isInTrack($row->badge_type_id)) {
             // in track
             if (!isset($this->mOwnerBadgesExtended[$row->badge_type_id])) {
                 $this->mOwnerBadgesExtended[$row->badge_type_id] = array();
             }
             $this->mOwnerBadgesExtended[$row->badge_type_id][] = $row->badge_lap;
         } else {
             // not in track
             if (!isset($this->mOwnerBadgesExtended[$row->badge_type_id])) {
                 $this->mOwnerBadgesExtended[$row->badge_type_id] = 0;
             }
             $this->mOwnerBadgesExtended[$row->badge_type_id]++;
         }
         $badge = new AchBadge($row->badge_type_id, $row->badge_lap);
         $to_get = '';
         if (is_array($this->mViewerCounters)) {
             if (AchConfig::getInstance()->isInTrack($row->badge_type_id)) {
                 // in track
                 if (!isset($this->mViewerBadgesExtended[$row->badge_type_id]) || !in_array($row->badge_lap, $this->mViewerBadgesExtended[$row->badge_type_id])) {
                     if (!isset($this->mViewerBadgesExtended[$row->badge_type_id])) {
                         $eventsCounter = 0;
                     } else {
                         if ($row->badge_type_id == BADGE_LOVE) {
                             $eventsCounter = $this->mViewerCounters[$row->badge_type_id][COUNTERS_COUNTER];
                         } else {
                             if ($row->badge_type_id == BADGE_BLOGCOMMENT) {
                                 $eventsCounter = count($this->mViewerCounters[$row->badge_type_id]);
                             } else {
                                 $eventsCounter = $this->mViewerCounters[$row->badge_type_id];
                             }
                         }
                     }
                     $to_get = $badge->getToGet(AchConfig::getInstance()->getRequiredEvents($row->badge_type_id, $row->badge_lap) - $eventsCounter);
                 }
             } else {
                 // not in track
                 if (!isset($this->mViewerBadgesExtended[$row->badge_type_id])) {
                     $to_get = $badge->getToGet();
                 }
             }
         }
         $this->mOwnerBadgesSimple[] = array('badge' => $badge, 'to_get' => $to_get);
     }
     wfProfileOut(__METHOD__);
 }
 public function getChallengesAnnotated()
 {
     wfProfileIn(__METHOD__);
     $achConfig = AchConfig::getInstance();
     $notInTrackCommunityPlatinum = $achConfig->getNotInTrackCommunityPlatinum();
     $inTrackStatic = $achConfig->getInTrackStatic();
     $inTrackEditPlusCategory = $achConfig->getInTrackEditPlusCategory();
     $ownerByType = $this->owner->getBadgesByType();
     $ownerCounters = $this->owner->getCounters();
     $challenges = array();
     // PLATINUM BADGES
     foreach ($notInTrackCommunityPlatinum as $badge_type_id => $badge_config) {
         if ($badge_config['enabled']) {
             if (!isset($ownerByType[$badge_type_id])) {
                 $challenges[$badge_type_id] = null;
             }
         }
     }
     // IN TRACK BADGES (only those for which user already has at least lap 0)
     foreach ($ownerByType as $badge_type_id => $typeData) {
         $badgeType = $achConfig->getBadgeType($badge_type_id);
         if ($badgeType == BADGE_TYPE_INTRACKEDITPLUSCATEGORY) {
             if ($achConfig->isEnabled($badge_type_id)) {
                 $challenges[$badge_type_id] = $typeData['count'];
             }
         } else {
             if ($badgeType == BADGE_TYPE_INTRACKSTATIC) {
                 if ($inTrackStatic[$badge_type_id]['infinite']) {
                     $challenges[$badge_type_id] = $typeData['count'];
                 } else {
                     if ($typeData['count'] < count($inTrackStatic[$badge_type_id]['laps'])) {
                         $challenges[$badge_type_id] = $typeData['count'];
                     }
                 }
             }
         }
     }
     $challengesOrder = array(BADGE_WELCOME, BADGE_INTRODUCTION, BADGE_EDIT, 0, BADGE_PICTURE, BADGE_SAYHI, BADGE_BLOGCOMMENT, BADGE_CATEGORY, BADGE_BLOGPOST, BADGE_LOVE);
     foreach ($challengesOrder as $badge_type_id) {
         if ($badge_type_id == 0) {
             foreach ($inTrackEditPlusCategory as $badge_type_id_2 => $badge_config) {
                 if ($badge_config['enabled']) {
                     if (!isset($ownerByType[$badge_type_id_2]) && !isset($challenges[$badge_type_id_2])) {
                         $challenges[$badge_type_id_2] = 0;
                     }
                 }
             }
         } else {
             if (!isset($ownerByType[$badge_type_id]) && !isset($challenges[$badge_type_id])) {
                 $challenges[$badge_type_id] = $achConfig->isInTrack($badge_type_id) ? 0 : null;
             }
         }
     }
     global $wgEnableAchievementsForSharing;
     $challengesAnnotated = array();
     foreach ($challenges as $badge_type_id => $badge_lap) {
         $badge = new AchBadge($badge_type_id, $badge_lap);
         if ($badge_lap === null) {
             $toGet = $badge->getToGet();
         } else {
             if (!isset($ownerCounters[$badge_type_id])) {
                 $eventsCounter = 0;
             } else {
                 if ($badge_type_id == BADGE_LOVE) {
                     $eventsCounter = $ownerCounters[$badge_type_id][COUNTERS_COUNTER];
                 } else {
                     if ($badge_type_id == BADGE_BLOGCOMMENT) {
                         $eventsCounter = count($ownerCounters[$badge_type_id]);
                     } else {
                         $eventsCounter = $ownerCounters[$badge_type_id];
                     }
                 }
             }
             $requiredEvents = $achConfig->getRequiredEvents($badge_type_id, $badge_lap);
             $toGet = $badge->getToGet($requiredEvents);
             if ($badge_type_id != BADGE_SHARING) {
                 $toGet .= " ({$eventsCounter}/{$requiredEvents})";
             } else {
                 if (empty($wgEnableAchievementsForSharing)) {
                     continue;
                 }
             }
         }
         $challengesAnnotated[] = array('badge' => $badge, 'to_get' => $toGet);
     }
     wfProfileOut(__METHOD__);
     return $challengesAnnotated;
 }