2 Copyright (C) 2004 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
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
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.
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
23 #import <Contacts/SOGoContactObject.h>
25 #import <NGCards/NGVCard.h>
26 #import <NGCards/CardElement.h>
27 #import <NGCards/NSArray+NGCards.h>
28 #import <NGExtensions/NSString+Ext.h>
32 #import "UIxContactView.h"
34 @implementation UIxContactView
38 - (NSString *)tabSelection {
41 selection = [self queryParameterForKey:@"tab"];
43 selection = @"attributes";
47 - (NSString *) _cardStringWithLabel: (NSString *) label
48 value: (NSString *) value
50 NSMutableString *cardString;
52 cardString = [NSMutableString new];
53 [cardString autorelease];
55 if (value && [value length] > 0)
58 [cardString appendFormat: @"%@ %@<br />\n",
59 [self labelForKey: label], value];
61 [cardString appendFormat: @"%@<br />\n", value];
67 - (NSString *) contactCardTitle
69 return [NSString stringWithFormat:
70 [self labelForKey: @"Card for %@"],
74 - (NSString *) displayName
76 return [self _cardStringWithLabel: @"Display Name:"
80 - (NSString *) nickName
82 return [self _cardStringWithLabel: @"Nickname:"
83 value: [card nickname]];
86 - (NSString *) primaryEmail
88 NSString *email, *mailTo;
90 email = [card preferredEMail];
91 if ([email length] > 0)
92 mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
93 @" onclick=\"return onContactMailTo(this);\">"
94 @"%@</a>", email, email];
98 return [self _cardStringWithLabel: @"Email:"
102 - (NSString *) secondaryEmail
104 NSString *email, *mailTo;
105 NSMutableArray *emails;
107 emails = [NSMutableArray new];
108 [emails addObjectsFromArray: [card childrenWithTag: @"email"]];
109 [emails removeObjectsInArray: [card childrenWithTag: @"email"
110 andAttribute: @"type"
111 havingValue: @"pref"]];
113 if ([emails count] > 1)
115 email = [[emails objectAtIndex: 0] value: 0];
116 mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
117 @" onclick=\"return onContactMailTo(this);\">"
118 @"%@</a>", email, email];
123 return [self _cardStringWithLabel: @"Additional Email:"
127 - (NSString *) screenName
129 NSString *screenName, *goim;
131 screenName = [[card uniqueChildWithTag: @"x-aim"] value: 0];
132 if ([screenName length] > 0)
133 goim = [NSString stringWithFormat: @"<a href=\"aim:goim?screenname=%@\""
134 @">%@</a>", screenName, screenName];
138 return [self _cardStringWithLabel: @"Screen Name:" value: goim];
141 - (NSString *) preferredTel
143 return [self _cardStringWithLabel: @"Phone Number:"
144 value: [card preferredTel]];
147 - (NSString *) preferredAddress
152 - (BOOL) hasTelephones
155 phones = [card childrenWithTag: @"tel"];
157 return ([phones count] > 0);
160 - (NSString *) _phoneOfType: (NSString *) aType
161 withLabel: (NSString *) aLabel
166 elements = [phones cardElementsWithAttribute: @"type"
169 if ([elements count] > 0)
170 phone = [[elements objectAtIndex: 0] value: 0];
174 return [self _cardStringWithLabel: aLabel value: phone];
177 - (NSString *) workPhone
179 return [self _phoneOfType: @"work" withLabel: @"Work:"];
182 - (NSString *) homePhone
184 return [self _phoneOfType: @"home" withLabel: @"Home:"];
189 return [self _phoneOfType: @"fax" withLabel: @"Fax:"];
192 - (NSString *) mobile
194 return [self _phoneOfType: @"cell" withLabel: @"Mobile:"];
199 return [self _phoneOfType: @"pager" withLabel: @"Pager:"];
202 - (BOOL) hasHomeInfos
207 elements = [card childrenWithTag: @"adr"
208 andAttribute: @"type"
209 havingValue: @"home"];
210 if ([elements count] > 0)
213 homeAdr = [elements objectAtIndex: 0];
216 result = ([[card childrenWithTag: @"url"
217 andAttribute: @"type"
218 havingValue: @"home"] count] > 0);
223 - (NSString *) homePobox
225 return [self _cardStringWithLabel: nil value: [homeAdr value: 0]];
228 - (NSString *) homeExtendedAddress
230 return [self _cardStringWithLabel: nil value: [homeAdr value: 1]];
233 - (NSString *) homeStreetAddress
235 return [self _cardStringWithLabel: nil value: [homeAdr value: 2]];
238 - (NSString *) homeCityAndProv
240 NSString *city, *prov;
241 NSMutableString *data;
243 city = [homeAdr value: 3];
244 prov = [homeAdr value: 4];
246 data = [NSMutableString new];
248 [data appendString: city];
249 if ([city length] > 0 && [prov length] > 0)
250 [data appendString: @", "];
251 [data appendString: prov];
253 return [self _cardStringWithLabel: nil value: data];
256 - (NSString *) homePostalCodeAndCountry
258 NSString *postalCode, *country;
259 NSMutableString *data;
261 postalCode = [homeAdr value: 5];
262 country = [homeAdr value: 6];
264 data = [NSMutableString new];
266 [data appendString: postalCode];
267 if ([postalCode length] > 0 && [country length] > 0)
268 [data appendFormat: @", ", country];
269 [data appendString: country];
271 return [self _cardStringWithLabel: nil value: data];
274 - (NSString *) _urlOfType: (NSString *) aType
277 NSString *data, *url;
279 elements = [card childrenWithTag: @"url"
280 andAttribute: @"type"
282 if ([elements count] > 0)
284 url = [[elements objectAtIndex: 0] value: 0];
285 data = [NSString stringWithFormat:
286 @"<a href=\"%@\">%@</a>",
292 return [self _cardStringWithLabel: nil value: data];
295 - (NSString *) homeUrl
297 return [self _urlOfType: @"home"];
300 - (BOOL) hasWorkInfos
305 elements = [card childrenWithTag: @"adr"
306 andAttribute: @"type"
307 havingValue: @"work"];
308 if ([elements count] > 0)
311 workAdr = [elements objectAtIndex: 0];
314 result = (([[card childrenWithTag: @"url"
315 andAttribute: @"type"
316 havingValue: @"work"] count] > 0)
317 || [[card childrenWithTag: @"org"] count] > 0);
322 - (NSString *) workTitle
324 return [self _cardStringWithLabel: nil value: [card title]];
327 - (NSString *) workService
329 NSArray *org, *orgServices;
334 if (org && [org count] > 1)
336 aRange = NSMakeRange (1, [org count] - 1);
337 orgServices = [org subarrayWithRange: aRange];
338 services = [orgServices componentsJoinedByString: @", "];
343 return [self _cardStringWithLabel: nil value: services];
346 - (NSString *) workCompany
352 if (org && [org count] > 0)
353 company = [org objectAtIndex: 0];
357 return [self _cardStringWithLabel: nil value: company];
360 - (NSString *) workPobox
362 return [self _cardStringWithLabel: nil value: [workAdr value: 0]];
365 - (NSString *) workExtendedAddress
367 return [self _cardStringWithLabel: nil value: [workAdr value: 1]];
370 - (NSString *) workStreetAddress
372 return [self _cardStringWithLabel: nil value: [workAdr value: 2]];
375 - (NSString *) workCityAndProv
377 NSString *city, *prov;
378 NSMutableString *data;
380 city = [workAdr value: 3];
381 prov = [workAdr value: 4];
383 data = [NSMutableString new];
385 [data appendString: city];
386 if ([city length] > 0 && [prov length] > 0)
387 [data appendString: @", "];
388 [data appendString: prov];
390 return [self _cardStringWithLabel: nil value: data];
393 - (NSString *) workPostalCodeAndCountry
395 NSString *postalCode, *country;
396 NSMutableString *data;
398 postalCode = [workAdr value: 5];
399 country = [workAdr value: 6];
401 data = [NSMutableString new];
403 [data appendString: postalCode];
404 if ([postalCode length] > 0 && [country length] > 0)
405 [data appendFormat: @", ", country];
406 [data appendString: country];
408 return [self _cardStringWithLabel: nil value: data];
411 - (NSString *) workUrl
413 return [self _urlOfType: @"work"];
416 - (BOOL) hasOtherInfos
418 return ([[card note] length] > 0
419 || [[card bday] length] > 0
420 || [[card tz] length] > 0);
425 return [self _cardStringWithLabel: @"Birthday:" value: [card bday]];
430 return [self _cardStringWithLabel: @"Timezone:" value: [card tz]];
440 note = [note stringByReplacingString: @"\r\n"
441 withString: @"<br />"];
442 note = [note stringByReplacingString: @"\n"
443 withString: @"<br />"];
446 return [self _cardStringWithLabel: @"Note:" value: note];
451 - (NSString *) completeHrefForMethod: (NSString *) _method
452 withParameter: (NSString *) _param
453 forKey: (NSString *) _key
457 [self setQueryParameter:_param forKey:_key];
458 href = [self completeHrefForMethod:[self ownMethodName]];
459 [self setQueryParameter:nil forKey:_key];
464 - (NSString *)attributesTabLink {
465 return [self completeHrefForMethod:[self ownMethodName]
466 withParameter:@"attributes"
469 - (NSString *)debugTabLink {
470 return [self completeHrefForMethod:[self ownMethodName]
471 withParameter:@"debug"
477 - (id <WOActionResults>) vcardAction
479 WOResponse *response;
481 card = [[self clientObject] vCard];
484 response = [WOResponse new];
485 [response autorelease];
486 [response setHeader: @"text/vcard" forKey: @"Content-type"];
487 [response appendContentString: [card versitString]];
490 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
491 reason:@"could not locate contact"];
496 - (id <WOActionResults>) defaultAction
498 card = [[self clientObject] vCard];
506 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
507 reason: @"could not locate contact"];
512 - (BOOL) isDeletableClientObject
514 return [[self clientObject] respondsToSelector: @selector(delete)];
522 if (![self isDeletableClientObject])
523 /* return 400 == Bad Request */
524 return [NSException exceptionWithHTTPStatus:400
525 reason:@"method cannot be invoked on "
526 @"the specified object"];
528 ex = [[self clientObject] delete];
531 // TODO: improve error handling
532 [self debugWithFormat:@"failed to delete: %@", ex];
537 url = [[[self clientObject] container] baseURLInContext:[self context]];
539 return [self redirectToLocation:url];
542 @end /* UIxContactView */