/**
  * Sync groups upstream
  *
  * @param  integer $gid (group id)
  * @return void
  */
 function groups_upstream_sync($gid)
 {
     $sql = 'SELECT * FROM ' . get_table_name($this->db_groupmembers) . ' WHERE contactgroup_id=?';
     $res = $this->db->query($sql, $gid);
     while ($member = $this->db->fetch_assoc($res)) {
         $members[] = $member;
     }
     if (is_array($members)) {
         foreach ($members as $member) {
             $sql = 'SELECT * FROM ' . get_table_name($this->db_name) . ' WHERE user_id=? AND carddav_contact_id=?';
             $res = $this->db->query($sql, $this->rc->user->ID, $member['contact_id']);
             $contact = $this->db->fetch_assoc($res);
             $vcard = new rcube_vcard();
             $vcard->load($contact['vcard']);
             $save_data = $vcard->get_assoc();
             $save_data['groups'][0] = array();
             $sql = 'SELECT contactgroup_id FROM ' . get_table_name($this->db_groupmembers) . ' WHERE contact_id=?';
             $res = $this->db->query($sql, $member['contact_id']);
             while ($group_id = $this->rc->db->fetch_assoc($res)) {
                 $group_ids[] = $group_id;
             }
             if (!empty($group_ids)) {
                 $categories = array();
                 foreach ($group_ids as $group_id) {
                     $sql = 'SELECT name FROM ' . get_table_name($this->db_groups) . ' WHERE contactgroup_id=? AND del=?';
                     $res = $this->db->query($sql, $group_id['contactgroup_id'], 0);
                     if ($category = $this->rc->db->fetch_assoc($res)) {
                         if ($category['name']) {
                             $categories[$category['name']] = $category['name'];
                         }
                     }
                 }
                 if (!empty($categories)) {
                     $save_data['groups'] = implode(',', $categories);
                 }
             }
             $this->update($member['contact_id'], $save_data);
         }
     }
 }