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 fullcalendar-2.4.0/lang/fr.js */ 6/* DOKUWIKI:include_once fullcalendar-2.4.0/lang/nl.js */ 7/* DOKUWIKI:include_once datetimepicker-2.4.5/jquery.datetimepicker.js */ 8/* DOKUWIKI:include_once jstz.js */ 9 10/** 11 * Initialize the DAVCal script, attaching some event handlers and triggering 12 * the initial load of the fullcalendar JS 13 */ 14jQuery(function() { 15 // Redefine functions for using moment.js with datetimepicker 16 17 Date.parseDate = function( input, format ){ 18 return moment(input,format).toDate(); 19 }; 20 Date.prototype.dateFormat = function( format ){ 21 return moment(this).format(format); 22 }; 23 24 // Attach to event links 25 var calendarpage = jQuery('#fullCalendar').data('calendarpage'); 26 if(!calendarpage) return; 27 dw_davcal__modals.page = calendarpage; 28 29 jQuery('div.fullCalendarSettings a').each(function() { 30 var $link = jQuery(this); 31 var href = $link.attr('href'); 32 if (!href) return; 33 34 $link.click( 35 function(e) { 36 dw_davcal__modals.showSettingsDialog(); 37 e.preventDefault(); 38 return ''; 39 } 40 ); 41 } 42 ); 43 44 // First, retrieve the current settings. 45 // Upon success, initialize fullcalendar. 46 var postArray = { }; 47 jQuery.post( 48 DOKU_BASE + 'lib/exe/ajax.php', 49 { 50 call: 'plugin_davcal', 51 id: dw_davcal__modals.page, 52 page: dw_davcal__modals.page, 53 action: 'getSettings', 54 params: postArray 55 }, 56 function(data) 57 { 58 var result = data['result']; 59 if(result === true) 60 { 61 dw_davcal__modals.settings = data['settings']; 62 var tz = false; 63 if(data['settings']['timezone'] !== '') 64 tz = data['settings']['timezone']; 65 // Force-overwrite thhe timezone setting if requested 66 if(data['settings']['meta']['forcetimezone'] !== 'no') 67 tz = data['settings']['meta']['forcetimezone']; 68 var fcOptions = { 69 dayClick: function(date, jsEvent, view) { 70 dw_davcal__modals.showEditEventDialog(date, false); 71 }, 72 eventClick: function(calEvent, jsEvent, view) { 73 dw_davcal__modals.showEditEventDialog(calEvent, true); 74 }, 75 events: { 76 url: DOKU_BASE + 'lib/exe/ajax.php', 77 type: 'POST', 78 data: { 79 call: 'plugin_davcal', 80 action: 'getEvents', 81 id: dw_davcal__modals.page, 82 page: dw_davcal__modals.page 83 }, 84 error: function() { 85 dw_davcal__modals.msg = LANG.plugins.davcal['error_retrieving_data']; 86 dw_davcal__modals.showDialog(false); 87 } 88 }, 89 header: { 90 left: 'title', 91 center: 'today prev,next', 92 right: 'month,agendaWeek,agendaDay' 93 }, 94 lang: JSINFO.plugin.davcal['language'], 95 weekNumbers: (data['settings']['weeknumbers'] == 1) ? true : false, 96 timezone: tz, 97 weekends: (data['settings']['workweek'] == 1) ? false : true, 98 firstDay: (data['settings']['monday'] == 1) ? 1 : 0, 99 defaultView: data['settings']['meta']['view'] 100 }; 101 var timeformat = data['settings']['timeformat']; 102 // Force-overwrite the user's timezone setting if requested by the calendar 103 if(data['settings']['meta']['forcetimeformat'] !== 'no') 104 timeformat = data['settings']['meta']['forcetimeformat']; 105 if(timeformat !== 'lang') 106 { 107 // If the time format is language-based, we don't need to pass 108 // the timeFormat option to fullCalendar 109 if(timeformat == '24h') 110 { 111 fcOptions.timeFormat = 'H:mm'; 112 } 113 if(timeformat == '12h') 114 { 115 fcOptions.timeFormat = 'h:mmt'; 116 } 117 } 118 var detectedTz = jstz.determine().name(); 119 dw_davcal__modals.detectedTz = detectedTz; 120 // The current TZ value holds either the uers's selection or 121 // the force timezone value 122 dw_davcal__modals.currentTz = (tz === false) ? '' : tz; 123 // Initialize the davcal popup 124 var res = jQuery('#fullCalendar').fullCalendar(fcOptions); 125 } 126 } 127 ); 128}); 129 130/** 131 * This holds all modal windows that DAVCal uses. 132 */ 133var dw_davcal__modals = { 134 $editEventDialog: null, 135 $dialog: null, 136 $settingsDialog: null, 137 $inputDialog: null, 138 msg: null, 139 completeCb: null, 140 action: null, 141 uid: null, 142 settings: null, 143 page: null, 144 detectedTz: null, 145 currentTz: null, 146 147 /** 148 * Show the settings dialog 149 */ 150 // FIXME: Hide URLs for multi-calendar 151 showSettingsDialog : function() { 152 if(dw_davcal__modals.$settingsDialog) 153 return; 154 155 // Dialog buttons are language-dependent and defined here. 156 // Attach event handlers for save and cancel. 157 var dialogButtons = {}; 158 if(!JSINFO.plugin.davcal['disable_settings']) 159 { 160 dialogButtons[LANG.plugins.davcal['save']] = function() { 161 var postArray = { }; 162 jQuery("input[class=dw_davcal__settings], select[class=dw_davcal__settings]").each(function() { 163 if(jQuery(this).attr('type') == 'checkbox') 164 { 165 postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0; 166 } 167 else 168 { 169 postArray[jQuery(this).prop('name')] = jQuery(this).val(); 170 } 171 }); 172 jQuery('#dw_davcal__ajaxsettings').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />'); 173 jQuery.post( 174 DOKU_BASE + 'lib/exe/ajax.php', 175 { 176 call: 'plugin_davcal', 177 id: dw_davcal__modals.page, 178 page: dw_davcal__modals.page, 179 action: 'saveSettings', 180 params: postArray 181 }, 182 function(data) 183 { 184 var result = data['result']; 185 var html = data['html']; 186 jQuery('#dw_davcal__ajaxsettings').html(html); 187 if(result === true) 188 { 189 location.reload(); 190 } 191 } 192 ); 193 }; 194 } 195 dialogButtons[LANG.plugins.davcal['cancel']] = function () { 196 dw_davcal__modals.hideSettingsDialog(); 197 }; 198 199 var settingsHtml = '<div><table>'; 200 201 if(JSINFO.plugin.davcal['disable_settings'] && JSINFO.plugin.davcal['disable_sync'] && JSINFO.plugin.davcal['disable_ics']) 202 { 203 settingsHtml += LANG.plugins.davcal['nothing_to_show']; 204 } 205 206 if(!JSINFO.plugin.davcal['disable_settings']) 207 { 208 settingsHtml += '<tr><td>' + LANG.plugins.davcal['timezone'] + '</td><td><select name="timezone" id="dw_davcal__settings_timezone" class="dw_davcal__settings"></select></td></tr>' + 209 '<tr><td>' + LANG.plugins.davcal['timeformat'] + '</td><td><select name="timeformat" id="dw_davcal__settings_timeformat" class="dw_davcal__settings"></select></td></tr>' + 210 '<tr><td>' + LANG.plugins.davcal['weeknumbers'] + '</td><td><input type="checkbox" name="weeknumbers" id="dw_davcal__settings_weeknumbers" class="dw_davcal__settings"></td></tr>' + 211 '<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>' + 212 '<tr><td>' + LANG.plugins.davcal['start_monday'] + '</td><td><input type="checkbox" name="monday" id="dw_davcal__settings_monday" class="dw_davcal__settings"></td></tr>'; 213 } 214 215 if(!JSINFO.plugin.davcal['disable_sync']) 216 { 217 settingsHtml += '<tr id="dw_davcal__settings_syncurl"><td>' + LANG.plugins.davcal['sync_url'] + '</td><td><input type="text" name="syncurl" readonly="readonly" id="dw_davcal__settings_syncurl_edit" class="dw_davcal__text" value="' + dw_davcal__modals.settings['syncurl'] + '"></td></tr>'; 218 settingsHtml += '<tr id="dw_davcal__settings_principalurl"><td>' + LANG.plugins.davcal['sync_ical'] + '</td><td><input type="text" name="principalurl" readonly="readonly" id="dw_davcal__settings_principalurl_edit" class="dw_davcal__text" value="' + dw_davcal__modals.settings['principalurl'] + '"></td></tr>'; 219 } 220 221 if(!JSINFO.plugin.davcal['disable_ics']) 222 { 223 settingsHtml += '<tr id="dw_davcal__settings_privateurl"><td>' + LANG.plugins.davcal['private_url'] + '</td><td><input type="text" name="privateurl" readonly="readonly" id="dw_davcal__settings_privateurl_edit" class="dw_davcal__text" value="' + dw_davcal__modals.settings['privateurl'] + '"></td></tr>'; 224 } 225 226 settingsHtml += '</table>' + 227 '</div>' + 228 '<div id="dw_davcal__ajaxsettings"></div>'; 229 230 dw_davcal__modals.$settingsDialog = jQuery(document.createElement('div')) 231 .dialog({ 232 autoOpen: false, 233 draggable: true, 234 title: LANG.plugins.davcal['settings'], 235 resizable: true, 236 buttons: dialogButtons, 237 }) 238 .html( 239 settingsHtml 240 ) 241 .parent() 242 .attr('id','dw_davcal__settings') 243 .show() 244 .appendTo('.dokuwiki:first'); 245 246 jQuery('#dw_davcal__settings').position({ 247 my: "center", 248 at: "center", 249 of: window 250 }); 251 252 // Initialize current settings 253 254 if(!JSINFO.plugin.davcal['disable_settings']) 255 { 256 var $tzdropdown = jQuery('#dw_davcal__settings_timezone'); 257 jQuery('#fullCalendarTimezoneList option').each(function() { 258 jQuery('<option />', {value: jQuery(this).val(), 259 text: jQuery(this).text()}).appendTo($tzdropdown); 260 }); 261 262 var $tfdropdown = jQuery('#dw_davcal__settings_timeformat'); 263 jQuery('<option />', {value: 'lang', text: LANG.plugins.davcal['language_specific']}).appendTo($tfdropdown); 264 jQuery('<option />', {value: '24h', text: '24h'}).appendTo($tfdropdown); 265 jQuery('<option />', {value: '12h', text: '12h'}).appendTo($tfdropdown); 266 267 if(!JSINFO.plugin.davcal['disable_sync']) 268 { 269 jQuery('#dw_davcal__settings_syncurl_edit').on('click', function() { 270 jQuery(this).select(); 271 }); 272 jQuery('#dw_davcal__settings_principalurl_edit').on('click', function() { 273 jQuery(this).select(); 274 }); 275 } 276 277 if(!JSINFO.plugin.davcal['disable_ics']) 278 { 279 jQuery('#dw_davcal__settings_privateurl_edit').on('click', function() { 280 jQuery(this).select(); 281 }); 282 } 283 284 if(dw_davcal__modals.settings) 285 { 286 if(dw_davcal__modals.settings['timeformat'] !== '') 287 jQuery('#dw_davcal__settings_timeformat').val(dw_davcal__modals.settings['timeformat']); 288 if(dw_davcal__modals.settings['timezone'] !== '') 289 jQuery('#dw_davcal__settings_timezone').val(dw_davcal__modals.settings['timezone']); 290 if(dw_davcal__modals.settings['weeknumbers'] == 1) 291 jQuery('#dw_davcal__settings_weeknumbers').prop('checked', true); 292 else 293 jQuery('#dw_davcal__settings_weeknumbers').prop('checked', false); 294 295 if(dw_davcal__modals.settings['workweek'] == 1) 296 jQuery('#dw_davcal__settings_workweek').prop('checked', true); 297 else 298 jQuery('#dw_davcal__settings_workweek').prop('checked', false); 299 300 if(dw_davcal__modals.settings['monday'] == 1) 301 jQuery('#dw_davcal__settings_monday').prop('checked', true); 302 else 303 jQuery('#dw_davcal__settings_monday').prop('checked', false); 304 if(dw_davcal__modals.settings['meta']['forcetimezone'] !== 'no') 305 jQuery('#dw_davcal__settings_timezone').prop('disabled', true); 306 if(dw_davcal__modals.settings['meta']['forcetimeformat'] !== 'no') 307 jQuery('#dw_davcal__settings_timeformat').prop('disabled', true); 308 } 309 } 310 311 // attach event handlers 312 jQuery('#dw_davcal__settings .ui-dialog-titlebar-close').click(function(){ 313 dw_davcal__modals.hideSettingsDialog(); 314 }); 315 }, 316 317 /** 318 * Sanity-check our events. 319 * 320 * @return boolean false on failure, otherwise true 321 */ 322 checkEvents : function() { 323 // Retrieve dates 324 var allDay = jQuery('#dw_davcal__allday_edit').prop('checked'); 325 var startDate = moment(jQuery('#dw_davcal__eventfrom_edit').val(), 'YYYY-MM-DD'); 326 var endDate = moment(jQuery('#dw_davcal__eventto_edit').val(), 'YYYY-MM-DD'); 327 328 // Do the checking 329 if(!allDay) 330 { 331 var startTime = moment.duration(jQuery('#dw_davcal__eventfromtime_edit').val()); 332 var endTime = moment.duration(jQuery('#dw_davcal__eventtotime_edit').val()); 333 startDate.add(startTime); 334 endDate.add(endTime); 335 } 336 if(!startDate.isValid()) 337 { 338 dw_davcal__modals.msg = LANG.plugins.davcal['start_date_invalid']; 339 dw_davcal__modals.showDialog(false); 340 return false; 341 } 342 if(!endDate.isValid()) 343 { 344 dw_davcal__modals.msg = LANG.plugins.davcal['end_date_invalid']; 345 dw_davcal__modals.showDialog(false); 346 return false; 347 } 348 if(endDate.isBefore(startDate)) 349 { 350 dw_davcal__modals.msg = LANG.plugins.davcal['end_date_before_start_date']; 351 dw_davcal__modals.showDialog(false); 352 return false; 353 } 354 if(!allDay && endDate.isSame(startDate)) 355 { 356 dw_davcal__modals.msg = LANG.plugins.davcal['end_date_is_same_as_start_date']; 357 dw_davcal__modals.showDialog(false); 358 return false; 359 } 360 return true; 361 }, 362 363 /** 364 * Show the edit event dialog, which is also used to create new events 365 * @param {Object} event The event to create, that is the date or the calEvent 366 * @param {Object} edit Whether we edit (true) or create a new event (false) 367 */ 368 showEditEventDialog : function(event, edit) { 369 if(dw_davcal__modals.$editEventDialog) 370 return; 371 372 var readonly = dw_davcal__modals.settings['readonly']; 373 var title = ''; 374 var dialogButtons = {}; 375 var calEvent = []; 376 var recurringWarning = ''; 377 // Buttons are dependent on edit or create 378 // Several possibilities: 379 // 380 // 1) Somebody tries to edit, it is not recurring and not readonly -> show 381 // 2) Somebody tries to edit, it is recurring and not readonly -> message 382 // 3) Somebody tries to edit, it is readonly -> message 383 // 4) Somebody tries to create and it is readonly -> message 384 // 5) Somebody tries to create -> show 385 if(edit && (event.recurring != true) && (readonly === false)) 386 { 387 calEvent = event; 388 title = LANG.plugins.davcal['edit_event']; 389 dialogButtons[LANG.plugins.davcal['edit']] = function() { 390 if(!dw_davcal__modals.checkEvents()) 391 return; 392 var postArray = { }; 393 var attachArr = new Array(); 394 var pageid = dw_davcal__modals.page; 395 if(dw_davcal__modals.settings['multi']) 396 { 397 pageid = jQuery("#dw_davcal__editevent_calendar option:selected").val(); 398 } 399 jQuery('.dw_davcal__editevent_attachment_link').each(function() { 400 var attachment = jQuery(this).attr('href'); 401 if(attachment != undefined) 402 { 403 attachArr.push(attachment); 404 } 405 }); 406 postArray['attachments'] = attachArr; 407 jQuery("input.dw_davcal__editevent, textarea.dw_davcal__editevent").each(function() { 408 if(jQuery(this).attr('type') == 'checkbox') 409 { 410 postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0; 411 } 412 else 413 { 414 postArray[jQuery(this).prop('name')] = jQuery(this).val(); 415 } 416 }); 417 jQuery('#dw_davcal__ajaxedit').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />'); 418 jQuery.post( 419 DOKU_BASE + 'lib/exe/ajax.php', 420 { 421 call: 'plugin_davcal', 422 id: pageid, 423 page: dw_davcal__modals.page, 424 action: 'editEvent', 425 params: postArray 426 }, 427 function(data) 428 { 429 var result = data['result']; 430 var html = data['html']; 431 jQuery('#dw_davcal__ajaxedit').html(html); 432 if(result === true) 433 { 434 jQuery('#fullCalendar').fullCalendar('refetchEvents'); 435 dw_davcal__modals.hideEditEventDialog(); 436 } 437 } 438 ); 439 }; 440 dialogButtons[LANG.plugins.davcal['delete']] = function() { 441 dw_davcal__modals.action = 'deleteEvent'; 442 dw_davcal__modals.msg = LANG.plugins.davcal['really_delete_this_event']; 443 dw_davcal__modals.completeCb = function(data) { 444 var result = data['result']; 445 var html = data['html']; 446 jQuery('#dw_davcal__ajaxedit').html(html); 447 if(result === true) 448 { 449 jQuery('#fullCalendar').fullCalendar('refetchEvents'); 450 dw_davcal__modals.hideEditEventDialog(); 451 } 452 }; 453 dw_davcal__modals.showDialog(true); 454 }; 455 } 456 else if(edit && (event.recurring == true) && (readonly === false)) 457 { 458 calEvent = event; 459 title = LANG.plugins.davcal['edit_event']; 460 recurringWarning = LANG.plugins.davcal['recurring_cant_edit']; 461 } 462 else if(edit && (readonly === true)) 463 { 464 calEvent = event; 465 title = LANG.plugins.davcal['edit_event']; 466 recurringWarning = LANG.plugins.davcal['no_permission']; 467 } 468 else if(readonly === true) 469 { 470 calEvent.start = event; 471 calEvent.end = moment(event); 472 calEvent.start.hour(12); 473 calEvent.start.minute(0); 474 calEvent.end.hour(13); 475 calEvent.end.minute(0); 476 calEvent.allDay = false; 477 calEvent.recurring = false; 478 calEvent.title = ''; 479 calEvent.description = ''; 480 calEvent.id = '0'; 481 calEvent.page = dw_davcal__modals.page; 482 title = LANG.plugins.davcal['create_new_event']; 483 recurringWarning = LANG.plugins.davcal['no_permission']; 484 } 485 else 486 { 487 calEvent.start = event; 488 calEvent.end = moment(event); 489 calEvent.start.hour(12); 490 calEvent.start.minute(0); 491 calEvent.end.hour(13); 492 calEvent.end.minute(0); 493 calEvent.allDay = false; 494 calEvent.recurring = false; 495 calEvent.title = ''; 496 calEvent.description = ''; 497 calEvent.id = '0'; 498 calEvent.page = dw_davcal__modals.settings['calids'][0]['page']; 499 title = LANG.plugins.davcal['create_new_event']; 500 dialogButtons[LANG.plugins.davcal['create']] = function() { 501 if(!dw_davcal__modals.checkEvents()) 502 return; 503 504 var postArray = { }; 505 var pageid = dw_davcal__modals.page; 506 var attachArr = new Array(); 507 if(dw_davcal__modals.settings['multi']) 508 { 509 pageid = jQuery("#dw_davcal__editevent_calendar option:selected").val(); 510 } 511 jQuery("input.dw_davcal__editevent, textarea.dw_davcal__editevent").each(function() { 512 if(jQuery(this).attr('type') == 'checkbox') 513 { 514 postArray[jQuery(this).prop('name')] = jQuery(this).prop('checked') ? 1 : 0; 515 } 516 else 517 { 518 postArray[jQuery(this).prop('name')] = jQuery(this).val(); 519 } 520 }); 521 jQuery('.dw_davcal__editevent_attachment_link').each(function() { 522 var attachment = jQuery(this).attr('href'); 523 if(attachment != undefined) 524 { 525 attachArr.push(attachment); 526 } 527 }); 528 postArray['attachments'] = attachArr; 529 jQuery('#dw_davcal__ajaxedit').html('<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />'); 530 jQuery.post( 531 DOKU_BASE + 'lib/exe/ajax.php', 532 { 533 call: 'plugin_davcal', 534 id: pageid, 535 page: dw_davcal__modals.page, 536 action: 'newEvent', 537 params: postArray 538 }, 539 function(data) 540 { 541 var result = data['result']; 542 var html = data['html']; 543 jQuery('#dw_davcal__ajaxedit').html(html); 544 if(result === true) 545 { 546 jQuery('#fullCalendar').fullCalendar('refetchEvents'); 547 dw_davcal__modals.hideEditEventDialog(); 548 } 549 } 550 ); 551 }; 552 } 553 dialogButtons[LANG.plugins.davcal['cancel']] = function() { 554 dw_davcal__modals.hideEditEventDialog(); 555 }; 556 dw_davcal__modals.uid = calEvent.id; 557 dw_davcal__modals.$editEventDialog = jQuery(document.createElement('div')) 558 .dialog({ 559 autoOpen: false, 560 draggable: true, 561 title: title, 562 resizable: true, 563 buttons: dialogButtons, 564 }) 565 .html( 566 '<div><table>' + 567 '<tr><td>' + LANG.plugins.davcal['calendar'] + '</td><td><select id="dw_davcal__editevent_calendar"></select></td></tr>' + 568 '<tr><td>' + LANG.plugins.davcal['title'] + '</td><td><input type="text" id="dw_davcal__eventname_edit" name="eventname" class="dw_davcal__editevent"></td></tr>' + 569 '<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>' + 570 '<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>' + 571 '<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>' + 572 '<tr><td colspan="2"><input type="checkbox" name="allday" id="dw_davcal__allday_edit" class="dw_davcal__editevent">' + LANG.plugins.davcal['allday'] + '</td></tr>' + 573 '<tr><td>' + LANG.plugins.davcal['attachments'] + '</td><td><table id="dw_davcal__editevent_attachments"><tbody><tr><td><input type="text" id="dw_davcal__editevent_attachment" value="http://"></td><td><a href="#" id="dw_davcal__editevent_attach">' + LANG.plugins.davcal['add_attachment'] + '</a></td></tr></tbody></table></td></tr>' + 574 '</table>' + 575 recurringWarning + 576 '<input type="hidden" name="uid" id="dw_davcal__uid_edit" class="dw_davcal__editevent">' + 577 '<input type="hidden" name="detectedtz" id="dw_davcal__tz_edit" class="dw_davcal__editevent">' + 578 '<input type="hidden" name="currenttz" id="dw_davcal__currenttz_edit" class="dw_davcal__editevent">' + 579 '</div>' + 580 '<div id="dw_davcal__ajaxedit"></div>' 581 ) 582 .parent() 583 .attr('id','dw_davcal__edit') 584 .show() 585 .appendTo('.dokuwiki:first'); 586 587 jQuery('#dw_davcal__edit').position({ 588 my: "center", 589 at: "center", 590 of: window 591 }); 592 593 // Populate calendar dropdown 594 var $dropdown = jQuery("#dw_davcal__editevent_calendar"); 595 for(var i=0; i<dw_davcal__modals.settings['calids'].length; i++) 596 { 597 var sel = ''; 598 if(calEvent.page == dw_davcal__modals.settings['calids'][i]['page']) 599 sel = ' selected="selected"'; 600 $dropdown.append('<option value="' + dw_davcal__modals.settings['calids'][i]['page'] + '"' + sel + '>' + dw_davcal__modals.settings['calids'][i]['name'] + '</option>'); 601 } 602 if(edit || (dw_davcal__modals.settings['calids'].length < 1)) 603 { 604 $dropdown.prop('disabled', true); 605 } 606 607 // Set up existing/predefined values 608 jQuery('#dw_davcal__tz_edit').val(dw_davcal__modals.detectedTz); 609 jQuery('#dw_davcal__currenttz_edit').val(dw_davcal__modals.currentTz); 610 jQuery('#dw_davcal__uid_edit').val(calEvent.id); 611 jQuery('#dw_davcal__eventname_edit').val(calEvent.title); 612 jQuery('#dw_davcal__eventfrom_edit').val(calEvent.start.format('YYYY-MM-DD')); 613 jQuery('#dw_davcal__eventfromtime_edit').val(calEvent.start.format('HH:mm')); 614 jQuery('#dw_davcal__eventdescription_edit').val(calEvent.description); 615 if(calEvent.attachments && (calEvent.attachments !== null)) 616 { 617 for(var i=0; i<calEvent.attachments.length; i++) 618 { 619 var url = calEvent.attachments[i]; 620 var row = '<tr><td><a href="' + url + '" class="dw_davcal__editevent_attachment_link">' + url + '</a></td><td><a class="deleteLink" href="#">' + LANG.plugins.davcal['delete'] + '</a></td></tr>'; 621 jQuery('#dw_davcal__editevent_attachments > tbody:last').append(row); 622 623 } 624 } 625 dw_davcal__modals.attachAttachmentDeleteHandlers(); 626 jQuery('#dw_davcal__editevent_attach').on("click", function(e) 627 { 628 e.preventDefault(); 629 var url = jQuery('#dw_davcal__editevent_attachment').val(); 630 jQuery('#dw_davcal__editevent_attachment').val('http://'); 631 var row = '<tr><td><a href="' + url + '" class="dw_davcal__editevent_attachment_link">' + url + '</a></td><td><a class="deleteLink" href="#">' + LANG.plugins.davcal['delete'] + '</a></td></tr>'; 632 jQuery('#dw_davcal__editevent_attachments > tbody:last').append(row); 633 dw_davcal__modals.attachAttachmentDeleteHandlers(); 634 return false; 635 }); 636 if(calEvent.allDay && (calEvent.end === null)) 637 { 638 jQuery('#dw_davcal__eventto_edit').val(calEvent.start.format('YYYY-MM-DD')); 639 jQuery('#dw_davcal__eventtotime_edit').val(calEvent.start.format('HH:mm')); 640 } 641 else if(calEvent.allDay) 642 { 643 endEvent = moment(calEvent.end); 644 endEvent.subtract(1, 'days'); 645 jQuery('#dw_davcal__eventto_edit').val(endEvent.format('YYYY-MM-DD')); 646 jQuery('#dw_davcal__eventotime_edit').val(endEvent.format('HH:mm')); 647 } 648 else 649 { 650 jQuery('#dw_davcal__eventto_edit').val(calEvent.end.format('YYYY-MM-DD')); 651 jQuery('#dw_davcal__eventtotime_edit').val(calEvent.end.format('HH:mm')); 652 } 653 jQuery('#dw_davcal__allday_edit').prop('checked', calEvent.allDay); 654 655 // attach event handlers 656 jQuery('#dw_davcal__edit .ui-dialog-titlebar-close').click(function(){ 657 dw_davcal__modals.hideEditEventDialog(); 658 }); 659 jQuery('#dw_davcal__eventfrom_edit').datetimepicker({format:'YYYY-MM-DD', 660 formatDate:'YYYY-MM-DD', 661 datepicker: true, 662 timepicker: false, 663 }); 664 jQuery('#dw_davcal__eventfromtime_edit').datetimepicker({format:'HH:mm', 665 formatTime:'HH:mm', 666 datepicker: false, 667 timepicker: true, 668 step: 15}); 669 jQuery('#dw_davcal__eventto_edit').datetimepicker({format:'YYYY-MM-DD', 670 formatDate:'YYYY-MM-DD', 671 datepicker: true, 672 timepicker: false, 673 }); 674 jQuery('#dw_davcal__eventtotime_edit').datetimepicker({format:'HH:mm', 675 formatTime:'HH:mm', 676 datepicker: false, 677 timepicker: true, 678 step:15}); 679 jQuery('#dw_davcal__allday_edit').change(function() { 680 if(jQuery(this).is(":checked")) 681 { 682 jQuery('#dw_davcal__eventfromtime_edit').prop('readonly', true); 683 jQuery('#dw_davcal__eventtotime_edit').prop('readonly', true); 684 } 685 else 686 { 687 jQuery('#dw_davcal__eventfromtime_edit').prop('readonly', false); 688 jQuery('#dw_davcal__eventtotime_edit').prop('readonly', false); 689 } 690 }); 691 jQuery('#dw_davcal__allday_edit').change(); 692 }, 693 694 /** 695 * Attach handles to delete the attachments to all 'delete' links 696 */ 697 attachAttachmentDeleteHandlers: function() 698 { 699 jQuery("#dw_davcal__editevent_attachments .deleteLink").on("click", function(e) 700 { 701 e.preventDefault(); 702 var tr = jQuery(this).closest('tr'); 703 tr.css("background-color", "#FF3700"); 704 tr.fadeOut(400, function() 705 { 706 tr.remove(); 707 }); 708 return false; 709 }); 710 }, 711 712 /** 713 * Show an info/confirmation dialog 714 * @param {Object} confirm Whether a confirmation dialog (true) or an info dialog (false) is requested 715 */ 716 showDialog : function(confirm) 717 { 718 if(dw_davcal__modals.$confirmDialog) 719 return; 720 var dialogButtons = {}; 721 var title = ''; 722 if(confirm) 723 { 724 title = LANG.plugins.davcal['confirmation']; 725 var pageid = dw_davcal__modals.page; 726 if(dw_davcal__modals.settings['multi']) 727 { 728 pageid = jQuery("#dw_davcal__editevent_calendar option:selected").val(); 729 } 730 dialogButtons[LANG.plugins.davcal['yes']] = function() { 731 jQuery.post( 732 DOKU_BASE + 'lib/exe/ajax.php', 733 { 734 call: 'plugin_davcal', 735 id: pageid, 736 page: dw_davcal__modals.page, 737 action: dw_davcal__modals.action, 738 params: { 739 uid: dw_davcal__modals.uid 740 } 741 }, 742 function(data) 743 { 744 dw_davcal__modals.completeCb(data); 745 } 746 ); 747 dw_davcal__modals.hideDialog(); 748 }; 749 dialogButtons[LANG.plugins.davcal['cancel']] = function() { 750 dw_davcal__modals.hideDialog(); 751 }; 752 } 753 else 754 { 755 title = LANG.plugins.davcal['info']; 756 dialogButtons[LANG.plugins.davcal['ok']] = function() { 757 dw_davcal__modals.hideDialog(); 758 }; 759 } 760 dw_davcal__modals.$dialog = jQuery(document.createElement('div')) 761 .dialog({ 762 autoOpen: false, 763 draggable: true, 764 title: title, 765 resizable: true, 766 buttons: dialogButtons, 767 }) 768 .html( 769 '<div>' + dw_davcal__modals.msg + '</div>' 770 ) 771 .parent() 772 .attr('id','dw_davcal__confirm') 773 .show() 774 .appendTo('.dokuwiki:first'); 775 776 jQuery('#dw_davcal__confirm').position({ 777 my: "center", 778 at: "center", 779 of: window 780 }); 781 // attach event handlers 782 jQuery('#dw_davcal__confirm .ui-dialog-titlebar-close').click(function(){ 783 dw_davcal__modals.hideDialog(); 784 }); 785 }, 786 787 /** 788 * Hide the edit event dialog 789 */ 790 hideEditEventDialog : function() { 791 dw_davcal__modals.$editEventDialog.empty(); 792 dw_davcal__modals.$editEventDialog.remove(); 793 dw_davcal__modals.$editEventDialog = null; 794 }, 795 796 /** 797 * Hide the confirm/info dialog 798 */ 799 hideDialog: function() { 800 dw_davcal__modals.$dialog.empty(); 801 dw_davcal__modals.$dialog.remove(); 802 dw_davcal__modals.$dialog = null; 803 }, 804 805 /** 806 * Hide the settings dialog 807 */ 808 hideSettingsDialog: function() { 809 dw_davcal__modals.$settingsDialog.empty(); 810 dw_davcal__modals.$settingsDialog.remove(); 811 dw_davcal__modals.$settingsDialog = null; 812 } 813}; 814