').addClass('edit-recurring-warning');
- $dialog.html('
' +
- rcmail.gettext((action == 'remove' ? 'removerecurringeventwarning' : 'changerecurringeventwarning'), 'calendar') + '
' +
- '
');
-
- $dialog.find('a.button').button().click(function(e){
- event.savemode = String(this.href).replace(/.+#/, '');
- update_event(action, event);
- $dialog.dialog("destroy").hide();
- return false;
- });
-
- $dialog.dialog({
- modal: true,
- width: 420,
- dialogClass: 'warning',
- title: rcmail.gettext((action == 'remove' ? 'removerecurringevent' : 'changerecurringevent'), 'calendar'),
- buttons: [
- {
- text: rcmail.gettext('cancel', 'calendar'),
- click: function() {
- $(this).dialog("close");
- }
- }
- ],
- close: function(){
- $dialog.dialog("destroy").hide();
- fc.fullCalendar('refetchEvents');
- }
- }).show();
-
- return true;
- };
-
-
- /*** public methods ***/
- //public method to show the print dialog.
-
-
- // public method to bring up the new event dialog
- this.add_event = function() {
- if (this.selected_calendar) {
- var now = new Date();
- var date = fc.fullCalendar('getDate') || now;
- date.setHours(now.getHours()+1);
- date.setMinutes(0);
- var end = new Date(date.getTime());
- end.setHours(date.getHours()+1);
- event_edit_dialog('new', { start:date, end:end, allDay:false, calendar:this.selected_calendar });
- }
- };
-
- // delete the given event after showing a confirmation dialog
- this.delete_event = function(event) {
- // show extended confirm dialog for recurring events, use jquery UI dialog
- if (event.recurrence)
- return recurring_edit_confirm({ id:event.id, calendar:event.calendar }, 'remove');
-
- // send remove request to plugin
- if (confirm(rcmail.gettext('deleteventconfirm', 'calendar'))) {
- update_event('remove', { id:event.id, calendar:event.calendar });
- return true;
- }
-
- return false;
- };
-
- // opens a jquery UI dialog with event properties (or empty for creating a new calendar)
- this.calendar_edit_dialog = function(calendar)
- {
- // close show dialog first
- var $dialog = $("#calendarform").dialog('close');
-
- if (!calendar)
- calendar = { name:'', color:'cc0000' };
-
- var form, name, color;
-
- $dialog.html(rcmail.get_label('loading'));
- $.ajax({
- type: 'GET',
- dataType: 'html',
- url: rcmail.url('calendar'),
- data: { action:(calendar.id ? 'form-edit' : 'form-new'), calendar:{ id:calendar.id } },
- success: function(data){
- $dialog.html(data);
- form = $('#calendarform > form');
- name = $('#calendar-name').val(calendar.editname || calendar.name);
- color = $('#calendar-color').val(calendar.color).miniColors({ value: calendar.color });
- name.select();
- }
- });
-
- // dialog buttons
- var buttons = {};
-
- buttons[rcmail.gettext('save', 'calendar')] = function() {
- // form is not loaded
- if (!form)
- return;
-
- // TODO: do some input validation
- if (!name.val() || name.val().length < 2) {
- alert(rcmail.gettext('invalidcalendarproperties', 'calendar'));
- name.select();
- return;
- }
-
- // post data to server
- var data = form.serializeJSON();
- if (data.color)
- data.color = data.color.replace(/^#/, '');
- if (calendar.id)
- data.id = calendar.id;
-
- rcmail.http_post('calendar', { action:(calendar.id ? 'edit' : 'new'), c:data });
- $dialog.dialog("close");
- };
-
- buttons[rcmail.gettext('cancel', 'calendar')] = function() {
- $dialog.dialog("close");
- };
-
- // open jquery UI dialog
- $dialog.dialog({
- modal: true,
- resizable: true,
- title: rcmail.gettext((calendar.id ? 'editcalendar' : 'createcalendar'), 'calendar'),
- close: function() {
- $dialog.dialog("destroy").hide();
- },
- buttons: buttons,
- minWidth: 400,
- width: 420
- }).show();
-
- };
-
- this.calendar_remove = function(calendar)
- {
- if (confirm(rcmail.gettext('deletecalendarconfirm', 'calendar'))) {
- rcmail.http_post('calendar', { action:'remove', c:{ id:calendar.id } });
- return true;
- }
- return false;
- };
-
- this.calendar_destroy_source = function(id)
- {
- if (this.calendars[id]) {
- fc.fullCalendar('removeEventSource', this.calendars[id]);
- $(rcmail.get_folder_li(id, 'rcmlical')).remove();
- $('#edit-calendar option[value="'+id+'"]').remove();
- delete this.calendars[id];
- }
- };
-
-
- /*** event searching ***/
-
- // execute search
- this.quicksearch = function()
- {
- if (rcmail.gui_objects.qsearchbox) {
- var q = rcmail.gui_objects.qsearchbox.value;
- if (q != '') {
- var id = 'search-'+q;
- var sources = [];
-
- if (this._search_message)
- rcmail.hide_message(this._search_message);
-
- for (var sid in this.calendars) {
- if (this.calendars[sid] && this.calendars[sid].active) {
- fc.fullCalendar('removeEventSource', this.calendars[sid]);
- sources.push(sid);
- }
- }
- id += '@'+sources.join(',');
-
- // just refetch events if query didn't change
- if (this.search_request == id) {
- fc.fullCalendar('refetchEvents');
- return;
- }
- // remove old search results
- else if (this.search_source) {
- fc.fullCalendar('removeEventSource', this.search_source);
- }
- else {
- this.default_view = fc.fullCalendar('getView').name;
- }
-
- // replace event source from fullcalendar
- this.search_request = id;
- this.search_source = {
- url: "./?_task=calendar&_action=search_events&q="+escape(q)+'&source='+escape(sources.join(',')),
- editable: false
- };
-
- fc.fullCalendar('option', 'listSections', 'month');
- fc.fullCalendar('addEventSource', this.search_source);
- fc.fullCalendar('changeView', 'table');
- }
- else // empty search input equals reset
- this.reset_quicksearch();
- }
- };
-
- // reset search and get back to normal event listing
- this.reset_quicksearch = function()
- {
- $(rcmail.gui_objects.qsearchbox).val('');
-
- if (this._search_message)
- rcmail.hide_message(this._search_message);
-
- if (this.search_request) {
- // restore original event sources and view mode from fullcalendar
- fc.fullCalendar('option', 'listSections', 'smart');
- fc.fullCalendar('removeEventSource', this.search_source);
- for (var sid in this.calendars) {
- if (this.calendars[sid] && this.calendars[sid].active)
- fc.fullCalendar('addEventSource', this.calendars[sid]);
- }
- if (this.default_view)
- fc.fullCalendar('changeView', this.default_view);
-
- this.search_request = this.search_source = null;
- }
- };
-
- // callback if all sources have been fetched from server
- this.events_loaded = function(count)
- {
- if (this.search_request && !count)
- this._search_message = rcmail.display_message(rcmail.gettext('searchnoresults', 'calendar'), 'notice');
- }
-
+
/*** startup code ***/
@@ -1023,8 +137,6 @@ function rcube_calendar_ui(settings)
tableCols: ['handle', 'date', 'time', 'title', 'location'],
defaultView: rcmail.env.nview,
allDayText: rcmail.gettext('all-day', 'calendar'),
- buttonText: {
- },
selectable: false,
selectHelper: true,
loading: function(isLoading) {
@@ -1062,65 +174,7 @@ function rcube_calendar_ui(settings)
element.find('div.fc-event-time').append('
');
}
},
- // callback for date range selection
- select: function(start, end, allDay, e, view) {
- var range_select = (!allDay || start.getDate() != end.getDate())
- if (dialog_check(e) && range_select)
- event_edit_dialog('new', { start:start, end:end, allDay:allDay, calendar:me.selected_calendar });
- if (range_select || ignore_click)
- view.calendar.unselect();
- },
- // callback for clicks in all-day box
- dayClick: function(date, allDay, e, view) {
- var now = new Date().getTime();
- if (now - day_clicked_ts < 400 && day_clicked == date.getTime()) // emulate double-click on day
- return event_edit_dialog('new', { start:date, end:date, allDay:allDay, calendar:me.selected_calendar });
-
- if (!ignore_click) {
- view.calendar.gotoDate(date);
- fullcalendar_update();
- if (day_clicked && new Date(day_clicked).getMonth() != date.getMonth())
- view.calendar.select(date, date, allDay);
- }
- day_clicked = date.getTime();
- day_clicked_ts = now;
- },
- // callback when a specific event is clicked
- eventClick: function(event) {
- event_show_dialog(event);
- },
- // callback when an event was dragged and finally dropped
- eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
- if (event.end == null) {
- event.end = event.start;
- }
- // send move request to server
- var data = {
- id: event.id,
- calendar: event.calendar,
- start: date2unixtime(event.start),
- end: date2unixtime(event.end),
- allday: allDay?1:0
- };
- if (event.recurrence)
- recurring_edit_confirm(data, 'move');
- else
- update_event('move', data);
- },
- // callback for event resizing
- eventResize: function(event, delta) {
- // send resize request to server
- var data = {
- id: event.id,
- calendar: event.calendar,
- start: date2unixtime(event.start),
- end: date2unixtime(event.end)
- };
- if (event.recurrence)
- recurring_edit_confirm(data, 'resize');
- else
- update_event('resize', data);
- },
+
viewDisplay: function(view) {
me.eventcount = [];
if (!bw.ie)
@@ -1132,205 +186,26 @@ function rcube_calendar_ui(settings)
});
- // event handler for clicks on calendar week cell of the datepicker widget
- var init_week_events = function(){
- $('#datepicker table.ui-datepicker-calendar td.ui-datepicker-week-col').click(function(e){
- var base_date = minical.datepicker('getDate');
- var day_off = base_date.getDay() - 1;
- if (day_off < 0) day_off = 6;
- var base_kw = $.datepicker.iso8601Week(base_date);
- var kw = parseInt($(this).html());
- var diff = (kw - base_kw) * 7 * 86400000;
- // select monday of the chosen calendar week
- var date = new Date(base_date.getTime() - day_off * 86400000 + diff);
- fc.fullCalendar('gotoDate', date).fullCalendar('setDate', date).fullCalendar('changeView', 'agendaWeek');
- minical.datepicker('setDate', date);
- window.setTimeout(init_week_events, 10);
- }).css('cursor', 'pointer');
- };
-
- // initialize small calendar widget using jQuery UI datepicker
- var minical = $('#datepicker').datepicker($.extend(datepicker_settings, {
- inline: true,
- showWeek: true,
- changeMonth: false, // maybe enable?
- changeYear: false, // maybe enable?
- onSelect: function(dateText, inst) {
- ignore_click = true;
- var d = minical.datepicker('getDate'); //parse_datetime('0:0', dateText);
- fc.fullCalendar('gotoDate', d).fullCalendar('select', d, d, true);
- window.setTimeout(init_week_events, 10);
- },
- onChangeMonthYear: function(year, month, inst) {
- window.setTimeout(init_week_events, 10);
- var d = minical.datepicker('getDate');
- d.setYear(year);
- d.setMonth(month - 1);
- minical.data('year', year).data('month', month);
- //fc.fullCalendar('gotoDate', d).fullCalendar('setDate', d);
- }
- }));
- window.setTimeout(init_week_events, 10);
-
- // react on fullcalendar buttons
- var fullcalendar_update = function() {
- var d = fc.fullCalendar('getDate');
- minical.datepicker('setDate', d);
- window.setTimeout(init_week_events, 10);
- };
- $("#calendar .fc-button-prev").click(fullcalendar_update);
- $("#calendar .fc-button-next").click(fullcalendar_update);
- $("#calendar .fc-button-today").click(fullcalendar_update);
-
- // format time string
- var formattime = function(hour, minutes) {
- var d = new Date();
- d.setHours(hour);
- d.setMinutes(minutes);
- return $.fullCalendar.formatDate(d, settings['time_format'])
- };
-
- // if start date is changed, shift end date according to initial duration
- var shift_enddate = function(dateText) {
- var newstart = parse_datetime('0', dateText);
- var newend = new Date(newstart.getTime() + $('#edit-startdate').data('duration') * 1000);
- $('#edit-enddate').val($.fullCalendar.formatDate(newend, me.settings['date_format']));
- };
-
- // init event dialog
- $('#eventtabs').tabs({
- show: function(event, ui) {
- if (ui.panel.id == 'event-tab-3')
- $('#edit-attendee-name').select();
- }
- });
- $('#edit-enddate, input.edit-alarm-date').datepicker(datepicker_settings);
- $('#edit-startdate').datepicker(datepicker_settings).datepicker('option', 'onSelect', shift_enddate).change(function(){ shift_enddate(this.value); });
- $('#edit-allday').click(function(){ $('#edit-starttime, #edit-endtime')[(this.checked?'hide':'show')](); });
-
- // configure drop-down menu on time input fields based on jquery UI autocomplete
- $('#edit-starttime, #edit-endtime, input.edit-alarm-time')
- .attr('autocomplete', "off")
- .autocomplete({
- delay: 100,
- minLength: 1,
- source: function(p, callback) {
- /* Time completions */
- var result = [];
- var now = new Date();
- var full = p.term - 1 > 0 || p.term.length > 1;
- var hours = (full ? parse_datetime(p.term, '') : now).getHours();
- var step = 15;
- var minutes = hours * 60 + (full ? 0 : now.getMinutes());
- var min = Math.ceil(minutes / step) * step % 60;
- var hour = Math.floor(Math.ceil(minutes / step) * step / 60);
- // list hours from 0:00 till now
- for (var h = 0; h < hours; h++)
- result.push(formattime(h, 0));
- // list 15min steps for the next two hours
- for (; h < hour + 2; h++) {
- while (min < 60) {
- result.push(formattime(h, min));
- min += step;
- }
- min = 0;
- }
- // list the remaining hours till 23:00
- while (h < 24)
- result.push(formattime((h++), 0));
- return callback(result);
- },
- open: function(event, ui) {
- // scroll to current time
- var widget = $(this).autocomplete('widget');
- var menu = $(this).data('autocomplete').menu;
- var val = $(this).val().replace(/^(.+)(am?)/i, '0:$1').replace(/^(.+)(pm?)/i, '1:$1');
- var li, html, offset = 0;
- widget.css('width', '7em');
- widget.children().each(function(){
- li = $(this);
- html = li.children().first().html().replace(/^(.+)(am?)/i, '0:$1').replace(/^(.+)(pm?)/i, '1:$1');
- if (html < val)
- offset += li.height();
- if (html == val)
- menu.activate($.Event({ type: 'mouseenter' }), li);
- });
- widget.scrollTop(offset - 1);
- }
- })
- .click(function() { // show drop-down upon clicks
- $(this).autocomplete('search', $(this).val() ? $(this).val().replace(/\D.*/, "") : " ");
- });
-
- // register events on alarm fields
- $('select.edit-alarm-type').change(function(){
- $(this).parent().find('span.edit-alarm-values')[(this.selectedIndex>0?'show':'hide')]();
- });
- $('select.edit-alarm-offset').change(function(){
- var mode = $(this).val() == '@' ? 'show' : 'hide';
- $(this).parent().find('.edit-alarm-date, .edit-alarm-time')[mode]();
- $(this).parent().find('.edit-alarm-value').prop('disabled', mode == 'show');
- });
-
- // toggle recurrence frequency forms
- $('#edit-recurrence-frequency').change(function(e){
- var freq = $(this).val().toLowerCase();
- $('.recurrence-form').hide();
- if (freq)
- $('#recurrence-form-'+freq+', #recurrence-form-until').show();
- });
- $('#edit-recurrence-enddate').datepicker(datepicker_settings).click(function(){ $("#edit-recurrence-repeat-until").prop('checked', true) });
- // init attendees autocompletion
- rcmail.init_address_input_events($('#edit-attendee-name'));
- rcmail.addEventListener('autocomplete_insert', function(e){ $('#edit-attendee-add').click(); });
- $('#edit-attendee-add').click(function(){
- var input = $('#edit-attendee-name');
- if (add_attendees(input.val()))
- input.val('');
- });
-
- // add proprietary css styles if not IE
+
+ // add proprietary css styles if not IE
if (!bw.ie)
$('div.fc-content').addClass('rcube-fc-content');
- // hide event dialog when clicking somewhere into document
- $(document).bind('mousedown', dialog_check);
-
+
} // end rcube_calendar class
/* calendar plugin initialization */
window.rcmail && rcmail.addEventListener('init', function(evt) {
- // configure toolbar buttons
- rcmail.register_command('addevent', function(){ cal.add_event(); }, true);
- // configure list operations
- rcmail.register_command('calendar-create', function(){ cal.calendar_edit_dialog(null); }, true);
- rcmail.register_command('calendar-edit', function(){ cal.calendar_edit_dialog(cal.calendars[cal.selected_calendar]); }, false);
- rcmail.register_command('calendar-remove', function(){ cal.calendar_remove(cal.calendars[cal.selected_calendar]); }, false);
-
- // search and export events
- rcmail.register_command('export', function(){ rcmail.goto_url('export_events', { source:cal.selected_calendar }); }, true);
- rcmail.register_command('search', function(){ cal.quicksearch(); }, true);
- rcmail.register_command('reset-search', function(){ cal.reset_quicksearch(); }, true);
-
- // register callback commands
- rcmail.addEventListener('plugin.display_alarms', function(alarms){ cal.display_alarms(alarms); });
- rcmail.addEventListener('plugin.reload_calendar', function(p){ $('#calendar').fullCalendar('refetchEvents', cal.calendars[p.source]); });
- rcmail.addEventListener('plugin.destroy_source', function(p){ cal.calendar_destroy_source(p.id); });
- rcmail.addEventListener('plugin.unlock_saving', function(p){ rcmail.set_busy(false, null, cal.saving_lock); });
-
// let's go
- var cal = new rcube_calendar_ui(rcmail.env.calendar_settings);
+ var cal = new rcube_calendar_print(rcmail.env.calendar_settings);
$(window).resize(function() {
$('#calendar').fullCalendar('option', 'height', $('#main').height());
}).resize();
- // show toolbar
- $('#toolbar').show();
-
});