]> err.no Git - scalable-opengroupware.org/blob - UI/Contacts/UIxContactView.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1151 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Contacts / UIxContactView.m
1 /*
2   Copyright (C) 2004 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #import <NGObjWeb/NSException+HTTP.h>
23 #import <NGObjWeb/WOResponse.h>
24 #import <NGCards/NGVCard.h>
25 #import <NGCards/CardElement.h>
26 #import <NGCards/NSArray+NGCards.h>
27 #import <NGExtensions/NSString+Ext.h>
28
29 #import <SoObjects/Contacts/SOGoContactObject.h>
30
31 #import "UIxContactView.h"
32
33 @implementation UIxContactView
34
35 /* accessors */
36
37 - (NSString *)tabSelection {
38   NSString *selection;
39     
40   selection = [self queryParameterForKey:@"tab"];
41   if (selection == nil)
42     selection = @"attributes";
43   return selection;
44 }
45
46 - (NSString *) _cardStringWithLabel: (NSString *) label
47                               value: (NSString *) value
48 {
49   NSMutableString *cardString;
50
51   cardString = [NSMutableString new];
52   [cardString autorelease];
53
54   if (value && [value length] > 0)
55     {
56       if (label)
57         [cardString appendFormat: @"%@&nbsp;%@<br />\n",
58                     [self labelForKey: label], value];
59       else
60         [cardString appendFormat: @"%@<br />\n", value];
61     }
62
63   return cardString;
64 }
65
66 - (NSString *) contactCardTitle
67 {
68   return [NSString stringWithFormat:
69                      [self labelForKey: @"Card for %@"],
70                    [card fn]];
71 }
72
73 - (NSString *) displayName
74 {
75   return [self _cardStringWithLabel: @"Display Name:"
76                value: [card fn]];
77 }
78
79 - (NSString *) nickName
80 {
81   return [self _cardStringWithLabel: @"Nickname:"
82                value: [card nickname]];
83 }
84
85 - (NSString *) primaryEmail
86 {
87   NSString *email, *mailTo;
88
89   email = [card preferredEMail];
90   if ([email length] > 0)
91     mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
92                        @" onclick=\"return onContactMailTo(this);\">"
93                        @"%@</a>", email, email];
94   else
95     mailTo = nil;
96
97   return [self _cardStringWithLabel: @"Email:"
98                value: mailTo];
99 }
100
101 - (NSString *) secondaryEmail
102 {
103   NSString *email, *mailTo;
104   NSMutableArray *emails;
105
106   emails = [NSMutableArray new];
107   [emails addObjectsFromArray: [card childrenWithTag: @"email"]];
108   [emails removeObjectsInArray: [card childrenWithTag: @"email"
109                                       andAttribute: @"type"
110                                       havingValue: @"pref"]];
111
112   if ([emails count] > 1)
113     {
114       email = [[emails objectAtIndex: 0] value: 0];
115       mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
116                          @" onclick=\"return onContactMailTo(this);\">"
117                          @"%@</a>", email, email];
118     }
119   else
120     mailTo = nil;
121
122   return [self _cardStringWithLabel: @"Additional Email:"
123                value: mailTo];
124 }
125
126 - (NSString *) screenName
127 {
128   NSString *screenName, *goim;
129
130   screenName = [[card uniqueChildWithTag: @"x-aim"] value: 0];
131   if ([screenName length] > 0)
132     goim = [NSString stringWithFormat: @"<a href=\"aim:goim?screenname=%@\""
133                      @">%@</a>", screenName, screenName];
134   else
135     goim = nil;
136
137   return [self _cardStringWithLabel: @"Screen Name:" value: goim];
138 }
139
140 - (NSString *) preferredTel
141 {
142   return [self _cardStringWithLabel: @"Phone Number:"
143                value: [card preferredTel]];
144 }
145
146 - (NSString *) preferredAddress
147 {
148   return @"";
149 }
150
151 - (BOOL) hasTelephones
152 {
153   if (!phones)
154     phones = [card childrenWithTag: @"tel"];
155
156   return ([phones count] > 0);
157 }
158
159 - (NSString *) _phoneOfType: (NSString *) aType
160                   withLabel: (NSString *) aLabel
161 {
162   NSArray *elements;
163   NSString *phone;
164
165   elements = [phones cardElementsWithAttribute: @"type"
166                      havingValue: aType];
167
168   if ([elements count] > 0)
169     phone = [[elements objectAtIndex: 0] value: 0];
170   else
171     phone = nil;
172
173   return [self _cardStringWithLabel: aLabel value: phone];
174 }
175
176 - (NSString *) workPhone
177 {
178   return [self _phoneOfType: @"work" withLabel: @"Work:"];
179 }
180
181 - (NSString *) homePhone
182 {
183   return [self _phoneOfType: @"home" withLabel: @"Home:"];
184 }
185
186 - (NSString *) fax
187 {
188   return [self _phoneOfType: @"fax" withLabel: @"Fax:"];
189 }
190
191 - (NSString *) mobile
192 {
193   return [self _phoneOfType: @"cell" withLabel: @"Mobile:"];
194 }
195
196 - (NSString *) pager
197 {
198   return [self _phoneOfType: @"pager" withLabel: @"Pager:"];
199 }
200
201 - (BOOL) hasHomeInfos
202 {
203   BOOL result;
204   NSArray *elements;
205
206   elements = [card childrenWithTag: @"adr"
207                    andAttribute: @"type"
208                    havingValue: @"home"];
209   if ([elements count] > 0)
210     {
211       result = YES;
212       homeAdr = [elements objectAtIndex: 0];
213     }
214   else
215     result = ([[card childrenWithTag: @"url"
216                      andAttribute: @"type"
217                      havingValue: @"home"] count] > 0);
218
219   return result;
220 }
221
222 - (NSString *) homePobox
223 {
224   return [self _cardStringWithLabel: nil value: [homeAdr value: 0]];
225 }
226
227 - (NSString *) homeExtendedAddress
228 {
229   return [self _cardStringWithLabel: nil value: [homeAdr value: 1]];
230 }
231
232 - (NSString *) homeStreetAddress
233 {
234   return [self _cardStringWithLabel: nil value: [homeAdr value: 2]];
235 }
236
237 - (NSString *) homeCityAndProv
238 {
239   NSString *city, *prov;
240   NSMutableString *data;
241
242   city = [homeAdr value: 3];
243   prov = [homeAdr value: 4];
244
245   data = [NSMutableString new];
246   [data autorelease];
247   [data appendString: city];
248   if ([city length] > 0 && [prov length] > 0)
249     [data appendString: @", "];
250   [data appendString: prov];
251
252   return [self _cardStringWithLabel: nil value: data];
253 }
254
255 - (NSString *) homePostalCodeAndCountry
256 {
257   NSString *postalCode, *country;
258   NSMutableString *data;
259
260   postalCode = [homeAdr value: 5];
261   country = [homeAdr value: 6];
262
263   data = [NSMutableString new];
264   [data autorelease];
265   [data appendString: postalCode];
266   if ([postalCode length] > 0 && [country length] > 0)
267     [data appendFormat: @", ", country];
268   [data appendString: country];
269
270   return [self _cardStringWithLabel: nil value: data];
271 }
272
273 - (NSString *) _urlOfType: (NSString *) aType
274 {
275   NSArray *elements;
276   NSString *data, *url;
277
278   elements = [card childrenWithTag: @"url"
279                    andAttribute: @"type"
280                    havingValue: aType];
281   if ([elements count] > 0)
282     {
283       url = [[elements objectAtIndex: 0] value: 0];
284       data = [NSString stringWithFormat:
285                          @"<a href=\"%@\">%@</a>",
286                        url, url];
287     }
288   else
289     data = nil;
290
291   return [self _cardStringWithLabel: nil value: data];
292 }
293
294 - (NSString *) homeUrl
295 {
296   return [self _urlOfType: @"home"];
297 }
298
299 - (BOOL) hasWorkInfos
300 {
301   BOOL result;
302   NSArray *elements;
303
304   elements = [card childrenWithTag: @"adr"
305                    andAttribute: @"type"
306                    havingValue: @"work"];
307   if ([elements count] > 0)
308     {
309       result = YES;
310       workAdr = [elements objectAtIndex: 0];
311     }
312   else
313     result = (([[card childrenWithTag: @"url"
314                       andAttribute: @"type"
315                      havingValue: @"work"] count] > 0)
316               || [[card childrenWithTag: @"org"] count] > 0);
317
318   return result;
319 }
320
321 - (NSString *) workTitle
322 {
323   return [self _cardStringWithLabel: nil value: [card title]];
324 }
325
326 - (NSString *) workService
327 {
328   NSArray *org, *orgServices;
329   NSRange aRange;
330   NSString *services;
331
332   org = [card org];
333   if (org && [org count] > 1)
334     {
335       aRange = NSMakeRange (1, [org count] - 1);
336       orgServices = [org subarrayWithRange: aRange];
337       services = [orgServices componentsJoinedByString: @", "];
338     }
339   else
340     services = nil;
341
342   return [self _cardStringWithLabel: nil value: services];
343 }
344
345 - (NSString *) workCompany
346 {
347   NSArray *org;
348   NSString *company;
349
350   org = [card org];
351   if (org && [org count] > 0)
352     company = [org objectAtIndex: 0];
353   else
354     company = nil;
355
356   return [self _cardStringWithLabel: nil value: company];
357 }
358
359 - (NSString *) workPobox
360 {
361   return [self _cardStringWithLabel: nil value: [workAdr value: 0]];
362 }
363
364 - (NSString *) workExtendedAddress
365 {
366   return [self _cardStringWithLabel: nil value: [workAdr value: 1]];
367 }
368
369 - (NSString *) workStreetAddress
370 {
371   return [self _cardStringWithLabel: nil value: [workAdr value: 2]];
372 }
373
374 - (NSString *) workCityAndProv
375 {
376   NSString *city, *prov;
377   NSMutableString *data;
378
379   city = [workAdr value: 3];
380   prov = [workAdr value: 4];
381
382   data = [NSMutableString new];
383   [data autorelease];
384   [data appendString: city];
385   if ([city length] > 0 && [prov length] > 0)
386     [data appendString: @", "];
387   [data appendString: prov];
388
389   return [self _cardStringWithLabel: nil value: data];
390 }
391
392 - (NSString *) workPostalCodeAndCountry
393 {
394   NSString *postalCode, *country;
395   NSMutableString *data;
396
397   postalCode = [workAdr value: 5];
398   country = [workAdr value: 6];
399
400   data = [NSMutableString new];
401   [data autorelease];
402   [data appendString: postalCode];
403   if ([postalCode length] > 0 && [country length] > 0)
404     [data appendFormat: @", ", country];
405   [data appendString: country];
406
407   return [self _cardStringWithLabel: nil value: data];
408 }
409
410 - (NSString *) workUrl
411 {
412   return [self _urlOfType: @"work"];
413 }
414
415 - (BOOL) hasOtherInfos
416 {
417   return ([[card note] length] > 0
418           || [[card bday] length] > 0
419           || [[card tz] length] > 0);
420 }
421
422 - (NSString *) bday
423 {
424   return [self _cardStringWithLabel: @"Birthday:" value: [card bday]];
425 }
426
427 - (NSString *) tz
428 {
429   return [self _cardStringWithLabel: @"Timezone:" value: [card tz]];
430 }
431
432 - (NSString *) note
433 {
434   NSString *note;
435
436   note = [card note];
437   if (note)
438     {
439       note = [note stringByReplacingString: @"\r\n"
440                    withString: @"<br />"];
441       note = [note stringByReplacingString: @"\n"
442                    withString: @"<br />"];
443     }
444
445   return [self _cardStringWithLabel: @"Note:" value: note];
446 }
447
448 /* hrefs */
449
450 - (NSString *) completeHrefForMethod: (NSString *) _method
451                        withParameter: (NSString *) _param
452                               forKey: (NSString *) _key
453 {
454   NSString *href;
455
456   [self setQueryParameter:_param forKey:_key];
457   href = [self completeHrefForMethod:[self ownMethodName]];
458   [self setQueryParameter:nil forKey:_key];
459
460   return href;
461 }
462
463 - (NSString *)attributesTabLink {
464   return [self completeHrefForMethod:[self ownMethodName]
465                withParameter:@"attributes"
466                forKey:@"tab"];
467 }
468 - (NSString *)debugTabLink {
469   return [self completeHrefForMethod:[self ownMethodName]
470                withParameter:@"debug"
471                forKey:@"tab"];
472 }
473
474 /* action */
475
476 - (id <WOActionResults>) vcardAction
477 {
478   WOResponse *response;
479
480   card = [[self clientObject] vCard];
481   if (card)
482     {
483       response = [WOResponse new];
484       [response autorelease];
485       [response setHeader: @"text/vcard" forKey: @"Content-type"];
486       [response appendContentString: [card versitString]];
487     }
488   else
489     return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
490                         reason:@"could not locate contact"];
491
492   return response;
493 }
494
495 - (id <WOActionResults>) defaultAction
496 {
497   card = [[self clientObject] vCard];
498   if (card)
499     {
500       phones = nil;
501       homeAdr = nil;
502       workAdr = nil;
503     }
504   else
505     return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
506                         reason: @"could not locate contact"];
507
508   return self;
509 }
510
511 - (BOOL) isDeletableClientObject
512 {
513   return [[self clientObject] respondsToSelector: @selector(delete)];
514 }
515
516 - (id) deleteAction
517 {
518   NSException *ex;
519   id url;
520
521   if (![self isDeletableClientObject])
522     /* return 400 == Bad Request */
523     return [NSException exceptionWithHTTPStatus:400
524                         reason:@"method cannot be invoked on "
525                         @"the specified object"];
526
527   ex = [[self clientObject] delete];
528   if (ex)
529     {
530     // TODO: improve error handling
531       [self debugWithFormat:@"failed to delete: %@", ex];
532
533       return ex;
534     }
535
536   url = [[[self clientObject] container] baseURLInContext:[self context]];
537
538   return [self redirectToLocation:url];
539 }
540
541 @end /* UIxContactView */