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
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>
29 #import <SoObjects/Contacts/SOGoContactObject.h>
31 #import "UIxContactView.h"
33 @implementation UIxContactView
37 - (NSString *)tabSelection {
40 selection = [self queryParameterForKey:@"tab"];
42 selection = @"attributes";
46 - (NSString *) _cardStringWithLabel: (NSString *) label
47 value: (NSString *) value
49 NSMutableString *cardString;
51 cardString = [NSMutableString new];
52 [cardString autorelease];
54 if (value && [value length] > 0)
57 [cardString appendFormat: @"%@ %@<br />\n",
58 [self labelForKey: label], value];
60 [cardString appendFormat: @"%@<br />\n", value];
66 - (NSString *) contactCardTitle
68 return [NSString stringWithFormat:
69 [self labelForKey: @"Card for %@"],
73 - (NSString *) displayName
75 return [self _cardStringWithLabel: @"Display Name:"
79 - (NSString *) nickName
81 return [self _cardStringWithLabel: @"Nickname:"
82 value: [card nickname]];
85 - (NSString *) primaryEmail
87 NSString *email, *mailTo;
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];
97 return [self _cardStringWithLabel: @"Email:"
101 - (NSString *) secondaryEmail
103 NSString *email, *mailTo;
104 NSMutableArray *emails;
106 emails = [NSMutableArray new];
107 [emails addObjectsFromArray: [card childrenWithTag: @"email"]];
108 [emails removeObjectsInArray: [card childrenWithTag: @"email"
109 andAttribute: @"type"
110 havingValue: @"pref"]];
112 if ([emails count] > 1)
114 email = [[emails objectAtIndex: 0] value: 0];
115 mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
116 @" onclick=\"return onContactMailTo(this);\">"
117 @"%@</a>", email, email];
122 return [self _cardStringWithLabel: @"Additional Email:"
126 - (NSString *) screenName
128 NSString *screenName, *goim;
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];
137 return [self _cardStringWithLabel: @"Screen Name:" value: goim];
140 - (NSString *) preferredTel
142 return [self _cardStringWithLabel: @"Phone Number:"
143 value: [card preferredTel]];
146 - (NSString *) preferredAddress
151 - (BOOL) hasTelephones
154 phones = [card childrenWithTag: @"tel"];
156 return ([phones count] > 0);
159 - (NSString *) _phoneOfType: (NSString *) aType
160 withLabel: (NSString *) aLabel
165 elements = [phones cardElementsWithAttribute: @"type"
168 if ([elements count] > 0)
169 phone = [[elements objectAtIndex: 0] value: 0];
173 return [self _cardStringWithLabel: aLabel value: phone];
176 - (NSString *) workPhone
178 return [self _phoneOfType: @"work" withLabel: @"Work:"];
181 - (NSString *) homePhone
183 return [self _phoneOfType: @"home" withLabel: @"Home:"];
188 return [self _phoneOfType: @"fax" withLabel: @"Fax:"];
191 - (NSString *) mobile
193 return [self _phoneOfType: @"cell" withLabel: @"Mobile:"];
198 return [self _phoneOfType: @"pager" withLabel: @"Pager:"];
201 - (BOOL) hasHomeInfos
206 elements = [card childrenWithTag: @"adr"
207 andAttribute: @"type"
208 havingValue: @"home"];
209 if ([elements count] > 0)
212 homeAdr = [elements objectAtIndex: 0];
215 result = ([[card childrenWithTag: @"url"
216 andAttribute: @"type"
217 havingValue: @"home"] count] > 0);
222 - (NSString *) homePobox
224 return [self _cardStringWithLabel: nil value: [homeAdr value: 0]];
227 - (NSString *) homeExtendedAddress
229 return [self _cardStringWithLabel: nil value: [homeAdr value: 1]];
232 - (NSString *) homeStreetAddress
234 return [self _cardStringWithLabel: nil value: [homeAdr value: 2]];
237 - (NSString *) homeCityAndProv
239 NSString *city, *prov;
240 NSMutableString *data;
242 city = [homeAdr value: 3];
243 prov = [homeAdr value: 4];
245 data = [NSMutableString new];
247 [data appendString: city];
248 if ([city length] > 0 && [prov length] > 0)
249 [data appendString: @", "];
250 [data appendString: prov];
252 return [self _cardStringWithLabel: nil value: data];
255 - (NSString *) homePostalCodeAndCountry
257 NSString *postalCode, *country;
258 NSMutableString *data;
260 postalCode = [homeAdr value: 5];
261 country = [homeAdr value: 6];
263 data = [NSMutableString new];
265 [data appendString: postalCode];
266 if ([postalCode length] > 0 && [country length] > 0)
267 [data appendFormat: @", ", country];
268 [data appendString: country];
270 return [self _cardStringWithLabel: nil value: data];
273 - (NSString *) _urlOfType: (NSString *) aType
276 NSString *data, *url;
278 elements = [card childrenWithTag: @"url"
279 andAttribute: @"type"
281 if ([elements count] > 0)
283 url = [[elements objectAtIndex: 0] value: 0];
284 data = [NSString stringWithFormat:
285 @"<a href=\"%@\">%@</a>",
291 return [self _cardStringWithLabel: nil value: data];
294 - (NSString *) homeUrl
296 return [self _urlOfType: @"home"];
299 - (BOOL) hasWorkInfos
304 elements = [card childrenWithTag: @"adr"
305 andAttribute: @"type"
306 havingValue: @"work"];
307 if ([elements count] > 0)
310 workAdr = [elements objectAtIndex: 0];
313 result = (([[card childrenWithTag: @"url"
314 andAttribute: @"type"
315 havingValue: @"work"] count] > 0)
316 || [[card childrenWithTag: @"org"] count] > 0);
321 - (NSString *) workTitle
323 return [self _cardStringWithLabel: nil value: [card title]];
326 - (NSString *) workService
328 NSArray *org, *orgServices;
333 if (org && [org count] > 1)
335 aRange = NSMakeRange (1, [org count] - 1);
336 orgServices = [org subarrayWithRange: aRange];
337 services = [orgServices componentsJoinedByString: @", "];
342 return [self _cardStringWithLabel: nil value: services];
345 - (NSString *) workCompany
351 if (org && [org count] > 0)
352 company = [org objectAtIndex: 0];
356 return [self _cardStringWithLabel: nil value: company];
359 - (NSString *) workPobox
361 return [self _cardStringWithLabel: nil value: [workAdr value: 0]];
364 - (NSString *) workExtendedAddress
366 return [self _cardStringWithLabel: nil value: [workAdr value: 1]];
369 - (NSString *) workStreetAddress
371 return [self _cardStringWithLabel: nil value: [workAdr value: 2]];
374 - (NSString *) workCityAndProv
376 NSString *city, *prov;
377 NSMutableString *data;
379 city = [workAdr value: 3];
380 prov = [workAdr value: 4];
382 data = [NSMutableString new];
384 [data appendString: city];
385 if ([city length] > 0 && [prov length] > 0)
386 [data appendString: @", "];
387 [data appendString: prov];
389 return [self _cardStringWithLabel: nil value: data];
392 - (NSString *) workPostalCodeAndCountry
394 NSString *postalCode, *country;
395 NSMutableString *data;
397 postalCode = [workAdr value: 5];
398 country = [workAdr value: 6];
400 data = [NSMutableString new];
402 [data appendString: postalCode];
403 if ([postalCode length] > 0 && [country length] > 0)
404 [data appendFormat: @", ", country];
405 [data appendString: country];
407 return [self _cardStringWithLabel: nil value: data];
410 - (NSString *) workUrl
412 return [self _urlOfType: @"work"];
415 - (BOOL) hasOtherInfos
417 return ([[card note] length] > 0
418 || [[card bday] length] > 0
419 || [[card tz] length] > 0);
424 return [self _cardStringWithLabel: @"Birthday:" value: [card bday]];
429 return [self _cardStringWithLabel: @"Timezone:" value: [card tz]];
439 note = [note stringByReplacingString: @"\r\n"
440 withString: @"<br />"];
441 note = [note stringByReplacingString: @"\n"
442 withString: @"<br />"];
445 return [self _cardStringWithLabel: @"Note:" value: note];
450 - (NSString *) completeHrefForMethod: (NSString *) _method
451 withParameter: (NSString *) _param
452 forKey: (NSString *) _key
456 [self setQueryParameter:_param forKey:_key];
457 href = [self completeHrefForMethod:[self ownMethodName]];
458 [self setQueryParameter:nil forKey:_key];
463 - (NSString *)attributesTabLink {
464 return [self completeHrefForMethod:[self ownMethodName]
465 withParameter:@"attributes"
468 - (NSString *)debugTabLink {
469 return [self completeHrefForMethod:[self ownMethodName]
470 withParameter:@"debug"
476 - (id <WOActionResults>) vcardAction
478 WOResponse *response;
480 card = [[self clientObject] vCard];
483 response = [WOResponse new];
484 [response autorelease];
485 [response setHeader: @"text/vcard" forKey: @"Content-type"];
486 [response appendContentString: [card versitString]];
489 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
490 reason:@"could not locate contact"];
495 - (id <WOActionResults>) defaultAction
497 card = [[self clientObject] vCard];
505 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
506 reason: @"could not locate contact"];
511 - (BOOL) isDeletableClientObject
513 return [[self clientObject] respondsToSelector: @selector(delete)];
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"];
527 ex = [[self clientObject] delete];
530 // TODO: improve error handling
531 [self debugWithFormat:@"failed to delete: %@", ex];
536 url = [[[self clientObject] container] baseURLInContext:[self context]];
538 return [self redirectToLocation:url];
541 @end /* UIxContactView */