xref: /plugin/davcal/action/ajax.php (revision f3942fbb338ccf2ff4a23ef678ec4f3f82af16e5)
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}