]> code.citadel.org Git - citadel.git/blobdiff - webcit/calendar_view.c
* added matts date picker widget
[citadel.git] / webcit / calendar_view.c
index ffa6356d6cad656606bba06d8bf7df15a35928cd..0cb0273d19a429edaf1094482cc4854e688f7fd1 100644 (file)
@@ -1,18 +1,12 @@
- /*
+/*
  * $Id$
+ *
+ * Handles the HTML display of calendar items.
  */
-/**
- * \defgroup CalHtmlHandles Handles the HTML display of calendar items.
- * \ingroup Calendaring
- */
-/*@{*/
+
 #include "webcit.h"
 #include "webserver.h"
 
-#ifdef WEBCIT_WITH_CALENDAR_SERVICE
-
-/****************************************************************************/
-
 
 void embeddable_mini_calendar(int year, int month, char *urlformat)
 {
@@ -34,13 +28,13 @@ void embeddable_mini_calendar(int year, int month, char *urlformat)
        snprintf(div_id, sizeof div_id, "mini_calendar_%d", rand() );
 
        /* Determine what day to start.
-        */
+       */
        get_preference("weekstart", weekstart_buf, sizeof weekstart_buf);
        weekstart = atoi(weekstart_buf);
 
        /*
-        * Now back up to the 1st of the month...
-        */
+       * Now back up to the 1st of the month...
+       */
        memset(&starting_tm, 0, sizeof(struct tm));
 
        starting_tm.tm_year = year - 1900;
@@ -146,7 +140,7 @@ void embeddable_mini_calendar(int year, int month, char *urlformat)
                "</script>\n"
                ,
                escaped_urlformat, div_id
-       );
+               );
 
 }
 
@@ -163,7 +157,7 @@ void ajax_mini_calendar(void) {
                urlformat[i+1] = 0;
        }
 
-       embeddable_mini_calendar( atoi(bstr("year")), atoi(bstr("month")), urlformat );
+       embeddable_mini_calendar( ibstr("year"), ibstr("month"), urlformat );
 }
 
 
@@ -259,17 +253,16 @@ void calendar_month_view_display_events(int year, int month, int day)
                                }
 
                                wprintf("<font size=-1>"
-                                       "<a href=\"display_edit_event?"
-                                       "msgnum=%ld&calview=%s&year=%s&month=%s&day=%s\""
+                                       "<a class=\"event%s\" href=\"display_edit_event?"
+                                       "msgnum=%ld&calview=month&year=%d&month=%d&day=%d\""
                                        " btt_tooltext=\"",
+                                       (Cal->unread)?"_unread":"_read",
                                        WC->disp_cal[i].cal_msgnum,
-                                       bstr("calview"),
-                                       bstr("year"),
-                                       bstr("month"),
-                                       bstr("day")
+                                       year, month, day
                                        );
 
-                               wprintf("<i>%s</i> ", _("Summary:"));
+                               wprintf("<i>%s: %s</i><br />", _("From"), Cal->from);
+                               wprintf("<i>%s</i> ",          _("Summary:"));
                                escputs((char *)icalproperty_get_comment(p));
                                wprintf("<br />");
                                
@@ -280,7 +273,7 @@ void calendar_month_view_display_events(int year, int month, int day)
                                        wprintf("<i>%s</i> ", _("Location:"));
                                        escputs((char *)icalproperty_get_comment(q));
                                        wprintf("<br />");
-                                       }
+                               }
                                
                                /**
                                 * Only show start/end times if we're actually looking at the VEVENT
@@ -305,7 +298,7 @@ void calendar_month_view_display_events(int year, int month, int day)
                                                }
                                                else {
                                                        tt = icaltime_as_timet(t);
-                                                       fmt_date(buf, tt, 1);
+                                                       webcit_fmt_date(buf, tt, 1);
                                                        wprintf("<i>%s</i> %s<br>",
                                                                _("Starting date/time:"), buf);
                                                        
@@ -316,7 +309,7 @@ void calendar_month_view_display_events(int year, int month, int day)
                                                        if (q != NULL) {
                                                                t = icalproperty_get_dtend(q);
                                                                tt = icaltime_as_timet(t);
-                                                               fmt_date(buf, tt, 1);
+                                                               webcit_fmt_date(buf, tt, 1);
                                                                wprintf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
                                                        }
                                                        
@@ -359,12 +352,14 @@ 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 */
        struct tm event_tms;
        struct tm event_tme;
        struct tm today_tm;
        icalproperty *p;
        icalproperty *e;
        struct icaltimetype t;
