Simple event caching.
authorJan Schneider <jan@horde.org>
Mon, 9 Mar 2009 14:10:30 +0000 (15:10 +0100)
committerJan Schneider <jan@horde.org>
Thu, 12 Mar 2009 23:12:36 +0000 (00:12 +0100)
Turn calendars on and off.

kronolith/ajax.php
kronolith/js/src/kronolith.js

index 312a3b6..81628f6 100644 (file)
@@ -58,18 +58,30 @@ case 'ListEvents':
     $end   = new Horde_Date(Util::getFormData('end'));
     $cal   = Util::getFormData('cal');
     list($driver, $calendar) = explode('|', $cal);
-    $kronolith_driver = Kronolith::getDriver($driver, $calendar);
     switch ($driver) {
-    case 'Ical':
-        $kronolith_driver->setParam('timeout', 15);
-        break;
-    case '':
+    case 'internal':
         if (!array_key_exists($calendar,
                               Kronolith::listCalendars(false, PERMS_READ))) {
             $notification->push(_("Permission Denied"), 'horde.error');
             $result = false;
             break 2;
         }
+        $driver = '';
+        break;
+    case 'external':
+        $driver = 'Horde';
+        break;
+    case 'remote':
+        $driver = 'Ical';
+        break;
+    case 'holiday':
+        $driver = 'Holiday';
+        break;
+    }
+    $kronolith_driver = Kronolith::getDriver($driver, $calendar);
+    switch ($driver) {
+    case 'Ical':
+        $kronolith_driver->setParam('timeout', 15);
         break;
     }
     $events = $kronolith_driver->listEvents($start, $end, true, false, true);
index e2884d9..76cf8d6 100644 (file)
@@ -21,7 +21,7 @@ KronolithCore = {
 
     view: '',
     calendars: [],
-    ecache: {},
+    ecache: $H(),
     efifo: {},
     eventsLoading: $H(),
     date: new Date(),
@@ -485,7 +485,7 @@ KronolithCore = {
                 shared++;
                 div = $('kronolithSharedCalendars');
             }
-            div.appendChild(new Element('DIV', { 'class': cal.value.show ? 'kronolithCalOn' : 'kronolithCalOff' }).setStyle({ backgroundColor: cal.value.bg, color: cal.value.fg }).update(cal.value.name));
+            div.appendChild(new Element('DIV', { 'calendar': cal.key, 'calendarClass': 'internal', 'class': cal.value.show ? 'kronolithCalOn' : 'kronolithCalOff' }).setStyle({ backgroundColor: cal.value.bg, color: cal.value.fg }).update(cal.value.name));
         });
         if (my) {
             $('kronolithMyCalendars').show();
@@ -499,7 +499,7 @@ KronolithCore = {
         }
 
         remote.each(function(cal) {
-            $('kronolithRemoteCalendars').appendChild(new Element('DIV', { 'class': cal.value.show ? 'kronolithCalOn' : 'kronolithCalOff' }).setStyle({ backgroundColor: cal.value.bg, color: cal.value.fg }).update(cal.value.name));
+            $('kronolithRemoteCalendars').appendChild(new Element('DIV', { 'calendar': cal.key, 'calendarClass': 'remote', 'class': cal.value.show ? 'kronolithCalOn' : 'kronolithCalOff' }).setStyle({ backgroundColor: cal.value.bg, color: cal.value.fg }).update(cal.value.name));
         });
         if (remote.size()) {
             $('kronolithRemoteCalendars').show();
@@ -519,23 +519,9 @@ KronolithCore = {
         }
         calendars = $H(calendars);
         calendars.each(function(type) {
-            switch (type.key) {
-            case 'internal':
-                driver = '';
-                break;
-            case 'external':
-                driver = 'Horde';
-                break;
-            case 'remote':
-                driver = 'Ical';
-                break;
-            case 'holiday':
-                driver = 'Holiday';
-                break;
-            }
             $H(type.value).each(function(cal) {
                 if (cal.value.show) {
-                    calendar = driver + '|' + cal.key;
+                    calendar = type.key + '|' + cal.key;
                     this.eventsLoading[calendar] = start + end;
                     this.doAction('ListEvents', { start: start, end: end, cal: calendar }, callback);
                 }
@@ -558,9 +544,10 @@ KronolithCore = {
         }
 
         if (r.response.events) {
+            this._storeCache(r.response.events, r.response.cal);
             $H(r.response.events).each(function(date) {
                 $H(date.value).each(function(event) {
-                    div = new Element('DIV', { 'class': 'kronolithEvent', 'style': 'background-color:' + event.value.bg + ';color:' + event.value.fg, 'calendar': event.value.c });
+                    div = new Element('DIV', { 'id' : 'kronolithEventM' + event.key, 'class': 'kronolithEvent', 'style': 'background-color:' + event.value.bg + ';color:' + event.value.fg, 'calendar': event.value.c });
                     div.setText(event.value.t)
                         .observe('mouseover', div.addClassName.curry('kronolithSelected'))
                         .observe('mouseout', div.removeClassName.curry('kronolithSelected'));
@@ -584,6 +571,20 @@ KronolithCore = {
         return new Date(date.substr(0, 4), date.substr(4, 2) - 1, date.substr(6, 2));
     },
 
+    _storeCache: function(events, calendar)
+    {
+        if (typeof calendar == 'string') {
+            calendar = calendar.split('|');
+        }
+        if (!this.ecache[calendar[0]]) {
+            this.ecache[calendar[0]] = $H();
+        }
+        if (!this.ecache[calendar[0]][calendar[1]]) {
+            this.ecache[calendar[0]][calendar[1]] = $H();
+        }
+        this.ecache[calendar[0]][calendar[1]] = this.ecache[calendar[0]][calendar[1]].merge(events);
+    },
+
     _addHistory: function(loc, data)
     {
         if (Horde.dhtmlHistory.getCurrentLocation() != loc) {
@@ -647,7 +648,7 @@ KronolithCore = {
 
         var elt = e.element(),
             orig = e.element(),
-            id, tmp;
+            id, tmp, calendar, calendarClass;
 
         if (this.alertrequest) {
             this.alertsFade(this.alertrequest);
@@ -690,13 +691,6 @@ KronolithCore = {
                 e.stop();
                 return;
 
-            case 'kronolithMenu':
-                if (orig.match('div.kronolithCalendars div')) {
-                    this.toggleCalendar(orig);
-                }
-                e.stop();
-                return;
-
             case 'kronolithMinicalDate':
                 this.go('month:' + orig.readAttribute('date'));
                 e.stop();
@@ -761,6 +755,18 @@ KronolithCore = {
                 break;
             }
 
+            calClass = elt.readAttribute('calendarClass');
+            if (calClass) {
+                var calendar = elt.readAttribute('calendar');
+                this.ecache[calClass][calendar].each(function(day) {
+                    $H(day.value).each(function(event) {
+                        $('kronolithEventM' + event.key).toggle();
+                    });
+                });
+                elt.toggleClassName('kronolithCalOn');
+                elt.toggleClassName('kronolithCalOff');
+            }
+
             elt = elt.up();
         }
         Prototype.emptyFunction();