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 *) preferredEmail
88 NSString *email, *mailTo;
90 email = [card preferredEMail];
91 if (email && [email length] > 0)
92 mailTo = [NSString stringWithFormat: @"<a href=\"mailto:%@\""
93 @" onclick=\"return onContactMailTo(this);\">"
94 @"%@</a>", email, email];
98 return [self _cardStringWithLabel: @"Email Address: "
102 - (NSString *) preferredTel
104 return [self _cardStringWithLabel: @"Phone Number: "
105 value: [card preferredTel]];
108 - (NSString *) preferredAddress
113 - (BOOL) hasTelephones
116 phones = [card childrenWithTag: @"tel"];
118 return ([phones count] > 0);
121 - (NSString *) _phoneOfType: (NSString *) aType
122 withLabel: (NSString *) aLabel
127 elements = [phones cardElementsWithAttribute: @"type"
130 if ([elements count] > 0)
131 phone = [[elements objectAtIndex: 0] value: 0];
135 return [self _cardStringWithLabel: aLabel value: phone];
138 - (NSString *) workPhone
140 return [self _phoneOfType: @"work" withLabel: @"Work: "];
143 - (NSString *) homePhone
145 return [self _phoneOfType: @"home" withLabel: @"Home: "];
150 return [self _phoneOfType: @"fax" withLabel: @"Fax: "];
153 - (NSString *) mobile
155 return [self _phoneOfType: @"cell" withLabel: @"Mobile: "];
160 return [self _phoneOfType: @"pager" withLabel: @"Pager: "];
163 - (BOOL) hasHomeInfos
168 elements = [card childrenWithTag: @"adr"
169 andAttribute: @"type"
170 havingValue: @"home"];
171 if ([elements count] > 0)
174 homeAdr = [elements objectAtIndex: 0];
177 result = ([[card childrenWithTag: @"url"
178 andAttribute: @"type"
179 havingValue: @"home"] count] > 0);
184 - (NSString *) homePobox
186 return [self _cardStringWithLabel: nil value: [homeAdr value: 0]];
189 - (NSString *) homeExtendedAddress
191 return [self _cardStringWithLabel: nil value: [homeAdr value: 1]];
194 - (NSString *) homeStreetAddress
196 return [self _cardStringWithLabel: nil value: [homeAdr value: 2]];
199 - (NSString *) homeCityAndProv
201 NSString *city, *prov;
202 NSMutableString *data;
204 city = [homeAdr value: 3];
205 prov = [homeAdr value: 4];
207 data = [NSMutableString new];
209 [data appendString: city];
210 if ([city length] > 0 && [prov length] > 0)
211 [data appendString: @", "];
212 [data appendString: prov];
214 return [self _cardStringWithLabel: nil value: data];
217 - (NSString *) homePostalCodeAndCountry
219 NSString *postalCode, *country;
220 NSMutableString *data;
222 postalCode = [homeAdr value: 5];
223 country = [homeAdr value: 6];
225 data = [NSMutableString new];
227 [data appendString: postalCode];
228 if ([postalCode length] > 0 && [country length] > 0)
229 [data appendFormat: @", ", country];
230 [data appendString: country];
232 return [self _cardStringWithLabel: nil value: data];
235 - (NSString *) _urlOfType: (NSString *) aType
238 NSString *data, *url;
240 elements = [card childrenWithTag: @"url"
241 andAttribute: @"type"
243 if ([elements count] > 0)
245 url = [[elements objectAtIndex: 0] value: 0];
246 data = [NSString stringWithFormat:
247 @"<a href=\"%@\">%@</a>",
253 return [self _cardStringWithLabel: nil value: data];
256 - (NSString *) homeUrl
258 return [self _urlOfType: @"home"];
261 - (BOOL) hasWorkInfos
266 elements = [card childrenWithTag: @"adr"
267 andAttribute: @"type"
268 havingValue: @"work"];
269 if ([elements count] > 0)
272 workAdr = [elements objectAtIndex: 0];
275 result = (([[card childrenWithTag: @"url"
276 andAttribute: @"type"
277 havingValue: @"work"] count] > 0)
278 || [[card childrenWithTag: @"org"] count] > 0);
283 - (NSString *) workTitle
285 return [self _cardStringWithLabel: nil value: [card title]];
288 - (NSString *) workService
290 NSArray *org, *orgServices;
295 if (org && [org count] > 1)
297 aRange = NSMakeRange (1, [org count] - 1);
298 orgServices = [org subarrayWithRange: aRange];
299 services = [orgServices componentsJoinedByString: @", "];
304 return [self _cardStringWithLabel: nil value: services];
307 - (NSString *) workCompany
313 if (org && [org count] > 0)
314 company = [org objectAtIndex: 0];
318 return [self _cardStringWithLabel: nil value: company];
321 - (NSString *) workPobox
323 return [self _cardStringWithLabel: nil value: [workAdr value: 0]];
326 - (NSString *) workExtendedAddress
328 return [self _cardStringWithLabel: nil value: [workAdr value: 1]];
331 - (NSString *) workStreetAddress
333 return [self _cardStringWithLabel: nil value: [workAdr value: 2]];
336 - (NSString *) workCityAndProv
338 NSString *city, *prov;
339 NSMutableString *data;
341 city = [workAdr value: 3];
342 prov = [workAdr value: 4];
344 data = [NSMutableString new];
346 [data appendString: city];
347 if ([city length] > 0 && [prov length] > 0)
348 [data appendString: @", "];
349 [data appendString: prov];
351 return [self _cardStringWithLabel: nil value: data];
354 - (NSString *) workPostalCodeAndCountry
356 NSString *postalCode, *country;
357 NSMutableString *data;
359 postalCode = [workAdr value: 5];
360 country = [workAdr value: 6];
362 data = [NSMutableString new];
364 [data appendString: postalCode];
365 if ([postalCode length] > 0 && [country length] > 0)
366 [data appendFormat: @", ", country];
367 [data appendString: country];
369 return [self _cardStringWithLabel: nil value: data];
372 - (NSString *) workUrl
374 return [self _urlOfType: @"home"];
377 - (BOOL) hasOtherInfos
379 return ([[card note] length] > 0
380 || [[card bday] length] > 0
381 || [[card tz] length] > 0);
386 return [self _cardStringWithLabel: @"Birthday: " value: [card bday]];
391 return [self _cardStringWithLabel: @"Timezone: " value: [card tz]];
401 note = [note stringByReplacingString: @"\r\n"
402 withString: @"<br />"];
403 note = [note stringByReplacingString: @"\n"
404 withString: @"<br />"];
407 return [self _cardStringWithLabel: @"Note: " value: note];
412 - (NSString *) completeHrefForMethod: (NSString *) _method
413 withParameter: (NSString *) _param
414 forKey: (NSString *) _key
418 [self setQueryParameter:_param forKey:_key];
419 href = [self completeHrefForMethod:[self ownMethodName]];
420 [self setQueryParameter:nil forKey:_key];
425 - (NSString *)attributesTabLink {
426 return [self completeHrefForMethod:[self ownMethodName]
427 withParameter:@"attributes"
430 - (NSString *)debugTabLink {
431 return [self completeHrefForMethod:[self ownMethodName]
432 withParameter:@"debug"
438 - (id <WOActionResults>) vcardAction
440 WOResponse *response;
442 card = [[self clientObject] vCard];
445 response = [WOResponse new];
446 [response autorelease];
447 [response setHeader: @"text/vcard" forKey: @"Content-type"];
448 [response appendContentString: [card versitString]];
451 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
452 reason:@"could not locate contact"];
457 - (id <WOActionResults>) defaultAction
459 card = [[self clientObject] vCard];
467 return [NSException exceptionWithHTTPStatus: 404 /* Not Found */
468 reason: @"could not locate contact"];
473 - (BOOL) isDeletableClientObject
475 return [[self clientObject] respondsToSelector: @selector(delete)];
483 if (![self isDeletableClientObject])
484 /* return 400 == Bad Request */
485 return [NSException exceptionWithHTTPStatus:400
486 reason:@"method cannot be invoked on "
487 @"the specified object"];
489 ex = [[self clientObject] delete];
492 // TODO: improve error handling
493 [self debugWithFormat:@"failed to delete: %@", ex];
498 url = [[[self clientObject] container] baseURLInContext:[self context]];
500 return [self redirectToLocation:url];
503 @end /* UIxContactView */