+       struct disp_cal *Cal;
        int month, day, year;
        int all_day_event = 0;
        char *timeformat;
@@ -381,8 +376,9 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
        year = today_tm.tm_year + 1900;
 
        for (i=0; i<(WC->num_cal); ++i) {
-               p = icalcomponent_get_first_property(WC->disp_cal[i].cal,
-                                               ICAL_DTSTART_PROPERTY);
+               Cal = &WCC->disp_cal[i];
+               p = icalcomponent_get_first_property(Cal->cal,
+                       ICAL_DTSTART_PROPERTY);
                if (p != NULL) {
                        t = icalproperty_get_dtstart(p);
                        event_tt = icaltime_as_timet(t);
@@ -398,58 +394,58 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
                        }
                        /** \todo epoch &! daymask */
                        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)) {
+                               && (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(
+                               WC->disp_cal[i].cal,
+                               ICAL_SUMMARY_PROPERTY);
+                       e = icalcomponent_get_first_property(
+                               WC->disp_cal[i].cal, 
+                               ICAL_DTEND_PROPERTY);
+                       if ((p != NULL) && (e != NULL)) {
+                               time_t difftime;
+                               int hours, minutes;
+                               t = icalproperty_get_dtend(e);
+                               event_tte = icaltime_as_timet(t);
+                               localtime_r(&event_tte, &event_tme);
+                               difftime=(event_tte-event_tts)/60;
+                               hours=(int)(difftime / 60);
+                               minutes=difftime % 60;
+                               wprintf("<tr><td bgcolor='%s'>%i:%2i</td><td bgcolor='%s'>"
+                                       "<font size=-1>"
+                                       "<a class=\"event%s\" href=\"display_edit_event?msgnum=%ld&calview=calbrief&year=%s&month=%s&day=%s\">",
+                                       daycolor,
+                                       hours, minutes,
+                                       (Cal->unread)?"_unread":"_read",                                                
+                                       daycolor,
+                                       WC->disp_cal[i].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);
                                
-                               char sbuf[255];
-                               char ebuf[255];
-
-                               p = icalcomponent_get_first_property(
-                                                       WC->disp_cal[i].cal,
-                                                       ICAL_SUMMARY_PROPERTY);
-                               e = icalcomponent_get_first_property(
-                                                       WC->disp_cal[i].cal, 
-                                                       ICAL_DTEND_PROPERTY);
-                               if ((p != NULL) && (e != NULL)) {
-                                       time_t difftime;
-                                       int hours, minutes;
-                                       t = icalproperty_get_dtend(e);
-                                       event_tte = icaltime_as_timet(t);
-                                       localtime_r(&event_tte, &event_tme);
-                                       difftime=(event_tte-event_tts)/60;
-                                       hours=(int)(difftime / 60);
-                                       minutes=difftime % 60;
-                                       wprintf("<tr><td bgcolor='%s'>%i:%2i</td><td bgcolor='%s'>"
-                                                       "<font size=-1>"
-                                                       "<a href=\"display_edit_event?msgnum=%ld&calview=%s&year=%s&month=%s&day=%s\">",
-                                                       daycolor,
-                                                       hours, minutes,
-                                                       daycolor,
-                                                       WC->disp_cal[i].cal_msgnum,
-                                                       bstr("calview"),
-                                                       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("</a></font></td>"
-                                                       "<td bgcolor='%s'>%s</td><td bgcolor='%s'>%s</td></tr>",
-                                                       daycolor,
-                                                       sbuf,
-                                                       daycolor,
-                                                       ebuf);
-                                       
-                               }
+                               wprintf("</a></font></td>"
+                                       "<td bgcolor='%s'>%s</td><td bgcolor='%s'>%s</td></tr>",
+                                       daycolor,
+                                       sbuf,
+                                       daycolor,
+                                       ebuf);
                                
                        }
                        
+                       }
+                       
                        
                }
        }
@@ -543,7 +539,7 @@ void calendar_month_view(int year, int month, int day) {
                colheader_time = thetime + (i * 86400) ;
                localtime_r(&colheader_time, &colheader_tm);
                wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm);
-               wprintf("<td align=center width=14%%>"
+               wprintf("<th align=center width=14%%>"
                        "<font color=\"#FFFFFF\">%s</font></th>", colheader_label);
 
        }
