4 * Miscellaneous functions which handle calendar components.
13 "12am", "1am", "2am", "3am", "4am", "5am", "6am",
14 "7am", "8am", "9am", "10am", "11am", "12pm",
15 "1pm", "2pm", "3pm", "4pm", "5pm", "6pm",
16 "7pm", "8pm", "9pm", "10pm", "11pm"
20 * The display_icaltimetype_as_webform() and icaltime_from_webform() functions
21 * handle the display and editing of date/time properties in web pages. The
22 * first one converts an icaltimetype into valid HTML markup -- a series of form
23 * fields for editing the date and time. When the user submits the form, the
24 * results can be fed back into the second function, which turns it back into
25 * an icaltimetype. The "prefix" string required by both functions is prepended
26 * to all field names. This allows a form to contain more than one date/time
27 * property (for example, a start and end time) by ensuring the field names are
28 * unique within the form.
30 * NOTE: These functions assume that the icaltimetype being edited is in UTC, and
31 * will convert to/from local time for editing. "local" in this case is assumed
32 * to be the time zone in which the WebCit server is running. A future improvement
33 * might be to allow the user to specify his/her timezone.
36 void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix, int date_only) {
43 int all_day_event = 0;
47 time_format = get_time_format_cached ();
50 localtime_r(&now, &tm_now);
51 this_year = tm_now.tm_year + 1900;
53 if (t == NULL) return;
54 if (t->is_date) all_day_event = 1;
55 tt = icaltime_as_timet(*t);
60 localtime_r(&tt, &tm);
63 wprintf("<input type=\"text\" name=\"");
67 wprintf("\" size=\"10\" maxlength=\"10\" value=\"");
68 wc_strftime(timebuf, 32, "%Y-%m-%d", &tm);
72 StrBufAppendPrintf(WC->trailing_javascript, "attachDatePicker('");
73 StrBufAppendPrintf(WC->trailing_javascript, prefix);
74 StrBufAppendPrintf(WC->trailing_javascript, "', '%s');\n", get_selected_language());
76 /* If we're editing a date only, we still generate the time boxes, but we hide them.
77 * This keeps the data model consistent.
80 wprintf("<div style=\"display:none\">");
84 wprintf("<SELECT NAME=\"%s_hour\" SIZE=\"1\">\n", prefix);
85 for (i=0; i<=23; ++i) {
87 if (time_format == WC_TIMEFORMAT_24) {
88 wprintf("<OPTION %s VALUE=\"%d\">%d</OPTION>\n",
89 ((tm.tm_hour == i) ? "SELECTED" : ""),
94 wprintf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
95 ((tm.tm_hour == i) ? "SELECTED" : ""),
101 wprintf("</SELECT>\n");
103 wprintf(_("Minute: "));
104 wprintf("<SELECT NAME=\"%s_minute\" SIZE=\"1\">\n", prefix);
105 for (i=0; i<=59; ++i) {
106 if ( (i % 5 == 0) || (tm.tm_min == i) ) {
107 wprintf("<OPTION %s VALUE=\"%d\">:%02d</OPTION>\n",
108 ((tm.tm_min == i) ? "SELECTED" : ""),
113 wprintf("</SELECT>\n");
121 * Get date/time from a web form and convert it into an icaltimetype struct.
123 void icaltime_from_webform(struct icaltimetype *t, char *prefix) {
128 /* Stuff tm with some zero values */
138 struct icaltimetype t2;
140 strptime((char*)BSTR(prefix), "%Y-%m-%d", &tm);
141 sprintf(vname, "%s_hour", prefix); hour = IBSTR(vname);
142 sprintf(vname, "%s_minute", prefix); minute = IBSTR(vname);
145 strftime(&datebuf[0], 32, "%Y%m%dT%H%M%S", &tm);
148 * t2 = icaltime_from_string(datebuf);
152 * t2 = icaltime_from_string_with_zone(datebuf, get_default_icaltimezone() );
156 t2 = icaltime_from_timet_with_zone(mktime(&tm), 0, get_default_icaltimezone());
158 memcpy(t, &t2, sizeof(struct icaltimetype));
163 * Get date (no time) from a web form and convert it into an icaltimetype struct.
165 void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) {
167 /* Stuff tm with some zero values */
174 struct icaltimetype t2;
175 strptime((char *)BSTR(prefix), "%Y-%m-%d", &tm);
177 t2 = icaltime_from_timet(tm_t, 1);
178 memcpy(t, &t2, sizeof(struct icaltimetype));
183 * \brief Render PARTSTAT
184 * Render a PARTSTAT parameter as a string (and put it in parentheses)
185 * \param buf the string to put it to
186 * \param attendee the attendee to textify
188 void partstat_as_string(char *buf, icalproperty *attendee) {
189 icalparameter *partstat_param;
190 icalparameter_partstat partstat;
192 strcpy(buf, _("(status unknown)"));
194 partstat_param = icalproperty_get_first_parameter(
196 ICAL_PARTSTAT_PARAMETER
198 if (partstat_param == NULL) {
202 partstat = icalparameter_get_partstat(partstat_param);
204 case ICAL_PARTSTAT_X:
207 case ICAL_PARTSTAT_NEEDSACTION:
208 strcpy(buf, _("(needs action)"));
210 case ICAL_PARTSTAT_ACCEPTED:
211 strcpy(buf, _("(accepted)"));
213 case ICAL_PARTSTAT_DECLINED:
214 strcpy(buf, _("(declined)"));
216 case ICAL_PARTSTAT_TENTATIVE:
217 strcpy(buf, _("(tenative)"));
219 case ICAL_PARTSTAT_DELEGATED:
220 strcpy(buf, _("(delegated)"));
222 case ICAL_PARTSTAT_COMPLETED:
223 strcpy(buf, _("(completed)"));
225 case ICAL_PARTSTAT_INPROCESS:
226 strcpy(buf, _("(in process)"));
228 case ICAL_PARTSTAT_NONE:
229 strcpy(buf, _("(none)"));
236 * Utility function to encapsulate a subcomponent into a full VCALENDAR
238 icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) {
239 icalcomponent *encaps;
241 /* lprintf(9, "ical_encapsulate_subcomponent() called\n"); */
243 if (subcomp == NULL) {
244 lprintf(3, "ERROR: called with NULL argument!\n");
249 * If we're already looking at a full VCALENDAR component,
250 * don't bother ... just return itself.
252 if (icalcomponent_isa(subcomp) == ICAL_VCALENDAR_COMPONENT) {
256 /* Encapsulate the VEVENT component into a complete VCALENDAR */
257 encaps = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
258 if (encaps == NULL) {
259 lprintf(3, "%s:%d: Error - could not allocate component!\n",
264 /* Set the Product ID */
265 icalcomponent_add_property(encaps, icalproperty_new_prodid(PRODID));
267 /* Set the Version Number */
268 icalcomponent_add_property(encaps, icalproperty_new_version("2.0"));
270 /* Encapsulate the subcomponent inside */
271 /* lprintf(9, "Doing the encapsulation\n"); */
272 icalcomponent_add_component(encaps, subcomp);
274 /* Convert all timestamps to UTC so we don't have to deal with
275 * stupid VTIMEZONE crap.
277 ical_dezonify(encaps);
279 /* Return the object we just created. */