aaaaaaaaaaaaaaaaahhhhh more recurrence editor
[citadel.git] / webcit / event.c
index 08f5dc7e2785a18bc94251c4c87e3971dd61b5f4..61b389f136dc55cc3175a46b45aa2dc99971a042 100644 (file)
@@ -31,6 +31,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        int i, j = 0;
        int sequence = 0;
        char weekday_labels[7][32];
+       char month_labels[12][32];
        long weekstart = 0;
 
        get_pref_long("weekstart", &weekstart, 17);
@@ -54,6 +55,16 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        }
        /* populate the weekday names - end */
 
+       /* populate the month names - begin */
+       now = 259200L;  /* 1970-jan-04 is the first Sunday ever */
+       localtime_r(&now, &tm_now);
+       for (i=0; i<12; ++i) {
+               localtime_r(&now, &tm_now);
+               wc_strftime(month_labels[i], 32, "%B", &tm_now);
+               now += 2678400L;
+       }
+       /* populate the month names - end */
+
        now = time(NULL);
        strcpy(organizer_string, "");
        strcpy(attendee_string, "");
@@ -326,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"));
 
@@ -511,11 +524,12 @@ 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[128];
+       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 */
@@ -537,6 +551,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
        wprintf("<br />\n");
 
        wprintf("<input type=\"radio\" name=\"rrmonthtype\" id=\"rrmonthtype_wday\" "
+               "value=\"rrmonthtype_wday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rrmonthtype_is_preselected == 1) ? "checked" : "")
        );
@@ -578,7 +593,7 @@ void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum,
 
        if ( (recur.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) 
           && (recur.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) ) {
-               which_rryeartype_is_preselected = 1;    /* FIXME finish this */
+               which_rryeartype_is_preselected = 1;
                rrymweek = icalrecurrencetype_day_position(recur.by_day[0]);
                rrymweekday = icalrecurrencetype_day_day_of_week(recur.by_day[0]) - 1;
                rrymonth = recur.by_month[0];
@@ -586,23 +601,59 @@ 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=\"rrmonthtype_ymday\" "
+       wprintf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ymday\" "
+               "value=\"rryeartype_ymday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
                ((which_rryeartype_is_preselected == 0) ? "checked" : "")
        );
        wprintf(_("every "));
        wprintf("<span id=\"ymday\">%s</span><br />", _("year on this date"));
 
-       wprintf("<input type=\"radio\" name=\"rryeartype\" id=\"rrmonthtype_ywday\" "
+       wprintf("<input type=\"radio\" name=\"rryeartype\" id=\"rryeartype_ywday\" "
+               "value=\"rryeartype_ywday\" "
                "%s onChange=\"RecurrenceShowHide();\">",
-               ((which_rrmonthtype_is_preselected == 1) ? "checked" : "")
+               ((which_rryeartype_is_preselected == 1) ? "checked" : "")
        );
 
-       wprintf("on the (%d) (%d) of (%d)<br />", rrymweek, rrymweekday, rrymonth);     /* FIXME */
+       wprintf(_("on the "));
+       wprintf("<select name=\"rrymweek\" id=\"rrymweek\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=1; i<=5; ++i) {
+               wprintf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymweek) ? "selected " : ""),
+                       i,
+                       ordinals[i]
+               );
+       }
+       wprintf("</select> \n");
 
-       wprintf("</div>\n");                            /* end 'yearday_selector' div */
+       wprintf("<select name=\"rrymweekday\" id=\"rrymweekday\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (j=0; j<7; ++j) {
+               i = ((j + (int)weekstart) % 7);
+               wprintf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymweekday) ? "selected " : ""),
+                       i,
+                       weekday_labels[i]
+               );
+       }
+       wprintf("</select>");
+
+       wprintf(" %s ", _("of"));
 
+       wprintf("<select name=\"rrymonth\" id=\"rrymonth\" size=\"1\" "
+               "onChange=\"RecurrenceShowHide();\">\n");
+       for (i=1; i<=12; ++i) {
+               wprintf("<option %svalue=\"%d\">%s</option>\n",
+                       ((i==rrymonth) ? "selected " : ""),
+                       i,
+                       month_labels[i-1]
+               );
+       }
+       wprintf("</select>");
+       wprintf("<br />\n");
 
+       wprintf("</div>\n");                            /* end 'yearday_selector' div */
 
        wprintf("</td></tr>\n");
 
@@ -616,12 +667,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" : "")
        );
@@ -632,6 +685,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" : "")
        );
@@ -825,6 +879,58 @@ 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;
+
+                               /* These are the real options. */
+                               case ICAL_DAILY_RECURRENCE:
+                                       break;
+                               case ICAL_WEEKLY_RECURRENCE:
+                                       break;
+                               case ICAL_MONTHLY_RECURRENCE:
+                                       break;
+                               case ICAL_YEARLY_RECURRENCE:
+                                       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")) {