@@ -570,9 +566,9 @@ void calendar_month_view(int year, int month, int day) {
 
                        wprintf("<td class=\"cal%s\"><div class=\"day\">",
                                ((tm.tm_mon != month-1) ? "out" :
-                               ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" :
-                               "day"))
-                       );
+                                       ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" :
+                                               "day"))
+                               );
                        if ((i==0) || (tm.tm_mday == 1)) {
                                wc_strftime(colheader_label, sizeof colheader_label, "%B", &tm);
                                wprintf("%s ", colheader_label);
@@ -589,7 +585,7 @@ void calendar_month_view(int year, int month, int day) {
                                tm.tm_year + 1900,
                                tm.tm_mon + 1,
                                tm.tm_mday
-                       );
+                               );
 
                        wprintf("</td>");
 
@@ -711,27 +707,27 @@ void calendar_brief_month_view(int year, int month, int day) {
                if ((i % 7) == 0) {
                        wc_strftime(&weeknumber[0], sizeof(weeknumber), "%U", &tm);
                        wprintf("<table border='0' bgcolor=\"#EEEECC\" width='100%'> <tr><th colspan='4'>%s %s</th></tr>"
-                                       "   <tr><td>%s</td><td width=70%%>%s</td><td>%s</td><td>%s</td></tr>\n",
-                                       _("Week"), 
-                                       weeknumber,
-                                       _("Hours"),
-                                       _("Subject"),
-                                       _("Start"),
-                                       _("End")
-                                       );
+                               "   <tr><td>%s</td><td width=70%%>%s</td><td>%s</td><td>%s</td></tr>\n",
+                               _("Week"), 
+                               weeknumber,
+                               _("Hours"),
+                               _("Subject"),
+                               _("Start"),
+                               _("End")
+                               );
                }
                
                daycolor=((tm.tm_mon != month-1) ? "DDDDDD" :
-                                 ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" :
-                                  "FFFFFF"));
+                       ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" :
+                               "FFFFFF"));
                
                /** Day Header */
                wc_strftime(weekday_name, sizeof weekday_name, "%A", &tm);
                wprintf("<tr><td bgcolor='%s' colspan='1' align='left'> %s,%i."
-                               "</td><td bgcolor='%s' colspan='3'><hr></td></tr>\n",
-                               daycolor,
-                               weekday_name,tm.tm_mday,
-                               daycolor);
+                       "</td><td bgcolor='%s' colspan='3'><hr></td></tr>\n",
+                       daycolor,
+                       weekday_name,tm.tm_mday,
+                       daycolor);
 
                /** put the data of one day  here, stupid */
                calendar_month_view_brief_events(thetime, daycolor);
