34
|
1 (function($) {
|
|
2 /**
|
|
3 * The fontend scripts for an advanced search.
|
|
4 *
|
|
5 * @version 2.1.6
|
|
6 * @licence GNU GPLv3+
|
|
7 * @author Wilwert Claude
|
|
8 * @author Ludovicy Steve
|
|
9 * @author Chris Moules
|
|
10 * @website http://www.gms.lu
|
|
11 */
|
|
12
|
|
13 $.stack = {
|
|
14 /**
|
|
15 * This object is used to buffer all the server side information which doesn't change. So the script
|
|
16 * doesn't have to send an ajax-request for every new added row.
|
|
17 *
|
|
18 * @name stack
|
|
19 * @namespace
|
|
20 */
|
|
21 date_criteria: {},
|
|
22 flag_criteria: {},
|
|
23 email_criteria: {},
|
|
24 row: null,
|
|
25 messages: null
|
|
26 };
|
|
27
|
|
28 var search_loading = '';
|
|
29
|
|
30 $(document).on("change", "#button_display_option", function(e) {
|
|
31 var img = $('img', $(this).closest('p'));
|
|
32 var src = img.attr('src');
|
|
33 if(this.value == 'messagemenu') {
|
|
34 src = src.replace('menu_location_b.jpg', 'menu_location_a.jpg');
|
|
35 } else {
|
|
36 src = src.replace('menu_location_a.jpg', 'menu_location_b.jpg');
|
|
37 }
|
|
38 img.attr('src', src);
|
|
39 });
|
|
40
|
|
41 $(document).on("change", "#_show_message_mbox_info, #_show_message_label_header", function(e) {
|
|
42 var img = $('img', $(this).closest('p'));
|
|
43 if($(this).is(':checked')) {
|
|
44 img.removeClass('disabled');
|
|
45 } else {
|
|
46 img.addClass('disabled');
|
|
47 }
|
|
48 });
|
|
49
|
|
50 /**
|
|
51 * The callback function of the initial dialog call. It creates the dialog and buffers the serverside
|
|
52 * informations into an object.
|
|
53 *
|
|
54 * @param {object} r The serverside informations
|
|
55 */
|
|
56 rcmail.addEventListener('plugin.show', function(r) {
|
|
57 $.stack.date_criteria = r.date_criteria;
|
|
58 $.stack.flag_criteria = r.flag_criteria;
|
|
59 $.stack.email_criteria = r.email_criteria;
|
|
60 $.stack.row = r.row;
|
|
61 $.stack.html = r.html;
|
|
62
|
|
63 var $html = $(r.html);
|
|
64 var saved_searches_label = rcmail.gettext('saved_searches', 'advanced_search');
|
|
65 var saved_searches = '<span class="saved_searches"> <label for="select_saved_search">' + saved_searches_label + ': <select name="select_saved_search" id="select_saved_search"><option value=""></option></select></label></span>';
|
|
66 title = $('<div>' + r.title + saved_searches + '<div>');
|
|
67 var saved_searches_select = $('[name=select_saved_search]', title);
|
|
68 if (r.saved_searches.length) {
|
|
69 var i;
|
|
70 for (i in r.saved_searches) {
|
|
71 saved_searches_select.append('<option value="' + r.saved_searches[i] + '">' + r.saved_searches[i] + '</option>');
|
|
72 }
|
|
73 }
|
|
74 $html.dialog({
|
|
75 width: 640,
|
|
76 height: 300,
|
|
77 resizable: true,
|
|
78 draggable: true,
|
|
79 title: title,
|
|
80 dialogClass: "advanced_search_dialog",
|
|
81 close: function() {
|
|
82 $('body').css('overflow', 'auto');
|
|
83 },
|
|
84 create: function() {
|
|
85 $('body').css('overflow', 'hidden');
|
|
86 }
|
|
87 });
|
|
88
|
|
89 saved_searches_select.bind("blur click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select", function(e) {
|
|
90 e.stopPropagation();
|
|
91 });
|
|
92
|
|
93 saved_searches_select.bind("mouseenter", function(e) {
|
|
94 saved_searches_select.focus();
|
|
95 });
|
|
96
|
|
97 saved_searches_select.bind('change', function(e) {
|
|
98 var search_name = $(this).val();
|
|
99 if (search_name == "") {
|
|
100 $('#adsearch-popup').html($.stack.html);
|
|
101 } else {
|
|
102 rcmail.http_request('plugin.get_saved_search', { search_name : search_name });
|
|
103 $('[name=delete]', '#adsearch-popup').show();
|
|
104 }
|
|
105 });
|
|
106
|
|
107 });
|
|
108
|
|
109 rcmail.addEventListener('plugin.load_saved_search', function(search) {
|
|
110 var $form = $("#adsearch-popup form"),
|
|
111 $tr = $('tr', $('tbody', $form)).not(':first').not(':last'),
|
|
112 $last = $('tr:last', $('tbody', $form));
|
|
113 saved_search = search.search,
|
|
114 data = [];
|
|
115 $tr.remove();
|
|
116 $("[name=folder]", $form).val(search.folder);
|
|
117 $("[name=subfolder]", $form).prop('checked', search.sub_folders == "true");
|
|
118 $('span.sub-folders', $form).css('display', search.folder == 'all' ? 'none' : 'inline');
|
|
119
|
|
120 var i = 0;
|
|
121 for (i; i < saved_search.length; i++) {
|
|
122 var row;
|
|
123 if (i == 0) {
|
|
124 row = $('<tr>' + $("tr:eq(1)", $.stack.html).html() + '</tr>');
|
|
125 } else {
|
|
126 row = $($.stack.row);
|
|
127 }
|
|
128 $("[name=method]", row).val(saved_search[i].method);
|
|
129 $("[name=filter]", row).val(saved_search[i].filter);
|
|
130 $("[name=not]", row).prop('checked', saved_search[i]['not'] == "true");
|
|
131 $("[name=filter-exclude]", row).prop('checked', saved_search[i]['excluded'] == "true");
|
|
132 $last.before(row);
|
|
133 $("[name=filter]", row).trigger("change");
|
|
134 $("[name=filter-val]", row).val(saved_search[i]['filter-val']);
|
|
135 }
|
|
136 });
|
|
137 //messagelistcontainer table thead
|
|
138 rcmail.addEventListener('plugin.advanced_search_add_header', function(evt) {
|
|
139 if($("#messagelistcontainer #rcavbox1").length == 0) {
|
|
140 var Mbox = rcmail.gettext('mbox', 'advanced_search');
|
|
141 $("#messagelistcontainer table.fixedcopy thead tr:first").append('<td class="mbox" id="rcavbox1"><span class="mbox">' + Mbox + '</span></td>');
|
|
142 $("#messagelistcontainer table#messagelist thead tr:first").append('<td class="mbox" id="rcavbox2"><span class="mbox">' + Mbox + '</span></td>');
|
|
143 }
|
|
144 });
|
|
145
|
|
146 rcmail.addEventListener('plugin.advanced_search_del_header', function(evt) {
|
|
147 $("#messagelistcontainer #rcavbox1").remove();
|
|
148 $("#messagelistcontainer #rcavbox2").remove();
|
|
149 });
|
|
150
|
|
151 rcube_webmail.prototype.advanced_search_add_mbox = function (mbox, count, showMbox) {
|
|
152 if (!this.gui_objects.messagelist || !this.message_list) {
|
|
153 return false;
|
|
154 }
|
|
155
|
|
156 var colspan = showMbox == true ? 9 : 8;
|
|
157 $(rcmail.message_list.list).append('<tr class="aslabel_mbox"><td><span class="aslabel_found">' + count + '</span></td><td colspan="' + colspan + '">' + mbox + '</td></tr>');
|
|
158 }
|
|
159
|
|
160 rcube_webmail.prototype.advanced_search_active = function(param) {
|
|
161 var page = param.replace('_page=', '');
|
|
162 rcmail.http_request('plugin.trigger_search_pagination', { _page : page });
|
|
163 }
|
|
164
|
|
165 /**
|
|
166 * Builds the search to send to the server
|
|
167 */
|
|
168 var get_search_data = function()
|
|
169 {
|
|
170 var $form = $("#adsearch-popup form"),
|
|
171 $tr = $('tr', $('tbody', $form)).not(':first').not(':last'),
|
|
172 data = [];
|
|
173
|
|
174 if ($tr.length) {
|
|
175 $tr.each(function() {
|
|
176 var item = {not: $('input[name=not]', $(this)).prop('checked'),
|
|
177 excluded: $('input[name=filter-exclude]', $(this)).prop('checked'),
|
|
178 filter: $('option:selected', $('select[name=filter]', $(this))).val(),
|
|
179 'filter-val': $('input[name=filter-val]', $(this)).val()};
|
|
180
|
|
181 if ($('select[name=method]', $(this)).length) {
|
|
182 item.method = $('option:selected', $('select[name=method]', $(this))).val();
|
|
183 }
|
|
184
|
|
185 data.push(item);
|
|
186 });
|
|
187 }
|
|
188
|
|
189 return data;
|
|
190 }
|
|
191
|
|
192 /**
|
|
193 * The onclick event handler for the search button. This generates the search query and sends them
|
|
194 * to the server. It also stores the wrapped set of the old rows into an object for later cleanup.
|
|
195 *
|
|
196 * @param {object} e The event element
|
|
197 */
|
|
198 $(document).on("click", 'input[name=search]', function(e) {
|
|
199 e.preventDefault();
|
|
200
|
|
201 rcmail.clear_message_list();
|
|
202
|
|
203 $.stack.messages = $('tr', $('tbody', '#messagelist'));
|
|
204
|
|
205 var $form = $("#adsearch-popup form");
|
|
206 search_loading = rcmail.set_busy(true, 'loading');
|
|
207 rcmail.http_request('plugin.trigger_search',
|
|
208 {search: get_search_data(),
|
|
209 current_folder: rcmail.env.mailbox,
|
|
210 folder: $('select[name=folder]', $form).val(),
|
|
211 sub_folders: $('input[name=subfolder]', $form).prop('checked')});
|
|
212
|
|
213 $("#adsearch-popup").closest('div.ui-dialog-content').dialog('close');
|
|
214 });
|
|
215
|
|
216 /**
|
|
217 * The onclick event handler of the "reset search" button, which resets the advanced search
|
|
218 * back to its initial state.
|
|
219 *
|
|
220 * @param {object} e The event element
|
|
221 */
|
|
222 $(document).on("click", 'input[name=reset]', function(e) {
|
|
223 e.preventDefault();
|
|
224 $('#adsearch-popup').html($.stack.html);
|
|
225 $('[name=select_saved_search]').val("");
|
|
226 });
|
|
227
|
|
228 /**
|
|
229 * The onclick event handler for the "add" button. This adds one new row to the query dialog
|
|
230 *
|
|
231 * @param {object} e The event element
|
|
232 */
|
|
233 $(document).on("click", 'button[name=add]', function(e) {
|
|
234 e.preventDefault();
|
|
235
|
|
236 $(this).closest('tr').after($.stack.row);
|
|
237 });
|
|
238
|
|
239 /**
|
|
240 * The onclick event handler for the "delete" button. This removes the containing row from
|
|
241 * the query dialog
|
|
242 *
|
|
243 * @param {object} e The event element
|
|
244 */
|
|
245 $(document).on("click", 'button[name=delete]', function(e) {
|
|
246 e.preventDefault();
|
|
247
|
|
248 $(this).closest('tr').remove();
|
|
249 });
|
|
250
|
|
251 /**
|
|
252 * The change event handler for the filter selector.
|
|
253 * Make the input field context relevent.
|
|
254 *
|
|
255 * @param {object} e The event element
|
|
256 */
|
|
257 $(document).on("click", 'select[name=filter]', function(e) {
|
|
258 var $row_input = $(this).nextUntil('tr', 'input[name=filter-val]'),
|
|
259 old_avs_type = $row_input.data("avs_type");
|
|
260
|
|
261 if ($.inArray($(this).val(), $.stack.date_criteria) >= 0) {
|
|
262 if(old_avs_type !== "date") {
|
|
263 $row_input.val('');
|
|
264 $row_input.datepicker({dateFormat: rcmail.env.date_format});
|
|
265 }
|
|
266
|
|
267 $row_input.data("avs_type", "date");
|
|
268 } else if ($.inArray($(this).val(), $.stack.email_criteria) >= 0) {
|
|
269 if(old_avs_type !== "email") {
|
|
270 rcmail.init_address_input_events($row_input, "");
|
|
271 rcmail.addEventListener('autocomplete_insert', function(e){
|
|
272 e.field.value = e.insert.replace(/.*<(\S*?@\S*?)>.*/, "$1");
|
|
273 });
|
|
274 }
|
|
275
|
|
276 $row_input.data("avs_type", "email");
|
|
277 } else if ($.inArray($(this).val(), $.stack.flag_criteria) >= 0) {
|
|
278 if (old_avs_type !== "flag_criteria") {
|
|
279 $row_input.val('');
|
|
280 $row_input.hide();
|
|
281 }
|
|
282
|
|
283 $row_input.data("avs_type", "flag_criteria");
|
|
284 } else {
|
|
285 $row_input.data("avs_type", "none");
|
|
286 }
|
|
287
|
|
288 switch (old_avs_type) {
|
|
289 case "date":
|
|
290 if (($row_input.data("avs_type") !== "date") && $row_input.hasClass("hasDatepicker")) {
|
|
291 $row_input.datepicker("destroy");
|
|
292 }
|
|
293 break;
|
|
294 case "email":
|
|
295 if (($row_input.data("avs_type") !== "email")) {
|
|
296 $row_input.removeAttr("autocomplete");
|
|
297 $row_input.unbind('keydown');
|
|
298 $row_input.unbind('keypress');
|
|
299 }
|
|
300 break;
|
|
301 case "flag_criteria":
|
|
302 if (($row_input.data("avs_type") !== "flag_criteria") && !$row_input.is(":visible")) {
|
|
303 $row_input.show();
|
|
304 }
|
|
305 break;
|
|
306 }
|
|
307 });
|
|
308
|
|
309 /**
|
|
310 * The change event handler for the folder select box. It makes the subfolder checkbox invisible
|
|
311 * when selecting the "all folders" option
|
|
312 *
|
|
313 * @param {object} e The event element
|
|
314 */
|
|
315 $(document).on("click", 'select[name=folder]', function(e) {
|
|
316 $('span.sub-folders', $(this).closest('form')).css('display', $(this).val() == 'all' ? 'none' : 'inline');
|
|
317 });
|
|
318
|
|
319 /**
|
|
320 * The onclick event handler for the menu entry of the advanced search. This makes the initial call
|
|
321 * of the advanced search and fires a query to the server to get every important information.
|
|
322 *
|
|
323 * @param {object} e The event element
|
|
324 */
|
|
325 $(document).on("click", 'a.icon.advanced-search, a.button.advanced-search', function(e) {
|
|
326 e.preventDefault();
|
|
327
|
|
328 if (!$('#adsearch-popup').length) {
|
|
329 rcmail.http_request('plugin.display_advanced_search');
|
|
330 } else {
|
|
331 $("#adsearch-popup").closest('div.ui-dialog-content').dialog('open');
|
|
332 }
|
|
333 });
|
|
334
|
|
335 /**
|
|
336 * Stop propagation of keydown and keypress events.
|
|
337 * This should stop these events being processed by other listeners in the mailbox.
|
|
338 *
|
|
339 * @param {object} e The event element
|
|
340 */
|
|
341 $(document).on("keydown keypress", "#adsearch-popup", function(e) {
|
|
342 e.stopPropagation();
|
|
343 });
|
|
344
|
|
345 $(document).on("click", "#adsearch-popup input.delete_search", function(e) {
|
|
346 e.stopPropagation();
|
|
347 e.preventDefault();
|
|
348 var search_name = $("[name=select_saved_search]").val();
|
|
349 var txt = {};
|
|
350 txt['cancel'] = rcmail.get_label('advanced_search.cancel');
|
|
351 txt['delete'] = rcmail.get_label('advanced_search.delete');
|
|
352 $( "<p><strong>" + search_name + "</strong></p>" ).dialog({
|
|
353 resizable: true,
|
|
354 height:180,
|
|
355 modal: true,
|
|
356 title: rcmail.gettext('advanced_search.deletesearch'),
|
|
357 buttons: [
|
|
358 {
|
|
359 text: txt['delete'],
|
|
360 click: function() {
|
|
361 rcmail.http_request('plugin.delete_search', {search_name: search_name});
|
|
362 $("[value=" + search_name + "]", "[name=select_saved_search]").remove();
|
|
363 $("[name=select_saved_search]").val("").trigger("change");
|
|
364 $( this ).dialog( "close" );
|
|
365 },
|
|
366 },
|
|
367 {
|
|
368 text: txt['cancel'],
|
|
369 click: function() {
|
|
370 $( this ).dialog( "close" );
|
|
371 }
|
|
372 }]
|
|
373
|
|
374 });
|
|
375 });
|
|
376
|
|
377 $(document).on("click", "#save_the_search", function(e) {
|
|
378 e.stopPropagation();
|
|
379 e.preventDefault();
|
|
380 var labelName = rcmail.gettext('name', 'advanced_search');
|
|
381 var labelSave = rcmail.gettext('save', 'advanced_search');
|
|
382 var labelCancel = rcmail.gettext('cancel', 'advanced_search');
|
|
383 var save_search = '<table>'
|
|
384 + ' <tr><td>' + labelName + ' </td><td><input type="text" name="search_name" /></td></tr>'
|
|
385 + ' <tr><td></td><td><input type="submit" class="button mainaction" value="' + labelSave + '" /> <input type="reset" class="button reset" value="' + labelCancel + '" /></td></tr>'
|
|
386 + '</table>';
|
|
387 save_search = $(save_search);
|
|
388 $("[name=search_name]", save_search).val($("[name=select_saved_search]").val());
|
|
389
|
|
390 save_search.dialog({
|
|
391 title: rcmail.gettext('advanced_search.save_the_search'),
|
|
392 dialogClass: 'saveTheSearch',
|
|
393 close: function() {
|
|
394 $(this).remove();
|
|
395 },
|
|
396 width: $("#adsearch-popup").width(),
|
|
397 height: $("#adsearch-popup").height(),
|
|
398 modal: true
|
|
399 });
|
|
400 $(".mainaction", save_search).bind('click', function(e) {
|
|
401 e.preventDefault();
|
|
402 e.stopPropagation();
|
|
403 var search_name = $("[name=search_name]", save_search).val();
|
|
404 var $form = $("#adsearch-popup form");
|
|
405 rcmail.http_request('plugin.save_search',
|
|
406 {search: get_search_data(),
|
|
407 search_name: search_name,
|
|
408 folder: $('select[name=folder]', $form).val(),
|
|
409 sub_folders: $('input[name=subfolder]', $form).prop('checked')});
|
|
410 var isNewSearch = true;
|
|
411 $("[name=select_saved_search] option").each(function(e) {
|
|
412 if ($(this).attr("value") == search_name) {
|
|
413 isNewSearch = false;
|
|
414 }
|
|
415 });
|
|
416 if (isNewSearch) {
|
|
417 $("[name=select_saved_search]").append('<option value="' + search_name + '">' + search_name + '</option>');
|
|
418 $("[name=select_saved_search]").val(search_name);
|
|
419 }
|
|
420 save_search.dialog('close');
|
|
421 });
|
|
422
|
|
423 $(".reset", save_search).bind('click', function(e) {
|
|
424 e.preventDefault();
|
|
425 e.stopPropagation();
|
|
426 save_search.dialog('close');
|
|
427 });
|
|
428
|
|
429 });
|
|
430
|
|
431 var advanced_search_redirect_draft_messages = function(check) {
|
|
432 if (rcmail.env.search_request == "advanced_search_active") {
|
|
433 if (rcmail.task == 'mail') {
|
|
434 uid = rcmail.get_single_uid();
|
|
435 if (uid && (!rcmail.env.uid || uid != rcmail.env.uid || check)) {
|
|
436 if ((rcmail.env.mailbox == rcmail.env.drafts_mailbox) || check) {
|
|
437 url = {
|
|
438 _mbox: this.env.mailbox,
|
|
439 _search: 'advanced_search_active'
|
|
440 };
|
|
441 url[this.env.mailbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid'] = uid;
|
|
442 this.goto_url('compose', url, true);
|
|
443 }
|
|
444 }
|
|
445 }
|
|
446 return true;
|
|
447 }
|
|
448 return false;
|
|
449 }
|
|
450
|
|
451 var advanced_search_perform_action = function(props, action) {
|
|
452
|
|
453 var raw_selection = rcmail.message_list.get_selection();
|
|
454 var md5_folders = rcmail.env.as_md5_folders;
|
|
455 var i;
|
|
456 var selections = {};
|
|
457 for (i in raw_selection) {
|
|
458 raw_selection[i];
|
|
459 var parts = raw_selection[i].split('__MB__');
|
|
460 var mid = parts[0];
|
|
461 var md5Mbox = parts[1];
|
|
462 var mbox = md5_folders[md5Mbox];
|
|
463 if (!selections[mbox]) {
|
|
464 selections[mbox] = [];
|
|
465 }
|
|
466 selections[mbox].push(mid);
|
|
467 }
|
|
468
|
|
469 if (i != undefined) {
|
|
470 // show wait message
|
|
471 if (rcmail.env.action == 'show') {
|
|
472 lock = rcmail.set_busy(true, 'movingmessage');
|
|
473 } else {
|
|
474 rcmail.show_contentframe(false);
|
|
475 }
|
|
476 // Hide message command buttons until a message is selected
|
|
477 rcmail.enable_command(rcmail.env.message_commands, false);
|
|
478 var j;
|
|
479 for (j in selections) {
|
|
480 rcmail.select_folder(j, '', true);
|
|
481 rcmail.env.mailbox = j;
|
|
482 var uids = selections[j].join(',');
|
|
483 var lock = false,
|
|
484 post_data = rcmail.selection_post_data({
|
|
485 _target_mbox: props.id,
|
|
486 _uid: uids
|
|
487 });
|
|
488 rcmail._with_selected_messages(action, post_data, lock);
|
|
489 }
|
|
490 // Make sure we have no selection
|
|
491 rcmail.env.uid = undefined;
|
|
492 rcmail.message_list.selection = [];
|
|
493 }
|
|
494
|
|
495 }
|
|
496
|
|
497 var advanced_search_check_multi_mbox = function () {
|
|
498 var raw_selection = rcmail.message_list.get_selection();
|
|
499 var md5_folders = rcmail.env.as_md5_folders;
|
|
500 var i;
|
|
501 var mcount = 0;
|
|
502 var selections = {};
|
|
503 for (i in raw_selection) {
|
|
504 raw_selection[i];
|
|
505 var parts = raw_selection[i].split('__MB__');
|
|
506 var mid = parts[0];
|
|
507 var md5Mbox = parts[1];
|
|
508 var mbox = md5_folders[md5Mbox];
|
|
509 if (!selections[mbox]) {
|
|
510 selections[mbox] = [];
|
|
511 mcount++;
|
|
512 }
|
|
513 selections[mbox].push(mid);
|
|
514 }
|
|
515
|
|
516 return {
|
|
517 isMulti: mcount > 1,
|
|
518 selections: selections
|
|
519 };
|
|
520 }
|
|
521
|
|
522 /**
|
|
523 * The roundcube init funtion, which registers and enables the advanced search command.
|
|
524 */
|
|
525 rcmail.addEventListener('init', function() {
|
|
526 rcmail.register_command('plugin.advanced_search', true, true);
|
|
527 rcmail.enable_command('plugin.advanced_search', true);
|
|
528
|
|
529 rcmail.addEventListener('plugin.search_complete', function(r) {
|
|
530 rcmail.set_busy(false, 'loading', search_loading);
|
|
531 /* Start registering event listeners for handling drag/drop, marking, flagging etc... */
|
|
532 rcmail.addEventListener('beforeedit', function (command) {
|
|
533 rcmail.env.framed = true;
|
|
534 if (advanced_search_redirect_draft_messages(true)) {
|
|
535 return false;
|
|
536 }
|
|
537 });
|
|
538
|
|
539 rcmail.message_list.addEventListener('dblclick', function (o) {
|
|
540 advanced_search_redirect_draft_messages();
|
|
541 });
|
|
542
|
|
543 rcmail.message_list.addEventListener('select', function (list) {
|
|
544 if (rcmail.env.search_request == "advanced_search_active") {
|
|
545 if (list.selection.length == 1) {
|
|
546 var parts = list.selection[0].split('__MB__');
|
|
547 var mid = parts[0];
|
|
548 var md5Mbox = parts[1];
|
|
549 var mbox = rcmail.env.as_md5_folders[md5Mbox];
|
|
550 rcmail.env.uid = mid;
|
|
551 if (rcmail.env.mailbox != mbox) {
|
|
552 var ex = [];
|
|
553 li = rcmail.get_folder_li(mbox, '', true);
|
|
554 parent = $(li).parents(".mailbox");
|
|
555 parent.each(function () {
|
|
556 div = $(this.getElementsByTagName('div')[0]);
|
|
557 a = $(this.getElementsByTagName('a')[0]);
|
|
558 if (div.hasClass('collapsed')) {
|
|
559 ex.push($(a).attr("rel"));
|
|
560 }
|
|
561 });
|
|
562 for (var i = ex.length - 1; i >= 0; i--) {
|
|
563 rcmail.command('collapse-folder', ex[i]);
|
|
564 }
|
|
565 rcmail.select_folder(mbox, '', true);
|
|
566 rcmail.env.mailbox = mbox;
|
|
567 }
|
|
568 return false;
|
|
569 }
|
|
570 }
|
|
571 });
|
|
572
|
|
573 rcmail.addEventListener('beforemoveto', function (props) {
|
|
574 if (rcmail.env.search_request == 'advanced_search_active') {
|
|
575 advanced_search_perform_action(props, 'moveto');
|
|
576
|
|
577 return false;
|
|
578 }
|
|
579 });
|
|
580
|
|
581 rcmail.addEventListener('beforedelete', function (props) {
|
|
582 if (rcmail.env.search_request == 'advanced_search_active') {
|
|
583 advanced_search_perform_action(props, 'delete');
|
|
584
|
|
585 return false;
|
|
586 }
|
|
587 });
|
|
588
|
|
589 rcmail.addEventListener('beforemark', function (flag) {
|
|
590 if (rcmail.env.search_request == 'advanced_search_active') {
|
|
591 var res = advanced_search_check_multi_mbox();
|
|
592 //Update on server
|
|
593 var i;
|
|
594 var sel = res.selections;
|
|
595 for (i in sel) {
|
|
596 var uids = sel[i].join(',');
|
|
597 var lock = false;
|
|
598 var post_data = {
|
|
599 _uid: uids,
|
|
600 _flag: flag,
|
|
601 _mbox: i,
|
|
602 _remote: 1
|
|
603 };
|
|
604 rcmail.http_post('mark', post_data, lock);
|
|
605 }
|
|
606 var raw_selection = rcmail.message_list.get_selection();
|
|
607 for(i in raw_selection) {
|
|
608 var key = raw_selection[i];
|
|
609 switch (flag) {
|
|
610 case 'read':
|
|
611 rcmail.message_list.rows[key].unread = 0;
|
|
612 break;
|
|
613 case 'unread':
|
|
614 rcmail.message_list.rows[key].unread = 1;
|
|
615 break;
|
|
616 case 'flagged':
|
|
617 rcmail.message_list.rows[key].flagged = 1;
|
|
618 break;
|
|
619 case 'unflagged':
|
|
620 rcmail.message_list.rows[key].flagged = 0;
|
|
621 break;
|
|
622 }
|
|
623 }
|
|
624 //Refresh ui
|
|
625 var messages = [];
|
|
626 var selections = rcmail.message_list.get_selection();
|
|
627 var j;
|
|
628 for (j in selections) {
|
|
629 messages.push('#rcmrow' + selections[j]);
|
|
630 }
|
|
631 var selector = messages.join(', ');
|
|
632 var selection = $(selector);
|
|
633 switch (flag) {
|
|
634 case 'read':
|
|
635 selection.removeClass('unread');
|
|
636 break;
|
|
637 case 'unread':
|
|
638 selection.addClass('unread');
|
|
639 break;
|
|
640 case 'flagged':
|
|
641 selection.addClass('flagged');
|
|
642 $("td.flag span", selection).removeClass('unflagged').addClass('flagged');
|
|
643 break;
|
|
644 case 'unflagged':
|
|
645 selection.removeClass('flagged');
|
|
646 $("td.flag span", selection).removeClass('flagged').addClass('unflagged');
|
|
647 break;
|
|
648 default:
|
|
649 break;
|
|
650 }
|
|
651 return false;
|
|
652 }
|
|
653 });
|
|
654
|
|
655 rcmail.addEventListener('beforeforward', function (props) {
|
|
656 if (rcmail.env.search_request == 'advanced_search_active' && rcmail.message_list.selection.length > 1) {
|
|
657 var res = advanced_search_check_multi_mbox();
|
|
658 if (res.isMulti == true) {
|
|
659 //Selections from more then one folder
|
|
660 return false;
|
|
661 } else {
|
|
662 //Only one folder, redirecting
|
|
663 var i, url, sel = res.selections;
|
|
664 for (i in sel) {
|
|
665 url = '&_forward_uid=' + sel[i].join(',') + '&_mbox=' + i;
|
|
666 }
|
|
667 url += '&_attachment=1&_action=compose';
|
|
668 window.location = location.pathname + rcmail.env.comm_path + url;
|
|
669
|
|
670 return false;
|
|
671 }
|
|
672 }
|
|
673 });
|
|
674
|
|
675 rcmail.addEventListener('beforeforward-attachment', function (props) {
|
|
676 if (rcmail.env.search_request == 'advanced_search_active' && rcmail.message_list.selection.length > 1) {
|
|
677 var res = advanced_search_check_multi_mbox();
|
|
678 if (res.isMulti == true) {
|
|
679 //Selections from more then one folder
|
|
680 return false;
|
|
681 } else {
|
|
682 //Only one folder, redirecting
|
|
683 var i, url, sel = res.selections;
|
|
684 for (i in sel) {
|
|
685 url = '&_forward_uid=' + sel[i].join(',') + '&_mbox=' + i;
|
|
686 }
|
|
687 url += '&_attachment=1&_action=compose';
|
|
688 window.location = location.pathname + rcmail.env.comm_path + url;
|
|
689
|
|
690 return false;
|
|
691 }
|
|
692 }
|
|
693 });
|
|
694
|
|
695 rcmail.addEventListener('beforetoggle_flag', function (props) {
|
|
696 if (rcmail.env.search_request == 'advanced_search_active') {
|
|
697 var flag = $(props).hasClass('unflagged') ? 'flagged' : 'unflagged';
|
|
698 var tr = $(props).closest('tr');
|
|
699 var id = tr.attr('id').replace('rcmrow', '');
|
|
700 var parts = id.split('__MB__');
|
|
701 var lock = false;
|
|
702 var mbox = rcmail.env.as_md5_folders[parts[1]];
|
|
703 var post_data = {
|
|
704 _uid: parts[0],
|
|
705 _flag: flag,
|
|
706 _mbox: mbox,
|
|
707 _remote: 1
|
|
708 };
|
|
709 rcmail.http_post('mark', post_data, lock);
|
|
710 if (flag == 'flagged') {
|
|
711 tr.addClass('flagged');
|
|
712 $("td.flag span", tr).removeClass('unflagged').addClass('flagged');
|
|
713 rcmail.message_list.rows[id].flagged = 1;
|
|
714 } else {
|
|
715 tr.removeClass('flagged');
|
|
716 $("td.flag span", tr).removeClass('flagged').addClass('unflagged');
|
|
717 rcmail.message_list.rows[id].flagged = 0;
|
|
718 }
|
|
719 return false;
|
|
720 }
|
|
721 });
|
|
722 /* End registering event listeners */
|
|
723 });
|
|
724
|
|
725 });
|
|
726 })(jQuery);
|