]> code.citadel.org Git - citadel.git/blobdiff - webcit/event.c
Form-to-icalrecur logic for both types of yearly events.
[citadel.git] / webcit / event.c
index 5bb3efb4fd87a5623d6bc4468e1617e96a490db7..138bc0ff38ffcde2ed92dceed026a4f497f6d2d2 100644 (file)
@@ -337,15 +337,17 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        }
 
        wprintf("<INPUT TYPE=\"radio\" NAME=\"transp\" VALUE=\"transparent\"");
-       if (v != NULL) if (icalvalue_get_transp(v) == ICAL_TRANSP_TRANSPARENT)
+       if ((v != NULL) && (icalvalue_get_transp(v) == ICAL_TRANSP_TRANSPARENT)) {
                wprintf(" CHECKED");
+       }
        wprintf(">");
        wprintf(_("Free"));
        wprintf("&nbsp;&nbsp;");
 
        wprintf("<INPUT TYPE=\"radio\" NAME=\"transp\" VALUE=\"opaque\"");
-       if (v != NULL) if (icalvalue_get_transp(v) == ICAL_TRANSP_OPAQUE)
+       if ((v != NULL) && (icalvalue_get_transp(v) == ICAL_TRANSP_OPAQUE)) {
                wprintf(" CHECKED");
+       }
        wprintf(">");
        wprintf(_("Busy"));
 
@@ -522,14 +524,21 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("<div id=\"monthday_selector\">");      /* begin 'monthday_selector' div */
 
        wprintf("<input type=\"radio\" name=\"rrmonthtype\" id=\"rrmonthtype_mday\" "
+               "value=\"rrmonthtype_mday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrmonthtype_is_preselected == 0) ? "checked" : "")
        );
 
-       char mdaybox[256];
-       int rrmday = 1;                                 /* FIXME default to same as event start */
-       int rrmweek = 1;                                /* FIXME default to same as event start */
-       int rrmweekday = 1;                             /* FIXME default to same as event start */
+       int rrmday = t_start.day;
+       int rrmweekday = icaltime_day_of_week(t_start) - 1;
+
+       /* Figure out what week of the month we're in */
+       icaltimetype day1 = t_start;
+       day1.day = 1;
+       int weekbase = icaltime_week_number(day1);
+       int rrmweek = icaltime_week_number(t_start) - weekbase + 1;
+
+       /* Are we going by day of the month or week/day? */
 
        if (recur.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
                which_rrmonthtype_is_preselected = 0;
@@ -541,13 +550,11 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
                rrmweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1;
        }
 
-       snprintf(mdaybox, sizeof mdaybox,
-               "<input type=\"text\" name=\"rrmday\" id=\"rrmday\" maxlength=\"2\" size=\"2\" "
-               "value=\"%d\">", rrmday);
-       wprintf(_("on day %s of the month"), mdaybox);
+       wprintf(_("on day %s%d%s of the month"), "<span id=\"rrmday\">", rrmday, "</span>");
        wprintf("<br />\n");
 
        wprintf("<input type=\"radio\" name=\"rrmonthtype\" id=\"rrmonthtype_wday\" "
+               "value=\"rrmonthtype_wday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrmonthtype_is_preselected == 1) ? "checked" : "")
        );
@@ -581,9 +588,11 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("</div>\n");                            /* end 'monthday_selector' div */
 
 
-       int rrymweek = 1;                               /* FIXME default to same as event start */
-       int rrymweekday = 1;                            /* FIXME default to same as event start */
-       int rrymonth = 1;                               /* FIXME default to same as event start */
+       int rrymweek = rrmweek;
+       int rrymweekday = rrmweekday;
+       int rrymonth = t_start.month;
+
+       lprintf(9, "FIXME: RRYMWEEK %d, RRYMWEEKDAY %d, RRYMONTH %d\n", rrymweek, rrymweekday, rrymonth);
 
        int which_rryeartype_is_preselected = 0;
 
@@ -598,6 +607,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("<div id=\"yearday_selector\">");       /* begin 'yearday_selector' div */
 
        wprintf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ymday\" "
+               "value=\"rryeartype_ymday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rryeartype_is_preselected == 0) ? "checked" : "")
        );
@@ -605,6 +615,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("<span id=\"ymday\">%s</span><br />", _("year on this date"));
 
        wprintf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ywday\" "
