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