source: trunk/prototype/modules/attach_message/attach_message.js @ 5831

Revision 5831, 17.7 KB checked in by douglasz, 12 years ago (diff)

Ticket #2486 - Correção para sinalizadores como concluidos.

Line 
1// $.storage = new $.store();
2 
3isOffline = /[A-z0-9-_\/\.]*:offline\?(.*)/;
4breakParams = /[&=]/;
5dots = /\./gi;
6dashes = /\//gi;
7flags = [ 'Attachment', 'Forwarded' ,'Recent', 'Unseen',  'Answered',  'Draft',  'Deleted', 'Flagged', 'Followupflag', 'Label' ];
8
9$.ajaxPrefilter(function( options, originalOptions, jqXHR ){
10
11      var offlineAction = isOffline.exec( options.url );
12
13      if( offlineAction )
14      {
15          offlineAction = offlineAction[1] || "";
16       
17          jqXHR.abort();
18
19          var params = {};
20         
21          if( offlineAction )
22              offlineAction +=  options.data ? "&" +  options.data : "";
23
24          offlineAction = offlineAction.split( breakParams );
25
26          for( var i = 0; i < offlineAction.length; )
27              params[ offlineAction[i++] ] = offlineAction[i++];
28
29          rest = params["q"].split("/");
30
31          if( !(rest.length % 2) )
32              var id = rest.pop();
33
34          var concept = rest.pop();
35
36          for( var i = 0; i < rest.length; )
37            params[ rest[i++] ] = rest[ i++ ];
38
39          switch( concept )
40          {
41            case "message":
42            {
43                if( id ){
44                    var mail = expresso_local_messages.get_local_mail( id );
45                    mail.eml = expresso_local_messages.get_src( mail.url_export_file );
46
47                    ( options.success || options.complete )( mail );
48                    return;
49                }
50
51                var msgs = expresso_local_messages.get_local_range_msgs( params["folder"].replace(dots, "/").replace("local_messages/", ""),
52                                                                          params["rows"] * ( params["page"] - 1 ) + 1,
53                                                                          params["rows"], "SORTARRIVAL", (params["sord"] == "desc"),
54                                                                          "ALL", 1, 1 );
55
56                for( var i = 0; i < msgs.length; i++ )
57                {
58                      msgs[i].size = msgs[i].Size;
59                      msgs[i].timestamp = msgs[i].udate * 1000;
60                      msgs[i].flags = [];
61
62                      for( var ii = 0; ii < flags.length; ii++ )
63                          if( f = $.trim( msgs[i][ flags[ii] ] ) )
64                              msgs[i].flags[ msgs[i].flags.length ] =  f;
65
66                      msgs[i].flags = msgs[i].flags.join(',');
67                }
68
69                ( options.success || options.complete )( {"rows": msgs,
70                                                           "records": msgs.length,
71                                                           "page": params["page"],
72                                                           "total": Math.ceil( msgs.num_msgs / params["rows"] )} );
73            }
74          }
75      }
76});
77
78var BASE_PATH = '../prototype/';
79//BASE_PATH = '../';
80//encontra os pais de todas as pastas e cria uma nova estrutura adicionando os filhos a um array no atributo 'children' do respectivo pai
81unorphanize = function(root, element) {
82        var ok = false;
83        for (var i=0; i<root.length; i++) {
84                if (root[i].id == element.parentFolder) {
85                        element.children = new Array();
86                        root[i].children.push(element);
87                        return true;
88                } else if (ok = unorphanize(root[i].children, element)) {
89                        break;
90                }
91        }
92
93        return ok;
94}
95
96/* --- helpers --- */
97bytes2Size = function(bytes) {
98        var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
99        if (bytes == 0) return 'n/a';
100        var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
101        var size = (i<2) ? Math.round((bytes / Math.pow(1024, i))) : Math.round((bytes / Math.pow(1024, i)) * 100)/100;
102        return  size + ' ' + sizes[i];
103}
104
105flags2Class = function(cellvalue, options, rowObject) {
106        var classes = '';       
107        cellvalue = cellvalue.split(',');
108        cell = {
109                        Unseen: parseInt(cellvalue[0])  ? 'Unseen' : 'Seen',
110                        Answered: parseInt(cellvalue[1]) ? 'Answered' : (parseInt(cellvalue[2]) ? 'Forwarded' : ''),
111                        Flagged: parseInt(cellvalue[3]) ? 'Flagged' : '',
112                        Recent: parseInt(cellvalue[4])  ? 'Recent' : '',                       
113                        Draft: parseInt(cellvalue[5]) ? 'Draft' : ''           
114                };
115        for(var flag in cell){
116                classes += '<span class="flags '+ (cell[flag]).toLowerCase() + '"' + (cell[flag] != "" ? 'title="'+ get_lang(cell[flag])+'"' : '')+'> </span>';
117        }
118        console.log(rowObject);
119        if(rowObject.labels){   
120                var titles = [];
121                var count = 0;
122                 for(i in rowObject.labels){
123                        titles[count] = " "+rowObject.labels[i].name;
124                        count++;
125                }
126                titles = titles.join();
127                classes += '<span class="flags labeled" title="'+titles+'"> </span>';
128        }else{
129                classes += '<span class="flags"> </span>';
130        }
131       
132        if(rowObject.followupflagged){         
133                if(rowObject.followupflagged.followupflag.id < 7){
134                        var nameFollowupflag = get_lang(rowObject.followupflagged.followupflag.name);
135                }else{
136                        var nameFollowupflag = rowObject.followupflagged.followupflag.name;
137                }
138                if(rowObject.followupflagged.isDone == 1){
139                        classes += '<span class="flags followupflagged" title="'+nameFollowupflag+'" style="background:'+rowObject.followupflagged.backgroundColor+';"><img style=" margin-left:-3px;" src="../prototype/modules/mail/img/flagChecked.png"></span>';
140                }else{                 
141                        classes += '<span class="flags followupflagged" title="'+nameFollowupflag+'" style="background:'+rowObject.followupflagged.backgroundColor+';"><img src="../prototype/modules/mail/img/flagEditor.png"></span>';
142                }
143               
144        }
145
146        return classes;
147}
148
149function numberMonths (months){
150        switch(months){
151                case 'Jan':
152                        return 1;
153                case 'Feb':
154                        return 2;
155                case 'Mar':
156                        return 3;
157                case 'Apr':
158                        return 4;
159                case 'May':
160                        return 5;
161                case 'June':
162                        return 6;
163                case 'July':
164                        return 7;
165                case 'Aug':
166                        return 8;
167                case 'Sept':
168                        return 9;
169                case 'Oct':
170                        return 10;
171                case 'Nov':
172                        return 11;
173                case 'Dec':
174                        return 12;
175        }       
176}
177
178NormaliseFrom = function(cellvalue, options, rowObject) {
179        rowObject['flags'] = rowObject['flags'].split(",");
180        if(rowObject['flags'][rowObject['flags'].length-1] ==  1){
181                return get_lang(special_folders["Drafts"]);
182        }
183        return cellvalue;       
184}
185
186date2Time = function (timestamp) {
187        var date = new Date();
188        if ((date.getTime() - timestamp) < (24*60*60*1000)) {
189                return '<span class="timable" title="'+timestamp+'"> </span>';
190        } else {
191                date = new Date(timestamp);
192                if(is_ie){
193                        var b = date.toString().split(' ');
194                        var c = b[2] + "/" + numberMonths(b[1]) + "/" + b[5];
195                        return '<span class="datable">' + c + '</span>';
196                }else{
197                        var b = date.toISOString().split("T")[0].split("-");
198                        var c = b[2] + "/" + b[1] + "/" + b[0];
199                        return '<span class="datable">' + c + '</span>';
200                }
201        }
202}
203
204changeTabIndex = function (elements) {
205//      jQuery('#foldertree').attr('tabIndex', '1').focus();
206}
207
208
209selectedMessagesCount = function() {
210        var byte_size = 0, total_messages = 0;
211        for (var folder in selectedMessages) {
212                for (var message in selectedMessages[folder]) {
213                        if (selectedMessages[folder][message]) {
214                                byte_size += parseInt(onceOpenedMessages[folder][message].size);
215                                total_messages++;
216                        }
217                }
218        }
219        $("#selected_messages_number").html(total_messages).next().html(bytes2Size(byte_size));
220        return total_messages;
221}
222
223var msgAttacherGrid = $("#message_attacher_grid"), msgsTotal = $("#selected_messages_number");
224var lastLoadedMessages = [];
225var onceOpenedMessages = [];
226var selectedMessages   = {};
227var selectedFolder     = {};
228
229function adaptOffline( data )
230{
231    if( preferences.use_local_messages == 1 || expresso_offline )
232    {
233        var folders = expresso_local_messages.list_local_folders();
234       
235        var stripParents = /^(.*)\/([^\/]*)/;
236
237        $.each( folders, function( i, folder ){
238               
239                  if(typeof(folder) == 'undefined')  return;
240                 
241              var id = 'local_messages/' + folder[0];
242
243              var parts = stripParents.exec( id );
244         
245              data[data.length] = {'id' : id,
246                                    'commonName' : parts[2],
247                                    'parentFolder' : parts[1]};
248        });
249    }
250
251    return( data );
252}
253
254$mailpreview_tabs_label_length = 15;
255
256/* --- jQuery handlers --- */
257
258jQuery('#buttons-container .button').button();
259
260jQuery.ajax({
261        url: BASE_PATH + "REST.php?q=folder",
262        dataType: 'json',
263
264        success: function( data ){
265
266                data = adaptOffline( data );
267
268                var tree1 = new Array();
269                var tree2 = new Array();
270                var tree3 = new Array();
271                for (var i=0; i<data.length; i++) {
272
273                        if (/^INBOX/.test(data[i].id)) {
274                                if (!unorphanize(tree1, data[i])) {
275                                        data[i].children = new Array();
276                                        tree1.push(data[i]);
277                                }
278                        }
279                        else if (/^user/.test(data[i].id)) {
280                                if (!unorphanize(tree2, data[i])) {
281                                        data[i].children = new Array();
282                                        tree2.push(data[i]);
283                                }
284                        }
285                        else if (/^local_messages/.test(data[i].id)) {
286                                if (!unorphanize(tree3, data[i])) {
287                                        data[i].children = new Array();
288                                        tree3.push(data[i]);
289                                }
290                        }
291                       
292                }
293
294                var firstFolder = jQuery("#foldertree-container")
295                .removeClass('empty-container')
296                .html(DataLayer.render(BASE_PATH + 'api/templates/foldertree.ejs', {folders: [tree1, tree2, tree3]}))
297                .find("#foldertree").treeview()
298                .click(function(event){
299                        //request new selected folder messages
300                        var target = $(event.target);
301
302                        if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable, .lastExpandable, .treeview') )
303                            return;
304
305                        if( !target.attr('id') )
306                            target = target.parent();
307
308            if (target.attr('id') == "foldertree") return;
309                       
310                        var targetId = target.attr('id');
311                        var child = target.find('.folder');
312             
313                        $('.filetree span.folder.selected').removeClass('selected');
314                        if(!target.is('#foldertree > .expandable, #foldertree > .collapsable'))
315                                $(target).children('.folder').addClass('selected');
316                       
317                        selectedFolder = {
318                            id: targetId,
319                            name: child.attr('title'),
320                            'class': child.attr('class')
321                        };
322
323                        var grid = $("#message_attacher_grid"), offlineCase = "";
324                       
325                        if( !targetId.indexOf( 'local_messages/' ) )
326                            offlineCase = ":offline";
327                       
328
329                        grid.jqGrid('setGridParam',{url:BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+targetId.replace(dashes, '.')+'/message'})
330                            .trigger("reloadGrid")
331                            .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>');
332                })
333                .find('span:first-child');
334                $('span.folder.inbox').addClass('selected');
335                selectedFolder = {
336                        id: firstFolder.parent().attr('id'),
337                        name: firstFolder.attr('title'),
338                        'class': firstFolder.attr('class')
339                };
340
341                //jqgrid
342                jQuery("#mailgrid-container")
343                .removeClass('empty-container')
344                .html(DataLayer.render(BASE_PATH + 'api/templates/messagegrid.ejs', {}))
345                .find("#message_attacher_grid")
346                .jqGrid({
347                        url:BASE_PATH + 'REST.php?q=folder/INBOX/message',
348                        datatype: "json",
349                        mtype: 'GET',
350                        colNames:['#',' ', 'De', 'Assunto', 'Data', 'Tamanho'],
351                        colModel:[
352                                {name:'msg_number',index:'msg_number', width:45, hidden:true, sortable:false},
353                                {name:'flags',index:'msg_number',edittype: 'image', width:100, sortable:false, formatter:flags2Class, title :false},
354                                {name:'from.name',index:'msg_number', width:70, sortable:false, formatter:NormaliseFrom},
355                                {name:'subject',index:'subject', width:245, sortable:false},
356                                {name:'timestamp',index:'timestamp', width:65, align:"center", sortable:false, formatter:date2Time},
357                                {name:'size',index:'size', width:55, align:"right", sortable:false, formatter:bytes2Size}
358                        ],
359                        jsonReader : {
360                                  root:"rows",
361                                  page: "page",
362                                  total: "total",
363                                  records: "records",
364                                  repeatitems: false,
365                                  id: "0"
366                        },
367                        rowNum:10,
368                        rowList:[10,25,50],
369                        pager: '#message_attacher_grid_pager',
370                        sortname: 'id',
371                        viewrecords: true,
372                        sortorder: "desc",
373                        multiselect: true,
374                        autowidth: true,
375                        loadComplete: function(data) {
376                                lastLoadedMessages = data.rows;
377                               
378                                // aplica o contador
379                                jQuery('.timable').each(function (i) {
380                                        jQuery(this).countdown({
381                                                since: new Date(parseInt(this.title)),
382                                                significant: 1,
383                                                layout: 'h&aacute; {d<}{dn} {dl} {d>}{h<}{hn} {hl} {h>}{m<}{mn} {ml} {m>}{s<}{sn} {sl}{s>}',
384                                                description: ' atr&aacute;s'
385                                        });                                     
386                                });
387                               
388                                // reconstrói a seleção das mensagens mesmo depois da mudança de pasta
389                                if (selectedMessages[selectedFolder.id]) {
390                                        for (var message in selectedMessages[selectedFolder.id]){
391                                                for (var j=0; j<data.rows.length; j++){
392                                                        if (selectedMessages[selectedFolder.id][message] && message == data.rows[j].msg_number) {
393                                                                jQuery("#message_attacher_grid").setSelection(jQuery("#message_attacher_grid").getDataIDs()[j], false);
394                                                        }
395                                                }
396                                        }
397                                }
398                                $('#cb_message_attacher_grid').css('display', 'none');
399                               
400                        },
401                        onSelectRow: function (id, selected) {
402                                var message = false;
403                                for (var i=0; i<lastLoadedMessages.length; i++){
404                                        if (lastLoadedMessages[i].msg_number == id) {
405                                                message = lastLoadedMessages[i];
406                                                break;
407                                        }
408                                }
409                               
410                                var tabPanelTemplateId = 'mailpreview_tab_' + selectedFolder.id.replace(/[.\/]/, '_') + '_' + message.msg_number;
411                                var tabPanelTemplateId = tabPanelTemplateId.replace(/[\s\/]/g, '-');
412                               
413                                if (selected) {         
414                                        if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number]) {
415                                                if (!selectedMessages[selectedFolder.id])
416                                                        selectedMessages[selectedFolder.id] = {};
417                                                       
418                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
419                                                $('#mailpreview-container').unblock();                                         
420
421                                                var tabPanelTemplateLabel = onceOpenedMessages[selectedFolder.id][message.msg_number].subject;
422                                                if (tabPanelTemplateLabel.length > $mailpreview_tabs_label_length + 3)
423                                                        tabPanelTemplateLabel = tabPanelTemplateLabel.substring(0, $mailpreview_tabs_label_length) + '...';
424                                               
425                                                if (!$('#' + tabPanelTemplateId).length) {                                                             
426                                                        $mailpreview_tabs.tabs("add", '#' + tabPanelTemplateId, tabPanelTemplateLabel)
427                                                        .find('.message.empty-container').hide().end()
428                                                        .find('#' + tabPanelTemplateId).html(onceOpenedMessages[selectedFolder.id][message.msg_number].body);
429                                                } else {
430                                                        $mailpreview_tabs.tabs('select', '#' + tabPanelTemplateId)
431                                                        .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').removeClass('preview-message-unselected');
432                                                }
433                                               
434                                        } else {
435                                                jQuery('#mailpreview_container').block({ 
436                                                        message: '<div id="loading-content"><div class="image"> </div></div>', 
437                                                        css: { 
438                                                                backgroundImage: 'url('+BASE_PATH+'modules/attach_message/images/loading.gif)', 
439                                                                backgroundRepeat: 'no-repeat',
440                                                                backgroundPosition: 'center',
441                                                                backgroundColor: 'transparent',
442                                                                width: '32px',
443                                                                height: '32px',
444                                                                border:'none' 
445                                                        },
446                                                        overlayCSS: { 
447                                                                backgroundColor: '#CCC', 
448                                                                opacity:         0.5
449                                                        } 
450                                                });
451
452                                                var offlineCase = "";
453                                               
454                                                if( !selectedFolder.id.indexOf( 'local_messages/' ) )
455                                                    offlineCase = ":offline";
456                                         
457                                                if (!selectedMessages[selectedFolder.id])
458                                                        selectedMessages[selectedFolder.id] = {};
459                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
460                                                $.ajax({
461                                                        accepts: 'text/html',
462                                                        url: BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+selectedFolder.id.replace(dashes, '.')+'/message/'+id,
463                                                        dataType: 'json',
464                                                        success: function( mail_preview ){             
465                                                                //selectedMessagesCount();
466                                                                if (!onceOpenedMessages[selectedFolder.id])
467                                                                        onceOpenedMessages[selectedFolder.id] = {};
468                                                                onceOpenedMessages[selectedFolder.id][message.msg_number] = jQuery.extend(true, message, mail_preview);
469
470                                                                $('#mailpreview_container').unblock();
471
472                                                                var tabPanelTemplateLabel = onceOpenedMessages[selectedFolder.id][message.msg_number].subject;
473                                                                if (tabPanelTemplateLabel.length > $mailpreview_tabs_label_length + 3)
474                                                                        tabPanelTemplateLabel = tabPanelTemplateLabel.substring(0, $mailpreview_tabs_label_length) + '...';
475                                                        selectedMessagesCount();
476                                                               
477                                                                if (!$('#' + tabPanelTemplateId).length) {                                                             
478                                                                        $mailpreview_tabs.tabs("add", '#' + tabPanelTemplateId, tabPanelTemplateLabel)
479                                                                        .find('.message.empty-container').hide().end()
480                                                                        .find('#' + tabPanelTemplateId).html(onceOpenedMessages[selectedFolder.id][message.msg_number].body)
481                                                                        .prepend(
482                                                                                '<div class="mailpreview-message-info">' +
483                                                                                        get_lang('Subject') + ': ' +
484                                                                                        onceOpenedMessages[selectedFolder.id][message.msg_number].subject +
485                                                                                '</div>'
486                                                                        )
487                                                                        .find('[class^="ExpressoCssWrapper"]').addClass("mailpreview-message-body");
488                                                                } else {
489                                                                        $mailpreview_tabs.tabs('select', '#' + tabPanelTemplateId)
490                                                                        .find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').removeClass('preview-message-unselected');
491                                                                }
492                                                        }
493                                                });
494                                        }
495                                } else {
496                                        /**
497                                         * if you wants to remove tab on unselect message,
498                                         * but still needs to uselect message on remove tab.
499                                         *
500                                         */
501                                        /*
502                                        if ($('#' + tabPanelTemplateId).length) {
503                                                $mailpreview_tabs.tabs('remove', '#' + tabPanelTemplateId);
504                                        }
505                                         */
506                                        selectedMessages[selectedFolder.id][message.msg_number] = false;
507                                        $mailpreview_tabs.find('#' + tabPanelTemplateId + ', [href="#' + tabPanelTemplateId + '"]').addClass('preview-message-unselected');
508                                }
509                               
510                                if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number])
511                                        selectedMessagesCount();
512                        },
513                        caption: '<span class="'+selectedFolder['class']+'">'+selectedFolder.name+'</span>'
514                });
515                //.jqGrid('navGrid','#message_attacher_grid_pager',{edit:false,add:false,del:false});
516        }
517});
518
519
520var $mailpreview_tabs = $( "#mailpreview_container").tabs({
521        tabTemplate: "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'> Fechar </span></li>",
522        panelTemplate: '<div class="message mailpreview-message"></div>',
523        add: function( event, ui ) {
524                $mailpreview_tabs.tabs('select', '#' + ui.panel.id);
525                if ($('#mailpreview_tabs_default_empty').length && $mailpreview_tabs.tabs("length") > 1) {     
526                        $mailpreview_tabs.tabs('remove', '#mailpreview_tabs_default_empty');
527                }
528        },
529        remove: function(event, ui) {
530                if (!$mailpreview_tabs.tabs("length") && !$('#mailpreview_tabs_default_empty').length) {
531                        /**
532                         * TODO: internacionalizar a string 'Nenhuma aba'
533                         */
534                        $mailpreview_tabs.tabs('add', '#mailpreview_tabs_default_empty', 'Nenhuma aba')
535                        .find('#mailpreview_tabs_default_empty').removeClass('mailpreview-message').addClass('empty-container')
536                        .html('<span class="message">' + get_lang('select a message to preview') + '</span>').end()
537                        .find('.ui-tabs-nav li:first .ui-icon-close').remove();
538                }
539        }
540});
541
542$( "#mailpreview_container span.ui-icon-close" ).live( "click", function(e) {
543        var index = $("li", $mailpreview_tabs).index($(this).parent());
544        $mailpreview_tabs.tabs("remove", index);
545        e.stopImmediatePropagation();
546});
Note: See TracBrowser for help on using the repository browser.