source: trunk/phpgwapi/inc/class.vcard.inc.php @ 6057

Revision 6057, 25.2 KB checked in by marcosw, 12 years ago (diff)

Ticket #2398 - Compatibilizacao com PHP-5.3 em alguns módulos do expresso

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2  /**************************************************************************\
3  * eGroupWare API - VCard import/export class                               *
4  * This file written by Miles Lott <milos@groupwhere.org>                   *
5  * Parse vcards->contacts class fields, and vice-versa                      *
6  * Copyright (C) 2001-2004 Miles Lott                                       *
7  * ------------------------------------------------------------------------ *
8  * This library is free software; you can redistribute it and/or modify it  *
9  * under the terms of the GNU Lesser General Public License as published by *
10  * the Free Software Foundation; either version 2.1 of the License,         *
11  * or any later version.                                                    *
12  * This library is distributed in the hope that it will be useful, but      *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of               *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
15  * See the GNU Lesser General Public License for more details.              *
16  * You should have received a copy of the GNU Lesser General Public License *
17  * along with this library; if not, write to the Free Software Foundation,  *
18  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA            *
19  \**************************************************************************/
20
21
22        class vcard
23        {
24                var $import = array(
25                        'n'        => 'n',
26                        'sound'    => 'sound',
27                        'bday'     => 'bday',
28                        'note'     => 'note',
29                        'tz'       => 'tz',
30                        'geo'      => 'geo',
31                        'url'      => 'url',
32                        'pubkey'   => 'pubkey',
33                        'org'      => 'org',
34                        'title'    => 'title',
35                        'adr'      => 'adr',
36                        'label'    => 'label',
37                        'tel'      => 'tel',
38                        'email'    => 'email'
39                );
40
41                var $export = array(
42                        'fn'                  => 'FN',
43                        'n_given'             => 'N;GIVEN',
44                        'n_family'            => 'N;FAMILY',
45                        'n_middle'            => 'N;MIDDLE',
46                        'n_prefix'            => 'N;PREFIX',
47                        'n_suffix'            => 'N;SUFFIX',
48                        'sound'               => 'SOUND',
49                        'bday'                => 'BDAY',
50                        'note'                => 'NOTE',
51                        'tz'                  => 'TZ',
52                        'geo'                 => 'GEO',
53                        'url'                 => 'URL',
54                        'pubkey'              => 'PUBKEY',
55                        'org_name'            => 'ORG;NAME',
56                        'org_unit'            => 'ORG;UNIT',
57                        'title'               => 'TITLE',
58
59                        'adr_one_type'        => 'ADR;TYPE;WORK',
60                        'adr_two_type'        => 'ADR;TYPE;HOME',
61                        'tel_prefer'          => 'TEL;PREFER',
62                        'email_type'          => 'EMAIL;TYPE;WORK',
63                        'email_home_type'     => 'EMAIL;TYPE;HOME',
64
65                        'adr_one_street'      => 'ADR;WORK;STREET',
66                        'adr_one_locality'    => 'ADR;WORK;LOCALITY',
67                        'adr_one_region'      => 'ADR;WORK;REGION',
68                        'adr_one_postalcode'  => 'ADR;WORK;POSTALCODE',
69                        'adr_one_countryname' => 'ADR;WORK;COUNTRYNAME',
70                        'address2'            => 'EXT',
71                        'label'               => 'LABEL',
72
73                        'adr_two_street'      => 'ADR;HOME;STREET',
74                        'adr_two_locality'    => 'ADR;HOME;LOCALITY',
75                        'adr_two_region'      => 'ADR;HOME;REGION',
76                        'adr_two_postalcode'  => 'ADR;HOME;POSTALCODE',
77                        'adr_two_countryname' => 'ADR;HOME;COUNTRYNAME',
78
79                        'tel_work'            => 'TEL;WORK',
80                        'tel_home'            => 'TEL;HOME',
81                        'tel_voice'           => 'TEL;VOICE',
82                        'tel_fax'             => 'TEL;FAX',
83                        'tel_msg'             => 'TEL;MSG',
84                        'tel_cell'            => 'TEL;CELL',
85                        'tel_pager'           => 'TEL;PAGER',
86                        'tel_bbs'             => 'TEL;BBS',
87                        'tel_modem'           => 'TEL;MODEM',
88                        'tel_car'             => 'TEL;CAR',
89                        'tel_isdn'            => 'TEL;ISDN',
90                        'tel_video'           => 'TEL;VIDEO',
91                        'email'               => 'EMAIL;WORK',
92                        'email_home'          => 'EMAIL;HOME'
93                );
94
95                var $names = array(
96                        'family' => 'family',
97                        'given'  => 'given',
98                        'middle' => 'middle',
99                        'prefix' => 'prefix',
100                        'suffix' => 'suffix'
101                );
102
103                function vcard()
104                {
105                        /* _debug_array($this); */
106                }
107
108                /*
109                        This now takes the upload filename
110                        and parses using the class string and array processors.
111                        The return is a contacts class entry, ready for add.
112                */
113                function in_file($filename='')
114                {
115                        if(!$filename)
116                        {
117                                return array();
118                        }
119
120                        $buffer = array();
121
122                        $fp = fopen($filename,'r');
123                        while($data = fgets($fp,8000))
124                        {
125                                list($name,$value,$extra) = preg_split('/:/', $data);
126                                if(substr($value,0,5) == 'http')
127                                {
128                                        $value = $value . ':'.$extra;
129                                }
130                                if($name && $value)
131                                {
132                                        foreach($this->import as $fname => $fvalue)
133                                        {
134                                                if(strstr(strtolower($name), $this->import[$fname]))
135                                                {
136                                                        $value = trim($value);
137                                                        $value = str_replace('=0D=0A',"\n",$value);
138                                                        $buffer += array($name => $value);
139                                                }
140                                        }
141                                }
142                        }
143                        fclose($fp);
144
145                        $entry = $this->in($buffer);
146                        /* _debug_array($entry);exit; */
147
148                        return $entry;
149                }
150
151                /* Try to decode strings that may be base64 encoding, otherwise assume they are QUOTED-PRINTABLE */
152                function decode($string)
153                {
154                        $tmp = base64_decode($string);
155                        if(base64_encode($tmp) == $string)
156                        {
157                                return $tmp;
158                        }
159                        else
160                        {
161                                return(str_replace('=0D=0A',"\n",$string));
162                        }
163                }
164
165                function encode($string, $type='qp')
166                {
167                        $out = '';
168                        switch($type)
169                        {
170                                case 'qp':
171                                        $out = str_replace("\r\n",'=0D=0A',$string);
172                                        $out = str_replace("\n",'=0D=0A',$out);
173                                        break;
174                                case 'base64':
175                                        $out = base64_encode($string);
176                        }
177                        return $out;
178                }
179
180                /*
181                        This is here to match the old in() function, now called _parse_in().
182                        It is called now also by in_file() above.
183                        It takes a pre-parsed file using the methods in in_file(), returns a clean contacts class array.
184                */
185                function in($buffer)
186                {
187                        $buffer = $this->_parse_in($buffer);
188
189                        $contacts = CreateObject('phpgwapi.contacts');          /* RB 2001/05/08 Lotus Organizer uses/needs extrafields from edit.php */
190                        $all_fields = $contacts->stock_contact_fields + array(
191                                'ophone'   => 'ophone',
192                                'address2' => 'address2',
193                                'address3' => 'address3'
194                        );
195
196                        foreach($all_fields as $fname => $fvalue)
197                        {
198                                if($buffer[$fname])
199                                {
200                                        $entry[$fname] = $buffer[$fname];
201                                        /* echo '<br>'.$fname.' = "'.$entry[$fname].'"'."\n"; */
202                                }
203                        }
204                        return $entry;
205                }
206
207                /*
208                        Pass this an associative array of fieldnames and values
209                        returns a clean array based on contacts class std fields
210                        This array can then be passed via $phpgw->contacts->add($ownerid,$buffer)
211                */
212                function _parse_in($buffer)
213                {
214                        /* Following is a lot of pain and little magic */
215                        settype($buffer,'array');
216                        foreach($buffer as $name => $value)
217                        {
218                                $field  = preg_split('/;/',$name);
219                                $field[0] = preg_replace('/A\./','',$field[0]);
220                                $field[0] = preg_replace('/B\./','',$field[0]);
221                                $field[0] = preg_replace('/C\./','',$field[0]);
222                                $field[0] = preg_replace('/D\./','',$field[0]);
223                                $values = preg_split('/;/',$value);
224                                if($field[1])
225                                {
226                                        //echo $field[0];
227                                        switch($field[0])
228                                        {
229                                                case 'LABEL':
230                                                        $entry['label'] = $this->decode($values[0]);
231                                                        break;
232                                                case 'NOTE':
233                                                        $entry['note'] = $this->decode($values[0]);
234                                                        break;
235                                                case 'ADR':
236                                                        switch($field[1])
237                                                        {
238                                                                case 'INTL':
239                                                                        switch($field[2])
240                                                                        {
241                                                                                case 'WORK':
242                                                                                        if(!stristr($buffer['adr_one_type'],$field[1]))
243                                                                                        {
244                                                                                                $entry['adr_one_type'] .= 'intl;';
245                                                                                        }
246                                                                                        if(!$buffer['adr_one_street'])
247                                                                                        {
248                                                                                                $entry['address2']            = $values[1];
249                                                                                                $entry['adr_one_street']      = $values[2];
250                                                                                                $entry['adr_one_locality']    = $values[3];
251                                                                                                $entry['adr_one_region']      = $values[4];
252                                                                                                $entry['adr_one_postalcode']  = $values[5];
253                                                                                                $entry['adr_one_countryname'] = $values[6];
254                                                                                        }
255                                                                                        break;
256                                                                                case 'HOME':
257                                                                                        if(!stristr($buffer['adr_two_type'],$field[1]))
258                                                                                        {
259                                                                                                $entry['adr_two_type'] .= 'intl;';
260                                                                                        }
261                                                                                        if(!$buffer['adr_two_street'])
262                                                                                        {
263                                                                                                $entry['adr_two_street']      = $values[2];
264                                                                                                $entry['adr_two_locality']    = $values[3];
265                                                                                                $entry['adr_two_region']      = $values[4];
266                                                                                                $entry['adr_two_postalcode']  = $values[5];
267                                                                                                $entry['adr_two_countryname'] = $values[6];
268                                                                                        }
269                                                                                        break;
270                                                                                default:
271                                                                                        break;
272                                                                        }
273                                                                        break;
274                                                                case 'DOM':
275                                                                        switch($field[2])
276                                                                        {
277                                                                                case 'WORK':
278                                                                                        if(!stristr($buffer['adr_one_type'],$field[1]))
279                                                                                        {
280                                                                                                $entry['adr_one_type'] .= 'dom;';
281                                                                                        }
282                                                                                        if(!$buffer['adr_one_street'])
283                                                                                        {
284                                                                                                $entry['address2']            = $values[1];
285                                                                                                $entry['adr_one_street']      = $values[2];
286                                                                                                $entry['adr_one_locality']    = $values[3];
287                                                                                                $entry['adr_one_region']      = $values[4];
288                                                                                                $entry['adr_one_postalcode']  = $values[5];
289                                                                                                $entry['adr_one_countryname'] = $values[6];
290                                                                                        }
291                                                                                        break;
292                                                                                case 'HOME':
293                                                                                        if(!stristr($buffer['adr_two_type'],$field[1]))
294                                                                                        {
295                                                                                                $entry['adr_two_type'] .= 'dom;';
296                                                                                        }
297                                                                                        if(!$buffer['adr_two_street'])
298                                                                                        {
299                                                                                                $entry['adr_two_street']      = $values[2];
300                                                                                                $entry['adr_two_locality']    = $values[3];
301                                                                                                $entry['adr_two_region']      = $values[4];
302                                                                                                $entry['adr_two_postalcode']  = $values[5];
303                                                                                                $entry['adr_two_countryname'] = $values[6];
304                                                                                        }
305                                                                                        break;
306                                                                                default:
307                                                                                        break;
308                                                                        }
309                                                                        break;
310                                                                case 'PARCEL':
311                                                                        switch($field[2])
312                                                                        {
313                                                                                case 'WORK':
314                                                                                        if(!stristr($buffer['adr_one_type'],$field[1]))
315                                                                                        {
316                                                                                                $entry['adr_one_type'] .= 'parcel;';
317                                                                                        }
318                                                                                        if(!$buffer['adr_one_street'])
319                                                                                        {
320                                                                                                $entry['address2']            = $values[1];
321                                                                                                $entry['adr_one_street']      = $values[2];
322                                                                                                $entry['adr_one_locality']    = $values[3];
323                                                                                                $entry['adr_one_region']      = $values[4];
324                                                                                                $entry['adr_one_postalcode']  = $values[5];
325                                                                                                $entry['adr_one_countryname'] = $values[6];
326                                                                                        }
327                                                                                        break;
328                                                                                case 'HOME':
329                                                                                        if(!stristr($buffer['adr_two_type'],$field[1]))
330                                                                                        {
331                                                                                                $entry['adr_two_type'] .= 'parcel;';
332                                                                                        }
333                                                                                        if(!$buffer['adr_two_street'])
334                                                                                        {
335                                                                                                $entry['adr_two_street']      = $values[2];
336                                                                                                $entry['adr_two_locality']    = $values[3];
337                                                                                                $entry['adr_two_region']      = $values[4];
338                                                                                                $entry['adr_two_postalcode']  = $values[5];
339                                                                                                $entry['adr_two_countryname'] = $values[6];
340                                                                                        }
341                                                                                        break;
342                                                                                default:
343                                                                                        break;
344                                                                        }
345                                                                        break;
346                                                                case 'POSTAL':
347                                                                        switch($field[2])
348                                                                        {
349                                                                                case 'WORK':
350                                                                                        if(!stristr($buffer['adr_one_type'],$field[1]))
351                                                                                        {
352                                                                                                $entry['adr_one_type'] .= 'postal;';
353                                                                                        }
354                                                                                        if(!$buffer['adr_one_street'])
355                                                                                        {
356                                                                                                $entry['address2']            = $values[1];
357                                                                                                $entry['adr_one_street']      = $values[2];
358                                                                                                $entry['adr_one_locality']    = $values[3];
359                                                                                                $entry['adr_one_region']      = $values[4];
360                                                                                                $entry['adr_one_postalcode']  = $values[5];
361                                                                                                $entry['adr_one_countryname'] = $values[6];
362                                                                                        }
363                                                                                        break;
364                                                                                case 'HOME':
365                                                                                        if(!stristr($buffer['adr_two_type'],$field[1]))
366                                                                                        {
367                                                                                                $entry['adr_two_type'] .= 'postal;';
368                                                                                        }
369                                                                                        if(!$buffer['adr_two_street'])
370                                                                                        {
371                                                                                                $entry['adr_two_street']      = $values[2];
372                                                                                                $entry['adr_two_locality']    = $values[3];
373                                                                                                $entry['adr_two_region']      = $values[4];
374                                                                                                $entry['adr_two_postalcode']  = $values[5];
375                                                                                                $entry['adr_two_countryname'] = $values[6];
376                                                                                        }
377                                                                                        break;
378                                                                                default:
379                                                                                        break;
380                                                                        }
381                                                                        break;
382                                                                case 'WORK':
383                                                                        if(!$buffer['adr_one_street'])
384                                                                        {
385                                                                                $entry['address2']            = $values[1];
386                                                                                $entry['adr_one_street']      = $values[2];
387                                                                                $entry['adr_one_locality']    = $values[3];
388                                                                                $entry['adr_one_region']      = $values[4];
389                                                                                $entry['adr_one_postalcode']  = $values[5];
390                                                                                $entry['adr_one_countryname'] = $values[6];
391                                                                        }
392                                                                        break;
393                                                                case 'HOME':
394                                                                        $entry['adr_two_street']      = $values[2];
395                                                                        $entry['adr_two_locality']    = $values[3];
396                                                                        $entry['adr_two_region']      = $values[4];
397                                                                        $entry['adr_two_postalcode']  = $values[5];
398                                                                        $entry['adr_two_countryname'] = $values[6];
399                                                                        break;
400                                                                default:
401                                                                        if(!$buffer['adr_one_street'])
402                                                                        {
403                                                                                $entry['address2']            = $values[1];
404                                                                                $entry['adr_one_street']      = $values[2];
405                                                                                $entry['adr_one_locality']    = $values[3];
406                                                                                $entry['adr_one_region']      = $values[4];
407                                                                                $entry['adr_one_postalcode']  = $values[5];
408                                                                                $entry['adr_one_countryname'] = $values[6];
409                                                                        }
410                                                                        break;
411                                                        }
412                                                        break;
413                                                case 'TEL':     // RB 2001/05/07 added for Lotus Organizer ueses TEL;{WORK|HOME};{VOICE|FAX}[;PREF]
414                                                        if($field[2] == 'FAX' && ($field[1] == 'WORK' || $field[i] == 'HOME'))
415                                                        {
416                                                                array_shift($field);    // --> ignore the WORK or HOME if FAX follows, HOME;FAX and HOME;TEL are maped later
417                                                        }
418                                                        switch($field[1])
419                                                        {
420                                                                case 'PREF':
421                                                                        //echo $field[2].' is preferred';
422                                                                        if($field[2])
423                                                                        {
424                                                                                $buffer['tel_prefer'] .= strtolower($field[2]) . ';';
425                                                                        }
426                                                                        break;
427                                                                case 'WORK':    // RB don't overwrite TEL;WORK;VOICE (main nr.) with TEL;WORK, TEL;WORK --> tel_isdn
428                                                                        $entry[$buffer['tel_work'] ? 'tel_isdn' : 'tel_work'] = $values[0];
429                                                                        if($field[2] == 'PREF')
430                                                                        {
431                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
432                                                                        }
433                                                                        break;
434                                                                case 'HOME':    // RB don't overwrite TEL;HOME;VOICE (main nr.) with TEL;HOME, TEL;HOME --> ophone
435                                                                        $entry[$buffer['tel_home'] ? 'ophone' : 'tel_home' ] = $values[0];
436                                                                        if($field[2] == 'PREF')
437                                                                        {
438                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
439                                                                        }
440                                                                        break;
441                                                                case 'VOICE':
442                                                                        $entry['tel_voice'] = $values[0];
443                                                                        if($field[2] == 'PREF')
444                                                                        {
445                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
446                                                                        }
447                                                                        break;
448                                                                case 'FAX':
449                                                                        if($entry['tel_fax'])
450                                                                        {
451                                                                                // RB don't overwrite TEL;WORK;FAX with TEL;HOME;FAX, TEL;HOME;FAX --> ophone
452                                                                                $entry['ophone'] = $values[0] . ' Fax';
453                                                                                break;
454                                                                        }
455                                                                        $entry['tel_fax'] = $values[0];
456                                                                        if($field[2] == 'PREF')
457                                                                        {
458                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
459                                                                        }
460                                                                        break;
461                                                                case 'MSG':
462                                                                        $entry['tel_msg'] = $values[0];
463                                                                        if($field[2] == 'PREF')
464                                                                        {
465                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
466                                                                        }
467                                                                        break;
468                                                                case 'CELL':
469                                                                        $entry['tel_cell'] = $values[0];
470                                                                        if($field[2] == 'PREF')
471                                                                        {
472                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
473                                                                        }
474                                                                        break;
475                                                                case 'PAGER':
476                                                                        $entry['tel_pager'] = $values[0];
477                                                                        if($field[2] == 'PREF')
478                                                                        {
479                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
480                                                                        }
481                                                                        break;
482                                                                case 'BBS':
483                                                                        $entry['tel_bbs'] = $values[0];
484                                                                        if($field[2] == 'PREF')
485                                                                        {
486                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
487                                                                        }
488                                                                        break;
489                                                                case 'MODEM':
490                                                                        $entry['tel_modem'] = $values[0];
491                                                                        if($field[2] == 'PREF')
492                                                                        {
493                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
494                                                                        }
495                                                                        break;
496                                                                case 'CAR':
497                                                                        $entry['tel_car'] = $values[0];
498                                                                        if($field[2] == 'PREF')
499                                                                        {
500                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
501                                                                        }
502                                                                        break;
503                                                                case 'ISDN':
504                                                                        $entry['tel_isdn'] = $values[0];
505                                                                        if($field[2] == 'PREF')
506                                                                        {
507                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
508                                                                        }
509                                                                        break;
510                                                                case 'VIDEO':
511                                                                        $entry['tel_video'] = $values[0];
512                                                                        if($field[2] == 'PREF')
513                                                                        {
514                                                                                $entry['tel_prefer'] .= strtolower($field[1]) . ';';
515                                                                        }
516                                                                        break;
517                                                                default:
518                                                                        break;
519                                                        }
520                                                        break;
521                                                case 'EMAIL':
522                                                        switch($field[1])
523                                                        {
524                                                                case 'WORK':
525                                                                        $entry['email'] = $values[0];
526                                                                        $entry['email_type'] = $field[2];
527                                                                        break;
528                                                                case 'HOME':
529                                                                        $entry['email_home'] = $values[0];
530                                                                        $entry['email_home_type'] = $field[2];
531                                                                        break;
532                                                                default:
533                                                                        if($buffer['email'])
534                                                                        {
535                                                                                $entry['email_type'] = $field[2];
536                                                                        }
537                                                                        elseif(!$buffer['email'])
538                                                                        {
539                                                                                $entry['email'] = $values[0];
540                                                                                $entry['email_type'] = $field[1];
541                                                                        }
542                                                                        break;
543                                                        }
544                                                        break;
545                                                case 'URL':     // RB 2001/05/08 Lotus Organizer uses URL;WORK and URL;HOME (URL;HOME droped if both)
546                                                        $entry['url'] = $values[0];
547                                                        break;
548                                                default:
549                                                        break;
550                                        }
551                                }
552                                else
553                                {
554                                        switch($field[0])
555                                        {
556                                                case 'N':
557                                                        $j=0;
558                                                        foreach($this->names as $myname => $myval)
559                                                        {
560                                                                $namel = 'n_' . $myname;
561                                                                $entry[$namel] = $values[$j];
562                                                                $j++;
563                                                        }
564                                                        break;
565                                                case 'FN':
566                                                        $entry['fn'] = $values[0];
567                                                        break;
568                                                case 'TITLE':
569                                                        $entry['title'] = $values[0];
570                                                        break;
571                                                case 'TZ':
572                                                        $entry['tz'] = $values[0];
573                                                        break;
574                                                case 'GEO':
575                                                        $entry['geo'] = $values[0];
576                                                        break;
577                                                case 'URL':
578                                                        $entry['url'] = $values[0];
579                                                        break;
580                                                case 'NOTE':
581                                                        $entry['note'] = $this->decode($values[0]);
582                                                        break;
583                                                case 'KEY':
584                                                        $entry['key'] = $this->decode($values[0]);
585                                                        break;
586                                                case 'LABEL':
587                                                        $entry['label'] = $this->decode($values[0]);
588                                                        break;
589                                                case 'BDAY': #1969-12-31
590                                                        if(strlen($values[0]) == 8)
591                                                        {
592                                                                $entry['bday'] = substr($values[0],4,2) . '/' . substr($values[0],6,2) . '/' . substr($values[0],0,4);
593                                                        }
594                                                        else
595                                                        {
596                                                                $tmp = preg_split('/-/',$values[0]);
597                                                                if($tmp[0])
598                                                                {
599                                                                        $entry['bday'] = $tmp[1] . '/' . $tmp[2] . '/' . $tmp[0];
600                                                                }
601                                                        }
602                                                        break;
603                                                case 'ORG':     // RB 2001/05/07 added for Lotus Organizer: ORG:Company;Department
604                                                        $entry['org_name'] = $values[0];
605                                                        $entry['org_unit'] = $values[1];
606                                                        break;
607                                        }
608                                }
609                        }
610                        $entry['tel_prefer']   = substr($buffer['tel_prefer'],0,-1);
611                        $entry['adr_one_type'] = substr($buffer['adr_one_type'],0,-1);
612                        $entry['adr_two_type'] = substr($buffer['adr_two_type'],0,-1);
613
614                        if(count($street = preg_split('/\r*\n/',$buffer['adr_one_street'],3)) > 1)
615                        {
616                                $entry['adr_one_street'] = $street[0];  // RB 2001/05/08 added for Lotus Organizer to split multiline adresses
617                                $entry['address2'] = $street[1];
618                                $entry['address3'] = $street[2];
619                        }
620
621                        return $entry;
622                }
623
624                // Takes an array of contacts class fields/values, turns it into a vcard string:
625                //
626                // for($i=0;$i<count($buffer);$i++)
627                // {
628                //     $vcards .= $this->vcard->out($buffer[$i]);
629                // }
630                //
631                function out($buffer)
632                {
633                        $entry   = '';
634                        $header  = 'BEGIN:VCARD' . "\n";
635                        $header .= 'VERSION:2.1' . "\n";
636                        $header .= 'X-EGROUPWARE-FILE-AS:eGroupWare.org' . "\n";
637
638                        foreach($this->export as $name => $value)
639                        {
640                                if(!empty($buffer[$value]))
641                                {
642                                        $mult = explode(';',$value);
643                                        if(!$mult[1])
644                                        { // Normal
645                                                if(strstr($buffer[$value],"\r\n") || strstr($buffer[$value],"\n"))
646                                                {
647                                                        $buffer[$value] = $this->encode($buffer[$value]);
648                                                        $entry .= $value . ';QUOTED-PRINTABLE:' . $buffer[$value]."\n";
649                                                }
650                                                elseif($value == 'BDAY')
651                                                {
652                                                        $tmp = preg_split('/\//',$buffer[$value]); # 12/31/1969 -> 1969-12-31
653                                                        if($tmp[0])
654                                                        {
655                                                                if(strlen($tmp[0]) == 1) { $tmp[0] = '0'.$tmp[0]; }
656                                                                if(strlen($tmp[1]) == 1) { $tmp[1] = '0'.$tmp[1]; }
657                                                                $entry .= 'BDAY:' . $tmp[2] . '-' . $tmp[0] . '-' . $tmp[1] . "\n";
658                                                        }
659                                                }
660                                                else
661                                                {
662                                                        $entry .= $value . ':' . $buffer[$value] . "\n";
663                                                }
664                                        }
665                                        else
666                                        {
667                                                switch($mult[0])
668                                                {
669                                                        case 'N':
670                                                                switch($mult[1])
671                                                                {
672                                                                        case 'PREFIX':
673                                                                                $prefix    = ';' . $buffer[$value];
674                                                                                break;
675                                                                        case 'GIVEN':
676                                                                                $firstname = ';' . $buffer[$value];
677                                                                                break;
678                                                                        case 'MIDDLE':
679                                                                                $middle    = ';' . $buffer[$value];
680                                                                                break;
681                                                                        case 'FAMILY':
682                                                                                $lastname  =       $buffer[$value];
683                                                                                break;
684                                                                        case 'SUFFIX':
685                                                                                $suffix    = ';' . $buffer[$value];
686                                                                                break;
687                                                                }
688                                                                break;
689                                                        case 'ORG':
690                                                                switch($mult[1])
691                                                                {
692                                                                        case 'NAME':
693                                                                                $org_name = $buffer[$value];
694                                                                                break;
695                                                                        case 'UNIT':
696                                                                                $org_unit = ';' . $buffer[$value];
697                                                                                break;
698                                                                }
699                                                                break;
700                                                        case 'ADR':
701                                                                switch($mult[1])
702                                                                {
703                                                                        case 'TYPE':
704                                                                                $types = explode(';',$buffer[$value]);
705                                                                                if($types[1])
706                                                                                {
707                                                                                        while($type = each($types))
708                                                                                        {
709                                                                                                $typei[$i][$mult[2]] .= ';' . strtoupper($type[1]);
710                                                                                        }
711                                                                                }
712                                                                                elseif($types[0])
713                                                                                {
714                                                                                        $typei[$i][$mult[2]] .= ';' . strtoupper($types[0]);
715                                                                                }
716                                                                                else
717                                                                                {
718                                                                                        $typei[$i][$mult[2]] .= ';' . strtoupper($buffer[$value]);
719                                                                                }
720                                                                                //echo "TYPE=".$typei[$i][$mult[2]];
721                                                                                break;
722                                                                        case 'WORK':
723                                                                                $workaddr .= $buffer[$value] . ';';
724                                                                                $workattr = $mult[0] . ';' . $mult[1] . $typei[$i][$mult[1]];
725                                                                                break;
726                                                                        case 'HOME':
727                                                                                $homeaddr .= $buffer[$value] . ';';
728                                                                                $homeattr = $mult[0] . ';' . $mult[1] . $typei[$i][$mult[1]];
729                                                                                break;
730                                                                        default:
731                                                                                break;
732                                                                }
733                                                                break;
734                                                        case 'TEL':
735                                                                switch($mult[1])
736                                                                {
737                                                                        case 'PREFER':
738                                                                                $prefer = explode(';',$buffer[$value]);
739                                                                                if($prefer[1])
740                                                                                {
741                                                                                        while($pref = strtoupper(each($prefer)))
742                                                                                        {
743                                                                                                $prefi[$i][$pref] = ';PREF';
744                                                                                        }
745                                                                                        //echo 'PREF1';
746                                                                                }
747                                                                                elseif($prefer[0])
748                                                                                {
749                                                                                        $prefi[$i][strtoupper($prefer[0])] = ';PREF';
750                                                                                        //echo 'PREF='.strtoupper($prefer[0]);
751                                                                                }
752                                                                                elseif($buffer[$value])
753                                                                                {
754                                                                                        $prefi[$i][$buffer[$value]] = ';PREF';
755                                                                                        //echo 'PREF3';
756                                                                                }
757                                                                                break;
758                                                                        case 'WORK':
759                                                                                // Wow, this is fun!
760                                                                                $entry .= 'A.' . $mult[0] . ';' . $mult[1] . $prefi[$i][$mult[1]] . ':' . $buffer[$value] . "\n";
761                                                                                break;
762                                                                        case 'HOME':
763                                                                                $entry .= 'B.' . $mult[0] . ';' . $mult[1] . $prefi[$i][$mult[1]] . ':' . $buffer[$value] . "\n";
764                                                                                break;
765                                                                        default:
766                                                                                $entry .= $mult[0] . ';' . $mult[1] . $prefi[$i][$mult[1]] . ':' . $buffer[$value] . "\n";
767                                                                                break;
768                                                                }
769                                                                break;
770                                                        case 'EMAIL':
771                                                                switch($mult[1])
772                                                                {
773                                                                        case 'TYPE':
774                                                                                if($mult[2] == 'WORK') { $emailtype  = ';' . $buffer[$value]; }
775                                                                                if($mult[2] == 'HOME') { $hemailtype = ';' . $buffer[$value]; }
776                                                                                break;
777                                                                        case 'WORK':
778                                                                                $newval = 'A.'.$value;
779                                                                                $entry .= $newval . $emailtype . ':' . $buffer[$value] . "\n";
780                                                                                break;
781                                                                        case 'HOME':
782                                                                                $newval = 'B.' . $value;
783                                                                                $entry .= $newval . $hemailtype . ':' . $buffer[$value] . "\n";
784                                                                                break;
785                                                                        default:
786                                                                                break;
787                                                                }
788                                                                break;
789                                                        default:
790                                                                break;
791                                                } //end switch($mult[0])
792                                        } //end else
793                                } //end if(!empty)
794                        } //end while
795
796                        if($lastname && $firstname)
797                        {
798                                $entries .= $header;
799                                $entries .= 'N:' . $lastname . $firstname . $middle . $prefix . $suffix . "\n";
800                                $entries .= $entry;
801
802                                if(!$buffer['FN'])
803                                {
804                                        if($lastname || $firstname)
805                                        {
806                                                $entries .= 'FN:' . substr($firstname,1) . ' ' . $lastname . "\n";
807                                        }
808                                }
809                                if($org_name || $org_unit)
810                                {
811                                        $entries .= 'ORG:' . $org_name . $org_unit . "\n";
812                                }
813
814                                $workattr = str_replace('ADR;','',$workattr);
815                                $homeattr = str_replace('ADR;','',$homeattr);
816                                if(!$buffer['EXT']) { $buffer['EXT'] = ';'; }
817                                if($workaddr)
818                                {
819                                        $work = 'A.ADR;' . $workattr . ':;' . $buffer['EXT'] . substr($workaddr,0,-1) . "\n";
820                                        if(!$buffer['LABEL'])
821                                        {
822                                                $wlabel = substr($workaddr,0,-1);
823                                                $wlabel = str_replace(';','=0D=0A',$wlabel);
824                                                //$wlabel = str_replace('(',',',$wlabel);
825                                                //$wlabel = str_replace(')',',',$wlabel);
826                                                $wlabel = 'LABEL;WORK;QUOTED-PRINTABLE:' . $wlabel . "\n";
827                                        }
828                                }
829                                if($homeaddr)
830                                {
831                                        $home = 'B.ADR;'.$homeattr.':;;'.substr($homeaddr,0,-1)."\n";
832                                        $hlabel = substr($homeaddr,0,-1);
833                                        $hlabel = str_replace(';','=0D=0A',$hlabel);
834                                        //$hlabel = str_replace('(',',',$hlabel);
835                                        //$hlabel = str_replace(')',',',$hlabel);
836                                        $hlabel = 'LABEL;HOME;QUOTED-PRINTABLE:' . $hlabel . "\n";
837                                }
838                                $entries = str_replace('PUBKEY','KEY',$entries);
839                                $entries .= $work . $home . $wlabel . $hlabel . 'END:VCARD' . "\n";
840                                $entries .= "\n";
841
842                                $buffer = $entries;
843                                return $buffer;
844                        }
845                        else
846                        {
847                                return;
848                        }
849                } //end function
850        } //end class
851?>
Note: See TracBrowser for help on using the repository browser.