xref: /plugin/davcal/script.js (revision f69bb4491e1a8930c2218737f8703c41c7507247)
1/* DOKUWIKI:include_once fullcalendar-2.4.0/moment.js */
2/* DOKUWIKI:include_once fullcalendar-2.4.0/fullcalendar.js */
3/* DOKUWIKI:include_once fullcalendar-2.4.0/lang/de.js */
4/* DOKUWIKI:include_once fullcalendar-2.4.0/lang/en.js */
5/* DOKUWIKI:include_once datetimepicker-2.4.5/jquery.datetimepicker.js */
6/* DOKUWIKI:include_once jstz.js */
7
8jQuery(function() {
9    // Redefine functions for using moment.js with datetimepicker
10
11    Date.parseDate = function( input, format ){
12      return moment(input,format).toDate();
13    };
14    Date.prototype.dateFormat = function( format ){
15      return moment(this).format(format);
16    };
17
18    // Attach to event links
19
20    jQuery('div.fullCalendarSettings a').each(function() {
21        var $link = jQuery(this);
22        var href = $link.attr('href');
23        if (!href) return;
24
25        $link.click(
26            function(e) {
27                dw_davcal__modals.showSettingsDialog();
28                e.preventDefault();
29                return '';
30            }
31        );
32        }
33    );
34
35    var postArray = { };
36    jQuery.post(
37        DOKU_BASE + 'lib/exe/ajax.php',
38        {
39            call: 'plugin_davcal',
40            id: JSINFO.id,
41            action: 'getSettings',
42            params: postArray
43        },
44        function(data)
45        {
46            var result = data['result'];
47            if(result === true)
48            {
49                dw_davcal__modals.settings = data['settings'];
50                var wknum = false;
51                var tz = false;
52                var we = true;
53                var detectedTz = jstz.determine().name();
54                dw_davcal__modals.detectedTz = detectedTz;
55                if(data['settings']['weeknumbers'] == 1)
56                    wknum = true;
57                if(data['settings']['timezone'] !== '')
58                    tz = data['settings']['timezone'];
59                if(data['settings']['workweek'] == 1)
60                    we = false;
61                // Initialize the davcal popup
62                var res = jQuery('#fullCalendar').fullCalendar({
63                    dayClick: function(date, jsEvent, view) {
64                        dw_davcal__modals.showEditEventDialog(date, false);
65                    },
66                    eventClick: function(calEvent, jsEvent, view) {
67                        dw_davcal__modals.showEditEventDialog(calEvent, true);
68                    },
69                    events: {
70                        url: DOKU_BASE + 'lib/exe/ajax.php',
71                        type: 'POST',
72                        data: {
73                            call: 'plugin_davcal',
74                            action: 'getEvents',
75                            id: JSINFO.id
76                        },
77                        error: function() {
78                            dw_davcal__modals.msg = LANG.plugins.davcal['error_retrieving_data'];
79                            dw_davcal__modals.showDialog(false);
80                        }
81                    },
82                    header: {
83                        left: 'title',
84                        center: 'today prev,next',
85                        right: 'month,agendaWeek,agendaDay'
86                    },
87                    lang: JSINFO.plugin.davcal['language'],
88                    weekNumbers: wknum,
89                    timezone: tz,
90                    weekends: we,
91                });
92            }
93        }
94    );
95});
96
97var dw_davcal__modals = {
98    $editEventDialog: null,
99    $dialog: null,
100    $settingsDialog: null,
101    msg: null,
102    completeCb: null,
103    action: null,
104    uid: null,
105    settings: null,
106    detectedTz: null,
107
108    showSettingsDialog : function() {
109        if(dw_davcal__modals.$settingsDialog)
110            return;
111
112        var dialogButtons = {};
113        dialogButtons[LANG.plugins.davcal['save']] = function() {
114            var postArray = { };
115            jQuery("input[class=dw_davcal__settings], select[class=dw_davcal__settings]").each(function() {
116              if(jQuery(this).attr('type') == 'checkbox')
117              {
118                  postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0;
119              }
120              else
121              {
122                  postArray[jQuery(this).prop('name')] = jQuery(this).val();
123              }
124            });
125            jQuery('#dw_davcal__ajaxsettings').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />');
126            jQuery.post(
127                DOKU_BASE + 'lib/exe/ajax.php',
128                {
129                    call: 'plugin_davcal',
130                    id: JSINFO.id,
131                    action: 'saveSettings',
132                    params: postArray
133                },
134                function(data)
135                {
136                    var result = data['result'];
137                    var html = data['html'];
138                    jQuery('#dw_davcal__ajaxsettings').html(html);
139                    if(result === true)
140                    {
141                        location.reload();
142                    }
143                }
144            );
145        };
146        dialogButtons[LANG.plugins.davcal['cancel']] = function () {
147            dw_davcal__modals.hideSettingsDialog();
148        };
149
150        dw_davcal__modals.$settingsDialog = jQuery(document.createElement('div'))
151       .dialog({
152           autoOpen: false,
153           draggable: true,
154           title: LANG.plugins.davcal['settings'],
155           resizable: true,
156           buttons: dialogButtons,
157       })
158       .html(
159            '<div><table>' +
160            //'<tr><td>' + LANG.plugins.davcal['use_lang_tz'] + '</td><td><input type="checkbox" name="use_lang_tz" id="dw_davcal__settings_use_lang_tz" class="dw_davcal__settings"></td></tr>' +
161            '<tr><td>' + LANG.plugins.davcal['timezone'] + '</td><td><select name="timezone" id="dw_davcal__settings_timezone" class="dw_davcal__settings"></select></td></tr>' +
162            '<tr><td>' + LANG.plugins.davcal['weeknumbers'] + '</td><td><input type="checkbox" name="weeknumbers" id="dw_davcal__settings_weeknumbers" class="dw_davcal__settings"></td></tr>' +
163            '<tr><td>' + LANG.plugins.davcal['only_workweek'] + '</td><td><input type="checkbox" name="workweek" id="dw_davcal__settings_workweek" class="dw_davcal__settings"></td></tr>' +
164            '<tr><td>' + LANG.plugins.davcal['sync_url'] + '</td><td><input type="text" name="syncurl" readonly="readonly" id="dw_davcal__settings_syncurl" class="dw_davcal__text" value="' + dw_davcal__modals.settings['syncurl'] + '"></td></tr>' +
165            '<tr><td>' + LANG.plugins.davcal['private_url'] + '</td><td><input type="text" name="privateurl" readonly="readonly" id="dw_davcal__settings_privateurl" class="dw_davcal__text" value="' + dw_davcal__modals.settings['privateurl'] + '"></td></tr>' +
166            '</table>' +
167            '</div>' +
168            '<div id="dw_davcal__ajaxsettings"></div>'
169            )
170       .parent()
171       .attr('id','dw_davcal__settings')
172       .show()
173       .appendTo('.dokuwiki:first');
174
175       jQuery('#dw_davcal__settings').position({
176           my: "center",
177           at: "center",
178           of: window
179       });
180
181       jQuery('#dw_davcal__settings_syncurl').on('click', function() {
182           jQuery(this).select();
183       });
184
185       jQuery('#dw_davcal__settings_privateurl').on('click', function() {
186           jQuery(this).select();
187       });
188
189           // attach event handlers
190        jQuery('#dw_davcal__settings .ui-dialog-titlebar-close').click(function(){
191          dw_davcal__modals.hideSettingsDialog();
192        });
193
194        var $tzdropdown = jQuery('#dw_davcal__settings_timezone');
195        jQuery('#fullCalendarTimezoneList option').each(function() {
196            jQuery('<option />', {value: jQuery(this).val(),
197                    text: jQuery(this).text()}).appendTo($tzdropdown);
198        });
199
200        if(dw_davcal__modals.settings)
201        {
202            if(dw_davcal__modals.settings['timezone'] !== '')
203                jQuery('#dw_davcal__settings_timezone').val(dw_davcal__modals.settings['timezone']);
204            if(dw_davcal__modals.settings['weeknumbers'] == 1)
205                jQuery('#dw_davcal__settings_weeknumbers').prop('checked', true);
206            else
207                jQuery('#dw_davcal__settings_weeknumbers').prop('checked', false);
208
209            if(dw_davcal__modals.settings['workweek'] == 1)
210                jQuery('#dw_davcal__settings_workweek').prop('checked', true);
211            else
212                jQuery('#dw_davcal__settings_workweek').prop('checked', false);
213        }
214    },
215
216    checkEvents : function() {
217        var allDay = jQuery('#dw_davcal__allday_edit').prop('checked');
218        var startDate = moment(jQuery('#dw_davcal__eventfrom_edit').val(), 'YYYY-MM-DD');
219        var endDate = moment(jQuery('#dw_davcal__eventto_edit').val(), 'YYYY-MM-DD');
220        if(!allDay)
221        {
222            var startTime = moment.duration(jQuery('#dw_davcal__eventfromtime_edit').val());
223            var endTime = moment.duration(jQuery('#dw_davcal__eventtotime_edit').val());
224            startDate.add(startTime);
225            endDate.add(endTime);
226        }
227        if(!startDate.isValid())
228        {
229            dw_davcal__modals.msg = LANG.plugins.davcal['start_date_invalid'];
230            dw_davcal__modals.showDialog(false);
231            return false;
232        }
233        if(!endDate.isValid())
234        {
235            dw_davcal__modals.msg = LANG.plugins.davcal['end_date_invalid'];
236            dw_davcal__modals.showDialog(false);
237            return false;
238        }
239        if(endDate.isBefore(startDate))
240        {
241            dw_davcal__modals.msg = LANG.plugins.davcal['end_date_before_start_date'];
242            dw_davcal__modals.showDialog(false);
243            return false;
244        }
245        if(!allDay && endDate.isSame(startDate))
246        {
247            dw_davcal__modals.msg = LANG.plugins.davcal['end_date_is_same_as_start_date'];
248            dw_davcal__modals.showDialog(false);
249            return false;
250        }
251        return true;
252    },
253
254    showEditEventDialog : function(event, edit) {
255        if(dw_davcal__modals.$editEventDialog)
256            return;
257
258        var title = '';
259        var dialogButtons = {};
260        var calEvent = [];
261        if(edit)
262        {
263            calEvent = event;
264            title = LANG.plugins.davcal['edit_event'];
265            dialogButtons[LANG.plugins.davcal['edit']] = function() {
266                if(!dw_davcal__modals.checkEvents())
267                  return;
268                var postArray = { };
269                jQuery("input.dw_davcal__editevent, textarea.dw_davcal__editevent").each(function() {
270                  if(jQuery(this).attr('type') == 'checkbox')
271                  {
272                      postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0;
273                  }
274                  else
275                  {
276                      postArray[jQuery(this).prop('name')] = jQuery(this).val();
277                  }
278                });
279                jQuery('#dw_davcal__ajaxedit').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />');
280                jQuery.post(
281                    DOKU_BASE + 'lib/exe/ajax.php',
282                    {
283                        call: 'plugin_davcal',
284                        id: JSINFO.id,
285                        action: 'editEvent',
286                        params: postArray
287                    },
288                    function(data)
289                    {
290                        var result = data['result'];
291                        var html = data['html'];
292                        jQuery('#dw_davcal__ajaxedit').html(html);
293                        if(result === true)
294                        {
295                            jQuery('#fullCalendar').fullCalendar('refetchEvents');
296                            dw_davcal__modals.hideEditEventDialog();
297                        }
298                    }
299                );
300            };
301            dialogButtons[LANG.plugins.davcal['delete']] = function() {
302                dw_davcal__modals.action = 'deleteEvent';
303                dw_davcal__modals.msg = LANG.plugins.davcal['really_delete_this_event'];
304                dw_davcal__modals.completeCb = function(data) {
305                    if(data.result == false)
306                    {
307                        dw_davcal__modals.msg = data.errmsg;
308                        dw_davcal__modals.showDialog(false);
309                    }
310                    else
311                    {
312                        jQuery('#fullCalendar').fullCalendar('refetchEvents');
313                        dw_davcal__modals.hideEditEventDialog();
314                    }
315                };
316                dw_davcal__modals.showDialog(true);
317            };
318        }
319        else
320        {
321            calEvent.start = event;
322            calEvent.end = moment(event);
323            calEvent.start.hour(12);
324            calEvent.start.minute(0);
325            calEvent.end.hour(13);
326            calEvent.end.minute(0);
327            calEvent.allDay = false;
328            calEvent.title = '';
329            calEvent.description = '';
330            calEvent.id = '0';
331            title = LANG.plugins.davcal['create_new_event'];
332            dialogButtons[LANG.plugins.davcal['create']] = function() {
333                if(!dw_davcal__modals.checkEvents())
334                  return;
335
336                var postArray = { };
337                jQuery("input.dw_davcal__editevent, textarea.dw_davcal__editevent").each(function() {
338                  if(jQuery(this).attr('type') == 'checkbox')
339                  {
340                      postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0;
341                  }
342                  else
343                  {
344                      postArray[jQuery(this).prop('name')] = jQuery(this).val();
345                  }
346                });
347                jQuery('#dw_davcal__ajaxedit').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />');
348                jQuery.post(
349                    DOKU_BASE + 'lib/exe/ajax.php',
350                    {
351                        call: 'plugin_davcal',
352                        id: JSINFO.id,
353                        action: 'newEvent',
354                        params: postArray
355                    },
356                    function(data)
357                    {
358                        var result = data['result'];
359                        var html = data['html'];
360                        jQuery('#dw_davcal__ajaxedit').html(html);
361                        if(result === true)
362                        {
363                            jQuery('#fullCalendar').fullCalendar('refetchEvents');
364                            dw_davcal__modals.hideEditEventDialog();
365                        }
366                    }
367                );
368            };
369        }
370        dialogButtons[LANG.plugins.davcal['cancel']] = function() {
371            dw_davcal__modals.hideEditEventDialog();
372        };
373        dw_davcal__modals.uid = calEvent.id;
374        dw_davcal__modals.$editEventDialog = jQuery(document.createElement('div'))
375       .dialog({
376           autoOpen: false,
377           draggable: true,
378           title: title,
379           resizable: true,
380           buttons: dialogButtons,
381       })
382       .html(
383            '<div><table><tr><td>' + LANG.plugins.davcal['title'] + '</td><td><input type="text" id="dw_davcal__eventname_edit" name="eventname" class="dw_davcal__editevent"></td></tr>' +
384            '<tr><td>' + LANG.plugins.davcal['description'] + '</td><td><textarea name="eventdescription" id="dw_davcal__eventdescription_edit" class="dw_davcal__editevent dw_davcal__text"></textarea></td></tr>' +
385            '<tr><td>' + LANG.plugins.davcal['from'] + '</td><td><input type="text" name="eventfrom" id="dw_davcal__eventfrom_edit" class="dw_davcal__editevent dw_davcal__date"><input type="text" name="eventfromtime" id="dw_davcal__eventfromtime_edit" class="dw_davcal__editevent dw_davcal__time"></td></tr>' +
386            '<tr><td>' + LANG.plugins.davcal['to'] + '</td><td><input type="text" name="eventto" id="dw_davcal__eventto_edit" class="dw_davcal__editevent dw_davcal__date"><input type="text" name="eventtotime" id="dw_davcal__eventtotime_edit" class="dw_davcal__editevent dw_davcal__time"></td></tr>' +
387            '<tr><td colspan="2"><input type="checkbox" name="allday" id="dw_davcal__allday_edit" class="dw_davcal__editevent">' + LANG.plugins.davcal['allday'] + '</td></tr>' +
388            '</table>' +
389            '<input type="hidden" name="uid" id="dw_davcal__uid_edit" class="dw_davcal__editevent">' +
390            '<input type="hidden" name="detectedtz" id="dw_davcal__tz_edit" class="dw_davcal__editevent">' +
391            '</div>' +
392            '<div id="dw_davcal__ajaxedit"></div>'
393            )
394       .parent()
395       .attr('id','dw_davcal__edit')
396       .show()
397       .appendTo('.dokuwiki:first');
398
399       jQuery('#dw_davcal__edit').position({
400           my: "center",
401           at: "center",
402           of: window
403       });
404       jQuery('#dw_davcal__tz_edit').val(dw_davcal__modals.detectedTz);
405       jQuery('#dw_davcal__uid_edit').val(calEvent.id);
406       jQuery('#dw_davcal__eventname_edit').val(calEvent.title);
407       jQuery('#dw_davcal__eventfrom_edit').val(calEvent.start.format('YYYY-MM-DD'));
408       jQuery('#dw_davcal__eventfromtime_edit').val(calEvent.start.format('HH:mm'));
409       jQuery('#dw_davcal__eventdescription_edit').val(calEvent.description);
410       if(calEvent.allDay && (calEvent.end === null))
411       {
412           jQuery('#dw_davcal__eventto_edit').val(calEvent.start.format('YYYY-MM-DD'));
413           jQuery('#dw_davcal__eventtotime_edit').val(calEvent.start.format('HH:mm'));
414       }
415       else if(calEvent.allDay)
416       {
417           endEvent = moment(calEvent.end);
418           endEvent.subtract(1, 'days');
419           jQuery('#dw_davcal__eventto_edit').val(endEvent.format('YYYY-MM-DD'));
420           jQuery('#dw_davcal__eventotime_edit').val(endEvent.format('HH:mm'));
421       }
422       else
423       {
424           jQuery('#dw_davcal__eventto_edit').val(calEvent.end.format('YYYY-MM-DD'));
425           jQuery('#dw_davcal__eventtotime_edit').val(calEvent.end.format('HH:mm'));
426       }
427       jQuery('#dw_davcal__allday_edit').prop('checked', calEvent.allDay);
428
429           // attach event handlers
430        jQuery('#dw_davcal__edit .ui-dialog-titlebar-close').click(function(){
431          dw_davcal__modals.hideEditEventDialog();
432        });
433        jQuery('#dw_davcal__eventfrom_edit').datetimepicker({format:'YYYY-MM-DD',
434                                                      formatDate:'YYYY-MM-DD',
435                                                      datepicker: true,
436                                                      timepicker: false,
437                                                      });
438        jQuery('#dw_davcal__eventfromtime_edit').datetimepicker({format:'HH:mm',
439                                                      formatTime:'HH:mm',
440                                                      datepicker: false,
441                                                      timepicker: true,
442                                                      step: 15});
443        jQuery('#dw_davcal__eventto_edit').datetimepicker({format:'YYYY-MM-DD',
444                                                      formatDate:'YYYY-MM-DD',
445                                                      datepicker: true,
446                                                      timepicker: false,
447                                                      });
448        jQuery('#dw_davcal__eventtotime_edit').datetimepicker({format:'HH:mm',
449                                                      formatTime:'HH:mm',
450                                                      datepicker: false,
451                                                      timepicker: true,
452                                                      step:15});
453        jQuery('#dw_davcal__allday_edit').change(function() {
454            if(jQuery(this).is(":checked"))
455            {
456                jQuery('#dw_davcal__eventfromtime_edit').prop('readonly', true);
457                jQuery('#dw_davcal__eventtotime_edit').prop('readonly', true);
458            }
459            else
460            {
461                jQuery('#dw_davcal__eventfromtime_edit').prop('readonly', false);
462                jQuery('#dw_davcal__eventtotime_edit').prop('readonly', false);
463            }
464        });
465        jQuery('#dw_davcal__allday_edit').change();
466    },
467
468    showDialog : function(confirm)
469    {
470        if(dw_davcal__modals.$confirmDialog)
471            return;
472        var dialogButtons = {};
473        var title = '';
474        if(confirm)
475        {
476            title = LANG.plugins.davcal['confirmation'];
477            dialogButtons[LANG.plugins.davcal['yes']] =  function() {
478                            jQuery.post(
479                                DOKU_BASE + 'lib/exe/ajax.php',
480                                {
481                                    call: 'plugin_davcal',
482                                    id: JSINFO.id,
483                                    action: dw_davcal__modals.action,
484                                    params: {
485                                        uid: dw_davcal__modals.uid
486                                    }
487                                },
488                                function(data)
489                                {
490                                    dw_davcal__modals.completeCb(data);
491                                }
492                            );
493                            dw_davcal__modals.hideDialog();
494                    };
495            dialogButtons[LANG.plugins.tagrevisions['cancel']] = function() {
496                            dw_davcal__modals.hideDialog();
497                    };
498        }
499        else
500        {
501            title = LANG.plugins.davcal['info'];
502            dialogButtons[LANG.plugins.davcal['ok']] = function() {
503                 dw_davcal__modals.hideDialog();
504            };
505        }
506        dw_davcal__modals.$dialog = jQuery(document.createElement('div'))
507            .dialog({
508                autoOpen: false,
509                draggable: true,
510                title: title,
511                resizable: true,
512                buttons: dialogButtons,
513            })
514            .html(
515                '<div>' + dw_davcal__modals.msg + '</div>'
516            )
517            .parent()
518            .attr('id','dw_davcal__confirm')
519            .show()
520            .appendTo('.dokuwiki:first');
521
522            jQuery('#dw_davcal__confirm').position({
523                my: "center",
524                at: "center",
525                of: window
526            });
527                 // attach event handlers
528            jQuery('#dw_davcal__confirm .ui-dialog-titlebar-close').click(function(){
529                dw_davcal__modals.hideDialog();
530            });
531    },
532
533    hideEditEventDialog : function() {
534        dw_davcal__modals.$editEventDialog.empty();
535        dw_davcal__modals.$editEventDialog.remove();
536        dw_davcal__modals.$editEventDialog = null;
537    },
538
539    hideDialog: function() {
540        dw_davcal__modals.$dialog.empty();
541        dw_davcal__modals.$dialog.remove();
542        dw_davcal__modals.$dialog = null;
543    },
544
545    hideSettingsDialog: function() {
546        dw_davcal__modals.$settingsDialog.empty();
547        dw_davcal__modals.$settingsDialog.remove();
548        dw_davcal__modals.$settingsDialog = null;
549    }
550};
551