1<?php 2 3/** 4 * DokuWiki DAVCal PlugIn - Ajax component 5 */ 6 7if(!defined('DOKU_INC')) die(); 8 9class action_plugin_davcal_ajax extends DokuWiki_Action_Plugin { 10 11 /** 12 * @var helper_plugin_davcal 13 */ 14 private $hlp = null; 15 16 function __construct() { 17 $this->hlp =& plugin_load('helper','davcal'); 18 } 19 20 function register(Doku_Event_Handler $controller) { 21 $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown'); 22 } 23 24 function handle_ajax_call_unknown(&$event, $param) { 25 if($event->data != 'plugin_davcal') return; 26 27 $event->preventDefault(); 28 $event->stopPropagation(); 29 global $INPUT; 30 31 $action = trim($INPUT->post->str('action')); 32 $id = trim($INPUT->post->str('id')); 33 $page = trim($INPUT->post->str('page')); 34 $params = $INPUT->post->arr('params'); 35 $user = $_SERVER['REMOTE_USER']; 36 $write = false; 37 $multi = false; 38 39 $data = array(); 40 41 $data['result'] = false; 42 $data['html'] = $this->getLang('unknown_error'); 43 44 // Check if we have access to the calendar ($id is given by parameters, 45 // that's not necessarily the page we come from) 46 $acl = auth_quickaclcheck($id); 47 if($acl > AUTH_READ) 48 { 49 $write = true; 50 } 51 52 // Retrieve the calendar pages based on the meta data 53 $calendarPages = $this->hlp->getCalendarPagesByMeta($page); 54 if($calendarPages === false) 55 { 56 $calendarPages = array($page); 57 } 58 if(count($calendarPages) > 1) 59 $multi = true; 60 61 // Parse the requested action 62 switch($action) 63 { 64 // Add a new Event 65 case 'newEvent': 66 if($write) 67 { 68 $data['result'] = true; 69 $data['html'] = $this->getLang('event_added'); 70 $this->hlp->addCalendarEntryToCalendarForPage($id, $user, $params); 71 } 72 else 73 { 74 $data['result'] = false; 75 $data['html'] = $this->getLang('no_permission'); 76 } 77 break; 78 // Retrieve existing Events 79 case 'getEvents': 80 $startDate = $INPUT->post->str('start'); 81 $endDate = $INPUT->post->str('end'); 82 $data = array(); 83 foreach($calendarPages as $calPage) 84 { 85 $data = array_merge($data, $this->hlp->getEventsWithinDateRange($calPage, 86 $user, $startDate, $endDate)); 87 } 88 break; 89 // Edit an event 90 case 'editEvent': 91 if($write) 92 { 93 $data['result'] = true; 94 $data['html'] = $this->getLang('event_edited'); 95 $this->hlp->editCalendarEntryForPage($id, $user, $params); 96 } 97 else 98 { 99 $data['result'] = false; 100 $data['html'] = $this->getLang('no_permission'); 101 } 102 break; 103 // Delete an Event 104 case 'deleteEvent': 105 if($write) 106 { 107 $data['result'] = true; 108 $data['html'] = $this->getLang('event_deleted'); 109 $this->hlp->deleteCalendarEntryForPage($id, $params); 110 } 111 else 112 { 113 $data['result'] = false; 114 $data['html'] = $this->getLang('no_permission'); 115 } 116 break; 117 // Get personal settings 118 case 'getSettings': 119 $data['result'] = true; 120 $data['settings'] = $this->hlp->getPersonalSettings($user); 121 $data['settings']['multi'] = $multi; 122 $data['settings']['calids'] = $this->hlp->getCalendarMapForIDs($calendarPages); 123 $data['settings']['readonly'] = !$write; 124 $data['settings']['syncurl'] = $this->hlp->getSyncUrlForPage($page, $user); 125 $data['settings']['privateurl'] = $this->hlp->getPrivateURLForPage($page); 126 $data['settings']['meta'] = $this->hlp->getCalendarMetaForPage($page); 127 break; 128 // Save personal settings 129 case 'saveSettings': 130 $settings = array(); 131 $settings['weeknumbers'] = $params['weeknumbers']; 132 $settings['timezone'] = $params['timezone']; 133 $settings['workweek'] = $params['workweek']; 134 $settings['monday'] = $params['monday']; 135 if($this->hlp->savePersonalSettings($settings, $user)) 136 { 137 $data['result'] = true; 138 $data['html'] = $this->getLang('settings_saved'); 139 } 140 else 141 { 142 $data['result'] = false; 143 $data['html'] = $this->getLang('error_saving'); 144 } 145 break; 146 } 147 148 // If we are still here, JSON output is requested 149 150 //json library of DokuWiki 151 require_once DOKU_INC . 'inc/JSON.php'; 152 $json = new JSON(); 153 154 //set content type 155 header('Content-Type: application/json'); 156 echo $json->encode($data); 157 } 158 159}