X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fcalendar_view.c;h=c8820b22c6333092e972889fc79f4bfaae8b7e6f;hp=f982945e1750620422ae43622cee169146e26c9a;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hpb=cf2663dc7410333254b5e1af2f48bc2e205bcb01 diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c index f982945e1..c8820b22c 100644 --- a/webcit/calendar_view.c +++ b/webcit/calendar_view.c @@ -1,19 +1,37 @@ /* - * $Id$ - * * Handles the HTML display of calendar items. + * + * Copyright (c) 1996-2011 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "webcit.h" #include "webserver.h" +#include "calendar.h" +/* These define how high the hour rows are in the day view */ +#define TIMELINE 30 +#define EXTRATIMELINE (TIMELINE / 2) -void embeddable_mini_calendar(int year, int month, char *urlformat) +void embeddable_mini_calendar(int year, int month) { struct tm starting_tm; struct tm tm; time_t thetime; - int i, len; + int i; time_t previous_month; time_t next_month; time_t colheader_time; @@ -22,7 +40,6 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) long weekstart = 0; char url[256]; char div_id[256]; - char escaped_urlformat[256]; snprintf(div_id, sizeof div_id, "mini_calendar_%d", rand() ); @@ -58,15 +75,15 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) localtime_r(&thetime, &tm); } - wprintf("
\n", div_id); + wc_printf("
\n", div_id); /* Previous month link */ localtime_r(&previous_month, &tm); - wprintf("«", + wc_printf("«", (int)(tm.tm_year)+1900, tm.tm_mon + 1); wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm); - wprintf("  " + wc_printf("  " "" "%s %d" "" @@ -74,20 +91,20 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) /* Next month link */ localtime_r(&next_month, &tm); - wprintf("»", + wc_printf("»", (int)(tm.tm_year)+1900, tm.tm_mon + 1); - wprintf("" + wc_printf("
" ""); colheader_time = thetime; for (i=0; i<7; ++i) { colheader_time = thetime + (i * 86400) ; localtime_r(&colheader_time, &colheader_tm); wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm); - wprintf("", colheader_label[0]); + wc_printf("", colheader_label[0]); } - wprintf("\n"); + wc_printf("\n"); /* Now do 35 or 42 days */ @@ -98,21 +115,21 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) /* Before displaying Sunday, start a new row */ if ((i % 7) == 0) { - wprintf(""); + wc_printf(""); } if (tm.tm_mon == month-1) { - snprintf(url, sizeof url, urlformat, + snprintf(url, sizeof url, "readfwd?calview=day?year=%d?month=%d?day=%d", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday); - wprintf("", url, tm.tm_mday); + wc_printf("", url, tm.tm_mday); } else { - wprintf(""); + wc_printf(""); } /* After displaying one week, end the row */ if ((i % 7) == 6) { - wprintf("\n"); + wc_printf("\n"); } } @@ -120,24 +137,18 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) thetime += (time_t)86400; /* ahead 24 hours */ } - wprintf("
%c%c
%d%d
" /* end of inner table */ + wc_printf("" /* end of inner table */ "
\n"); - /* javascript for previous and next month */ - len = strlen(urlformat); - for (i=0; itrailing_javascript, " function minical_change_month(year, month) { \n" " p = 'year=' + year + '&month=' + month \n" - " + '&urlformat=%s&r=' + CtdlRandomString(); \n" + " + '&r=' + CtdlRandomString(); \n" " new Ajax.Updater('%s', 'mini_calendar', \n" " { method: 'get', parameters: p, evalScripts: true } ); \n" " } \n" "", - escaped_urlformat, div_id + div_id ); } @@ -145,19 +156,9 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) /* * ajax embedder for the above mini calendar */ -void ajax_mini_calendar(void) { - char urlformat[256]; - int i, len; - char *escaped_urlformat; - - escaped_urlformat = bstr("urlformat"); - len = strlen(escaped_urlformat) * 2 ; - for (i=0; idisp_cal_items) == 0) { - wprintf("