+               "value=\"rryeartype_ywday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rryeartype_is_preselected == 1) ? "checked" : "")
        );
@@ -661,12 +672,14 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("</b></td><td>\n");
 
        wprintf("<input type=\"radio\" name=\"rrend\" id=\"rrend_none\" "
+               "value=\"rrend_none\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrend_is_preselected == 0) ? "checked" : "")
        );
        wprintf("%s<br />\n", _("No ending date"));
 
        wprintf("<input type=\"radio\" name=\"rrend\" id=\"rrend_count\" "
+               "value=\"rrend_count\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrend_is_preselected == 1) ? "checked" : "")
        );
@@ -677,6 +690,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("<br />\n");
 
        wprintf("<input type=\"radio\" name=\"rrend\" id=\"rrend_until\" "
+               "value=\"rrend_until\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrend_is_preselected == 2) ? "checked" : "")
        );
@@ -870,6 +884,89 @@ void save_individual_event(icalcomponent *supplied_vevent, long msgnum, char *fr
                        );
                }
 
+               /* recurrence rules -- begin */
+
+               /* remove any existing rule */
+               while (prop = icalcomponent_get_first_property(vevent, ICAL_RRULE_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+
+               if (yesbstr("is_recur")) {
+                       struct icalrecurrencetype recur;
+                       icalrecurrencetype_clear(&recur);
+
+                       recur.interval = atoi(bstr("interval"));
+                       recur.freq = atoi(bstr("freq"));
+
+                       switch(recur.freq) {
+
+                               /* These can't happen; they're disabled. */
+                               case ICAL_SECONDLY_RECURRENCE:
+                                       break;
+                               case ICAL_MINUTELY_RECURRENCE:
+                                       break;
+                               case ICAL_HOURLY_RECURRENCE:
+                                       break;
+
+                               /* Daily is valid but there are no further inputs. */
+                               case ICAL_DAILY_RECURRENCE:
+                                       break;
+
+                               /* These are the real options. */
+
+                               case ICAL_WEEKLY_RECURRENCE:
+                                       j=0;
+                                       for (i=0; i<7; ++i) {
+                                               snprintf(buf, sizeof buf, "weekday%d", i);
+                                               if (YESBSTR(buf)) recur.by_day[j++] =
+                                                       icalrecurrencetype_day_day_of_week(i+1);
+                                       }
+                                       recur.by_day[j++] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       break;
+
+                               case ICAL_MONTHLY_RECURRENCE:
+                                       if (!strcasecmp(bstr("rrmonthtype"), "rrmonthtype_mday")) {
+                                               recur.by_month_day[0] = event_start.day;
+                                               recur.by_month_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       else if (!strcasecmp(bstr("rrmonthtype"), "rrmonthtype_wday")) {
+                                               recur.by_day[0] = (atoi(bstr("rrmweek")) * 8)
+                                                               + atoi(bstr("rrmweekday")) + 1;
+                                               recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       break;
+
+                               case ICAL_YEARLY_RECURRENCE:
+                                       if (!strcasecmp(bstr("rryeartype"), "rryeartype_ymday")) {
+                                               /* no further action is needed here */
+                                       }
+                                       else if (!strcasecmp(bstr("rryeartype"), "rryeartype_ywday")) {
+                                               recur.by_month[0] = atoi(bstr("rrymonth"));
+                                               recur.by_month[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                               recur.by_day[0] = (atoi(bstr("rrymweek")) * 8)
+                                                               + atoi(bstr("rrymweekday")) + 1;
+                                               recur.by_day[1] = ICAL_RECURRENCE_ARRAY_MAX;
+                                       }
+                                       break;
+
+                               /* This one can't happen either. */
+                               case ICAL_NO_RECURRENCE:
+                                       break;
+                       }
+
+                       if (!strcasecmp(bstr("rrend"), "rrend_count")) {
+                               recur.count = atoi(bstr("rrcount"));
+                       }
+                       else if (!strcasecmp(bstr("rrend"), "rrend_until")) {
+                               icaltime_from_webform_dateonly(&recur.until, "rruntil");
+                       }
+
+                       icalcomponent_add_property(vevent, icalproperty_new_rrule(recur));
+               }
+
+               /* recurrence rules -- end */
+
                /* See if transparency is indicated */
                if (havebstr("transp")) {
                        if (!strcasecmp(bstr("transp"), "opaque")) {