@@ -774,14 +770,17 @@ void calendar_week_view(int year, int month, int day) {
  * \param dstart daystart 
  * \param dend dayend 
  */
-void calendar_day_view_display_events(time_t thetime, int year, int month,
-                                       int day, int hour,
-                                       int dstart, int dend) {
+void calendar_day_view_display_events(time_t thetime,
+       int year,
+       int month,
+       int day,
+       int notime_events,
+       int dstart,
+       int dend)
+{
        int i;
        icalproperty *p = NULL;
        icalproperty *q = NULL;
-       time_t event_start;
-       time_t event_end;
        time_t event_tt;
        time_t event_tte;
        struct tm event_te;
@@ -798,29 +797,29 @@ void calendar_day_view_display_events(time_t thetime, int year, int month,
        struct tm starting_tm;
        struct tm ending_tm;
        int top = 0;
-       int height = 0;
+       int bottom = 0;
        int gap = 1;
        int startmin = 0;
        int diffmin = 0;
        int endmin = 0;
 
+        char buf[256];
+        struct tm d_tm;
+        char d_str[32];
+
        if (WCC->num_cal == 0) {
-               // \todo FIXME wprintf("<br /><br /><br />\n");
+               /* nothing to display */
                return;
        }
 
-       event_start = thetime + 60 * 60 * hour;
-       event_end = thetime + 60 * 60 * (hour + 1);
-
-
-       /* Create an imaginary event which spans the current hour.  Any events which
+       /* Create an imaginary event which spans the current day.  Any events which
         * overlap with this one take place at least partially in this day.
         */
        memset(&starting_tm, 0, sizeof(struct tm));
        starting_tm.tm_year = year - 1900;
        starting_tm.tm_mon = month - 1;
        starting_tm.tm_mday = day;
-       starting_tm.tm_hour = hour;
+       starting_tm.tm_hour = 0;
        starting_tm.tm_min = 0;
        today_start_t = icaltime_from_timet_with_zone(mktime(&starting_tm), 0, icaltimezone_get_utc_timezone());
        today_start_t.is_utc = 1;
@@ -829,7 +828,7 @@ void calendar_day_view_display_events(time_t thetime, int year, int month,
        ending_tm.tm_year = year - 1900;
        ending_tm.tm_mon = month - 1;
        ending_tm.tm_mday = day;
-       ending_tm.tm_hour = hour;
+       ending_tm.tm_hour = 23;
        ending_tm.tm_min = 59;
        today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone());
        today_end_t.is_utc = 1;
@@ -864,103 +863,172 @@ void calendar_day_view_display_events(time_t thetime, int year, int month,
 
                if (all_day_event)
                {
-                       show_event = ((t.year == year) && (t.month == month) && (t.day == day) && (hour == -1));
+                       show_event = ((t.year == year) && (t.month == month) && (t.day == day) && (notime_events));
                }
                else
                {
                        show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t);
                }
 
                /* If we determined that this event occurs today, then display it.
                 */
                p = icalcomponent_get_first_property(Cal->cal,ICAL_SUMMARY_PROPERTY);
+
                if ((show_event) && (p != NULL)) {
 
-                       if ((event_te.tm_mday != today_start_t.day) && (event_tm.tm_mday != today_start_t.day)) ongoing_event = 1; 
+                       if ((event_te.tm_mday != day) || (event_tm.tm_mday != day)) ongoing_event = 1; 
 
-                       if (all_day_event
+                       if (all_day_event && notime_events)
                        {
-                               wprintf("<li class=\"event\"> "
-                               "<a href=\"display_edit_event?"
-                               "msgnum=%ld&calview=day&year=%d&month=%d&day=%d&hour=%d\" "
-                               " class=\"event_title\" >",
-                                       Cal->cal_msgnum, year, month, day, hour);
-                               escputs((char *) icalproperty_get_comment(p));
-                               wprintf("</a> <span>(");
-                               wprintf(_("All day event"));
-                               wprintf(")</span></li>\n");
+                               wprintf("<li class=\"event_framed%s\"> "
+                                       "<a href=\"display_edit_event?"
+                                       "msgnum=%ld&calview=day&year=%d&month=%d&day=%d\" "
+                                       " class=\"event_title\" "
+                                       " btt_tooltext=\"",
+                                       (Cal->unread)?"_unread":"_read",
+                                        Cal->cal_msgnum, year, month, day);
+                                wprintf("<i>%s</i><br />",      _("All day event"));
+                               wprintf("<i>%s: %s</i><br />",  _("From"), Cal->from);
+                                wprintf("<i>%s</i> ",           _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wprintf("<br />");
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                                               }
+                                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("<i>%s</i> %s<br>",_("Date:"), d_str);
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                }
+                                wprintf("\">");
+                                escputs((char *) icalproperty_get_comment(p));
+                                wprintf("</a> <span>(");
+                                wprintf(_("All day event"));
+                                wprintf(")</span></li>\n");
                        }
-                       else if (ongoing_event && (hour == -1)
+                       else if (ongoing_event && notime_events
                        {
-                               wprintf("<li class=\"event\"> "
-                               "<a href=\"display_edit_event?"
-                               "msgnum=%ld&calview=day&year=%d&month=%d&day=%d&hour=%d\" "
-                               " class=\"event_title\" >",
-                                       Cal->cal_msgnum, year, month, day, hour);
+                               wprintf("<li class=\"event_framed%s\"> "
+                                       "<a href=\"display_edit_event?"
+                                       "msgnum=%ld&calview=day&year=%d&month=%d&day=%d\" "
+                                       " class=\"event_title\" " 
+                                       "btt_tooltext=\"",
+                                       (Cal->unread)?"_unread":"_read",
+                                       Cal->cal_msgnum, year, month, day);
+                                wprintf("<i>%s</i><br />",     _("Ongoing event"));
+                               wprintf("<i>%s: %s</i><br />", _("From"), Cal->from);
+                                wprintf("<i>%s</i> ",          _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wprintf("<br />");
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                                               }
+                                webcit_fmt_date(buf, event_tt, 1);
+                                wprintf("<i>%s</i> %s<br>", _("Starting date/time:"), buf);
+                                webcit_fmt_date(buf, event_tte, 1);
+                                wprintf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                }
+                                wprintf("\">");
                                escputs((char *) icalproperty_get_comment(p));
                                wprintf("</a> <span>(");
                                wprintf(_("Ongoing event"));
                                wprintf(")</span></li>\n");
                        }
-                       else 
+                       else if (!all_day_event && !notime_events)
                        {
                                gap++;
-                               if ((hour == event_te.tm_hour) && ! ongoing_event ) {
 
-                                       if (event_te.tm_mday != today_start_t.day)      event_te.tm_hour = 0;
-                                       if (event_tm.tm_mday != today_start_t.day) event_tm.tm_hour = 24;
+                               if (event_te.tm_mday != day) event_te.tm_hour = 0;
+                               if (event_tm.tm_mday != day) event_tm.tm_hour = 24;
 
-                                       if ((event_te.tm_hour < dstart) && (event_tm.tm_hour <= dstart)) {
-                                               startmin = diffmin = event_te.tm_min / 6;
-                                               endmin = ((event_tm.tm_hour == hour) ? (event_tm.tm_min / 2) : (event_tm.tm_min / 6)) ;
-                                               top = (event_te.tm_hour * 10) + startmin -1;
-                                               height= ((event_tm.tm_hour - event_te.tm_hour) * 10) + endmin - diffmin ;
-                                       }
-                                       if ((event_te.tm_hour < dstart) && (event_tm.tm_hour >= dstart)) {
-                                               startmin = diffmin = event_te.tm_min / 6;
-                                               endmin = event_tm.tm_min / 2;
-                                               top = (event_te.tm_hour * 10) + startmin - 1;
-                                               height = ((dstart - event_te.tm_hour) * 10) + ((event_tm.tm_hour - dstart) * 30) + endmin - (diffmin * 3);
-                                       }
-                                       if ((event_te.tm_hour <= dstart) && (event_tm.tm_hour > dend)) {
-                                               startmin = diffmin = ((event_te.tm_hour == hour) ? (event_te.tm_min / 2) : (event_te.tm_min / 6)) ;
-                                               endmin = event_tm.tm_min / 6; 
-                                               top = (event_te.tm_hour * 10)  + startmin - 1;
-                                               height = ((dstart - event_te.tm_hour) * 10) + ((dend - dstart + 1) * 30) + ((event_tm.tm_hour - dend - 1) * 10) + endmin - diffmin;
-                                       }
-                                       if ((event_te.tm_hour >= dstart) && (event_tm.tm_hour <= dend)) {
-                                               startmin = diffmin = (event_te.tm_min / 2);
-                                               endmin = event_tm.tm_min / 2;
-                                               top = (dstart * 10) + ((event_te.tm_hour - dstart) * 30) + startmin - 1;
-                                               height = ((event_tm.tm_hour - event_te.tm_hour) * 30) + endmin - diffmin;
-                                       }
-                                       if ((event_te.tm_hour >= dstart) && (event_te.tm_hour <= dend) && (event_tm.tm_hour > dend)) {
-                                               startmin = diffmin = (event_te.tm_min / 2);
-                                               endmin = event_tm.tm_min / 6;
-                                               top = (dstart * 10) + ((event_te.tm_hour - dstart) * 30)  + diffmin - 1;
-                                               height = (((dend - event_te.tm_hour + 1) * 30) + ((event_tm.tm_hour - dend - 1) * 10)) + endmin - diffmin;
-                                       }
-                                       if ((event_te.tm_hour > dend) && (event_tm.tm_hour > dend)) {
-                                               startmin = diffmin = event_te.tm_min / 6;
-                                               endmin = event_tm.tm_min / 6;
-                                               top = (dstart * 10) + ((dend - dstart + 1) * 30) + ((event_tm.tm_hour - event_te.tm_hour) * 10) + startmin - 1;
-                                               height = ((event_tm.tm_hour - event_te.tm_hour) * 10) + endmin - diffmin;
-                                       }
-                               wprintf("<dd  class=\"event\" "
+                               /* 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;
+                               }
+                               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;
+                               }
+                               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 ;
+                               }
+                               else {
+                                       /* should never get here */
+                               }
+
+                               /* 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;
+                               }
+                               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 ;
+                               }
+                               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;
+                               }
+                               else {
+                                       /* should never get here */
+                               }
+
+                               wprintf("<dd  class=\"event_framed%s\" "
                                        "style=\"position: absolute; "
                                        "top:%dpx; left:%dpx; "
                                        "height:%dpx; \" >",
-                                       top, (gap * 40), height
+                                       (Cal->unread)?"_unread":"_read",
+                                       top, (gap * 40), (bottom-top)
                                        );
                                wprintf("<a href=\"display_edit_event?"
-                                       "msgnum=%ld&calview=day&year=%d&month=%d&day=%d&hour=%d&case=%d\" "
-                                       "class=\"event_title\" >",
-                                       Cal->cal_msgnum, year, month, day, t.hour, hour);
+                                       "msgnum=%ld&calview=day&year=%d&month=%d&day=%d&hour=%d\" "
+                                       "class=\"event_title\" "
+                                               "btt_tooltext=\"",
+                                       Cal->cal_msgnum, year, month, day, t.hour);
+                               wprintf("<i>%s: %s</i><br />", _("From"), Cal->from);
+                                wprintf("<i>%s</i> ",          _("Summary:"));
+                                escputs((char *) icalproperty_get_comment(p));
+                                wprintf("<br />");
+                                q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Location:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                                               }
+                                webcit_fmt_date(buf, event_tt, 1);
+                                wprintf("<i>%s</i> %s<br>", _("Starting date/time:"), buf);
+                                webcit_fmt_date(buf, event_tte, 1);
+                                wprintf("<i>%s</i> %s<br>", _("Ending date/time:"), buf);
+                               q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY);
+                                if (q) {
+                                        wprintf("<i>%s</i> ", _("Notes:"));
+                                        escputs((char *)icalproperty_get_comment(q));
+                                        wprintf("<br />");
+                                }
+                                wprintf("\">");
+
                                escputs((char *) icalproperty_get_comment(p));
                                wprintf("</a></dd>\n");
-                               }
-                               
                        }
                }
        }
