119378907SAtari911<?php 219378907SAtari911/** 319378907SAtari911 * DokuWiki Plugin calendar (Action Component) 419378907SAtari911 * 519378907SAtari911 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 619378907SAtari911 * @author DokuWiki Community 719378907SAtari911 */ 819378907SAtari911 919378907SAtari911if (!defined('DOKU_INC')) die(); 1019378907SAtari911 1119378907SAtari911class action_plugin_calendar extends DokuWiki_Action_Plugin { 1219378907SAtari911 1319378907SAtari911 public function register(Doku_Event_Handler $controller) { 1419378907SAtari911 $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax'); 1519378907SAtari911 $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'addAssets'); 1619378907SAtari911 } 1719378907SAtari911 1819378907SAtari911 public function handleAjax(Doku_Event $event, $param) { 1919378907SAtari911 if ($event->data !== 'plugin_calendar') return; 2019378907SAtari911 $event->preventDefault(); 2119378907SAtari911 $event->stopPropagation(); 2219378907SAtari911 2319378907SAtari911 $action = $_REQUEST['action'] ?? ''; 2419378907SAtari911 2519378907SAtari911 switch ($action) { 2619378907SAtari911 case 'save_event': 2719378907SAtari911 $this->saveEvent(); 2819378907SAtari911 break; 2919378907SAtari911 case 'delete_event': 3019378907SAtari911 $this->deleteEvent(); 3119378907SAtari911 break; 3219378907SAtari911 case 'get_event': 3319378907SAtari911 $this->getEvent(); 3419378907SAtari911 break; 3519378907SAtari911 case 'load_month': 3619378907SAtari911 $this->loadMonth(); 3719378907SAtari911 break; 3819378907SAtari911 case 'toggle_task': 3919378907SAtari911 $this->toggleTaskComplete(); 4019378907SAtari911 break; 4119378907SAtari911 default: 4219378907SAtari911 echo json_encode(['success' => false, 'error' => 'Unknown action']); 4319378907SAtari911 } 4419378907SAtari911 } 4519378907SAtari911 4619378907SAtari911 private function saveEvent() { 4719378907SAtari911 global $INPUT; 4819378907SAtari911 4919378907SAtari911 $namespace = $INPUT->str('namespace', ''); 5019378907SAtari911 $date = $INPUT->str('date'); 5119378907SAtari911 $eventId = $INPUT->str('eventId', ''); 5219378907SAtari911 $title = $INPUT->str('title'); 5319378907SAtari911 $time = $INPUT->str('time', ''); 5419378907SAtari911 $description = $INPUT->str('description', ''); 5519378907SAtari911 $color = $INPUT->str('color', '#3498db'); 5619378907SAtari911 $oldDate = $INPUT->str('oldDate', ''); // Track original date for moves 5719378907SAtari911 $isTask = $INPUT->bool('isTask', false); 5819378907SAtari911 $completed = $INPUT->bool('completed', false); 5919378907SAtari911 $endDate = $INPUT->str('endDate', ''); 60*87ac9bf3SAtari911 $isRecurring = $INPUT->bool('isRecurring', false); 61*87ac9bf3SAtari911 $recurrenceType = $INPUT->str('recurrenceType', 'weekly'); 62*87ac9bf3SAtari911 $recurrenceEnd = $INPUT->str('recurrenceEnd', ''); 6319378907SAtari911 6419378907SAtari911 if (!$date || !$title) { 6519378907SAtari911 echo json_encode(['success' => false, 'error' => 'Missing required fields']); 6619378907SAtari911 return; 6719378907SAtari911 } 6819378907SAtari911 69*87ac9bf3SAtari911 // Generate event ID if new 70*87ac9bf3SAtari911 $generatedId = $eventId ?: uniqid(); 71*87ac9bf3SAtari911 72*87ac9bf3SAtari911 // If recurring, generate multiple events 73*87ac9bf3SAtari911 if ($isRecurring) { 74*87ac9bf3SAtari911 $this->createRecurringEvents($namespace, $date, $endDate, $title, $time, $description, 75*87ac9bf3SAtari911 $color, $isTask, $recurrenceType, $recurrenceEnd, $generatedId); 76*87ac9bf3SAtari911 echo json_encode(['success' => true]); 77*87ac9bf3SAtari911 return; 78*87ac9bf3SAtari911 } 79*87ac9bf3SAtari911 8019378907SAtari911 list($year, $month, $day) = explode('-', $date); 8119378907SAtari911 8219378907SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 8319378907SAtari911 if ($namespace) { 8419378907SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 8519378907SAtari911 } 8619378907SAtari911 $dataDir .= 'calendar/'; 8719378907SAtari911 8819378907SAtari911 if (!is_dir($dataDir)) { 8919378907SAtari911 mkdir($dataDir, 0755, true); 9019378907SAtari911 } 9119378907SAtari911 9219378907SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 9319378907SAtari911 9419378907SAtari911 $events = []; 9519378907SAtari911 if (file_exists($eventFile)) { 9619378907SAtari911 $events = json_decode(file_get_contents($eventFile), true); 9719378907SAtari911 } 9819378907SAtari911 9919378907SAtari911 // If editing and date changed, remove from old date first 10019378907SAtari911 if ($eventId && $oldDate && $oldDate !== $date) { 10119378907SAtari911 list($oldYear, $oldMonth, $oldDay) = explode('-', $oldDate); 10219378907SAtari911 $oldEventFile = $dataDir . sprintf('%04d-%02d.json', $oldYear, $oldMonth); 10319378907SAtari911 10419378907SAtari911 if (file_exists($oldEventFile)) { 10519378907SAtari911 $oldEvents = json_decode(file_get_contents($oldEventFile), true); 10619378907SAtari911 if (isset($oldEvents[$oldDate])) { 10719378907SAtari911 $oldEvents[$oldDate] = array_filter($oldEvents[$oldDate], function($evt) use ($eventId) { 10819378907SAtari911 return $evt['id'] !== $eventId; 10919378907SAtari911 }); 11019378907SAtari911 11119378907SAtari911 if (empty($oldEvents[$oldDate])) { 11219378907SAtari911 unset($oldEvents[$oldDate]); 11319378907SAtari911 } 11419378907SAtari911 11519378907SAtari911 file_put_contents($oldEventFile, json_encode($oldEvents, JSON_PRETTY_PRINT)); 11619378907SAtari911 } 11719378907SAtari911 } 11819378907SAtari911 } 11919378907SAtari911 12019378907SAtari911 if (!isset($events[$date])) { 12119378907SAtari911 $events[$date] = []; 12219378907SAtari911 } 12319378907SAtari911 12419378907SAtari911 $eventData = [ 125*87ac9bf3SAtari911 'id' => $generatedId, 12619378907SAtari911 'title' => $title, 12719378907SAtari911 'time' => $time, 12819378907SAtari911 'description' => $description, 12919378907SAtari911 'color' => $color, 13019378907SAtari911 'isTask' => $isTask, 13119378907SAtari911 'completed' => $completed, 13219378907SAtari911 'endDate' => $endDate, 13319378907SAtari911 'created' => date('Y-m-d H:i:s') 13419378907SAtari911 ]; 13519378907SAtari911 13619378907SAtari911 // If editing, replace existing event 13719378907SAtari911 if ($eventId) { 13819378907SAtari911 $found = false; 13919378907SAtari911 foreach ($events[$date] as $key => $evt) { 14019378907SAtari911 if ($evt['id'] === $eventId) { 14119378907SAtari911 $events[$date][$key] = $eventData; 14219378907SAtari911 $found = true; 14319378907SAtari911 break; 14419378907SAtari911 } 14519378907SAtari911 } 14619378907SAtari911 if (!$found) { 14719378907SAtari911 $events[$date][] = $eventData; 14819378907SAtari911 } 14919378907SAtari911 } else { 15019378907SAtari911 $events[$date][] = $eventData; 15119378907SAtari911 } 15219378907SAtari911 15319378907SAtari911 file_put_contents($eventFile, json_encode($events, JSON_PRETTY_PRINT)); 15419378907SAtari911 15519378907SAtari911 echo json_encode(['success' => true, 'events' => $events, 'eventId' => $eventData['id']]); 15619378907SAtari911 } 15719378907SAtari911 15819378907SAtari911 private function deleteEvent() { 15919378907SAtari911 global $INPUT; 16019378907SAtari911 16119378907SAtari911 $namespace = $INPUT->str('namespace', ''); 16219378907SAtari911 $date = $INPUT->str('date'); 16319378907SAtari911 $eventId = $INPUT->str('eventId'); 16419378907SAtari911 16519378907SAtari911 list($year, $month, $day) = explode('-', $date); 16619378907SAtari911 16719378907SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 16819378907SAtari911 if ($namespace) { 16919378907SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 17019378907SAtari911 } 17119378907SAtari911 $dataDir .= 'calendar/'; 17219378907SAtari911 17319378907SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 17419378907SAtari911 17519378907SAtari911 if (file_exists($eventFile)) { 17619378907SAtari911 $events = json_decode(file_get_contents($eventFile), true); 17719378907SAtari911 17819378907SAtari911 if (isset($events[$date])) { 17919378907SAtari911 $events[$date] = array_filter($events[$date], function($event) use ($eventId) { 18019378907SAtari911 return $event['id'] !== $eventId; 18119378907SAtari911 }); 18219378907SAtari911 18319378907SAtari911 if (empty($events[$date])) { 18419378907SAtari911 unset($events[$date]); 18519378907SAtari911 } 18619378907SAtari911 18719378907SAtari911 file_put_contents($eventFile, json_encode($events, JSON_PRETTY_PRINT)); 18819378907SAtari911 } 18919378907SAtari911 } 19019378907SAtari911 19119378907SAtari911 echo json_encode(['success' => true]); 19219378907SAtari911 } 19319378907SAtari911 19419378907SAtari911 private function getEvent() { 19519378907SAtari911 global $INPUT; 19619378907SAtari911 19719378907SAtari911 $namespace = $INPUT->str('namespace', ''); 19819378907SAtari911 $date = $INPUT->str('date'); 19919378907SAtari911 $eventId = $INPUT->str('eventId'); 20019378907SAtari911 20119378907SAtari911 list($year, $month, $day) = explode('-', $date); 20219378907SAtari911 20319378907SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 20419378907SAtari911 if ($namespace) { 20519378907SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 20619378907SAtari911 } 20719378907SAtari911 $dataDir .= 'calendar/'; 20819378907SAtari911 20919378907SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 21019378907SAtari911 21119378907SAtari911 if (file_exists($eventFile)) { 21219378907SAtari911 $events = json_decode(file_get_contents($eventFile), true); 21319378907SAtari911 21419378907SAtari911 if (isset($events[$date])) { 21519378907SAtari911 foreach ($events[$date] as $event) { 21619378907SAtari911 if ($event['id'] === $eventId) { 21719378907SAtari911 echo json_encode(['success' => true, 'event' => $event]); 21819378907SAtari911 return; 21919378907SAtari911 } 22019378907SAtari911 } 22119378907SAtari911 } 22219378907SAtari911 } 22319378907SAtari911 22419378907SAtari911 echo json_encode(['success' => false, 'error' => 'Event not found']); 22519378907SAtari911 } 22619378907SAtari911 22719378907SAtari911 private function loadMonth() { 22819378907SAtari911 global $INPUT; 22919378907SAtari911 23019378907SAtari911 $namespace = $INPUT->str('namespace', ''); 23119378907SAtari911 $year = $INPUT->int('year'); 23219378907SAtari911 $month = $INPUT->int('month'); 23319378907SAtari911 23419378907SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 23519378907SAtari911 if ($namespace) { 23619378907SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 23719378907SAtari911 } 23819378907SAtari911 $dataDir .= 'calendar/'; 23919378907SAtari911 240*87ac9bf3SAtari911 error_log("Calendar loadMonth: Loading $year-$month"); 24119378907SAtari911 242*87ac9bf3SAtari911 // Load current month 243*87ac9bf3SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 24419378907SAtari911 $events = []; 24519378907SAtari911 if (file_exists($eventFile)) { 246*87ac9bf3SAtari911 $contents = file_get_contents($eventFile); 247*87ac9bf3SAtari911 $decoded = json_decode($contents, true); 248*87ac9bf3SAtari911 if (json_last_error() === JSON_ERROR_NONE) { 249*87ac9bf3SAtari911 $events = $decoded; 250*87ac9bf3SAtari911 error_log("Calendar loadMonth: Loaded " . count($events) . " dates from $eventFile"); 251*87ac9bf3SAtari911 } else { 252*87ac9bf3SAtari911 error_log('Calendar: JSON decode error in ' . $eventFile . ': ' . json_last_error_msg()); 25319378907SAtari911 } 254*87ac9bf3SAtari911 } else { 255*87ac9bf3SAtari911 error_log("Calendar loadMonth: File not found: $eventFile"); 256*87ac9bf3SAtari911 } 257*87ac9bf3SAtari911 258*87ac9bf3SAtari911 // Load previous month to catch events spanning into current month 259*87ac9bf3SAtari911 $prevMonth = $month - 1; 260*87ac9bf3SAtari911 $prevYear = $year; 261*87ac9bf3SAtari911 if ($prevMonth < 1) { 262*87ac9bf3SAtari911 $prevMonth = 12; 263*87ac9bf3SAtari911 $prevYear--; 264*87ac9bf3SAtari911 } 265*87ac9bf3SAtari911 $prevEventFile = $dataDir . sprintf('%04d-%02d.json', $prevYear, $prevMonth); 266*87ac9bf3SAtari911 if (file_exists($prevEventFile)) { 267*87ac9bf3SAtari911 $contents = file_get_contents($prevEventFile); 268*87ac9bf3SAtari911 $decoded = json_decode($contents, true); 269*87ac9bf3SAtari911 if (json_last_error() === JSON_ERROR_NONE) { 270*87ac9bf3SAtari911 error_log("Calendar loadMonth: Loaded " . count($decoded) . " dates from $prevEventFile"); 271*87ac9bf3SAtari911 $events = array_merge($events, $decoded); 272*87ac9bf3SAtari911 } else { 273*87ac9bf3SAtari911 error_log('Calendar: JSON decode error in ' . $prevEventFile . ': ' . json_last_error_msg()); 274*87ac9bf3SAtari911 } 275*87ac9bf3SAtari911 } 276*87ac9bf3SAtari911 277*87ac9bf3SAtari911 // Load next month to catch events spanning from current month 278*87ac9bf3SAtari911 $nextMonth = $month + 1; 279*87ac9bf3SAtari911 $nextYear = $year; 280*87ac9bf3SAtari911 if ($nextMonth > 12) { 281*87ac9bf3SAtari911 $nextMonth = 1; 282*87ac9bf3SAtari911 $nextYear++; 283*87ac9bf3SAtari911 } 284*87ac9bf3SAtari911 $nextEventFile = $dataDir . sprintf('%04d-%02d.json', $nextYear, $nextMonth); 285*87ac9bf3SAtari911 if (file_exists($nextEventFile)) { 286*87ac9bf3SAtari911 $contents = file_get_contents($nextEventFile); 287*87ac9bf3SAtari911 $decoded = json_decode($contents, true); 288*87ac9bf3SAtari911 if (json_last_error() === JSON_ERROR_NONE) { 289*87ac9bf3SAtari911 error_log("Calendar loadMonth: Loaded " . count($decoded) . " dates from $nextEventFile"); 290*87ac9bf3SAtari911 $events = array_merge($events, $decoded); 291*87ac9bf3SAtari911 } else { 292*87ac9bf3SAtari911 error_log('Calendar: JSON decode error in ' . $nextEventFile . ': ' . json_last_error_msg()); 293*87ac9bf3SAtari911 } 294*87ac9bf3SAtari911 } 295*87ac9bf3SAtari911 296*87ac9bf3SAtari911 error_log("Calendar loadMonth: Total dates returned: " . count($events)); 29719378907SAtari911 29819378907SAtari911 echo json_encode(['success' => true, 'events' => $events, 'year' => $year, 'month' => $month]); 29919378907SAtari911 } 30019378907SAtari911 30119378907SAtari911 private function toggleTaskComplete() { 30219378907SAtari911 global $INPUT; 30319378907SAtari911 30419378907SAtari911 $namespace = $INPUT->str('namespace', ''); 30519378907SAtari911 $date = $INPUT->str('date'); 30619378907SAtari911 $eventId = $INPUT->str('eventId'); 30719378907SAtari911 $completed = $INPUT->bool('completed', false); 30819378907SAtari911 30919378907SAtari911 list($year, $month, $day) = explode('-', $date); 31019378907SAtari911 31119378907SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 31219378907SAtari911 if ($namespace) { 31319378907SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 31419378907SAtari911 } 31519378907SAtari911 $dataDir .= 'calendar/'; 31619378907SAtari911 31719378907SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 31819378907SAtari911 31919378907SAtari911 if (file_exists($eventFile)) { 32019378907SAtari911 $events = json_decode(file_get_contents($eventFile), true); 32119378907SAtari911 32219378907SAtari911 if (isset($events[$date])) { 32319378907SAtari911 foreach ($events[$date] as $key => $event) { 32419378907SAtari911 if ($event['id'] === $eventId) { 32519378907SAtari911 $events[$date][$key]['completed'] = $completed; 32619378907SAtari911 break; 32719378907SAtari911 } 32819378907SAtari911 } 32919378907SAtari911 33019378907SAtari911 file_put_contents($eventFile, json_encode($events, JSON_PRETTY_PRINT)); 33119378907SAtari911 echo json_encode(['success' => true, 'events' => $events]); 33219378907SAtari911 return; 33319378907SAtari911 } 33419378907SAtari911 } 33519378907SAtari911 33619378907SAtari911 echo json_encode(['success' => false, 'error' => 'Event not found']); 33719378907SAtari911 } 33819378907SAtari911 339*87ac9bf3SAtari911 private function createRecurringEvents($namespace, $startDate, $endDate, $title, $time, 340*87ac9bf3SAtari911 $description, $color, $isTask, $recurrenceType, 341*87ac9bf3SAtari911 $recurrenceEnd, $baseId) { 342*87ac9bf3SAtari911 $dataDir = DOKU_INC . 'data/meta/'; 343*87ac9bf3SAtari911 if ($namespace) { 344*87ac9bf3SAtari911 $dataDir .= str_replace(':', '/', $namespace) . '/'; 345*87ac9bf3SAtari911 } 346*87ac9bf3SAtari911 $dataDir .= 'calendar/'; 347*87ac9bf3SAtari911 348*87ac9bf3SAtari911 if (!is_dir($dataDir)) { 349*87ac9bf3SAtari911 mkdir($dataDir, 0755, true); 350*87ac9bf3SAtari911 } 351*87ac9bf3SAtari911 352*87ac9bf3SAtari911 // Calculate recurrence interval 353*87ac9bf3SAtari911 $interval = ''; 354*87ac9bf3SAtari911 switch ($recurrenceType) { 355*87ac9bf3SAtari911 case 'daily': $interval = '+1 day'; break; 356*87ac9bf3SAtari911 case 'weekly': $interval = '+1 week'; break; 357*87ac9bf3SAtari911 case 'monthly': $interval = '+1 month'; break; 358*87ac9bf3SAtari911 case 'yearly': $interval = '+1 year'; break; 359*87ac9bf3SAtari911 default: $interval = '+1 week'; 360*87ac9bf3SAtari911 } 361*87ac9bf3SAtari911 362*87ac9bf3SAtari911 // Set maximum end date if not specified (1 year from start) 363*87ac9bf3SAtari911 $maxEnd = $recurrenceEnd ?: date('Y-m-d', strtotime($startDate . ' +1 year')); 364*87ac9bf3SAtari911 365*87ac9bf3SAtari911 // Calculate event duration for multi-day events 366*87ac9bf3SAtari911 $eventDuration = 0; 367*87ac9bf3SAtari911 if ($endDate && $endDate !== $startDate) { 368*87ac9bf3SAtari911 $start = new DateTime($startDate); 369*87ac9bf3SAtari911 $end = new DateTime($endDate); 370*87ac9bf3SAtari911 $eventDuration = $start->diff($end)->days; 371*87ac9bf3SAtari911 } 372*87ac9bf3SAtari911 373*87ac9bf3SAtari911 // Generate recurring events 374*87ac9bf3SAtari911 $currentDate = new DateTime($startDate); 375*87ac9bf3SAtari911 $endLimit = new DateTime($maxEnd); 376*87ac9bf3SAtari911 $counter = 0; 377*87ac9bf3SAtari911 $maxOccurrences = 100; // Prevent infinite loops 378*87ac9bf3SAtari911 379*87ac9bf3SAtari911 while ($currentDate <= $endLimit && $counter < $maxOccurrences) { 380*87ac9bf3SAtari911 $dateKey = $currentDate->format('Y-m-d'); 381*87ac9bf3SAtari911 list($year, $month, $day) = explode('-', $dateKey); 382*87ac9bf3SAtari911 383*87ac9bf3SAtari911 // Calculate end date for this occurrence if multi-day 384*87ac9bf3SAtari911 $occurrenceEndDate = ''; 385*87ac9bf3SAtari911 if ($eventDuration > 0) { 386*87ac9bf3SAtari911 $occurrenceEnd = clone $currentDate; 387*87ac9bf3SAtari911 $occurrenceEnd->modify('+' . $eventDuration . ' days'); 388*87ac9bf3SAtari911 $occurrenceEndDate = $occurrenceEnd->format('Y-m-d'); 389*87ac9bf3SAtari911 } 390*87ac9bf3SAtari911 391*87ac9bf3SAtari911 // Load month file 392*87ac9bf3SAtari911 $eventFile = $dataDir . sprintf('%04d-%02d.json', $year, $month); 393*87ac9bf3SAtari911 $events = []; 394*87ac9bf3SAtari911 if (file_exists($eventFile)) { 395*87ac9bf3SAtari911 $events = json_decode(file_get_contents($eventFile), true); 396*87ac9bf3SAtari911 } 397*87ac9bf3SAtari911 398*87ac9bf3SAtari911 if (!isset($events[$dateKey])) { 399*87ac9bf3SAtari911 $events[$dateKey] = []; 400*87ac9bf3SAtari911 } 401*87ac9bf3SAtari911 402*87ac9bf3SAtari911 // Create event for this occurrence 403*87ac9bf3SAtari911 $eventData = [ 404*87ac9bf3SAtari911 'id' => $baseId . '-' . $counter, 405*87ac9bf3SAtari911 'title' => $title, 406*87ac9bf3SAtari911 'time' => $time, 407*87ac9bf3SAtari911 'description' => $description, 408*87ac9bf3SAtari911 'color' => $color, 409*87ac9bf3SAtari911 'isTask' => $isTask, 410*87ac9bf3SAtari911 'completed' => false, 411*87ac9bf3SAtari911 'endDate' => $occurrenceEndDate, 412*87ac9bf3SAtari911 'recurring' => true, 413*87ac9bf3SAtari911 'recurringId' => $baseId, 414*87ac9bf3SAtari911 'created' => date('Y-m-d H:i:s') 415*87ac9bf3SAtari911 ]; 416*87ac9bf3SAtari911 417*87ac9bf3SAtari911 $events[$dateKey][] = $eventData; 418*87ac9bf3SAtari911 file_put_contents($eventFile, json_encode($events, JSON_PRETTY_PRINT)); 419*87ac9bf3SAtari911 420*87ac9bf3SAtari911 // Move to next occurrence 421*87ac9bf3SAtari911 $currentDate->modify($interval); 422*87ac9bf3SAtari911 $counter++; 423*87ac9bf3SAtari911 } 424*87ac9bf3SAtari911 } 425*87ac9bf3SAtari911 42619378907SAtari911 public function addAssets(Doku_Event $event, $param) { 42719378907SAtari911 $event->data['link'][] = array( 42819378907SAtari911 'type' => 'text/css', 42919378907SAtari911 'rel' => 'stylesheet', 43019378907SAtari911 'href' => DOKU_BASE . 'lib/plugins/calendar/style.css' 43119378907SAtari911 ); 43219378907SAtari911 43319378907SAtari911 $event->data['script'][] = array( 43419378907SAtari911 'type' => 'text/javascript', 43519378907SAtari911 'src' => DOKU_BASE . 'lib/plugins/calendar/script.js' 43619378907SAtari911 ); 43719378907SAtari911 } 43819378907SAtari911} 439