\n"); + wc_printf("
\n"); return; } @@ -213,10 +215,18 @@ void calendar_month_view_display_events(int year, int month, int day) today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone()); today_end_t.is_utc = 1; + /* + * Create another one without caring about the timezone for all day events. + */ + today_t = icaltime_null_date(); + today_t.year = year; + today_t.month = month; + today_t.day = day; + /* * Now loop through our list of events to see which ones occur today. */ - Pos = GetNewHashPos(); + Pos = GetNewHashPos(WCC->disp_cal_items, 0); while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { Cal = (disp_cal*)vCal; all_day_event = 0; @@ -238,7 +248,7 @@ void calendar_month_view_display_events(int year, int month, int day) if (all_day_event) { - show_event = ((t.year == year) && (t.month == month) && (t.day == day)); + show_event = ical_ctdl_is_overlap(t, end_t, today_t, icaltime_null_time()); } else { @@ -249,103 +259,147 @@ void calendar_month_view_display_events(int year, int month, int day) * If we determined that this event occurs today, then display it. */ if (show_event) { + + /* time_t logtt = icaltime_as_timet(t); + syslog(LOG_DEBUG, "Match on %04d-%02d-%02d for event %x%s on %s", + year, month, day, + (int)Cal, ((all_day_event) ? " (all day)" : ""), + ctime(&logtt) + ); */ + p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY); + if (p == NULL) { + p = icalproperty_new_summary(_("Untitled Event")); + icalcomponent_add_property(Cal->cal, p); + } if (p != NULL) { if (all_day_event) { - wprintf("" + wc_printf("
" "
" ); } - wprintf("" + + wc_printf("" "" + , (Cal->unread)?"_unread":"_read", Cal->cal_msgnum, year, month, day - ); + ); + + escputs((char *) icalproperty_get_comment(p)); - wprintf("%s: %s
", _("From"), Cal->from); - wprintf("%s ", _("Summary:")); + wc_printf(""); + + wc_printf("%s: %s
", _("From"), Cal->from); + wc_printf("%s ", _("Summary:")); escputs((char *)icalproperty_get_comment(p)); - wprintf("
"); - + wc_printf("
"); + q = icalcomponent_get_first_property( Cal->cal, ICAL_LOCATION_PROPERTY); if (q) { - wprintf("%s ", _("Location:")); + wc_printf("%s ", _("Location:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
"); + wc_printf("
"); } - + /* * Only show start/end times if we're actually looking at the VEVENT * component. Otherwise it shows bogus dates for e.g. timezones */ if (icalcomponent_isa(Cal->cal) == ICAL_VEVENT_COMPONENT) { - + q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); if (q != NULL) { + int no_end = 0; + t = icalproperty_get_dtstart(q); - + q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY); + if (q != NULL) { + end_t = icalproperty_get_dtend(q); + } + else { + /* + * events with starting date/time equal + * ending date/time might get only + * DTSTART but no DTEND + */ + no_end = 1; + } + if (t.is_date) { + /* all day event */ struct tm d_tm; - char d_str[32]; + + if (!no_end) { + /* end given, have to adjust it */ + icaltime_adjust(&end_t, -1, 0, 0, 0); + } memset(&d_tm, 0, sizeof d_tm); d_tm.tm_year = t.year - 1900; d_tm.tm_mon = t.month - 1; d_tm.tm_mday = t.day; - wc_strftime(d_str, sizeof d_str, "%x", &d_tm); - wprintf("%s %s
", - _("Date:"), d_str); + wc_strftime(buf, sizeof buf, "%x", &d_tm); + + if (no_end || !icaltime_compare(t, end_t)) { + wc_printf("%s %s
", + _("Date:"), buf); + } + else { + wc_printf("%s %s
", + _("Starting date:"), buf); + d_tm.tm_year = end_t.year - 1900; + d_tm.tm_mon = end_t.month - 1; + d_tm.tm_mday = end_t.day; + wc_strftime(buf, sizeof buf, "%x", &d_tm); + wc_printf("%s %s
", + _("Ending date:"), buf); + } } else { tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, 1); - wprintf("%s %s
", - _("Starting date/time:"), buf); - - /* - * Embed the 'show end date/time' loop inside here so it - * only executes if this is NOT an all day event. - */ - q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY); - if (q != NULL) { - t = icalproperty_get_dtend(q); - tt = icaltime_as_timet(t); - webcit_fmt_date(buf, tt, 1); - wprintf("%s %s
", _("Ending date/time:"), buf); + webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF); + if (no_end || !icaltime_compare(t, end_t)) { + wc_printf("%s %s
", + _("Date/time:"), buf); + } + else { + wc_printf("%s %s
", + _("Starting date/time:"), buf); + tt = icaltime_as_timet(end_t); + webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF); + wc_printf("%s %s
", _("Ending date/time:"), buf); } - + } } - + } - + q = icalcomponent_get_first_property(Cal->cal, ICAL_DESCRIPTION_PROPERTY); if (q) { - wprintf("%s ", _("Notes:")); + wc_printf("%s ", _("Notes:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
"); + wc_printf("
"); } - - wprintf("\">"); - escputs((char *) - icalproperty_get_comment(p)); - wprintf("

\n"); - + + wc_printf(""); + wc_printf("

\n"); + if (all_day_event) { - wprintf("
"); + wc_printf(""); } - + } - + } - - + + } DeleteHashPos(&Pos); } @@ -362,7 +416,7 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { time_t event_tt; time_t event_tts; time_t event_tte; - struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ + wcsession *WCC = WC; struct tm event_tms; struct tm event_tme; struct tm today_tm; @@ -370,22 +424,18 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { icalproperty *e; struct icaltimetype t; disp_cal *Cal; - int month, day, year; int all_day_event = 0; char *timeformat; int time_format; - + time_format = get_time_format_cached (); if (time_format == WC_TIMEFORMAT_24) timeformat="%k:%M"; else timeformat="%I:%M %p"; localtime_r(&thetime, &today_tm); - month = today_tm.tm_mon + 1; - day = today_tm.tm_mday; - year = today_tm.tm_year + 1900; - Pos = GetNewHashPos(); + Pos = GetNewHashPos(WCC->disp_cal_items, 0); while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { Cal = (disp_cal*)vCal; p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); @@ -406,14 +456,18 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { if ((event_tms.tm_year == today_tm.tm_year) && (event_tms.tm_mon == today_tm.tm_mon) && (event_tms.tm_mday == today_tm.tm_mday)) { - - + + char sbuf[255]; char ebuf[255]; - + p = icalcomponent_get_first_property( Cal->cal, ICAL_SUMMARY_PROPERTY); + if (p == NULL) { + p = icalproperty_new_summary(_("Untitled Event")); + icalcomponent_add_property(Cal->cal, p); + } e = icalcomponent_get_first_property( Cal->cal, ICAL_DTEND_PROPERTY); @@ -426,36 +480,36 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { difftime=(event_tte-event_tts)/60; hours=(int)(difftime / 60); minutes=difftime % 60; - wprintf("%i:%2i" + wc_printf("%i:%2i" "" "", daycolor, hours, minutes, - (Cal->unread)?"_unread":"_read", + (Cal->unread)?"_unread":"_read", daycolor, Cal->cal_msgnum, bstr("year"), bstr("month"), bstr("day") ); - + escputs((char *) icalproperty_get_comment(p)); /* \todo: allso ammitime format */ wc_strftime(&sbuf[0], sizeof(sbuf), timeformat, &event_tms); wc_strftime(&ebuf[0], sizeof(sbuf), timeformat, &event_tme); - - wprintf("" + + wc_printf("" "%s%s", daycolor, sbuf, daycolor, ebuf); } - + } - - + + } } DeleteHashPos(&Pos); @@ -468,15 +522,23 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { void calendar_month_view(int year, int month, int day) { struct tm starting_tm; struct tm tm; + struct tm today_tm; time_t thetime; int i; time_t previous_month; time_t next_month; time_t colheader_time; + time_t today_timet; struct tm colheader_tm; char colheader_label[32]; long weekstart = 0; + /* + * Make sure we know which day is today. + */ + today_timet = time(NULL); + localtime_r(&today_timet, &today_tm); + /* * Determine what day to start. If an impossible value is found, start on Sunday. */ @@ -511,45 +573,45 @@ void calendar_month_view(int year, int month, int day) { } /* Outer table (to get the background color) */ - wprintf("
" - " \n
"); + wc_printf(" \n
"); - wprintf("\n"); + wc_printf("
\n"); - wprintf("
"); + wc_printf(""); localtime_r(&previous_month, &tm); - wprintf("", + wc_printf("", (int)(tm.tm_year)+1900, tm.tm_mon + 1); - wprintf("\n"); + wc_printf("\"%s\"\n", _("previous")); wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm); - wprintf("  " - "" + wc_printf("  " + "" "%s %d" "" "  ", colheader_label, year); localtime_r(&next_month, &tm); - wprintf("", + wc_printf("", (int)(tm.tm_year)+1900, tm.tm_mon + 1); - wprintf("\n"); + wc_printf("\"%s\"\n", _("next")); - wprintf("
\n"); + wc_printf("
\n"); /* Inner table (the real one) */ - wprintf(""); + wc_printf("
"); + wc_printf(""); colheader_time = thetime; for (i=0; i<7; ++i) { colheader_time = thetime + (i * 86400) ; localtime_r(&colheader_time, &colheader_tm); wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm); - wprintf("", colheader_label); } - wprintf("\n"); + wc_printf("\n"); /* Now do 35 or 42 days */ @@ -558,19 +620,22 @@ void calendar_month_view(int year, int month, int day) { /* Before displaying the first day of the week, start a new row */ if ((i % 7) == 0) { - wprintf(""); + wc_printf(""); + wc_printf(""); /* After displaying the last day of the week, end the row */ if ((i % 7) == 6) { - wprintf("\n"); + wc_printf("\n"); } thetime += (time_t)86400; /* ahead 24 hours */ @@ -599,23 +664,8 @@ void calendar_month_view(int year, int month, int day) { } } - wprintf("
" + wc_printf("" "%s
"); + wc_strftime(colheader_label, sizeof colheader_label, "%V", &tm); + wc_printf("%s ", colheader_label); } - wprintf("
", + wc_printf("
", ((tm.tm_mon != month-1) ? "out" : + (((tm.tm_year == today_tm.tm_year) && (tm.tm_mon == today_tm.tm_mon) && (tm.tm_mday == today_tm.tm_mday)) ? "today" : ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" : - "day")) + "day"))) ); if ((i==0) || (tm.tm_mday == 1)) { wc_strftime(colheader_label, sizeof colheader_label, "%B", &tm); - wprintf("%s ", colheader_label); + wc_printf("%s ", colheader_label); } - wprintf("" + wc_printf("" "%d
", tm.tm_year + 1900, tm.tm_mon + 1, @@ -584,11 +649,11 @@ void calendar_month_view(int year, int month, int day) { tm.tm_mday ); - wprintf("
" /* end of inner table */ - "
" /* end of outer table */ - "
\n"); - - /* - * Initialize the bubble tooltips. - * - * Yes, this is as stupid as it looks. Instead of just making the call - * to btt_enableTooltips() straight away, we have to create a timer event - * and let it initialize as an event after 1 millisecond. This is to - * work around a bug in Internet Explorer that causes it to crash if we - * manipulate the innerHTML of various DOM nodes while the page is still - * being rendered. See http://www.shaftek.org/blog/archives/000212.html - * for more information. - */ - StrBufAppendPrintf(WC->trailing_javascript, - " setTimeout(\"btt_enableTooltips('inner_month')\", 1); \n" + wc_printf("" /* end of inner table */ + "\n" /* end of outer table */ ); } @@ -658,38 +708,37 @@ void calendar_brief_month_view(int year, int month, int day) { } /* Outer table (to get the background color) */ - wprintf("
" - "
\n"); + wc_printf("
\n"); - wprintf("\n"); + wc_printf("
\n"); - wprintf("
"); + wc_printf(""); localtime_r(&previous_month, &tm); - wprintf("", + wc_printf("", (int)(tm.tm_year)+1900, tm.tm_mon + 1); - wprintf("\n"); + wc_printf("\"%s\"\n", _("previous")); wc_strftime(month_label, sizeof month_label, "%B", &tm); - wprintf("  " - "" + wc_printf("  " + "" "%s %d" "" "  ", month_label, year); localtime_r(&next_month, &tm); - wprintf("", + wc_printf("", (int)(tm.tm_year)+1900, tm.tm_mon + 1); - wprintf("\n"); + wc_printf("\"%s\"\n", _("next")); - wprintf("
\n"); + wc_printf("
\n"); /* Inner table (the real one) */ - wprintf(""); - wprintf("\n"); - wprintf("\n"); + wc_printf("
\n"); + wc_printf("
\n"); /* Now do 35 days */ for (i = 0; i < 35; ++i) { @@ -702,9 +751,9 @@ void calendar_brief_month_view(int year, int month, int day) { /* Before displaying Sunday, start a new CELL */ if ((i % 7) == 0) { wc_strftime(&weeknumber[0], sizeof(weeknumber), "%U", &tm); - wprintf("" - " \n", - _("Week"), + wc_printf("
%s %s
%s%s%s%s
" + " \n", + _("Week"), weeknumber, _("Hours"), _("Subject"), @@ -712,14 +761,14 @@ void calendar_brief_month_view(int year, int month, int day) { _("End") ); } - + daycolor=((tm.tm_mon != month-1) ? "DDDDDD" : ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" : "FFFFFF")); - + /* Day Header */ wc_strftime(weekday_name, sizeof weekday_name, "%A", &tm); - wprintf("\n", daycolor, weekday_name,tm.tm_mday, @@ -731,22 +780,22 @@ void calendar_brief_month_view(int year, int month, int day) { /* After displaying Saturday, end the row */ if ((i % 7) == 6) { - wprintf("
%s %s
%s%s%s%s
%s,%i." + wc_printf("
%s,%i." "
\n"); + wc_printf("
\n"); } thetime += (time_t)86400; /* ahead 24 hours */ } - wprintf("
" /* end of inner table */ - "" /* end of outer table */ - "
\n"); + wc_printf("" /* end of inner table */ + "\n" /* end of outer table */ + ); } /* * Calendar week view -- not implemented yet, this is a stub function */ void calendar_week_view(int year, int month, int day) { - wprintf("
week view FIXME

\n"); + wc_printf("
week view FIXME

\n"); } @@ -778,12 +827,13 @@ void calendar_day_view_display_events(time_t thetime, int show_event = 0; int all_day_event = 0; int ongoing_event = 0; - struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ + wcsession *WCC = WC; disp_cal *Cal; struct icaltimetype t; struct icaltimetype end_t; struct icaltimetype today_start_t; struct icaltimetype today_end_t; + struct icaltimetype today_t; struct tm starting_tm; struct tm ending_tm; int top = 0; @@ -794,8 +844,6 @@ void calendar_day_view_display_events(time_t thetime, int endmin = 0; char buf[256]; - struct tm d_tm; - char d_str[32]; if (GetCount(WCC->disp_cal_items) == 0) { /* nothing to display */ @@ -823,9 +871,17 @@ void calendar_day_view_display_events(time_t thetime, today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone()); today_end_t.is_utc = 1; + /* + * Create another one without caring about the timezone for all day events. + */ + today_t = icaltime_null_date(); + today_t.year = year; + today_t.month = month; + today_t.day = day; + /* Now loop through our list of events to see which ones occur today. */ - Pos = GetNewHashPos(); + Pos = GetNewHashPos(WCC->disp_cal_items, 0); while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { Cal = (disp_cal*)vCal; @@ -841,29 +897,46 @@ void calendar_day_view_display_events(time_t thetime, else { memset(&t, 0, sizeof t); } + + if (t.is_date) all_day_event = 1; + q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY); if (q != NULL) { end_t = icalproperty_get_dtend(q); - event_tte = icaltime_as_timet(end_t); - localtime_r(&event_tte, &event_tm); } else { - memset(&end_t, 0, sizeof end_t); + /* no end given means end = start */ + memcpy(&end_t, &t, sizeof(struct icaltimetype)); } - if (t.is_date) all_day_event = 1; if (all_day_event) { - show_event = ((t.year == year) && (t.month == month) && (t.day == day) && (notime_events)); + show_event = ical_ctdl_is_overlap(t, end_t, today_t, icaltime_null_time()); + if (icaltime_compare(t, end_t)) { + /* + * the end date is non-inclusive so adjust it by one + * day because our test is inclusive, note that a day is + * not to much because we are talking about all day + * events + */ + icaltime_adjust(&end_t, -1, 0, 0, 0); + } } else { show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t); } + event_tte = icaltime_as_timet(end_t); + localtime_r(&event_tte, &event_tm); + /* If we determined that this event occurs today, then display it. */ p = icalcomponent_get_first_property(Cal->cal,ICAL_SUMMARY_PROPERTY); + if (p == NULL) { + p = icalproperty_new_summary(_("Untitled Event")); + icalcomponent_add_property(Cal->cal, p); + } if ((show_event) && (p != NULL)) { @@ -871,77 +944,85 @@ void calendar_day_view_display_events(time_t thetime, if (all_day_event && notime_events) { - wprintf("
  • " + wc_printf("
  • " "" + , (Cal->unread)?"_unread":"_read", - Cal->cal_msgnum, year, month, day); - wprintf("%s
    ", _("All day event")); - wprintf("%s: %s
    ", _("From"), Cal->from); - wprintf("%s ", _("Summary:")); + Cal->cal_msgnum, year, month, day + ); + escputs((char *) icalproperty_get_comment(p)); + wc_printf(""); + wc_printf("%s
    ", _("All day event")); + wc_printf("%s: %s
    ", _("From"), Cal->from); + wc_printf("%s ", _("Summary:")); escputs((char *) icalproperty_get_comment(p)); - wprintf("
    "); + wc_printf("
    "); q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); if (q) { - wprintf("%s ", _("Location:")); + wc_printf("%s ", _("Location:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); - } - memset(&d_tm, 0, sizeof d_tm); - d_tm.tm_year = t.year - 1900; - d_tm.tm_mon = t.month - 1; - d_tm.tm_mday = t.day; - wc_strftime(d_str, sizeof d_str, "%x", &d_tm); - wprintf("%s %s
    ",_("Date:"), d_str); + wc_printf("
    "); + } + if (!icaltime_compare(t, end_t)) { /* one day only */ + webcit_fmt_date(buf, 256, event_tt, DATEFMT_LOCALEDATE); + wc_printf("%s %s
    ", _("Date:"), buf); + } + else { + webcit_fmt_date(buf, 256, event_tt, DATEFMT_LOCALEDATE); + wc_printf("%s %s
    ", _("Starting date:"), buf); + webcit_fmt_date(buf, 256, event_tte, DATEFMT_LOCALEDATE); + wc_printf("%s %s
    ", _("Ending date:"), buf); + } q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); if (q) { - wprintf("%s ", _("Notes:")); + wc_printf("%s ", _("Notes:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); + wc_printf("
    "); } - wprintf("\">"); - escputs((char *) icalproperty_get_comment(p)); - wprintf("
    ("); - wprintf(_("All day event")); - wprintf(")
  • \n"); + wc_printf(""); + wc_printf(" ("); + wc_printf(_("All day event")); + wc_printf(")\n"); } else if (ongoing_event && notime_events) { - wprintf("
  • " + wc_printf("
  • " "" + , (Cal->unread)?"_unread":"_read", - Cal->cal_msgnum, year, month, day); - wprintf("%s
    ", _("Ongoing event")); - wprintf("%s: %s
    ", _("From"), Cal->from); - wprintf("%s ", _("Summary:")); + Cal->cal_msgnum, year, month, day + ); + escputs((char *) icalproperty_get_comment(p)); + wc_printf(""); + wc_printf("%s
    ", _("Ongoing event")); + wc_printf("%s: %s
    ", _("From"), Cal->from); + wc_printf("%s ", _("Summary:")); escputs((char *) icalproperty_get_comment(p)); - wprintf("
    "); + wc_printf("
    "); q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); if (q) { - wprintf("%s ", _("Location:")); + wc_printf("%s ", _("Location:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); + wc_printf("
    "); } - webcit_fmt_date(buf, event_tt, 1); - wprintf("%s %s
    ", _("Starting date/time:"), buf); - webcit_fmt_date(buf, event_tte, 1); - wprintf("%s %s
    ", _("Ending date/time:"), buf); + webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF); + wc_printf("%s %s
    ", _("Starting date/time:"), buf); + webcit_fmt_date(buf, 256, event_tte, DATEFMT_BRIEF); + wc_printf("%s %s
    ", _("Ending date/time:"), buf); q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); if (q) { - wprintf("%s ", _("Notes:")); + wc_printf("%s ", _("Notes:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); + wc_printf("
    "); } - wprintf("\">"); - escputs((char *) icalproperty_get_comment(p)); - wprintf("
    ("); - wprintf(_("Ongoing event")); - wprintf(")
  • \n"); + wc_printf(""); + wc_printf(" ("); + wc_printf(_("Ongoing event")); + wc_printf(")\n"); } else if (!all_day_event && !notime_events) { @@ -953,15 +1034,15 @@ void calendar_day_view_display_events(time_t thetime, /* Calculate the location of the top of the box */ if (event_te.tm_hour < dstart) { startmin = diffmin = event_te.tm_min / 6; - top = (event_te.tm_hour * 10) + startmin; + top = (event_te.tm_hour * EXTRATIMELINE) + startmin; } else if ((event_te.tm_hour >= dstart) && (event_te.tm_hour <= dend)) { startmin = diffmin = (event_te.tm_min / 2); - top = (dstart * 10) + ((event_te.tm_hour - dstart) * 30) + startmin; + top = (dstart * EXTRATIMELINE) + ((event_te.tm_hour - dstart) * TIMELINE) + startmin; } else if (event_te.tm_hour >dend) { startmin = diffmin = event_te.tm_min / 6; - top = (dstart * 10) + ((dend - dstart - 1) * 30) + ((event_tm.tm_hour - dend + 1) * 10) + startmin ; + top = (dstart * EXTRATIMELINE) + ((dend - dstart - 1) * TIMELINE) + ((event_tm.tm_hour - dend + 1) * EXTRATIMELINE) + startmin ; } else { /* should never get here */ @@ -970,56 +1051,63 @@ void calendar_day_view_display_events(time_t thetime, /* Calculate the location of the bottom of the box */ if (event_tm.tm_hour < dstart) { endmin = diffmin = event_tm.tm_min / 6; - bottom = (event_tm.tm_hour * 10) + endmin; + bottom = (event_tm.tm_hour * EXTRATIMELINE) + endmin; } else if ((event_tm.tm_hour >= dstart) && (event_tm.tm_hour <= dend)) { endmin = diffmin = (event_tm.tm_min / 2); - bottom = (dstart * 10) + ((event_tm.tm_hour - dstart) * 30) + endmin ; + bottom = (dstart * EXTRATIMELINE) + ((event_tm.tm_hour - dstart) * TIMELINE) + endmin ; } else if (event_tm.tm_hour >dend) { endmin = diffmin = event_tm.tm_min / 6; - bottom = (dstart * 10) + ((dend - dstart + 1) * 30) + ((event_tm.tm_hour - dend - 1) * 10) + endmin; + bottom = (dstart * EXTRATIMELINE) + ((dend - dstart + 1) * TIMELINE) + ((event_tm.tm_hour - dend - 1) * EXTRATIMELINE) + endmin; } else { /* should never get here */ } - wprintf("
    ", (Cal->unread)?"_unread":"_read", top, (gap * 40), (bottom-top) ); - wprintf("cal_msgnum, year, month, day, t.hour); - wprintf("%s: %s
    ", _("From"), Cal->from); - wprintf("%s ", _("Summary:")); + "class=\"event_title\">" + , + Cal->cal_msgnum, year, month, day, t.hour + ); + escputs((char *) icalproperty_get_comment(p)); + wc_printf(""); + wc_printf("%s: %s
    ", _("From"), Cal->from); + wc_printf("%s ", _("Summary:")); escputs((char *) icalproperty_get_comment(p)); - wprintf("
    "); + wc_printf("
    "); q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); if (q) { - wprintf("%s ", _("Location:")); + wc_printf("%s ", _("Location:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); + wc_printf("
    "); } - webcit_fmt_date(buf, event_tt, 1); - wprintf("%s %s
    ", _("Starting date/time:"), buf); - webcit_fmt_date(buf, event_tte, 1); - wprintf("%s %s
    ", _("Ending date/time:"), buf); + if (!icaltime_compare(t, end_t)) { /* one day only */ + webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF); + wc_printf("%s %s
    ", _("Date/time:"), buf); + } + else { + webcit_fmt_date(buf, 256, event_tt, DATEFMT_BRIEF); + wc_printf("%s %s
    ", _("Starting date/time:"), buf); + webcit_fmt_date(buf, 256, event_tte, DATEFMT_BRIEF); + wc_printf("%s %s
    ", _("Ending date/time:"), buf); + } q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); if (q) { - wprintf("%s ", _("Notes:")); + wc_printf("%s ", _("Notes:")); escputs((char *)icalproperty_get_comment(q)); - wprintf("
    "); + wc_printf("
    "); } - wprintf("\">"); - - escputs((char *) icalproperty_get_comment(p)); - wprintf("
    \n"); + wc_printf(""); + wc_printf("\n"); } } } @@ -1035,12 +1123,14 @@ void calendar_day_view(int year, int month, int day) { long daystart; long dayend; struct tm d_tm; - char d_str[128]; + char d_str[160]; int time_format; time_t today_t; - int timeline = 30; - int extratimeline = 0; + int timeline = TIMELINE; + int extratimeline = EXTRATIMELINE; int gap = 0; + int hourlabel; + int extrahourlabel; time_format = get_time_format_cached (); get_pref_long("daystart", &daystart, 8); @@ -1051,7 +1141,7 @@ void calendar_day_view(int year, int month, int day) { daystart = 9; dayend = 17; } - + /* Today's date */ memset(&d_tm, 0, sizeof d_tm); d_tm.tm_year = year - 1900; @@ -1075,175 +1165,165 @@ void calendar_day_view(int year, int month, int day) { ++tomorrow.day; tomorrow = icaltime_normalize(tomorrow); - wprintf("
    "); - /* Inner table (the real one) */ - wprintf(" \n"); + wc_printf("
    \n"); /* Innermost cell (contains hours etc.) */ - wprintf(""); /* end of innermost table */ + wc_printf(""); + wc_printf(""); /* end of innermost table */ /* Display extra events (start/end times not present or not today) in the middle column */ - wprintf(""); /* end extra on the middle */ + wc_printf(""); /* end extra on the middle */ - wprintf("
    "); - wprintf("
    "); + wc_printf("
    "); + wc_printf("
    "); /* Now the middle of the day... */ - extratimeline = timeline / 3; + extrahourlabel = extratimeline - 2; + hourlabel = extrahourlabel * 150 / 100; + if (hourlabel > (timeline - 2)) hourlabel = timeline - 2; for (hour = 0; hour < daystart; ++hour) { /* could do HEIGHT=xx */ - wprintf("
    " + wc_printf("
    " "", - (hour * extratimeline ), extratimeline, +/* TODO: what have these been used for? + (hour * extratimeline ), + extratimeline, + extrahourlabel, +*/ year, month, day, hour ); if (time_format == WC_TIMEFORMAT_24) { - wprintf("%2d:00 ", hour); + wc_printf("%2d:00 ", hour); } else { - wprintf("%d:00%s ", - (hour <= 12 ? hour : hour-12), + wc_printf("%d:00%s ", + ((hour == 0) ? 12 : (hour <= 12 ? hour : hour-12)), (hour < 12 ? "am" : "pm") ); } - wprintf("
    "); + wc_printf(""); } gap = daystart * extratimeline; for (hour = daystart; hour <= dayend; ++hour) { /* could do HEIGHT=xx */ - wprintf("
    " + wc_printf("
    " "", - gap + ((hour - daystart) * timeline ), timeline, +/*TODO: what have these been used for? + gap + ((hour - daystart) * timeline ), + timeline, + hourlabel, +*/ year, month, day, hour ); if (time_format == WC_TIMEFORMAT_24) { - wprintf("%2d:00 ", hour); + wc_printf("%2d:00 ", hour); } else { - wprintf("%d:00%s ", + wc_printf("%d:00%s ", (hour <= 12 ? hour : hour-12), (hour < 12 ? "am" : "pm") ); } - wprintf("
    "); + wc_printf(""); } gap = gap + ((dayend - daystart + 1) * timeline); for (hour = (dayend + 1); hour < 24; ++hour) { /* could do HEIGHT=xx */ - wprintf("
    " + wc_printf("
    " "", - gap + ((hour - dayend - 1) * extratimeline ), extratimeline, +/*TODO: what have these been used for? + gap + ((hour - dayend - 1) * extratimeline ), + extratimeline, + extrahourlabel, +*/ year, month, day, hour ); if (time_format == WC_TIMEFORMAT_24) { - wprintf("%2d:00 ", hour); + wc_printf("%2d:00 ", hour); } else { - wprintf("%d:00%s ", + wc_printf("%d:00%s ", (hour <= 12 ? hour : hour-12), (hour < 12 ? "am" : "pm") ); } - wprintf("
    "); + wc_printf(""); } /* Display events with start and end times on this day */ calendar_day_view_display_events(today_t, year, month, day, 0, daystart, dayend); - wprintf("
    "); - wprintf("
    "); + wc_printf(""); - wprintf("
      "); + wc_printf("
        "); /* Display all-day events */ calendar_day_view_display_events(today_t, year, month, day, 1, daystart, dayend); - wprintf("
      "); + wc_printf("
    "); - wprintf("
    "); /* begin stuff-on-the-right */ + wc_printf(""); /* begin stuff-on-the-right */ /* Begin todays-date-with-left-and-right-arrows */ - wprintf("\n"); - wprintf(""); + wc_printf("
    \n"); + wc_printf(""); - /* Left arrow */ - wprintf(""); + wc_printf("\"previous\""); + wc_printf(""); wc_strftime(d_str, sizeof d_str, - "", &d_tm ); - wprintf("%s", d_str); + wc_printf("%s", d_str); /* Right arrow */ - wprintf(""); + wc_printf("\"%s\"\n", _("next")); + wc_printf(""); - wprintf("
    "); - wprintf("", + /* Left arrow */ + wc_printf(""); + wc_printf("", yesterday.year, yesterday.month, yesterday.day); - wprintf(""); - wprintf("" - "%B
    " - "%d
    " - "%Y
    " + "
    " + "%A
    " + "%B
    " + "%d
    " + "%Y
    " "
    "); - wprintf("", + wc_printf(""); + wc_printf("", tomorrow.year, tomorrow.month, tomorrow.day); - wprintf("\n"); - wprintf("
    \n"); + wc_printf("
    \n"); /* End todays-date-with-left-and-right-arrows */ /* Embed a mini month calendar in this space */ - wprintf("
    \n"); - embeddable_mini_calendar(year, month, "readfwd?calview=day?year=%d?month=%d?day=%d"); - - wprintf("\n"); + wc_printf("
    \n"); + embeddable_mini_calendar(year, month); - wprintf(""); /* end stuff-on-the-right */ - - wprintf("" /* end of inner table */ - "
    "); - - StrBufAppendPrintf(WC->trailing_javascript, - " setTimeout(\"btt_enableTooltips('inner_day')\", 1); \n" - ); + wc_printf(""); /* end stuff-on-the-right */ + wc_printf("\n"); /* end of inner table */ } /* - * Display today's events. + * Display today's events. Returns the number of items displayed. */ -void calendar_summary_view(void) { +int calendar_summary_view(void) { long hklen; const char *HashKey; void *vCal; @@ -1257,20 +1337,20 @@ void calendar_summary_view(void) { time_t now; int all_day_event = 0; char timestring[SIZ]; - struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ + wcsession *WCC = WC; + int num_displayed = 0; if (GetCount(WC->disp_cal_items) == 0) { - return; + return(0); } now = time(NULL); localtime_r(&now, &today_tm); - Pos = GetNewHashPos(); + Pos = GetNewHashPos(WCC->disp_cal_items, 0); while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { Cal = (disp_cal*)vCal; - p = icalcomponent_get_first_property(Cal->cal, - ICAL_DTSTART_PROPERTY); + p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); if (p != NULL) { t = icalproperty_get_dtstart(p); event_tt = icaltime_as_timet(t); @@ -1280,7 +1360,7 @@ void calendar_summary_view(void) { else { all_day_event = 0; } - fmt_time(timestring, event_tt); + fmt_time(timestring, SIZ, event_tt); if (all_day_event) { gmtime_r(&event_tt, &event_tm); @@ -1291,33 +1371,83 @@ void calendar_summary_view(void) { if ( (event_tm.tm_year == today_tm.tm_year) && (event_tm.tm_mon == today_tm.tm_mon) - && (event_tm.tm_mday == today_tm.tm_mday) + && (event_tm.tm_mday == today_tm.tm_mday) ) { - - p = icalcomponent_get_first_property( - Cal->cal, - ICAL_SUMMARY_PROPERTY); - if (p != NULL) { - escputs((char *) - icalproperty_get_comment(p)); - wprintf(" (%s)
    \n", timestring); - } + p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY); + if (p == NULL) { + p = icalproperty_new_summary(_("Untitled Task")); + icalcomponent_add_property(Cal->cal, p); + } + if (p != NULL) + { + if (WCC->CurRoom.view == VIEW_TASKS) { + wc_printf(""); + } + else { + wc_printf(""); + } + escputs((char *) icalproperty_get_comment(p)); + if (!all_day_event) { + wc_printf(" (%s)", timestring); + } + wc_printf("
    \n"); + ++num_displayed; + } } } } DeleteHashPos(&Pos); DeleteHash(&WC->disp_cal_items); + return(num_displayed); } - /* * Parse the URL variables in order to determine the scope and display of a calendar view */ -void parse_calendar_view_request(struct calview *c) { +int calendar_GetParamsGetServerCall(SharedMessageStatus *Stat, + void **ViewSpecific, + long oper, + char *cmd, + long len, + char *filter, + long flen) +{ + wcsession *WCC = WC; + calview *c; time_t now; struct tm tm; - char calview[32]; + char cv[32]; + + int span = 3888000; + + c = (calview*) malloc(sizeof(calview)); + memset(c, 0, sizeof(calview)); + *ViewSpecific = (void*)c; + + Stat->load_seen = 1; + strcpy(cmd, "MSGS ALL"); + Stat->maxmsgs = 32767; /* In case no date was specified, go with today */ now = time(NULL); @@ -1333,21 +1463,24 @@ void parse_calendar_view_request(struct calview *c) { /* How would you like that cooked? */ if (havebstr("calview")) { - strcpy(calview, bstr("calview")); + strcpy(cv, bstr("calview")); } else { - strcpy(calview, "month"); + strcpy(cv, "month"); } /* Display the selected view */ - if (!strcasecmp(calview, "day")) { + if (!strcasecmp(cv, "day")) { c->view = calview_day; } - else if (!strcasecmp(calview, "week")) { + else if (!strcasecmp(cv, "week")) { c->view = calview_week; } + else if (!strcasecmp(cv, "summary")) { /* shouldn't ever happen, but just in case */ + c->view = calview_day; + } else { - if (WC->wc_view == VIEW_CALBRIEF) { + if (WCC->CurRoom.view == VIEW_CALBRIEF) { c->view = calview_brief; } else { @@ -1364,14 +1497,15 @@ void parse_calendar_view_request(struct calview *c) { tm.tm_mday = c->day; now = mktime(&tm); - int span = 3888000; if (c->view == calview_month) span = 3888000; if (c->view == calview_brief) span = 3888000; if (c->view == calview_week) span = 604800; if (c->view == calview_day) span = 86400; + if (c->view == calview_summary) span = 86400; c->lower_bound = now - span; c->upper_bound = now + span; + return 200; } @@ -1379,8 +1513,13 @@ void parse_calendar_view_request(struct calview *c) { /* * Render a calendar view from data previously loaded into memory */ -void render_calendar_view(struct calview *c) +int calendar_RenderView_or_Tail(SharedMessageStatus *Stat, + void **ViewSpecific, + long oper) { + wcsession *WCC = WC; + calview *c = (calview*) *ViewSpecific; + if (c->view == calview_day) { calendar_day_view(c->year, c->month, c->day); } @@ -1388,7 +1527,7 @@ void render_calendar_view(struct calview *c) calendar_week_view(c->year, c->month, c->day); } else { - if (WC->wc_view == VIEW_CALBRIEF) { + if (WCC->CurRoom.view == VIEW_CALBRIEF) { calendar_brief_month_view(c->year, c->month, c->day); } else { @@ -1398,167 +1537,12 @@ void render_calendar_view(struct calview *c) /* Free the in-memory list of calendar items */ DeleteHash(&WC->disp_cal_items); -} - - -/* - * Helper function for do_tasks_view(). Returns the due date/time of a vtodo. - */ -time_t get_task_due_date(icalcomponent *vtodo) { - icalproperty *p; - - if (vtodo == NULL) { - return(0L); - } - - /* - * If we're looking at a fully encapsulated VCALENDAR - * rather than a VTODO component, recurse into the data - * structure until we get a VTODO. - */ - if (icalcomponent_isa(vtodo) == ICAL_VCALENDAR_COMPONENT) { - return get_task_due_date( - icalcomponent_get_first_component( - vtodo, ICAL_VTODO_COMPONENT - ) - ); - } - - p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); - if (p != NULL) { - return(icaltime_as_timet(icalproperty_get_due(p))); - } - else { - return(0L); - } -} - - -/* - * Compare the due dates of two tasks (this is for sorting) - */ -int task_due_cmp(const void *vtask1, const void *vtask2) { - disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1); - disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2); - - time_t t1; - time_t t2; - - t1 = get_task_due_date(Task1->cal); - t2 = get_task_due_date(Task2->cal); - if (t1 < t2) return(-1); - if (t1 > t2) return(1); - return(0); -} - -/* - * qsort filter to move completed tasks to bottom of task list - */ -int task_completed_cmp(const void *vtask1, const void *vtask2) { - disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1); -// disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2); - - icalproperty_status t1 = icalcomponent_get_status((Task1)->cal); - // icalproperty_status t2 = icalcomponent_get_status(((struct disp_cal *)task2)->cal); - - if (t1 == ICAL_STATUS_COMPLETED) - return 1; return 0; } - - -/* - * do the whole task view stuff - */ -void do_tasks_view(void) { - long hklen; - const char *HashKey; - void *vCal; - disp_cal *Cal; - HashPos *Pos; - int nItems; - time_t due; - char buf[SIZ]; - icalproperty *p; - struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ - - wprintf("
    " - "\n\n" - "\n", - _("Show All")); - - nItems = GetCount(WC->disp_cal_items); - - /* Sort them if necessary - if (nItems > 1) { - SortByPayload(WC->disp_cal_items, task_due_cmp); - } - * this shouldn't be neccessary, since we sort by the start time. - */ - - /* And then again, by completed */ - if (nItems > 1) { - SortByPayload(WC->disp_cal_items, - task_completed_cmp); - } - - Pos = GetNewHashPos(); - while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { - Cal = (disp_cal*)vCal; - wprintf("\n"); - - due = get_task_due_date(Cal->cal); - wprintf(""); - wprintf(""); - wprintf(""); - } - - wprintf("
    "); - wprintf(_("Completed?")); - wprintf(""); - wprintf(_("Name of task")); - wprintf(""); - wprintf(_("Date due")); - wprintf(""); - wprintf(_("Category")); - wprintf(" ()
    "); - icalproperty_status todoStatus = icalcomponent_get_status(Cal->cal); - wprintf("\n"); - p = icalcomponent_get_first_property(Cal->cal, - ICAL_SUMMARY_PROPERTY); - wprintf("cal_msgnum ); - urlescputs(WC->wc_roomname); - wprintf("\">"); - /* wprintf(" "); */ - if (p != NULL) { - escputs((char *)icalproperty_get_comment(p)); - } - wprintf("\n"); - wprintf(" 0) { - webcit_fmt_date(buf, due, 0); - wprintf(">%s",buf); - } - else { - wprintf(">"); - } - wprintf(""); - p = icalcomponent_get_first_property(Cal->cal, - ICAL_CATEGORIES_PROPERTY); - if (p != NULL) { - escputs((char *)icalproperty_get_categories(p)); - } - wprintf("
    \n"); - - /* Free the list */ - DeleteHash(&WC->disp_cal_items); - DeleteHashPos(&Pos); +void +InitModule_CALENDAR_VIEW +(void) +{ + WebcitAddUrlHandler(HKEY("mini_calendar"), "", 0, ajax_mini_calendar, AJAX); } -