Turba_Driver::tovCard PHP Метод

tovCard() публичный Метод

Exports a given Turba_Object as an iCalendar vCard.
public tovCard ( Turba_Object $object, string $version = '2.1', array $fields = null, boolean $skipEmpty = false ) : Horde_Icalendar_Vcard
$object Turba_Object Turba_Object.
$version string The vcard version to produce.
$fields array Hash of field names and Horde_SyncMl_Property properties with the requested fields.
$skipEmpty boolean Whether to skip empty fields.
Результат 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;
    }