Beispiel #1
0
 /**
  * Exports a given Turba_Object as an iCalendar vCard.
  *
  * @param Turba_Object $object  Turba_Object.
  * @param string $version       The vcard version to produce.
  * @param array $fields         Hash of field names and
  *                              Horde_SyncMl_Property properties with the
  *                              requested fields.
  * @param boolean $skipEmpty    Whether to skip empty fields.
  *
  * @return Horde_Icalendar_Vcard  A vcard object.
  */
 public function tovCard(Turba_Object $object, $version = '2.1', array $fields = null, $skipEmpty = false)
 {
     global $injector;
     $hash = $object->getAttributes();
     $attributes = array_keys($this->map);
     $vcard = new Horde_Icalendar_Vcard($version);
     $formattedname = false;
     $charset = $version == '2.1' ? array('CHARSET' => 'UTF-8') : array();
     $hooks = $injector->getInstance('Horde_Core_Hooks');
     $decode_hook = $hooks->hookExists('decode_attribute', 'turba');
     // Tags are stored externally to Turba, so they don't appear in the
     // source map.
     $attributes[] = '__tags';
     foreach ($attributes as $key) {
         $val = $object->getValue($key);
         if ($skipEmpty && !is_array($val) && !strlen($val)) {
             continue;
         }
         if ($decode_hook) {
             try {
                 $val = $hooks->callHook('decode_attribute', 'turba', array($key, $val, $object));
             } catch (Turba_Exception $e) {
             }
         }
         switch ($key) {
             case '__uid':
                 $vcard->setAttribute('UID', $val);
                 break;
             case 'name':
                 if ($fields && !isset($fields['FN'])) {
                     break;
                 }
                 $vcard->setAttribute('FN', $val, Horde_Mime::is8bit($val) ? $charset : array());
                 $formattedname = true;
                 break;
             case 'nickname':
             case 'alias':
                 $params = Horde_Mime::is8bit($val) ? $charset : array();
                 if (!$fields || isset($fields['NICKNAME'])) {
                     $vcard->setAttribute('NICKNAME', $val, $params);
                 }
                 if (!$fields || isset($fields['X-EPOCSECONDNAME'])) {
                     $vcard->setAttribute('X-EPOCSECONDNAME', $val, $params);
                 }
                 break;
             case 'homeAddress':
                 if ($fields && (!isset($fields['LABEL']) || isset($fields['LABEL']->Params['TYPE']) && !$this->_hasValEnum($fields['LABEL']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('LABEL', $val, array('HOME' => null));
                 } else {
                     $vcard->setAttribute('LABEL', $val, array('TYPE' => 'HOME'));
                 }
                 break;
             case 'workAddress':
                 if ($fields && (!isset($fields['LABEL']) || isset($fields['LABEL']->Params['TYPE']) && !$this->_hasValEnum($fields['LABEL']->Params['TYPE']->ValEnum, 'WORK'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('LABEL', $val, array('WORK' => null));
                 } else {
                     $vcard->setAttribute('LABEL', $val, array('TYPE' => 'WORK'));
                 }
                 break;
             case 'otherAddress':
                 if ($fields && !isset($fields['LABEL'])) {
                     break;
                 }
                 $vcard->setAttribute('LABEL', $val);
                 break;
             case 'phone':
                 if ($fields && !isset($fields['TEL'])) {
                     break;
                 }
                 $vcard->setAttribute('TEL', $val);
                 break;
             case 'homePhone':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('HOME' => null, 'VOICE' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => array('HOME', 'VOICE')));
                 }
                 break;
             case 'workPhone':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'WORK'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('WORK' => null, 'VOICE' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => array('WORK', 'VOICE')));
                 }
                 break;
             case 'cellPhone':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'CELL'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('CELL' => null, 'VOICE' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => array('CELL', 'VOICE')));
                 }
                 break;
             case 'homeCellPhone':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'CELL')) {
                         if ($version == '2.1') {
                             $parameters['CELL'] = null;
                             $parameters['VOICE'] = null;
                         } else {
                             $parameters['TYPE'] = array('CELL', 'VOICE');
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'HOME')) {
                         if ($version == '2.1') {
                             $parameters['HOME'] = null;
                             $parameters['VOICE'] = null;
                         } else {
                             $parameters['TYPE'] = array('HOME', 'VOICE');
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('CELL' => null, 'HOME' => null, 'VOICE' => null);
                     } else {
                         $parameters = array('TYPE' => array('CELL', 'HOME', 'VOICE'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 break;
             case 'workCellPhone':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'CELL')) {
                         if ($version == '2.1') {
                             $parameters['CELL'] = null;
                             $parameters['VOICE'] = null;
                         } else {
                             $parameters['TYPE'] = array('CELL', 'VOICE');
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'WORK')) {
                         if ($version == '2.1') {
                             $parameters['WORK'] = null;
                             $parameters['VOICE'] = null;
                         } else {
                             $parameters['TYPE'] = array('WORK', 'VOICE');
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('CELL' => null, 'WORK' => null, 'VOICE' => null);
                     } else {
                         $parameters = array('TYPE' => array('CELL', 'WORK', 'VOICE'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 break;
             case 'videoCall':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'VIDEO'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('VIDEO' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => 'VIDEO'));
                 }
                 break;
             case 'homeVideoCall':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'VIDEO')) {
                         if ($version == '2.1') {
                             $parameters['VIDEO'] = null;
                         } else {
                             $parameters['TYPE'] = 'VIDEO';
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'HOME')) {
                         if ($version == '2.1') {
                             $parameters['HOME'] = null;
                         } else {
                             $parameters['TYPE'] = 'HOME';
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('VIDEO' => null, 'HOME' => null);
                     } else {
                         $parameters = array('TYPE' => array('VIDEO', 'HOME'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 break;
             case 'workVideoCall':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'VIDEO')) {
                         if ($version == '2.1') {
                             $parameters['VIDEO'] = null;
                         } else {
                             $parameters['TYPE'] = 'VIDEO';
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'WORK')) {
                         if ($version == '2.1') {
                             $parameters['WORK'] = null;
                         } else {
                             $parameters['TYPE'] = 'WORK';
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('VIDEO' => null, 'WORK' => null);
                     } else {
                         $parameters = array('TYPE' => array('VIDEO', 'WORK'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 break;
             case 'sip':
                 if ($fields && !isset($fields['X-SIP'])) {
                     break;
                 }
                 $vcard->setAttribute('X-SIP', $val);
                 break;
             case 'ptt':
                 if ($fields && (!isset($fields['X-SIP']) || isset($fields['X-SIP']->Params['TYPE']) && !$this->_hasValEnum($fields['X-SIP']->Params['TYPE']->ValEnum, 'POC'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('X-SIP', $val, array('POC' => null));
                 } else {
                     $vcard->setAttribute('X-SIP', $val, array('TYPE' => 'POC'));
                 }
                 break;
             case 'voip':
                 if ($fields && (!isset($fields['X-SIP']) || isset($fields['X-SIP']->Params['TYPE']) && !$this->_hasValEnum($fields['X-SIP']->Params['TYPE']->ValEnum, 'VOIP'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('X-SIP', $val, array('VOIP' => null));
                 } else {
                     $vcard->setAttribute('X-SIP', $val, array('TYPE' => 'VOIP'));
                 }
                 break;
             case 'shareView':
                 if ($fields && (!isset($fields['X-SIP']) || isset($fields['X-SIP']->Params['TYPE']) && !$this->_hasValEnum($fields['X-SIP']->Params['TYPE']->ValEnum, 'SWIS'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('X-SIP', $val, array('SWIS' => null));
                 } else {
                     $vcard->setAttribute('X-SIP', $val, array('TYPE' => 'SWIS'));
                 }
                 break;
             case 'imaddress':
                 if ($fields && !isset($fields['X-WV-ID'])) {
                     break;
                 }
                 $vcard->setAttribute('X-WV-ID', $val);
                 break;
             case 'fax':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'FAX'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('FAX' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => 'FAX'));
                 }
                 break;
             case 'homeFax':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'FAX')) {
                         if ($version == '2.1') {
                             $parameters['FAX'] = null;
                         } else {
                             $parameters['TYPE'] = 'FAX';
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'HOME')) {
                         if ($version == '2.1') {
                             $parameters['HOME'] = null;
                         } else {
                             $parameters['TYPE'] = 'HOME';
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('FAX' => null, 'HOME' => null);
                     } else {
                         $parameters = array('TYPE' => array('FAX', 'HOME'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 break;
             case 'workFax':
                 $parameters = array();
                 if ($fields) {
                     if (!isset($fields['TEL'])) {
                         break;
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'FAX')) {
                         if ($version == '2.1') {
                             $parameters['FAX'] = null;
                         } else {
                             $parameters['TYPE'] = 'FAX';
                         }
                     }
                     if (!isset($fields['TEL']->Params['TYPE']) || $this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'WORK')) {
                         if ($version == '2.1') {
                             $parameters['WORK'] = null;
                         } else {
                             $parameters['TYPE'] = 'WORK';
                         }
                     }
                     if (empty($parameters)) {
                         break;
                     }
                 } else {
                     if ($version == '2.1') {
                         $parameters = array('FAX' => null, 'WORK' => null);
                     } else {
                         $parameters = array('TYPE' => array('FAX', 'WORK'));
                     }
                 }
                 $vcard->setAttribute('TEL', $val, $parameters);
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('FAX' => null, 'WORK' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => array('FAX', 'WORK')));
                 }
                 break;
             case 'pager':
                 if ($fields && (!isset($fields['TEL']) || isset($fields['TEL']->Params['TYPE']) && !$this->_hasValEnum($fields['TEL']->Params['TYPE']->ValEnum, 'PAGER'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('TEL', $val, array('PAGER' => null));
                 } else {
                     $vcard->setAttribute('TEL', $val, array('TYPE' => 'PAGER'));
                 }
                 break;
             case 'email':
                 if ($fields && !isset($fields['EMAIL'])) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('INTERNET' => null));
                 } else {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('TYPE' => 'INTERNET'));
                 }
                 break;
             case 'homeEmail':
                 if ($fields && (!isset($fields['EMAIL']) || isset($fields['EMAIL']->Params['TYPE']) && !$this->_hasValEnum($fields['EMAIL']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('HOME' => null));
                 } else {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('TYPE' => 'HOME'));
                 }
                 break;
             case 'workEmail':
                 if ($fields && (!isset($fields['EMAIL']) || isset($fields['EMAIL']->Params['TYPE']) && !$this->_hasValEnum($fields['EMAIL']->Params['TYPE']->ValEnum, 'WORK'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('WORK' => null));
                 } else {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($val), array('TYPE' => 'WORK'));
                 }
                 break;
             case 'emails':
                 if ($fields && !isset($fields['EMAIL'])) {
                     break;
                 }
                 $emails = explode(',', $val);
                 foreach ($emails as $email) {
                     $vcard->setAttribute('EMAIL', Horde_Icalendar_Vcard::getBareEmail($email));
                 }
                 break;
             case 'title':
                 if ($fields && !isset($fields['TITLE'])) {
                     break;
                 }
                 $vcard->setAttribute('TITLE', $val, Horde_Mime::is8bit($val) ? $charset : array());
                 break;
             case 'role':
                 if ($fields && !isset($fields['ROLE'])) {
                     break;
                 }
                 $vcard->setAttribute('ROLE', $val, Horde_Mime::is8bit($val) ? $charset : array());
                 break;
             case 'notes':
                 if ($fields && !isset($fields['NOTE'])) {
                     break;
                 }
                 $vcard->setAttribute('NOTE', $val, Horde_Mime::is8bit($val) ? $charset : array());
                 break;
             case '__tags':
                 $val = $injector->getInstance('Turba_Tagger')->split($val);
             case 'businessCategory':
                 // No CATEGORIES in vCard 2.1
                 if ($version == '2.1' || $fields && !isset($fields['CATEGORIES'])) {
                     break;
                 }
                 $vcard->setAttribute('CATEGORIES', null, array(), true, $val);
                 break;
             case 'anniversary':
                 if (!$fields || isset($fields['X-ANNIVERSARY'])) {
                     $vcard->setAttribute('X-ANNIVERSARY', $val);
                 }
                 break;
             case 'spouse':
                 if (!$fields || isset($fields['X-SPOUSE'])) {
                     $vcard->setAttribute('X-SPOUSE', $val);
                 }
                 break;
             case 'children':
                 if (!$fields || isset($fields['X-CHILDREN'])) {
                     $vcard->setAttribute('X-CHILDREN', $val);
                 }
                 break;
             case 'website':
                 if ($fields && !isset($fields['URL'])) {
                     break;
                 }
                 $vcard->setAttribute('URL', $val);
                 break;
             case 'homeWebsite':
                 if ($fields && (!isset($fields['URL']) || isset($fields['URL']->Params['TYPE']) && !$this->_hasValEnum($fields['URL']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('URL', $val, array('HOME' => null));
                 } else {
                     $vcard->setAttribute('URL', $val, array('TYPE' => 'HOME'));
                 }
                 break;
             case 'workWebsite':
                 if ($fields && (!isset($fields['URL']) || isset($fields['URL']->Params['TYPE']) && !$this->_hasValEnum($fields['URL']->Params['TYPE']->ValEnum, 'WORK'))) {
                     break;
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('URL', $val, array('WORK' => null));
                 } else {
                     $vcard->setAttribute('URL', $val, array('TYPE' => 'WORK'));
                 }
                 break;
             case 'freebusyUrl':
                 if ($version == '2.1' || $fields && !isset($fields['FBURL'])) {
                     break;
                 }
                 $vcard->setAttribute('FBURL', $val);
                 break;
             case 'birthday':
                 if ($fields && !isset($fields['BDAY'])) {
                     break;
                 }
                 $vcard->setAttribute('BDAY', $val);
                 break;
             case 'timezone':
                 if ($fields && !isset($fields['TZ'])) {
                     break;
                 }
                 $vcard->setAttribute('TZ', $val, array('VALUE' => 'text'));
                 break;
             case 'latitude':
                 if ($fields && !isset($fields['GEO'])) {
                     break;
                 }
                 if (isset($hash['longitude'])) {
                     $vcard->setAttribute('GEO', array('latitude' => $val, 'longitude' => $hash['longitude']));
                 }
                 break;
             case 'homeLatitude':
                 if ($fields && (!isset($fields['GEO']) || isset($fields['GEO']->Params['TYPE']) && !$this->_hasValEnum($fields['GEO']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if (isset($hash['homeLongitude'])) {
                     if ($version == '2.1') {
                         $vcard->setAttribute('GEO', array('latitude' => $val, 'longitude' => $hash['homeLongitude']), array('HOME' => null));
                     } else {
                         $vcard->setAttribute('GEO', array('latitude' => $val, 'longitude' => $hash['homeLongitude']), array('TYPE' => 'HOME'));
                     }
                 }
                 break;
             case 'workLatitude':
                 if ($fields && (!isset($fields['GEO']) || isset($fields['GEO']->Params['TYPE']) && !$this->_hasValEnum($fields['GEO']->Params['TYPE']->ValEnum, 'HOME'))) {
                     break;
                 }
                 if (isset($hash['workLongitude'])) {
                     if ($version == '2.1') {
                         $vcard->setAttribute('GEO', array('latitude' => $val, 'longitude' => $hash['workLongitude']), array('WORK' => null));
                     } else {
                         $vcard->setAttribute('GEO', array('latitude' => $val, 'longitude' => $hash['workLongitude']), array('TYPE' => 'WORK'));
                     }
                 }
                 break;
             case 'photo':
             case 'logo':
                 $name = Horde_String::upper($key);
                 $params = array();
                 if (strlen($hash[$key])) {
                     $params['ENCODING'] = 'b';
                 }
                 if (isset($hash[$key . 'type'])) {
                     $params['TYPE'] = $hash[$key . 'type'];
                 }
                 if ($fields && (!isset($fields[$name]) || isset($params['TYPE']) && isset($fields[$name]->Params['TYPE']) && !$this->_hasValEnum($fields[$name]->Params['TYPE']->ValEnum, $params['TYPE']))) {
                     break;
                 }
                 $vcard->setAttribute($name, base64_encode($hash[$key]), $params);
                 break;
         }
     }
     // No explicit firstname/lastname in data source: we have to guess.
     if (!isset($hash['lastname']) && isset($hash['name'])) {
         $this->_guessName($hash);
     }
     $a = array(Horde_Icalendar_Vcard::N_FAMILY => isset($hash['lastname']) ? $hash['lastname'] : '', Horde_Icalendar_Vcard::N_GIVEN => isset($hash['firstname']) ? $hash['firstname'] : '', Horde_Icalendar_Vcard::N_ADDL => isset($hash['middlenames']) ? $hash['middlenames'] : '', Horde_Icalendar_Vcard::N_PREFIX => isset($hash['namePrefix']) ? $hash['namePrefix'] : '', Horde_Icalendar_Vcard::N_SUFFIX => isset($hash['nameSuffix']) ? $hash['nameSuffix'] : '');
     $val = implode(';', $a);
     if (!$fields || isset($fields['N'])) {
         $vcard->setAttribute('N', $val, Horde_Mime::is8bit($val) ? $charset : array(), false, $a);
     }
     if (!$formattedname && (!$fields || isset($fields['FN']))) {
         if ($object->getValue('name')) {
             $val = $object->getValue('name');
         } elseif (!empty($this->alternativeName) && isset($hash[$this->alternativeName])) {
             $val = $hash[$this->alternativeName];
         } else {
             $val = '';
         }
         $vcard->setAttribute('FN', $val, Horde_Mime::is8bit($val) ? $charset : array());
     }
     $org = array();
     if (!empty($hash['company']) || !$skipEmpty && array_key_exists('company', $hash)) {
         $org[] = $hash['company'];
     }
     if (!empty($hash['department']) || !$skipEmpty && array_key_exists('department', $hash)) {
         $org[] = $hash['department'];
     }
     if (count($org) && (!$fields || isset($fields['ORG']))) {
         $val = implode(';', $org);
         $vcard->setAttribute('ORG', $val, Horde_Mime::is8bit($val) ? $charset : array(), false, $org);
     }
     if ((!$fields || isset($fields['ADR'])) && (!empty($hash['commonAddress']) || !empty($hash['commonStreet']) || !empty($hash['commonPOBox']) || !empty($hash['commonExtended']) || !empty($hash['commonCity']) || !empty($hash['commonProvince']) || !empty($hash['commonPostalCode']) || !empty($hash['commonCountry']) || !$skipEmpty && (array_key_exists('commonAddress', $hash) || array_key_exists('commonStreet', $hash) || array_key_exists('commonPOBox', $hash) || array_key_exists('commonExtended', $hash) || array_key_exists('commonCity', $hash) || array_key_exists('commonProvince', $hash) || array_key_exists('commonPostalCode', $hash) || array_key_exists('commonCountry', $hash)))) {
         /* We can't know if this particular Turba source uses a single
          * address field or multiple for
          * street/city/province/postcode/country. Try to deal with
          * both. */
         if (isset($hash['commonAddress']) && !isset($hash['commonStreet'])) {
             $hash['commonStreet'] = $hash['commonAddress'];
         }
         $a = array(Horde_Icalendar_Vcard::ADR_POB => isset($hash['commonPOBox']) ? $hash['commonPOBox'] : '', Horde_Icalendar_Vcard::ADR_EXTEND => isset($hash['commonExtended']) ? $hash['commonExtended'] : '', Horde_Icalendar_Vcard::ADR_STREET => isset($hash['commonStreet']) ? $hash['commonStreet'] : '', Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['commonCity']) ? $hash['commonCity'] : '', Horde_Icalendar_Vcard::ADR_REGION => isset($hash['commonProvince']) ? $hash['commonProvince'] : '', Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['commonPostalCode']) ? $hash['commonPostalCode'] : '', Horde_Icalendar_Vcard::ADR_COUNTRY => isset($hash['commonCountry']) ? Horde_Nls::getCountryISO($hash['commonCountry']) : '');
         $val = implode(';', $a);
         if ($version == '2.1') {
             $params = array();
             if (Horde_Mime::is8bit($val)) {
                 $params['CHARSET'] = 'UTF-8';
             }
         } else {
             $params = array('TYPE' => '');
         }
         $vcard->setAttribute('ADR', $val, $params, true, $a);
     }
     if ((!$fields || isset($fields['ADR']) && (!isset($fields['ADR']->Params['TYPE']) || $this->_hasValEnum($fields['ADR']->Params['TYPE']->ValEnum, 'HOME'))) && (!empty($hash['homeAddress']) || !empty($hash['homeStreet']) || !empty($hash['homePOBox']) || !empty($hash['homeExtended']) || !empty($hash['homeCity']) || !empty($hash['homeProvince']) || !empty($hash['homePostalCode']) || !empty($hash['homeCountry']) || !$skipEmpty && (array_key_exists('homeAddress', $hash) || array_key_exists('homeStreet', $hash) || array_key_exists('homePOBox', $hash) || array_key_exists('homeExtended', $hash) || array_key_exists('homeCity', $hash) || array_key_exists('homeProvince', $hash) || array_key_exists('homePostalCode', $hash) || array_key_exists('homeCountry', $hash)))) {
         if (isset($hash['homeAddress']) && !isset($hash['homeStreet'])) {
             $hash['homeStreet'] = $hash['homeAddress'];
         }
         $a = array(Horde_Icalendar_Vcard::ADR_POB => isset($hash['homePOBox']) ? $hash['homePOBox'] : '', Horde_Icalendar_Vcard::ADR_EXTEND => isset($hash['homeExtended']) ? $hash['homeExtended'] : '', Horde_Icalendar_Vcard::ADR_STREET => isset($hash['homeStreet']) ? $hash['homeStreet'] : '', Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['homeCity']) ? $hash['homeCity'] : '', Horde_Icalendar_Vcard::ADR_REGION => isset($hash['homeProvince']) ? $hash['homeProvince'] : '', Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['homePostalCode']) ? $hash['homePostalCode'] : '', Horde_Icalendar_Vcard::ADR_COUNTRY => isset($hash['homeCountry']) ? Horde_Nls::getCountryISO($hash['homeCountry']) : '');
         $val = implode(';', $a);
         if ($version == '2.1') {
             $params = array('HOME' => null);
             if (Horde_Mime::is8bit($val)) {
                 $params['CHARSET'] = 'UTF-8';
             }
         } else {
             $params = array('TYPE' => 'HOME');
         }
         $vcard->setAttribute('ADR', $val, $params, true, $a);
     }
     if ((!$fields || isset($fields['ADR']) && (!isset($fields['ADR']->Params['TYPE']) || $this->_hasValEnum($fields['ADR']->Params['TYPE']->ValEnum, 'WORK'))) && (!empty($hash['workAddress']) || !empty($hash['workStreet']) || !empty($hash['workPOBox']) || !empty($hash['workExtended']) || !empty($hash['workCity']) || !empty($hash['workProvince']) || !empty($hash['workPostalCode']) || !empty($hash['workCountry']) || !$skipEmpty && (array_key_exists('workAddress', $hash) || array_key_exists('workStreet', $hash) || array_key_exists('workPOBox', $hash) || array_key_exists('workExtended', $hash) || array_key_exists('workCity', $hash) || array_key_exists('workProvince', $hash) || array_key_exists('workPostalCode', $hash) || array_key_exists('workCountry', $hash)))) {
         if (isset($hash['workAddress']) && !isset($hash['workStreet'])) {
             $hash['workStreet'] = $hash['workAddress'];
         }
         $a = array(Horde_Icalendar_Vcard::ADR_POB => isset($hash['workPOBox']) ? $hash['workPOBox'] : '', Horde_Icalendar_Vcard::ADR_EXTEND => isset($hash['workExtended']) ? $hash['workExtended'] : '', Horde_Icalendar_Vcard::ADR_STREET => isset($hash['workStreet']) ? $hash['workStreet'] : '', Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['workCity']) ? $hash['workCity'] : '', Horde_Icalendar_Vcard::ADR_REGION => isset($hash['workProvince']) ? $hash['workProvince'] : '', Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['workPostalCode']) ? $hash['workPostalCode'] : '', Horde_Icalendar_Vcard::ADR_COUNTRY => isset($hash['workCountry']) ? Horde_Nls::getCountryISO($hash['workCountry']) : '');
         $val = implode(';', $a);
         if ($version == '2.1') {
             $params = array('WORK' => null);
             if (Horde_Mime::is8bit($val)) {
                 $params['CHARSET'] = 'UTF-8';
             }
         } else {
             $params = array('TYPE' => 'WORK');
         }
         $vcard->setAttribute('ADR', $val, $params, true, $a);
     }
     return $vcard;
 }