/** * Client scripts for the Kolab Delegation configuration utitlity * * @author Aleksander Machniak * @author Thomas Bruederli * * @licstart The following is the entire license notice for the * JavaScript code in this file. * * Copyright (C) 2011-2012, Kolab Systems AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * @licend The above is the entire license notice * for the JavaScript code in this file. */ window.rcmail && rcmail.addEventListener('init', function(evt) { if (rcmail.env.task == 'mail' || rcmail.env.task == 'calendar') { // set delegator context for calendar requests on invitation message rcmail.addEventListener('requestcalendar/event', function(o) { rcmail.event_delegator_request(o); }); rcmail.addEventListener('requestcalendar/mailimportevent', function(o) { rcmail.event_delegator_request(o); }); if (rcmail.env.delegators && window.rcube_calendar_ui) { rcmail.calendar_identity_init(); // delegator context for calendar event form rcmail.addEventListener('calendar-event-init', function(o) { return rcmail.calendar_event_init(o); }); // change organizer identity on calendar folder change $('#edit-calendar').change(function() { rcmail.calendar_change(); }); } } else if (rcmail.env.task != 'settings') return; if (/^plugin.delegation/.test(rcmail.env.action)) { rcmail.addEventListener('plugin.delegate_save_complete', function(e) { rcmail.delegate_save_complete(e); }); if (rcmail.gui_objects.delegatelist) { rcmail.delegatelist = new rcube_list_widget(rcmail.gui_objects.delegatelist, { multiselect:true, draggable:false, keyboard:true }); rcmail.delegatelist.addEventListener('select', function(o) { rcmail.select_delegate(o); }); rcmail.delegatelist.init(); rcmail.enable_command('delegate-add', true); } else { rcmail.enable_command('delegate-save', true); var input = $('#delegate'); // delegate autocompletion if (input.length) { rcmail.init_address_input_events(input, {action: 'settings/plugin.delegation-autocomplete'}); rcmail.env.recipients_delimiter = ''; input.focus(); } // folders list $('input.write').change(function(e) { if (this.checked) $('input.read', this.parentNode.parentNode).prop('checked', true); }); $('input.read').change(function(e) { if (!this.checked) $('input.write', this.parentNode.parentNode).prop('checked', false); }); $('.foldersblock thead td img').click(function(e) { var $this = $(this), classname = $this.parent().get(0).className, list = $this.closest('table').find('input.'+classname), check = list.not(':checked').length > 0; list.prop('checked', check).change(); }); } } }); // delegates list onclick even handler rcube_webmail.prototype.select_delegate = function(list) { this.env.active_delegate = list.get_single_selection(); if (this.env.active_delegate) this.delegate_select(this.env.active_delegate); else if (this.env.contentframe) this.show_contentframe(false); }; // select delegate rcube_webmail.prototype.delegate_select = function(id) { var win, target = window, url = '&_action=plugin.delegation'; if (id) url += '&_id='+urlencode(id); else { this.show_contentframe(false); return; } if (win = this.get_frame_window(this.env.contentframe)) { target = win; url += '&_framed=1'; } if (String(target.location.href).indexOf(url) >= 0) this.show_contentframe(true); else this.location_href(this.env.comm_path+url, target, true); }; // display new delegate form rcube_webmail.prototype.delegate_add = function() { var win, target = window, url = '&_action=plugin.delegation'; this.delegatelist.clear_selection(); this.env.active_delegate = null; this.show_contentframe(false); if (win = this.get_frame_window(this.env.contentframe)) { target = win; url += '&_framed=1'; } this.location_href(this.env.comm_path+url, target, true); }; // handler for delete commands rcube_webmail.prototype.delegate_delete = function() { if (!this.env.active_delegate) return; var $dialog = $("#delegate-delete-dialog").addClass('uidialog'), buttons = {}; buttons[this.gettext('no', 'kolab_delegation')] = function() { $dialog.dialog('close'); }; buttons[this.gettext('yes', 'kolab_delegation')] = function() { $dialog.dialog('close'); var lock = rcmail.set_busy(true, 'kolab_delegation.savingdata'); rcmail.http_post('plugin.delegation-delete', {id: rcmail.env.active_delegate, acl: $("#delegate-delete-dialog input:checked").length}, lock); } // open jquery UI dialog $dialog.dialog({ modal: true, resizable: false, closeOnEscape: true, title: this.gettext('deleteconfirm', 'kolab_delegation'), close: function() { $dialog.dialog('destroy').hide(); }, buttons: buttons, width: 400 }).show(); }; // submit delegate form to the server rcube_webmail.prototype.delegate_save = function() { var data = {id: this.env.active_delegate}, lock = this.set_busy(true, 'kolab_delegation.savingdata'); // new delegate if (!data.id) { data.newid = $('#delegate').val().replace(/(^\s+|[\s,]+$)/, ''); if (data.newid.match(/\s*\(([^)]+)\)$/)) data.newid = RegExp.$1; } data.folders = {}; $('input.read:checked').each(function(i, elem) { data.folders[elem.value] = 1; }); $('input.write:checked').each(function(i, elem) { data.folders[elem.value] = 2; }); this.http_post('plugin.delegation-save', data, lock); }; // callback function when saving/deleting has completed successfully rcube_webmail.prototype.delegate_save_complete = function(p) { // delegate created if (p.created) { var input = $('#delegate'), row = $(''), rc = this.is_framed() ? parent.rcmail : this; // remove delegate input input.parent().append($('').text(p.name)); input.remove(); // add delegate row to the list row.attr('id', 'rcmrow'+p.created); $('td', row).text(p.name); rc.delegatelist.insert_row(row.get(0)); rc.delegatelist.highlight_row(p.created); this.env.active_delegate = p.created; rc.env.active_delegate = p.created; rc.enable_command('delegate-delete', true); } // delegate updated else if (p.updated) { // do nothing } // delegate deleted else if (p.deleted) { this.env.active_delegate = null; this.delegate_select(); this.delegatelist.remove_row(p.deleted); this.enable_command('delegate-delete', false); } }; rcube_webmail.prototype.event_delegator_request = function(data) { if (!this.env.delegator_context) return; if (typeof data === 'object') data._context = this.env.delegator_context; else data += '&_context=' + this.env.delegator_context; return data; }; // callback for calendar event form initialization rcube_webmail.prototype.calendar_event_init = function(data) { // set identity for delegator context this.env.calendar_settings.identity = this.calendar_folder_delegator(data.o.calendar); }; // returns delegator's identity data according to selected calendar folder rcube_webmail.prototype.calendar_folder_delegator = function(calendar) { var d, delegator; $.each(this.env.namespace, function(i, v) { var delim = v[v.length-1], pos; if (calendar.indexOf(v) === 0 && (pos = calendar.indexOf(delim, v.length))) { delegator = calendar.substr(v.length, pos - v.length) return false; } }); if (delegator && (d = this.env.delegators[delegator])) { // find delegator's identity id if (!d.identity_id) $.each(this.env.calendar_settings.identities, function(i, v) { if (d.email == v) { d.identity_id = i; return false; } }); d.uid = delegator; } else d = this.env.original_identity; this.env.delegator_context = d.uid; return d; }; // handler for calendar folder change rcube_webmail.prototype.calendar_change = function() { var calendar = $('#edit-calendar').val(), select = $('#edit-identities-list'), old = this.env.calendar_settings.identity; this.env.calendar_settings.identity = this.calendar_folder_delegator(calendar); // change organizer identity in identity selector if (select.length && old != this.env.calendar_settings.identity) { // @TODO: run freebusy update? var id = this.env.calendar_settings.identity.identity_id; select.val(id ? id : ''); } }; // modify default identity of the user rcube_webmail.prototype.calendar_identity_init = function() { var identity = this.env.calendar_settings.identity, emails = identity.emails.split(';'); // remove delegators' emails from list of emails of the current user emails = $.map(emails, function(v) { for (var n in rcmail.env.delegators) if (rcmail.env.delegators[n].emails.indexOf(';'+v) > -1) return null; return v; }); identity.emails = emails.join(';'); this.env.original_identity = identity; }