@@ -1036,10 +1104,10 @@ void calendar_day_view(int year, int month, int day) {
                        "height: %dpx;          "       
                        "\" >                   "
                        "<a href=\"display_edit_event?msgnum=0"
-                       "&year=%d&month=%d&day=%d&hour=%d&minute=0\">",
+                       "&calview=day&year=%d&month=%d&day=%d&hour=%d&minute=0\">",
                        (hour * extratimeline ), extratimeline, 
                        year, month, day, hour
-               );
+                       );
 
                if (time_format == WC_TIMEFORMAT_24) {
                        wprintf("%2d:00</a> ", hour);
@@ -1048,14 +1116,10 @@ void calendar_day_view(int year, int month, int day) {
                        wprintf("%d:00%s</a> ",
                                (hour <= 12 ? hour : hour-12),
                                (hour < 12 ? "am" : "pm")
-                       );
+                               );
                }
 
                wprintf("</dt>");
-       
-               /* put the data here, stupid */
-               calendar_day_view_display_events(today_t, year, month, day, hour, daystart, dayend);
-
        }
 
        gap = daystart * extratimeline;
@@ -1067,11 +1131,11 @@ void calendar_day_view(int year, int month, int day) {
                         "top: %dpx; left: 0px;  "
                         "height: %dpx;          "
                         "\" >                   "
-                        "<a href=\"display_edit_event?msgnum=0"
+                        "<a href=\"display_edit_event?msgnum=0&calview=day"
                         "&year=%d&month=%d&day=%d&hour=%d&minute=0\">",
                         gap + ((hour - daystart) * timeline ), timeline,
                         year, month, day, hour
-                );
+                       );
 
                 if (time_format == WC_TIMEFORMAT_24) {
                         wprintf("%2d:00</a> ", hour);
@@ -1080,14 +1144,10 @@ void calendar_day_view(int year, int month, int day) {
                         wprintf("%d:00%s</a> ",
                                 (hour <= 12 ? hour : hour-12),
                                 (hour < 12 ? "am" : "pm")
-                        );
+                                               );
                 }
 
                 wprintf("</dt>");
