source: trunk/prototype/modules/filters/filters.js @ 8100

Revision 8100, 35.8 KB checked in by angelo, 11 years ago (diff)

Ticket #3432 - Inconsistencia na exibicao de mensagens de pasta ao salvar filtro

Line 
1/*
2 * Retorna as regras por remetente e que o usuário deseja ser avisado
3 */
4function getFromAlertRules() {
5        var filters = DataLayer.get("filter");
6        fromRules = [];
7        var alertMessage;
8        var active;
9        for (var index in filters) {
10                alertMessage = filters[index]['alertMessage'];         
11                active = filters[index]['enabled'];
12                for(var criterias in filters[index]['actions']) {
13                        if (filters[index]['actions'][criterias]['type'] == 'fileinto' && alertMessage == 'true' && active == 'true')
14                                fromRules[fromRules.length] = filters[index]['actions'][criterias]['parameter'];
15                }
16        }
17        return fromRules;
18}
19
20/*
21 * Verifica se a regra Fora de escritório está ativa
22 */
23function outOfficeVerify(force) {
24        if(force)
25        DataLayer.remove('filter', false);
26
27        var filters = DataLayer.get("filter");
28        var outoffice_active = false;
29        outoffice = false;
30        for(var index in filters){
31                if(filters[index].id == "vacation")
32                        outoffice = true;
33                if(filters[index].id == "vacation" && filters[index].enabled.toString() == "true"){
34                        write_msg(get_lang("Attention, you are in out of office mode."), true);
35                        outoffice_active = true;
36                        break;
37                }
38        }
39        if(!outoffice_active && old_msg == get_lang("Attention, you are in out of office mode."))
40                clean_msg();
41}
42
43/*
44 * Valida os campos do formulário da tela de filtros para salvar.
45 */
46valid_save = function(){
47        var accord = list_container.find(".rule-details-container").accordion({autoHeight: false});
48        if(list_container.find('[name="name"]').attr("disabled") != "disabled")
49        {
50                if($.trim(list_container.find('[name="name"]').val()) == ""){
51                        $.Zebra_Dialog(get_lang("No name filled"),{
52                'overlay_opacity': '0.5',
53                'custom_class': 'custom-zebra-filter',
54                                'onClose':  function(caption) {
55                                        list_container.find('[name="name"]').focus();
56                                }
57                        });
58                        accord.accordion('activate',0);
59                        return false;
60                }else if($.trim(list_container.find('[name="name"]').val()) == "vacation"){
61                        $.Zebra_Dialog(get_lang("Invalid name, 'vacation' is a reserved word"),{
62                'overlay_opacity': '0.5',
63                'custom_class': 'custom-zebra-filter',
64                                'onClose':  function(caption) {
65                                        list_container.find('[name="name"]').val("").focus();
66                                }
67                        });
68                        accord.accordion('activate',0);
69                        return false;
70                }else{
71                        filter_list = DataLayer.get("filter", true);
72                        var error = false;
73                        $.each(filter_list, function(index, value){
74                                if(filter_list[index].name == list_container.find('[name="name"]').val()){
75                                        $.Zebra_Dialog(get_lang("There is already a filter with this name"),{
76                        'overlay_opacity': '0.5',
77                        'custom_class': 'custom-zebra-filter',
78                                                'onClose':  function(caption) {
79                                                        list_container.find('[name="name"]').val("").focus();
80                                                }
81                                        });
82                                        accord.accordion('activate',0);
83                                        error = true;
84                                        return;
85                                }
86                        });
87                        if(error){
88                                return false;
89                        }
90                }
91        }
92        var criteria = "";
93        var criteria_list = list_container.find('[name="criteriaValue[]"]');
94        var er_num = /^[0-9]+$/;
95
96        if($(".sizeRule").val() != "" && er_num.test($(".sizeRule").val()) == false) {
97                $.Zebra_Dialog(get_lang("Size rule must be a number"),{
98            'overlay_opacity': '0.5',
99            'custom_class': 'custom-zebra-filter',
100                        'onClose':  function(caption) {
101                                list_container.find('[name="actionType[]"]:checked').parent().find("input:text, textarea").focus();
102                        }
103                });
104                accord.accordion('activate',0);
105                return false;
106        }
107        $.each(criteria_list, function(index, value){
108                if(($(criteria_list[index]).val() != "" && index != 5) || ($(criteria_list[index]).is(':checked'))){
109                        criteria += $.trim($(criteria_list[index]).val());
110                }
111        });
112        if(criteria == ""){
113                $.Zebra_Dialog(get_lang("No criteria filled"),{
114            'overlay_opacity': '0.5',
115            'custom_class': 'custom-zebra-filter',
116                        'onClose':  function(caption) {
117                                list_container.find('[name="criteriaValue[]"]:first').focus();
118                        }
119                });
120                accord.accordion('activate',0);
121                return false;
122        }
123        if(list_container.find('[name="actionType[]"]:checked').parent().find("input:text, textarea").length){
124                if($.trim(list_container.find('[name="actionType[]"]:checked').parent().find("input:text, textarea").val()) == ""){
125                        $.Zebra_Dialog(get_lang("Fill the action value"),{
126                'overlay_opacity': '0.5',
127                'custom_class': 'custom-zebra-filter',
128                                'onClose':  function(caption) {
129                                        list_container.find('[name="actionType[]"]:checked').parent().find("input:text, textarea").focus();
130                                }
131                        });
132                        return false;
133                }
134                var er_mail = RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
135                if(er_mail.test($.trim(list_container.find('[value="redirect"]:checked').parent().find("input:text").val())) == false && list_container.find('[name="actionType[]"]:checked').val() == 'redirect'){
136                        $.Zebra_Dialog(get_lang("Invalid mail"),{
137                'overlay_opacity': '0.5',
138                'custom_class': 'custom-zebra-filter',
139                                'onClose':  function(caption) {
140                                        list_container.find('[name="actionType[]"]:checked').parent().find("input:text, textarea").focus();
141                                }
142                        });
143                        return false;
144                }
145        }
146        /*Validação ao salvar filtro com alerta*/
147        var criteria_operator_list = list_container.find('[name="criteriaOperator[]"]');
148        if(list_container.find('.alertMessage').is(':checked')){
149                if($(criteria_list[0]).val() != "" && $('.select-folderlist').find('[type="radio"]').is(':checked') && $(criteria_operator_list[0]).find('option:selected').val() != "!*"){
150                        var hasValue = false;
151                        $.each(criteria_list, function(index, value){
152                                if(($(criteria_list[index]).val() != "" && index != 0 && index != 5) || ($(criteria_list[index]).is(':checked'))){
153                                        if($('.fields-isexact').find(':checked').val() == 'or'){
154                                                hasValue = true;
155                                        }
156                                }
157                        });
158                        if(hasValue){
159                                $.Zebra_Dialog('<strong>'+get_lang('Filter with alert')+'</strong><br>'+get_lang('If more than one criterion for the filter, the "Meeting all the criteria" must be selected'),{
160                    'overlay_opacity': '0.5',
161                    'custom_class': 'custom-zebra-filter'
162                });
163                                return false;
164                        }
165                }else{
166                        $.Zebra_Dialog('<strong>'+get_lang('Filter with alert')+'</strong><br>'+get_lang('The filter should be set as a criteria "Sender" and action "Archive folder"'),{
167                'overlay_opacity': '0.5',
168                'custom_class': 'custom-zebra-filter'
169            });
170                        return false;
171                }
172        }
173        return true;
174};
175
176function urlencode (str) {
177    str = (str + '').toString();
178    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
179    replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
180}
181
182bytes2Size = function(bytes) {
183        var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
184        if (bytes === 0) return 'n/a';
185        var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
186        var size = (i<2) ? Math.round((bytes / Math.pow(1024, i))) : Math.round((bytes / Math.pow(1024, i)) * 100)/100;
187        return  size + ' ' + sizes[i];
188};
189
190flags2Class = function(cellvalue) {
191        var flags_enum = cellvalue.split(',');
192        var classes = '';
193        for (var i=0; i<flags_enum.length; i++){
194                classes += '<span class="icon-'+flags_enum[i].toLowerCase()+'"> </span>';
195        }
196        return classes;
197};
198
199date2Time = function (timestamp) {
200    var date = new Date();
201    if( typeof timestamp === "string" )
202        timestamp = parseInt( timestamp, 10 );
203    if ((date.getTime() - timestamp) < (24*60*60*1000)) {
204        return '<span class="timable" title="'+timestamp+'"> </span>';
205    } else {
206        date = new Date(timestamp);
207        var b = date.toISOString().split("T")[0].split("-");
208        var c = b[2] + "/" + b[1] + "/" + b[0];
209        return '<span class="datable">' + c + '</span>';
210    }
211};
212
213keys = function( object ){
214
215  var array = [];
216
217  for( var key in object )
218       array[ array.length ] = key;
219
220  return( array );
221
222}
223
224/*
225 * Preenche o formulário de filtros com as informações originais para edição
226 */
227showDetails = function( filter ){
228    form.get(0).reset();
229
230    nameObj.val( filter.name );
231        nameObj.attr("disabled", "disabled");
232    for( var i = 0; i < filter.criteria.length; i++ ){
233                if(filter.criteria[i].field == 'hasAttachment') {
234                        $(".hasAttachment").attr("checked", "True");
235                        continue;
236                }
237                criterias.filter( '[value="' + filter.criteria[i].field + '"]' )
238                .siblings( '[name="criteriaOperator[]"]' ).val( filter.criteria[i].operator ).end()
239                .siblings( '[name="criteriaValue[]"]' ).val( filter.criteria[i].value );
240    }
241    var first_fileinto_action = true;
242    for( var i = 0; i < filter.actions.length; i++ ){
243                if(filter.actions[i].type == "redirect")
244                        actions.siblings('[name="addressRedirect"]').val(filter.actions[i].parameter);
245                if(filter.actions[i].type == "reject")
246        {
247            actions.siblings('[name="messageReject"]').val(filter.actions[i].parameter);
248            $('.ui-widget-content .fileintoInbox ').attr('checked', false).parent().addClass(' hidden');
249        }
250                if((filter.actions[i].type == "fileinto" && first_fileinto_action) || filter.actions[i].type == "setflag"){
251                        actions.parent().find('[value="'+filter.actions[i].parameter+'"]').attr("selected", "selected");
252//                      if(filter.actions[i].type == "fileinto")
253//                              first_fileinto_action =false;
254                }
255                /*A condição abaixo é executada quando uma segunda action do tipo "fileinto" for encontrada*/
256                if(filter.actions[i].type == "fileinto" && !first_fileinto_action){
257                        $('.fileintoInbox').attr('checked', 'True');
258                }else{
259            first_fileinto_action =false;
260            actions.filter( '[value="' + filter.actions[i].type + '"]' ).attr("checked", "True");
261            actions.filter( '[value="' + filter.actions[i].type + '"]' ).val( filter.actions[i].type )
262            .siblings( '[name="actionParameter[]"]' ).val( filter.actions[i].parameter );
263        }
264    }   
265        isExact.filter('[value="'+(filter.isExact != "false"? "and" : "or")+'"]').attr("checked", "True");
266
267        if (filter.alertMessage == 'true') $('.alertMessage').attr('checked', 'True');
268        if (filter.verifyNextRule == 'true') $('.verifyNextRule').attr('checked', 'True');
269}
270
271
272DataLayer.codec( "filter", "detail", {
273
274  decoder: function( form ){
275          if( form.vacation )
276          return {
277                criteria: [{ value: "vacation", operator: "", field: "vacation" }],
278                actions: [{ parameter: form.vacation, type: "vacation" }],
279                id: "vacation",
280                name: "vacation",
281                isExact: false,
282                applyMessages : "",
283                enabled : true
284      }
285
286        var apply_messages_ = keys(selectedMessages);
287
288        action = '';
289
290    return {
291                name: form.name ? form.name.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') : nameObj.val().replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'),
292                isExact: ( form.isExact === "and" ),
293                criteria: $.map( form.criteriaOperator || [], function( criteriaOperator, i ){
294                        return (!form.criteriaValue[i]) ? null:
295                        {
296                                        value:  form.criteriaValue[i].replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'),
297                                        operator: criteriaOperator,
298                                        field:  form.criteriaType[i].replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
299                        };
300                }),
301                actions: $.map( form.actionType || [], function( type, i ){
302                        var the_parameter = form.actionParameter[i];
303
304                        !the_parameter ? the_parameter = form.actionParameter[i+1] : "";
305
306                        if (type == 'alertMessage') {
307                                //if(!$('[value="alertMessage"]').parent().hasClass("hidden")){
308                                        type = 'addflag';
309                                        the_parameter = '$FilteredMessage';
310                                //}else{
311                                //      return;
312                                //}
313                        }
314                        if (type == 'fileinto') {
315                                the_parameter = form.valueFileInto;
316                        }
317                        if (type == 'reject') {
318                                the_parameter = form.messageReject;
319                        }
320                        if (type == 'fileintoInbox') {
321                                if(!$('[value="fileintoInbox"]').parent().hasClass("hidden")){
322                                        type = 'fileinto';
323                                        the_parameter = 'INBOX';
324                                }else{
325                                        return;
326                                }
327                        }
328                        if (type == 'fileintoTrash') {
329                                type = 'fileinto';
330                                the_parameter = 'INBOX' + cyrus_delimiter + 'Trash';
331                        }
332                        if (type == 'redirect') {
333                                the_parameter = form.addressRedirect;
334                        }
335                        if (type == 'setflag') {
336                                the_parameter = form.valueSetFlag;
337                                action = form.valueSetFlag;
338                        }
339                        return (!type) ? null:
340                              {parameter: the_parameter, type: type };
341
342                }),
343                enabled : true,
344                alertMessage: $('.alertMessage').is(':checked'),
345                verifyNextRule: $('.verifyNextRule').is(':checked'),
346                //applyMessages: allMessages? !$.isEmptyObject( selectedMessages ) ?
347                //keys( selectedMessages ) : allMessages : ""
348                applyMessages: apply_messages_
349    };
350  },
351
352  encoder: function( filters ){
353        var rules = [];
354
355        for( var id in filters )
356              rules[ rules.length ] = filters[id];
357
358        return { rules: rules };
359
360  }
361
362});
363
364/* Codec do datalayer */
365DataLayer.codec( "folder", "select", {
366
367  decoder:function(){
368
369  },
370  encoder:function( data ){
371
372      var tree1 = [], tree2 = [], tree3 = [];
373
374      for (var i=0; i<data.length; i++) {
375
376              if (/^INBOX/.test(data[i].id)) {
377                      if (!unorphanize(tree1, data[i])) {
378                              data[i].children = [];
379                              tree1.push(data[i]);
380                      }
381              }
382              else if (/^user/.test(data[i].id)) {
383                      if (!unorphanize(tree2, data[i])) {
384                              data[i].children = [];
385                              tree2.push(data[i]);
386                      }
387              }
388              else if (/^local_messages/.test(data[i].id)) {
389                      if (!unorphanize(tree3, data[i])) {
390                              data[i].children = [];
391                              tree3.push(data[i]);
392                      }
393              }
394
395      }
396
397      return {folders: [ tree1, tree2, tree3 ]};
398
399  }
400
401});
402
403
404fromRules = getFromAlertRules();
405
406var BASE_PATH = '../prototype/';
407
408DataLayer.basePath = BASE_PATH + "REST.php?q=";
409DataLayer.dispatchPath = BASE_PATH;
410
411var selectedMessages = {};
412var allMessages = false;
413
414/*
415 * Bloqueia usuário por email - utilizado na tela de mensagens do ExpressoMail
416 */
417function block_user_email(email) {
418        delete selectedMessages;
419        var idd = urlencode(email);
420        /** TODO - Mudar quando API abstrair atualizações no cache */
421        DataLayer.remove('filter', false);
422        var filters = DataLayer.get('filter');
423        for(var index in filters){
424                if(filters[index].name == email) {
425                        if(confirm(get_lang("This user is already blocked. Would you like to unlock it?"))) {
426                                DataLayer.remove( 'filter', filters[index].id );
427                                DataLayer.commit("filter", false, function(){
428                                        $.Zebra_Dialog(get_lang("Lock User") + " " + email + " " + get_lang("removed"),{
429                        'overlay_opacity': '0.5',
430                        'custom_class': 'custom-zebra-filter'
431                    });
432                                        list_filters();
433                                        getFromAlertRules();
434                                });
435                                return true;
436                        }else
437                                return true;
438                }
439        }
440        if(confirm(get_lang("Want to block the user") + " " + email + "?")){
441        var has_folder_spam = false;
442        var folder_spam = "INBOX"+cyrus_delimiter+"Spam";
443        $.each(cp_tree1, function(index, value){
444            if(value.id == folder_spam){
445                has_folder_spam = true;
446                return;
447            }
448        });
449        if(!has_folder_spam){
450            connector.loadScript('TreeS');
451            create_new_folder("Spam","INBOX");
452        }
453                DataLayer.put( 'filter', idd,
454                                        { name: email, isExact: false,
455                                                criteria:{ 0: {value: email, operator: "=", field: "from"} },
456                                                actions: { 0: {parameter: folder_spam, type: "fileinto"}},
457                                                enabled: true,
458                                                id: email,
459                                                block: true
460                                        });
461                DataLayer.commit("filter", false, function(){
462                        $.Zebra_Dialog(get_lang("User") + " " + email + " " + get_lang("blocked"),{
463                'overlay_opacity': '0.5',
464                'custom_class': 'custom-zebra-filter'
465            });
466                        list_filters();
467                        getFromAlertRules();
468                });
469
470        }
471}
472
473
474DataLayer.codec( 'message', 'jqGrid', {
475
476      encoder: function( data ){
477
478          return( data );
479
480      }
481});
482
483DataLayer.codec( 'message', 'jqGridSearch', {
484
485      encoder: function( data ){
486
487          return( data );
488
489      }
490});
491
492/* Gerencia o grid das mensagens da caixa de entrada
493 * Mostra o grid de mensagens para aplicar a regra nas mensagens da caixa de entrada.
494 */
495function showGridMessages(thiss) {
496        var criteria_list = list_container.find('[name="criteriaValue[]"]');
497        var criteria_operator_list = list_container.find('[name="criteriaOperator[]"]');
498        var criteria_value = "";
499        var criteria = "";
500        $.each(criteria_list, function(index, value){
501                criteria += $.trim($(criteria_list[index]).val()) + ",";
502        });
503        var criteria_ = criteria.split(",");
504        var criteria_operator  = "";
505        $.each(criteria_operator_list, function(index, value){
506                criteria_operator += $.trim($(criteria_list[index]).val()) != "" ? index + "," : ",";
507                criteria_value    += $.trim($(criteria_operator_list[index]).val()) + ",";
508        });
509        var criteria_operator_  = criteria_operator.split(",");
510        var criteria_value_     = criteria_value.split(",");
511        var options = ["from", "to", "subject", "body", "size"];
512        var criterias_ = new Array();
513
514    var isExact = (list_container.find('[name="isExact"]:checked').val() == 'and') ? 'yes' : 'no';
515
516        for (i in criteria_)
517                if(criteria_[i] != "")
518                    criterias_.push( criterias_.length ?  {"0": "OR", "1": options[i], "2": criteria_value_[i], "3": criteria_[i]} : {"0": options[i], "1": criteria_value_[i], "2": criteria_[i]} );
519
520        showGridButton = thiss.parent();
521
522        showGridButton.siblings("#filtergrid-container").block({
523                                                        message: '<div id="loading-content"><div class="image"></div></div>',
524                                                        css: {
525                                                                backgroundImage: 'url('+BASE_PATH+'modules/attach_message/images/loading.gif)',
526                                                                backgroundRepeat: 'no-repeat',
527                                                                backgroundPosition: 'center',
528                                                                backgroundColor: 'transparent',
529                                                                width: '32px',
530                                                                height: '32px',
531                                                                border:'none'
532                                                        },
533                                                        overlayCSS: {
534                                                                backgroundColor: '#CCC',
535                                                                opacity:         0.5
536                                                        }
537                                                });
538
539        var data = DataLayer.get( 'message', { filter: criterias_, criteria: { isExact: isExact , properties: { context: { folder: 'INBOX' } } } }, true );
540        if(DataLayer.criterias['message:jqGrid']){
541                delete DataLayer.criterias['message:jqGrid'];   
542        }
543
544        DataLayer.register( 'criterias', 'message:jqGrid', function( crit ){
545
546                    crit.properties = { context: { folder: 'INBOX' } };
547
548                    return { filter: [ "msgNumber", "IN", data ], criteria: crit };
549        });
550
551        allMessages = data;
552
553        if (typeof grid !== "undefined") {
554                grid.jqGrid( 'setGridParam', { url: 'message:jqGrid', postData: data } ).trigger( 'reloadGrid' );
555                //return;
556        }
557        grid = showGridButton.siblings("#filtergrid-container").removeClass('empty-container')
558        .html('<table class="hidden fields-search-messages-grid" id="fields-search-messages-grid"><tr><td/></tr></table><div class="hidden fields-search-messages-grid-pager" id="fields-search-messages-grid-pager"></div>')
559        .children(".fields-search-messages-grid, .fields-search-messages-grid-pager").removeClass('hidden').filter(".fields-search-messages-grid").trigger( 'reloadGrid' ).jqGrid({
560                url: 'message:jqGrid',
561                datatype: "json",
562                mtype: 'GET',
563                colNames:['#', 'De', 'Assunto', 'Data', 'Tamanho'],
564                colModel:[
565                        {name:'msg_number',index:'msg_number', width:45, hidden:true, sortable:false},
566                        {name:'from.email',index:'msg_number', width:130, sortable:false},
567                        {name:'subject',index:'subject', width:250, sortable:false},
568                        {name:'timestamp',index:'timestamp', width:65, align:"center", sortable:false, formatter:date2Time},
569                        {name:'size',index:'size', width:50, align:"right", sortable:false, formatter:bytes2Size}
570                ],
571                jsonReader : {
572                        root:"rows",
573                        page: "page",
574                        total: "total",
575                        records: "records",
576                        repeatitems: false,
577                        id: "0"
578                },
579                rowNum:10,
580                //rowList:[10,25,50],
581                rowList:[10],
582                pager: '#fields-search-messages-grid-pager',
583                sortname: 'id',
584                viewrecords: true,
585                sortorder: "desc",
586                multiselect: true,
587                autowidth: true,
588                reloadAfterEdit: true,
589                reloadAfterSubmit: true,
590                height:200,
591                loadComplete: function(data) {
592                        // aplica o contador
593                        jQuery('.timable').each(function (i) {
594                                jQuery(this).countdown({
595                                        since: new Date(parseInt(this.title)),
596                                        significant: 1,
597                                        layout: 'h&aacute; {d<}{dn} {dl} {d>}{h<}{hn} {hl} {h>}{m<}{mn} {ml} {m>}{s<}{sn} {sl}{s>}',
598                                        description: ' atr&aacute;s'
599                                });
600                        });
601                },
602                onSelectRow: function (id, selected) {
603                        if( selected )
604                        {
605                                selectedMessages[ id ] = true;
606                        }
607                        else
608                        {
609                                delete selectedMessages[ id ];
610                        }
611                },
612                onSelectAll: function (id, selected) {
613                        for (i in id) {
614                                if(selected)
615                                        selectedMessages[id[i]] = true;
616                                else
617                                        delete selectedMessages[id[i]];
618                        }
619                },
620                caption: 'Mensagens que atendem aos crit&eacute;rios'
621        }); // end jqGrid
622}
623
624/* Gerencia a listagem de filtros do usuário */
625/*
626 * Lista os filtros para o usuário
627 */
628function list_filters(html) {
629        outOfficeVerify();
630        for (var index in selectedMessages)
631        {
632                delete selectedMessages[index];
633        }
634 
635        initialize_container(html); // Inicializa o container do diálogo de filtros
636 
637        list_container = create_filter_dialog(); // Cria a estrutura básica do diálogo
638       
639        var list = DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', DataLayer.get("filter:detail", true));
640        list_container.html(list).find(".button").button();
641    list_container.find(".alldelete").button("disable");
642    list_container.find(".alldisable").button("disable");
643    list_container.find(".allenable").button("disable");
644   
645        list_container.find(".rule-list").selectable({
646                selecting: function(event, ui) {
647                        $(ui.selecting).find(':checkbox').attr('checked', true);
648                },
649                unselecting: function(event, ui) {
650                        $(ui.unselecting).find(':checkbox').attr('checked', false);
651                }
652        });
653
654    list_container.find(".rule-list li").click(function(){
655        if(list_container.find(".select").children("input:checked").length){
656            list_container.find(".alldelete").button("enable");
657            list_container.find(".alldisable").button("enable");
658            list_container.find(".allenable").button("enable");
659        } else {
660            list_container.find(".alldelete").button("disable");
661            list_container.find(".alldisable").button("disable");
662            list_container.find(".allenable").button("disable");
663        }
664    });
665
666        list_container.find( ".menu-control .button" ).filter(".update").button({
667                icons: {
668                        primary: "ui-icon-pencil"
669                },
670                text: false
671        }).click(function(){
672                var id = $(this).parents("li.rule").find('.id').val();
673                var filters = DataLayer.get( 'filter', true);
674                for(var i =0; i < filters.length; i++){
675                        if(filters[i].id == id){
676                                filters = filters[i];
677                                break;
678                        }
679                }
680                DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {folders : DataLayer.get("folder", true), delimiter: cyrus_delimiter},function(html){
681                        var details_container = $(".expresso-window-filters").html(html);
682                        if(filters.name != "vacation"){
683                                form = container.find("form");
684                                criterias = details_container.find( 'fieldset input[name="criteriaType[]"]' );
685                                actions = details_container.find( 'fieldset input[name="actionType[]"]' );
686                                nameObj = details_container.find( 'input[name="name"]' );
687                                isExact = details_container.find( 'input[name="isExact"]' );
688                                showDetails(filters);
689                                var accord = list_container.find(".rule-details-container").accordion({autoHeight: false});
690                                list_container.find(".button").button().filter(".forth").click(function(){
691                                        accord.accordion('activate',1);
692                                }).end().filter(".forth2").click(function(){
693                                        accord.accordion('activate',2);
694                                }).end().filter(".back").click(function(){
695                                        accord.accordion('activate',0);
696                                }).end().filter(".back2").click(function(){
697                                        accord.accordion('activate',1);
698                                }).end().filter(".cancel").click(function(){
699                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
700                                }).end().filter(".submit").click(function(){
701                                        if(nameObj)
702                                                nameObj.attr("disabled", "false");
703                                        if(valid_save())
704                                                $(this).submit();
705                                        else
706                                                return;
707                                        DataLayer.commit( 'filter', false,function(data){
708                                                if(filters['alertMessage'] == "true"){
709                                                        if(filters['alertMessage'] != $('.alertMessage').is(':checked').toString()){
710                                                                /**RETIRA FLAG*/
711                                                                removeMessagesFlag(filters['id']);
712                                                        }
713                                                }
714                                                if($('#gbox_fields-search-messages-grid').length > 0 && action != '') {
715                                                        for (var index in selectedMessages) {
716                                                                set_message_flag(index, action, false);
717                                                        }
718                                                }
719                                                DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
720                                                getFromAlertRules();
721                                                if (get_current_folder() == "INBOX")
722                                                        cExecute ("$this.imap_functions.get_range_msgs2&folder=INBOX&msg_range_begin=1&msg_range_end="+preferences.max_email_per_page+"&sort_box_type=SORTARRIVAL&search_box_type=ALL&sort_box_reverse=1", handler_draw_box);
723                                        });
724
725                                }).end().filter('.button.search').click(function() {
726                                        /* Valida se o usuário preencheu as informações */
727                                        if(valid_save())
728                                                showGridMessages($(this));
729                                        else
730                                                return;
731                                })
732                        }else{
733                                list_container.find(".vacation-details-container").removeClass("hidden");
734                                list_container.find(".rule-details-container").addClass("hidden");
735                                list_container.find(".button").button().filter(".back").click(function(){
736                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
737                                }).end().filter(".submit").click(function(){
738                                        if(list_container.find(".vacation-details-container .filter-textarea").val().length <= 0){
739                                                $.Zebra_Dialog(get_lang('Write a message'),{
740                            'overlay_opacity': '0.5',
741                            'custom_class': 'custom-zebra-filter'
742                        });
743                                                list_container.find(".vacation-details-container .filter-textarea").focus();
744                                        }else{
745                                                $(this).submit();
746                                                DataLayer.commit( 'filter',false,function(){
747                                                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
748                                                        getFromAlertRules();
749                                                });
750                                        }
751                                });
752                                details_container.find('[name="vacation"]').val(filters.actions[0].parameter);
753                        }
754                });
755        }).end()
756        .filter(".enable").button({
757                icons: {
758                        primary: "ui-icon-circle-close"
759                },
760                text: false
761        }).click(function(){
762                var id = $(this).parents("li.rule").find('.id').val();
763                DataLayer.put( 'filter', id, { enabled: false  });
764                /**RETIRA FLAG*/
765                removeMessagesFlag(id);
766                DataLayer.commit("filter", false,function(){
767                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
768                        getFromAlertRules();
769                });
770        }).end()
771
772        .filter(".disable").button({
773                icons: {
774                        primary: "ui-icon-circle-check"
775                },
776                text: false
777        }).click(function(){
778                var id = $(this).parents("li.rule").find('.id').val();
779                DataLayer.put( 'filter', id, { enabled: true });
780                DataLayer.commit("filter", false,function(){
781                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
782                        getFromAlertRules();
783                });
784        }).end()
785
786        .filter(".close").button({
787                icons: {
788                        primary: "ui-icon-close"
789                },
790                text: false
791        }).click(function(event){
792                var filter_name = $(event.target).parents("li.rule").find('.id').val();
793                var filter_screen_name = $(event.target).parents("li.rule").find('.title').html();
794                $.Zebra_Dialog(get_lang("Are you sure to delete the filter") + ": <strong>"+filter_screen_name+"</strong>",{
795                        'type':     'question',
796                        'title':    get_lang("Exclusion Confirmation"),
797                        'buttons':  [get_lang('Yes'), get_lang('No')],
798            'overlay_opacity': '0.5',
799            'custom_class': 'custom-zebra-filter',
800                        'onClose':  function(caption) {
801                                if(caption == get_lang('Yes')){
802                                /** TODO - Mudar quando API abstrair atualizações no cache */
803                                        DataLayer.remove('filter', false);
804                                        DataLayer.get('filter');
805                                        /**RETIRA FLAG*/
806                                        removeMessagesFlag(filter_name);
807                                        DataLayer.remove( 'filter', filter_name);
808
809                                        DataLayer.commit("filter", false,function(){
810                                                DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
811                                                getFromAlertRules();
812                                        });
813                                }else{
814                                        $(event.target).removeClass("ui-selected").parent().removeClass("ui-selected");
815                                }
816                        }
817                });
818        }).end().removeClass("ui-button-icon-only");
819
820        $(".button.allenable").click(function(){
821        container.find('.rule-list').find('.rule').find('.select').find(':checked').parents('.rule').find('input.id').each(function(i,o){
822                        DataLayer.put( 'filter', o.value, { enabled: true  });
823                });
824                DataLayer.commit("filter", false, function(){
825                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
826                        getFromAlertRules();
827                });
828        });
829
830        $(".button.alldisable").click(function(){
831        container.find('.rule-list').find('.rule').find('.select').find(':checked').parents('.rule').find('input.id').each(function(i,o){
832                        DataLayer.put( 'filter', o.value, { enabled: false  });
833                        /**RETIRA FLAG*/
834                        removeMessagesFlag(urlencode(o.innerHTML));
835                });
836                DataLayer.commit("filter", false, function(){
837                        DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
838                        getFromAlertRules();
839                });
840        });
841
842        $(".button.alldelete").click(function(){
843                $.Zebra_Dialog(get_lang("Are you sure to delete the filters?"),{
844                        'type':     'question',
845                        'title':    get_lang("Exclusion Confirmation"),
846                        'buttons':  [get_lang('Yes'), get_lang('No')],
847            'overlay_opacity': '0.5',
848            'custom_class': 'custom-zebra-filter',
849                        'onClose':  function(caption) {
850                                if(caption == get_lang('Yes')){
851                                /** TODO - Mudar quando API abstrair atualizações no cache */
852                                        DataLayer.remove('filter', false);
853                                        DataLayer.get('filter');
854                                        container.find('.rule-list').find('.rule').find('.select').find(':checked').parents('.rule').find('input.id').each(function(i,o){
855                                                /**RETIRA FLAG*/
856                                                removeMessagesFlag(urlencode(o.innerHTML));
857                                                //filter_name = urlencode(o.innerHTML.replace(".", "_"));
858                                                filter_name = o.value;
859                                                DataLayer.remove( 'filter', filter_name );
860                                        });
861                                        DataLayer.commit("filter", false, function(){
862                                                DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
863                                                getFromAlertRules();
864                                        });
865                                }else{
866                                        return true;
867                                }
868                        }
869                });
870        });
871
872        var aa = 0;
873
874        list_container.parent().find(".button.add:first").click(function(){
875                render_new_rule(); // Renderiza a tela de criação de nova regra de filtragem.
876        });
877        list_container.parent().find(".button.add.vacation").click(function(){
878
879                list_container.parent().find(".dialog-head-buttonpane").addClass("hidden");
880                DataLayer.render( BASE_PATH + 'modules/filters/edit-filter.ejs', {folders : DataLayer.get("folder", true), delimiter: cyrus_delimiter},function(html){
881                        list_container.html(html);
882                        list_container.find(".vacation-details-container").removeClass("hidden");
883                        list_container.find(".rule-details-container").addClass("hidden");
884                        list_container.find(".button").button().filter(".back").click(function(){
885                                DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
886                        }).end().filter(".submit").click(function(){
887                                if(list_container.find(".vacation-details-container .filter-textarea").val().length <= 0){
888                                                $.Zebra_Dialog(get_lang('Write a message'),{
889                            'overlay_opacity': '0.5',
890                            'custom_class': 'custom-zebra-filter'
891                        });
892                                                list_container.find(".vacation-details-container .filter-textarea").focus();
893                                }else{
894                                        $(this).submit();
895                                        DataLayer.commit( 'filter',false,function(){
896                                                DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {},list_filters);
897                                                getFromAlertRules();
898                                        });
899                                }
900                        });
901                });
902        });
903}
904
905/*
906        Inicializa o container do diálogo de gerenciamento de filtros.
907*/
908function initialize_container (html) {
909        if(html)
910        {
911                if(!$(".filters-windows").length) 
912                {
913                        container = $('.expressomail-module-container').append("<div class='filters-windows'></div>").find(".filters-windows").html(html).find(".expresso-window-container");
914                }
915        }
916}
917 
918/*
919        Cria a estrutura básica do diálogo de gerenciamento de filtros.
920*/
921function create_filter_dialog () {
922        var dialog = $(".expresso-window-filters").dialog(
923        {
924                title: get_lang('Filters'),
925                width: 700,
926                modal: true,
927                resizable: false,
928                closeOnEscape: true,
929                close: function(event, ui)
930                {
931                        event.stopPropagation();
932                        if(list_container.find(".cancel").length) list_container.find(".cancel").trigger('click');
933                        $(".dialog-head-buttonpane").hide();
934                },
935                open: function()
936                {
937                        $(".ui-dialog .ui-dialog-titlebar").append('<a href="#" class="ui-dialog-titlebar-minimize ui-corner-all" role="button"><span class="ui-icon ui-icon-minusthick">minimize</span></a>').find('.ui-dialog-titlebar-minimize').click(function()
938                        {
939                                $(".ui-dialog-buttonpane, .ui-dialog-content").toggle();
940                                $(".ui-icon-minusthick, .ui-icon-newwin").toggleClass('ui-icon-minusthick').toggleClass('ui-icon-newwin');
941                        });
942                        $(".dialog-head-buttonpane").show();
943                },
944                autoOpen: false,
945                buttons: [
946                {
947                        text: get_lang("Close"),
948                        click: function()
949                        {
950                                $(this).dialog("close");
951                        }
952                }]
953        });
954 
955        $(".ui-dialog-titlebar").after("<div class='dialog-head-buttonpane ui-dialog-buttonpane ui-widget-content ui-helper-clearfix' style='background-color: rgb(224, 238, 238); '><div class='ui-dialog-buttonset header-buttonpane'></div></div>");
956        $(".dialog-head-buttonpane").css("padding", "5px").
957        find(".header-buttonpane").html("<a href='#' class='button add' title='" + get_lang("Add new rule") + "'>" + get_lang("New rule") + "</a>" + (!outoffice ? "<a href='#' class='button add vacation' title='" + get_lang("Add rule out of office") + "'>" + get_lang("Out of office") + "</a>" : "")).find(".button").button();
958        $(".ui-dialog-buttonpane.ui-widget-content").css("background-color", "#E0EEEE");
959 
960        return dialog;
961}
962 
963/*
964        Renderiza a tela de adição de uma nova regra de filtragem, 
965        dentro do diálogo de gerenciamento de filtros.
966*/
967function render_new_rule (from, subject) {
968        list_container.parent().find(".dialog-head-buttonpane").addClass("hidden");
969        var data = {
970                folders: DataLayer.get("folder", true),
971                delimiter: cyrus_delimiter,
972                from: from,
973                subject: subject ? html_entities(subject) : subject
974        }
975 
976        DataLayer.render(BASE_PATH + 'modules/filters/edit-filter.ejs', data, function(html)
977        {
978                list_container.html(html);
979                var accord = list_container.find(".rule-details-container").accordion(
980                {
981                        autoHeight: false
982                });
983                list_container.find(".button").button().filter(".forth").click(function()
984                {
985                        accord.accordion('activate', 1);
986                }).end().filter(".forth2").click(function()
987                {
988                        accord.accordion('activate', 2);
989                }).end().filter(".back").click(function()
990                {
991                        accord.accordion('activate', 0);
992                }).end().filter(".back2").click(function()
993                {
994                        accord.accordion('activate', 1);
995                }).end().filter(".cancel").click(function()
996                {
997                        DataLayer.render(BASE_PATH + 'modules/filters/init.ejs', {}, list_filters);
998                }).end().filter(".submit").click(function()
999                {
1000                        if(valid_save()) $(this).submit();
1001                        else return;
1002                        DataLayer.commit('filter', false, function()
1003                        {
1004                                if($('#gbox_fields-search-messages-grid').length > 0 && action != '')
1005                                {
1006                                        for(var index in selectedMessages)
1007                                        {
1008                                                set_message_flag(index, action, false);
1009                                        }
1010                                }
1011                                DataLayer.render(BASE_PATH + 'modules/filters/init.ejs', {}, list_filters);
1012                                getFromAlertRules();
1013                        });
1014                }).end().filter('.button.search').click(function()
1015                {
1016                        if(valid_save()) showGridMessages($(this));
1017                        else return;
1018                }); // end function click
1019        }); // end DataLayer.render
1020}
1021
1022/* Inicializa os filtros e chama o list_filters
1023 * Inicia a funcionalidade de filtros de mensagens
1024 */
1025function  init_filters(){
1026        var html = DataLayer.render( BASE_PATH + 'modules/filters/init.ejs', {});
1027        list_filters(html);
1028}
1029
1030/*
1031 * Ao excluir filtro, desabilitar filtro ou retirar a ação Alerta de um filtro
1032 * esta função é chamada para retirar as flags que caracterizam uma mensagem como alertada pelos Filtros por Remetente
1033 */
1034function removeMessagesFlag(id){
1035        var filters_c = DataLayer.get('filter', urlencode(id));
1036        var folder = '';
1037        var from = ''; 
1038        if(filters_c['actions'])
1039        for(var i=0; i < filters_c['actions'].length; i++){
1040                if(filters_c['actions'][i].type == 'fileinto'){
1041                        folder = filters_c['actions'][i].parameter;
1042                }
1043        }
1044        $.each(fromRules, function(index, value) {
1045                if(value == folder){
1046                        for(var i=0; i < filters_c['criteria'].length; i++){
1047                                if(filters_c['criteria'][i].field == 'from'){
1048                                        from = filters_c['criteria'][i].value;
1049                                }
1050                        }
1051                        cExecute ("$this.imap_functions.removeFlagMessagesFilter&folder="+folder+"&from="+from, function(){});
1052                        return false;
1053                }
1054        });
1055}
Note: See TracBrowser for help on using the repository browser.