* summary.c: summary screen is now updated using ajax instead of refreshing
[citadel.git] / webcit / vcard_edit.c
1 /*
2  * $Id$
3  *
4  * Handles on-screen editing of vCard objects.
5  *
6  */
7
8 #include "webcit.h"
9 #include "vcard.h"
10
11 /* Edit the vCard component of a MIME message.  Supply the message number
12  * and MIME part number to fetch.  Or, specify -1 for the message number
13  * to start with a blank card.
14  */
15 void do_edit_vcard(long msgnum, char *partnum, char *return_to) {
16         char buf[SIZ];
17         char *serialized_vcard = NULL;
18         size_t total_len = 0;
19         struct vCard *v;
20         int i;
21         char *key, *value;
22         char whatuser[SIZ];
23
24         char lastname[SIZ];
25         char firstname[SIZ];
26         char middlename[SIZ];
27         char prefix[SIZ];
28         char suffix[SIZ];
29         char pobox[SIZ];
30         char extadr[SIZ];
31         char street[SIZ];
32         char city[SIZ];
33         char state[SIZ];
34         char zipcode[SIZ];
35         char country[SIZ];
36         char hometel[SIZ];
37         char worktel[SIZ];
38         char primary_inetemail[SIZ];
39         char other_inetemail[SIZ];
40         char extrafields[SIZ];
41         char title[SIZ];
42         char org[SIZ];
43
44         lastname[0] = 0;
45         firstname[0] = 0;
46         middlename[0] = 0;
47         prefix[0] = 0;
48         suffix[0] = 0;
49         pobox[0] = 0;
50         extadr[0] = 0;
51         street[0] = 0;
52         city[0] = 0;
53         state[0] = 0;
54         zipcode[0] = 0;
55         country[0] = 0;
56         hometel[0] = 0;
57         worktel[0] = 0;
58         primary_inetemail[0] = 0;
59         other_inetemail[0] = 0;
60         title[0] = 0;
61         org[0] = 0;
62         extrafields[0] = 0;
63
64         safestrncpy(whatuser, "", sizeof whatuser);
65
66         if (msgnum >= 0) {
67                 sprintf(buf, "MSG0 %ld|1", msgnum);
68                 serv_puts(buf);
69                 serv_getln(buf, sizeof buf);
70                 if (buf[0] != '1') {
71                         convenience_page("770000", _("Error"), &buf[4]);
72                         return;
73                 }
74                 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
75                         if (!strncasecmp(buf, "from=", 5)) {
76                                 safestrncpy(whatuser, &buf[5], sizeof whatuser);
77                         }
78                         else if (!strncasecmp(buf, "node=", 5)) {
79                                 strcat(whatuser, " @ ");
80                                 strcat(whatuser, &buf[5]);
81                         }
82                 }
83         
84                 sprintf(buf, "OPNA %ld|%s", msgnum, partnum);
85                 serv_puts(buf);
86                 serv_getln(buf, sizeof buf);
87                 if (buf[0] != '2') {
88                         convenience_page("770000", "Error", &buf[4]);
89                         return;
90                 }
91         
92                 total_len = atoi(&buf[4]);
93                 serialized_vcard = malloc(total_len + 2);
94         
95                 read_server_binary(serialized_vcard, total_len);
96         
97                 serv_puts("CLOS");
98                 serv_getln(buf, sizeof buf);
99                 serialized_vcard[total_len] = 0;
100         
101                 v = vcard_load(serialized_vcard);
102                 free(serialized_vcard);
103         
104                 /* Populate the variables for our form */
105                 i = 0;
106                 while (key = vcard_get_prop(v, "", 0, i, 1), key != NULL) {
107                         value = vcard_get_prop(v, "", 0, i++, 0);
108         
109                         if (!strcasecmp(key, "n")) {
110                                 extract_token(lastname, value, 0, ';', sizeof lastname);
111                                 extract_token(firstname, value, 1, ';', sizeof firstname);
112                                 extract_token(middlename, value, 2, ';', sizeof middlename);
113                                 extract_token(prefix, value, 3, ';', sizeof prefix);
114                                 extract_token(suffix, value, 4, ';', sizeof suffix);
115                         }
116
117                         else if (!strcasecmp(key, "title")) {
118                                 safestrncpy(title, value, sizeof title);
119                         }
120         
121                         else if (!strcasecmp(key, "org")) {
122                                 safestrncpy(org, value, sizeof org);
123                         }
124         
125                         else if (!strcasecmp(key, "adr")) {
126                                 extract_token(pobox, value, 0, ';', sizeof pobox);
127                                 extract_token(extadr, value, 1, ';', sizeof extadr);
128                                 extract_token(street, value, 2, ';', sizeof street);
129                                 extract_token(city, value, 3, ';', sizeof city);
130                                 extract_token(state, value, 4, ';', sizeof state);
131                                 extract_token(zipcode, value, 5, ';', sizeof zipcode);
132                                 extract_token(country, value, 6, ';', sizeof country);
133                         }
134         
135                         else if (!strcasecmp(key, "tel;home")) {
136                                 extract_token(hometel, value, 0, ';', sizeof hometel);
137                         }
138         
139                         else if (!strcasecmp(key, "tel;work")) {
140                                 extract_token(worktel, value, 0, ';', sizeof worktel);
141                         }
142         
143                         else if (!strcasecmp(key, "email;internet")) {
144                                 if (primary_inetemail[0] == 0) {
145                                         safestrncpy(primary_inetemail, value, sizeof primary_inetemail);
146                                 }
147                                 else {
148                                         if (other_inetemail[0] != 0) {
149                                                 strcat(other_inetemail, "\n");
150                                         }
151                                         strcat(other_inetemail, value);
152                                 }
153                         }
154         
155                         else {
156                                 strcat(extrafields, key);
157                                 strcat(extrafields, ":");
158                                 strcat(extrafields, value);
159                                 strcat(extrafields, "\n");
160                         }
161         
162                 }
163         
164                 vcard_free(v);
165         }
166
167         /* Display the form */
168         output_headers(1, 1, 2, 0, 0, 0);
169         wprintf("<div id=\"banner\">\n"
170                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
171                 "<SPAN CLASS=\"titlebar\">"
172                 "<img src=\"/static/savecontact_48x.gif\">");
173         wprintf(_("Edit contact information"));
174         wprintf("</SPAN>"
175                 "</TD></TR></TABLE>\n"
176                 "</div>\n<div id=\"content\">\n"
177         );
178
179         wprintf("<FORM METHOD=\"POST\" ACTION=\"/submit_vcard\">\n");
180         wprintf("<div id=\"fix_scrollbar_bug\">"
181                 "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
182
183         wprintf("<TABLE border=0><TR>"
184                 "<TD>%s</TD>"
185                 "<TD>%s</TD>"
186                 "<TD>%s</TD>"
187                 "<TD>%s</TD>"
188                 "<TD>%s</TD></TR>\n",
189                 _("Prefix"), _("First"), _("Middle"), _("Last"), _("Suffix")
190         );
191         wprintf("<TR><TD><INPUT TYPE=\"text\" NAME=\"prefix\" "
192                 "VALUE=\"%s\" MAXLENGTH=\"5\" SIZE=\"5\"></TD>",
193                 prefix);
194         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"firstname\" "
195                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
196                 firstname);
197         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"middlename\" "
198                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
199                 middlename);
200         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"lastname\" "
201                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
202                 lastname);
203         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"suffix\" "
204                 "VALUE=\"%s\" MAXLENGTH=\"10\" SIZE=\"10\"></TD></TR></TABLE>\n",
205                 suffix);
206
207         wprintf("<table border=0 width=100%% bgcolor=\"#dddddd\">");
208         wprintf("<tr><td>");
209
210         wprintf(_("Title:"));
211         wprintf("<br>"
212                 "<INPUT TYPE=\"text\" NAME=\"title\" "
213                 "VALUE=\"%s\" MAXLENGTH=\"40\"><br><br>\n",
214                 title
215         );
216
217         wprintf(_("Organization:"));
218         wprintf("<br>"
219                 "<INPUT TYPE=\"text\" NAME=\"org\" "
220                 "VALUE=\"%s\" MAXLENGTH=\"40\"><br><br>\n",
221                 org
222         );
223
224         wprintf("</td><td>");
225
226         wprintf("<table border=0>");
227         wprintf("<tr><td>");
228         wprintf(_("PO box:"));
229         wprintf("</td><td>"
230                 "<INPUT TYPE=\"text\" NAME=\"pobox\" "
231                 "VALUE=\"%s\" MAXLENGTH=\"29\"></td></tr>\n",
232                 pobox);
233         wprintf("<tr><td>");
234         wprintf(_("Address:"));
235         wprintf("</td><td>"
236                 "<INPUT TYPE=\"text\" NAME=\"extadr\" "
237                 "VALUE=\"%s\" MAXLENGTH=\"29\"></td></tr>\n",
238                 extadr);
239         wprintf("<tr><td> </td><td>"
240                 "<INPUT TYPE=\"text\" NAME=\"street\" "
241                 "VALUE=\"%s\" MAXLENGTH=\"29\"></td></tr>\n",
242                 street);
243         wprintf("<tr><td>");
244         wprintf(_("City:"));
245         wprintf("</td><td>"
246                 "<INPUT TYPE=\"text\" NAME=\"city\" "
247                 "VALUE=\"%s\" MAXLENGTH=\"29\"></td></tr>\n",
248                 city);
249         wprintf("<tr><td>");
250         wprintf(_("State:"));
251         wprintf("</td><td>"
252                 "<INPUT TYPE=\"text\" NAME=\"state\" "
253                 "VALUE=\"%s\" MAXLENGTH=\"2\"></td></tr>\n",
254                 state);
255         wprintf("<tr><td>");
256         wprintf(_("ZIP code:"));
257         wprintf("</td><td>"
258                 "<INPUT TYPE=\"text\" NAME=\"zipcode\" "
259                 "VALUE=\"%s\" MAXLENGTH=\"10\"></td></tr>\n",
260                 zipcode);
261         wprintf("<tr><td>");
262         wprintf(_("Country:"));
263         wprintf("</td><td>"
264                 "<INPUT TYPE=\"text\" NAME=\"country\" "
265                 "VALUE=\"%s\" MAXLENGTH=\"29\" WIDTH=\"5\"></td></tr>\n",
266                 country);
267         wprintf("</table>\n");
268
269         wprintf("</table>\n");
270
271         wprintf("<TABLE BORDER=0><TR><TD>");
272         wprintf(_("Home telephone:"));
273         wprintf("</TD>"
274                 "<TD><INPUT TYPE=\"text\" NAME=\"hometel\" "
275                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>\n",
276                 hometel);
277         wprintf("<TD>");
278         wprintf(_("Work telephone:"));
279         wprintf("</TD>"
280                 "<TD><INPUT TYPE=\"text\" NAME=\"worktel\" "
281                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
282                 worktel);
283
284         wprintf("<table border=0 width=100%% bgcolor=\"#dddddd\">");
285         wprintf("<tr><td>");
286
287         wprintf("<TABLE border=0><TR>"
288                 "<TD VALIGN=TOP>");
289         wprintf(_("Primary Internet e-mail address"));
290         wprintf("<br />"
291                 "<INPUT TYPE=\"text\" NAME=\"primary_inetemail\" "
292                 "SIZE=40 MAXLENGTH=40 VALUE=\"");
293         escputs(primary_inetemail);
294         wprintf("\"><br />"
295                 "</TD><TD VALIGN=TOP>");
296         wprintf(_("Internet e-mail aliases"));
297         wprintf("<br />"
298                 "<TEXTAREA NAME=\"other_inetemail\" ROWS=5 COLS=40 WIDTH=40>");
299         escputs(other_inetemail);
300         wprintf("</TEXTAREA></TD></TR></TABLE>\n");
301
302         wprintf("</td></tr></table>\n");
303
304         wprintf("<INPUT TYPE=\"hidden\" NAME=\"extrafields\" VALUE=\"");
305         escputs(extrafields);
306         wprintf("\">\n");
307
308         wprintf("<INPUT TYPE=\"hidden\" NAME=\"return_to\" VALUE=\"");
309         urlescputs(return_to);
310         wprintf("\">\n");
311
312         wprintf("<CENTER>\n"
313                 "<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">"
314                 "&nbsp;"
315                 "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">"
316                 "</CENTER></FORM>\n",
317                 _("Save changes"),
318                 _("Cancel")
319         );
320         
321         wprintf("</td></tr></table></div>\n");
322         wDumpContent(1);
323 }
324
325
326
327 void edit_vcard(void) {
328         long msgnum;
329         char *partnum;
330
331         msgnum = atol(bstr("msgnum"));
332         partnum = bstr("partnum");
333         do_edit_vcard(msgnum, partnum, "");
334 }
335
336
337
338
339 void submit_vcard(void) {
340         char buf[SIZ];
341         int i;
342
343         if (strlen(bstr("ok_button")) == 0) { 
344                 readloop("readnew");
345                 return;
346         }
347
348         sprintf(buf, "ENT0 1|||4||");
349         serv_puts(buf);
350         serv_getln(buf, sizeof buf);
351         if (buf[0] != '4') {
352                 edit_vcard();
353                 return;
354         }
355
356         serv_puts("Content-type: text/x-vcard");
357         serv_puts("");
358         serv_puts("begin:vcard");
359         serv_printf("n:%s;%s;%s;%s;%s",
360                 bstr("lastname"),
361                 bstr("firstname"),
362                 bstr("middlename"),
363                 bstr("prefix"),
364                 bstr("suffix") );
365         serv_printf("title:%s", bstr("title") );
366         serv_printf("org:%s", bstr("org") );
367         serv_printf("adr:%s;%s;%s;%s;%s;%s;%s",
368                 bstr("pobox"),
369                 bstr("extadr"),
370                 bstr("street"),
371                 bstr("city"),
372                 bstr("state"),
373                 bstr("zipcode"),
374                 bstr("country") );
375         serv_printf("tel;home:%s", bstr("hometel") );
376         serv_printf("tel;work:%s", bstr("worktel") );
377
378         serv_printf("email;internet:%s\n", bstr("primary_inetemail"));  
379         for (i=0; i<num_tokens(bstr("other_inetemail"), '\n'); ++i) {
380                 extract_token(buf, bstr("other_inetemail"), i, '\n', sizeof buf);
381                 if (strlen(buf) > 0) {
382                         serv_printf("email;internet:%s", buf);
383                 }
384         }
385
386         serv_printf("%s", bstr("extrafields") );
387         serv_puts("end:vcard");
388         serv_puts("000");
389
390         if (!strcmp(bstr("return_to"), "/select_user_to_edit")) {
391                 select_user_to_edit(NULL, NULL);
392         }
393         else if (!strcmp(bstr("return_to"), "/do_welcome")) {
394                 do_welcome();
395         }
396         else {
397                 readloop("readnew");
398         }
399 }