-
-                /* put the data here, stupid */
-                calendar_day_view_display_events(today_t, year, month, day, hour, daystart, dayend);
-
         }
 
        gap = gap + ((dayend - daystart + 1) * timeline);
@@ -1099,7 +1159,7 @@ void calendar_day_view(int year, int month, int day) {
                         "top: %dpx; left: 0px;  "
                         "height: %dpx;          "
                         "\" >                   "
-                        "<a href=\"display_edit_event?msgnum=0"
+                        "<a href=\"display_edit_event?msgnum=0&calview=day"
                         "&year=%d&month=%d&day=%d&hour=%d&minute=0\">",
                         gap + ((hour - dayend - 1) * extratimeline ), extratimeline,
                         year, month, day, hour
@@ -1116,22 +1176,21 @@ void calendar_day_view(int year, int month, int day) {
                 }
 
                 wprintf("</dt>");
-
-                /* put the data here, stupid */
-                calendar_day_view_display_events(today_t, year, month, day, hour, daystart, dayend);
-
         }
 
+       /* Display events with start and end times on this day */
+       calendar_day_view_display_events(today_t, year, month, day, 0, daystart, dayend);
+
                wprintf("</dl>");
        wprintf("</td>");                       /* end of innermost table */
 
-       /** Extra events on the middle */
+       /** Display extra events (start/end times not present or not today) in the middle column */
         wprintf("<td class=\"extra_events\">");
 
         wprintf("<ul>");
 
-        /** Display all-day events) */
-                calendar_day_view_display_events(today_t, year, month, day, -1, daystart, dayend);
+        /** Display all-day events */
+       calendar_day_view_display_events(today_t, year, month, day, 1, daystart, dayend);
 
         wprintf("</ul>");
 
@@ -1158,7 +1217,7 @@ void calendar_day_view(int year, int month, int day) {
                "<font size=+2>%Y</font><br />"
                "</td>",
                &d_tm
-       );
+               );
        wprintf("%s", d_str);
 
        /** Right arrow */
@@ -1233,19 +1292,19 @@ 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)
-                          ) {
-
-
-                               p = icalcomponent_get_first_property(
-                                                       WC->disp_cal[i].cal,
-                                                       ICAL_SUMMARY_PROPERTY);
-                               if (p != NULL) {
-                                       escputs((char *)
-                                               icalproperty_get_comment(p));
-                                       wprintf(" (%s)<br />\n", timestring);
-                               }
+                               && (event_tm.tm_mon == today_tm.tm_mon)
+                       && (event_tm.tm_mday == today_tm.tm_mday)
+                       ) {
+
+
+                       p = icalcomponent_get_first_property(
+                               WC->disp_cal[i].cal,
+                               ICAL_SUMMARY_PROPERTY);
+                       if (p != NULL) {
+                               escputs((char *)
+                                       icalproperty_get_comment(p));
+                               wprintf(" (%s)<br />\n", timestring);
+                       }
                        }
                }
        }
@@ -1261,6 +1320,7 @@ void free_calendar_buffer(void) {
        int i;
        if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) {
                icalcomponent_free(WC->disp_cal[i].cal);
+               free(WC->disp_cal[i].from);
        }
        WC->num_cal = 0;
        free(WC->disp_cal);
@@ -1287,12 +1347,12 @@ void do_calendar_view(void) {
        day = tm.tm_mday;
 
        /** Now see if a date was specified */
-       if (!IsEmptyStr(bstr("year"))) year = atoi(bstr("year"));
-       if (!IsEmptyStr(bstr("month"))) month = atoi(bstr("month"));
-       if (!IsEmptyStr(bstr("day"))) day = atoi(bstr("day"));
+       if (havebstr("year")) year = ibstr("year");
+       if (havebstr("month")) month = ibstr("month");
+       if (havebstr("day")) day = ibstr("day");
 
        /** How would you like that cooked? */
-       if (!IsEmptyStr(bstr("calview"))) {
+       if (havebstr("calview")) {
                strcpy(calview, bstr("calview"));
        }
        else {
@@ -1343,8 +1403,8 @@ time_t get_task_due_date(icalcomponent *vtodo) {
                return get_task_due_date(
                        icalcomponent_get_first_component(
                                vtodo, ICAL_VTODO_COMPONENT
-                       )
-               );
+                               )
+                       );
        }
 
        p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY);
@@ -1368,12 +1428,22 @@ int task_due_cmp(const void *task1, const void *task2) {
 
        t1 =  get_task_due_date(((struct disp_cal *)task1)->cal);
        t2 =  get_task_due_date(((struct disp_cal *)task2)->cal);
-
        if (t1 < t2) return(-1);
        if (t1 > t2) return(1);
        return(0);
 }
 
+/**
+ * \brief qsort filter to move completed tasks to bottom of task list
+ */
+int task_completed_cmp(const void *task1, const void *task2) {
+       icalproperty_status t1 = icalcomponent_get_status(((struct disp_cal *)task1)->cal);
+       // icalproperty_status t2 = icalcomponent_get_status(((struct disp_cal *)task2)->cal);
+       
+       if (t1 == ICAL_STATUS_COMPLETED) 
+               return 1;
+       return 0;
+}
 
 
 
@@ -1383,18 +1453,20 @@ int task_due_cmp(const void *task1, const void *task2) {
 void do_tasks_view(void) {
        int i;
        time_t due;
-       int bg = 0;
        char buf[SIZ];
        icalproperty *p;
-
        wprintf("<div class=\"fix_scrollbar_bug\">"
-               "<table class=\"calendar_view_background\">\n<tr>\n"
+               "<table class=\"calendar_view_background\"><tbody id=\"taskview\">\n<tr>\n"
                "<th>");
+       wprintf(_("Completed?"));
+       wprintf("</th><th>");
        wprintf(_("Name of task"));
        wprintf("</th><th>");
        wprintf(_("Date due"));
-       wprintf("</th></tr>\n"
-       );
+       wprintf("</th><th>");
+       wprintf(_("Category"));
+       wprintf(" (<select id=\"selectcategory\"><option value=\"showall\">%s</option></select>)</th></tr>\n",
+               _("Show All"));
 
        /** Sort them if necessary */
        if (WC->num_cal > 1) {
@@ -1402,24 +1474,33 @@ void do_tasks_view(void) {
                        WC->num_cal,
                        sizeof(struct disp_cal),
                        task_due_cmp
-               );
+                       );
+       }
+       /** And then again, by completed */
+       if (WC->num_cal > 1) {
+               qsort(WC->disp_cal,
+                       WC->num_cal,
+                       sizeof(struct disp_cal),
+                       task_completed_cmp
+                       );
        }
 
        if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) {
-
-               bg = 1 - bg;
-               wprintf("<tr bgcolor=\"#%s\"><td>",
-                       (bg ? "DDDDDD" : "FFFFFF")
-               );
-
+               wprintf("<tr><td>");
+               icalproperty_status todoStatus = icalcomponent_get_status(WC->disp_cal[i].cal);
+               wprintf("<input style=\"text-align: center;\" type=\"checkbox\" name=\"completed\" value=\"completed\" ");
+               if (todoStatus == ICAL_STATUS_COMPLETED) {
+                       wprintf("checked=\"checked\" ");
+               }
+               wprintf("disabled=\"disabled\">\n</td><td>");
                p = icalcomponent_get_first_property(WC->disp_cal[i].cal,
-                                                       ICAL_SUMMARY_PROPERTY);
-               wprintf("<a href=\"display_edit_task?msgnum=%ld&taskrm=",
+                       ICAL_SUMMARY_PROPERTY);
+               wprintf("<a href=\"display_edit_task?msgnum=%ld&amp;taskrm=",
                        WC->disp_cal[i].cal_msgnum );
                urlescputs(WC->wc_roomname);
                wprintf("\">");
-               wprintf("<img align=middle "
-                       "src=\"static/taskmanag_16x.gif\" border=0>&nbsp;");
+               /* wprintf("<img align=middle "
+               "src=\"static/taskmanag_16x.gif\" border=0>&nbsp;"); */
                if (p != NULL) {
                        escputs((char *)icalproperty_get_comment(p));
                }
@@ -1427,41 +1508,29 @@ void do_tasks_view(void) {
                wprintf("</td>\n");
 
                due = get_task_due_date(WC->disp_cal[i].cal);
-               fmt_date(buf, due, 0);
-               wprintf("<td><font");
-               if (due < time(NULL)) {
-                       wprintf(" color=\"#FF0000\"");
+               wprintf("<td><span");
+               if (due > 0) {
+                       webcit_fmt_date(buf, due, 0);
+                       wprintf(">%s",buf);
+               }
+               else {
+                       wprintf(">");
+               }
+               wprintf("</span></td>");
+               wprintf("<td>");
+               p = icalcomponent_get_first_property(WC->disp_cal[i].cal,
+                       ICAL_CATEGORIES_PROPERTY);
+               if (p != NULL) {
+                       escputs((char *)icalproperty_get_categories(p));
                }
-               wprintf(">%s</font></td></tr>\n", buf);
+               wprintf("</td>");
+               wprintf("</tr>");
        }
 
-       wprintf("</table></div>\n");
+       wprintf("</tbody></table></div>\n");
 
        /** Free the list */
        free_calendar_buffer();
 
 }
 
-#else  /* WEBCIT_WITH_CALENDAR_SERVICE */
-
-/**\brief stub for non-libical builds */
-void do_calendar_view(void) {
-       wprintf("<center><i>");
-       wprintf(_("The calendar view is not available."));
-       wprintf("</i></center><br />\n");
-}
-
-/**\brief stub for non-libical builds */
-void do_tasks_view(void) {     
-       wprintf("<center><I>");
-       wprintf(_("The tasks view is not available."));
-       wprintf("</i></center><br />\n");
-}
-
-/**\brief stub for non-libical builds */
-void ajax_mini_calendar(void) {
-}
-
-#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
-
-/** @} */