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

Revision 5188, 13.4 KB checked in by gustavo, 12 years ago (diff)

Ticket #2327 - Erros na tela de anexar mensagens que foram encontrados

Line 
1// $.storage = new $.store();
2
3isOffline = /[A-z0-9-_\/\.]*:offline\?(.*)/;
4breakParams = /[&=]/;
5dots = /\./gi;
6dashes = /\//gi;
7flags = [ 'Recent', 'Unseen',  'Answered',  'Draft',  'Deleted', 'Flagged' ];
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       
108        if(cellvalue ==""){
109                classes += '<span class="flags seen" title="seen"> </span>';
110                return classes;
111        }
112        var flags_enum = cellvalue.split(',');
113       
114        for (var i=0; i<flags_enum.length; i++){
115                classes += '<span class="flags '+flags_enum[i].toLowerCase()+'" title="'+flags_enum[i].toLowerCase()+'"> </span>';
116        }
117       
118        return classes;
119}
120
121NormaliseFrom = function(cellvalue, options, rowObject) {
122        //alert(dump(rowObject));
123        if(rowObject['flags'].indexOf("Draft") >=  0)
124                return get_lang(special_folders["Drafts"]);
125        return cellvalue;       
126}
127
128date2Time = function (timestamp) {
129        var date = new Date();
130        if ((date.getTime() - timestamp) < (24*60*60*1000)) {
131                return '<span class="timable" title="'+timestamp+'"> </span>';
132        } else {
133                date = new Date(timestamp);
134                var b = date.toISOString().split("T")[0].split("-");
135                var c = b[2] + "/" + b[1] + "/" + b[0];
136                return '<span class="datable">' + c + '</span>';
137        }
138}
139
140changeTabIndex = function (elements) {
141//      jQuery('#foldertree').attr('tabIndex', '1').focus();
142}
143
144
145selectedMessagesCount = function() {
146        var byte_size = 0, total_messages = 0;
147        for (var folder in selectedMessages) {
148                for (var message in selectedMessages[folder]) {
149                        if (selectedMessages[folder][message]) {
150                                byte_size += parseInt(onceOpenedMessages[folder][message].size);
151                                total_messages++;
152                        }
153                }
154        }
155        $("#selected_messages_number").html(total_messages).next().html(bytes2Size(byte_size));
156
157        return total_messages;
158}
159
160      function dump(arr,level) {
161              var dumped_text = "";
162              if(!level) level = 0;
163
164              //The padding given at the beginning of the line.
165              var level_padding = "";
166              for(var j=0;j<level+1;j++) level_padding += "    ";
167
168              if(typeof(arr) == 'object') { //Array/Hashes/Objects
169                      for(var item in arr) {
170                              var value = arr[item];
171
172                              if(typeof(value) == 'object') { //If it is an array,
173                                      dumped_text += level_padding + "'" + item + "' ...\n";
174                                      dumped_text += dump(value,level+1);
175                              } else {
176                                      dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
177                              }
178                      }
179              } else { //Stings/Chars/Numbers etc.
180                      dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
181              }
182              return dumped_text;
183      }
184
185var msgAttacherGrid = $("#message_attacher_grid"), msgsTotal = $("#selected_messages_number");
186var lastLoadedMessages = [];
187var onceOpenedMessages = [];
188var selectedMessages   = {};
189var selectedFolder     = {};
190
191function adaptOffline( data )
192{
193    if( preferences.use_local_messages == 1 || expresso_offline )
194    {
195        var folders = expresso_local_messages.list_local_folders();
196       
197        var stripParents = /^(.*)\/([^\/]*)/;
198
199        $.each( folders, function( i, folder ){
200               
201                  if(typeof(folder) == 'undefined')  return;
202                 
203              var id = 'local_messages/' + folder[0];
204
205              var parts = stripParents.exec( id );
206         
207              data[data.length] = { 'id' : id,
208                                    'commonName' : parts[2],
209                                    'parentFolder' : parts[1] };
210        });
211    }
212
213    return( data );
214}
215
216/* --- jQuery handlers --- */
217
218jQuery('#buttons-container .button').button();
219
220jQuery.ajax({
221        url: BASE_PATH + "REST.php?q=folder",
222        dataType: 'json',
223
224        success: function( data ){
225
226                data = adaptOffline( data );
227
228                var tree1 = new Array();
229                var tree2 = new Array();
230                var tree3 = new Array();
231                for (var i=0; i<data.length; i++) {
232
233                        if (/^INBOX/.test(data[i].id)) {
234                                if (!unorphanize(tree1, data[i])) {
235                                        data[i].children = new Array();
236                                        tree1.push(data[i]);
237                                }
238                        }
239                        else if (/^user/.test(data[i].id)) {
240                                if (!unorphanize(tree2, data[i])) {
241                                        data[i].children = new Array();
242                                        tree2.push(data[i]);
243                                }
244                        }
245                        else if (/^local_messages/.test(data[i].id)) {
246                                if (!unorphanize(tree3, data[i])) {
247                                        data[i].children = new Array();
248                                        tree3.push(data[i]);
249                                }
250                        }
251                       
252                }
253
254                var firstFolder = jQuery("#foldertree-container")
255                .removeClass('empty-conteiner')
256                .html(BASE_PATH + 'app/templates/foldertree.ejs', {folders: [tree1, tree2, tree3]})
257                .find("#foldertree").treeview()
258                .click(function(event){
259                        //request new selected folder messages
260                        var target = $(event.target);
261
262                        if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable, .lastExpandable, .treeview') )
263                            return;
264
265                        if( !target.attr('id') )
266                            target = target.parent();
267
268            if (target.attr('id') == "foldertree") return;
269                       
270                        var targetId = target.attr('id');
271                        var child = target.find('.folder');
272             
273                        $('.filetree span.folder.selected').removeClass('selected');
274                        if(!target.is('#foldertree > .expandable, #foldertree > .collapsable'))
275                                $(target).children('.folder').addClass('selected');
276                       
277                        selectedFolder = {
278                            id: targetId,
279                            name: child.attr('title'),
280                            class: child.attr('class')
281                        };
282
283                        var grid = $("#message_attacher_grid"), offlineCase = "";
284                       
285                        if( !targetId.indexOf( 'local_messages/' ) )
286                            offlineCase = ":offline";
287                       
288
289                        grid.jqGrid('setGridParam',{url:BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+targetId.replace(dashes, '.')+'/message'})
290                            .trigger("reloadGrid")
291                            .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>');
292                })
293                .find('span:first-child');
294                $('span.folder.inbox').addClass('selected');
295                selectedFolder = {
296                        id: firstFolder.parent().attr('id'),
297                        name: firstFolder.attr('title'),
298                        class: firstFolder.attr('class')
299                };
300
301                //jqgrid
302                jQuery("#mailgrid-container")
303                .removeClass('empty-conteiner')
304                .html(BASE_PATH + 'app/templates/messagegrid.ejs', {data: {}})
305                .find("#message_attacher_grid")
306                .jqGrid({
307                        url:BASE_PATH + 'REST.php?q=folder/INBOX/message',
308                        datatype: "json",
309                        mtype: 'GET',
310                        colNames:['#', ' ', 'De', 'Assunto', 'Data', 'Tamanho'],
311                        colModel:[
312                                {name:'msg_number',index:'msg_number', width:45, hidden:true, sortable:false},
313                                {name:'flags',index:'msg_number',edittype: 'image', width:40, sortable:false, formatter:flags2Class},
314                                {name:'from.name',index:'msg_number', width:130, sortable:false, formatter:NormaliseFrom},
315                                {name:'subject',index:'subject', width:245, sortable:false},
316                                {name:'timestamp',index:'timestamp', width:65, align:"center", sortable:false, formatter:date2Time},
317                                {name:'size',index:'size', width:55, align:"right", sortable:false, formatter:bytes2Size}
318                        ],
319                        jsonReader : {
320                                  root:"rows",
321                                  page: "page",
322                                  total: "total",
323                                  records: "records",
324                                  repeatitems: false,
325                                  id: "0"
326                        },
327                        rowNum:10,
328                        rowList:[10,25,50],
329                        pager: '#message_attacher_grid_pager',
330                        sortname: 'id',
331                        viewrecords: true,
332                        sortorder: "desc",
333                        multiselect: true,
334                        autowidth: true,
335                        loadComplete: function(data) {
336                                lastLoadedMessages = data.rows;
337                               
338                                // aplica o contador
339                                jQuery('.timable').each(function (i) {
340                                        jQuery(this).countdown({
341                                                since: new Date(parseInt(this.title)),
342                                                significant: 1,
343                                                layout: 'h&aacute; {d<}{dn} {dl} {d>}{h<}{hn} {hl} {h>}{m<}{mn} {ml} {m>}{s<}{sn} {sl}{s>}',
344                                                description: ' atr&aacute;s'
345                                        });                                     
346                                });
347                               
348                                // reconstrói a seleção das mensagens mesmo depois da mudança de pasta
349                                if (selectedMessages[selectedFolder.id]) {
350                                        for (var message in selectedMessages[selectedFolder.id]){
351                                                for (var j=0; j<data.rows.length; j++){
352                                                        if (selectedMessages[selectedFolder.id][message] && message == data.rows[j].msg_number) {
353                                                                jQuery("#message_attacher_grid").setSelection(jQuery("#message_attacher_grid").getDataIDs()[j], false);
354                                                        }
355                                                }
356                                        }
357                                }
358                                $('#cb_message_attacher_grid').css('display', 'none');
359                               
360                        },
361                        onSelectRow: function (id, selected) {
362                                if (selected) {
363                                        var message = false;
364                                        for (var i=0; i<lastLoadedMessages.length; i++){
365                                                if (lastLoadedMessages[i].msg_number == id) {
366                                                        message = lastLoadedMessages[i];
367                                                        break;
368                                                }
369                                        }
370                                       
371                                        if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number]) {
372                                                if (!selectedMessages[selectedFolder.id])
373                                                        selectedMessages[selectedFolder.id] = {};
374                                                       
375                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
376                                                $('#mailpreview-container').removeClass('empty-conteiner').unblock()
377                                                .find('.message')
378                                                .html(onceOpenedMessages[selectedFolder.id][message.msg_number].body).end()
379                                                .find('#mailpreview-message-info').html(onceOpenedMessages[selectedFolder.id][message.msg_number].subject)
380                                                //$('#mailpreview-container').removeClass('empty-conteiner').html(onceOpenedMessages[selectedFolder.id][message.msg_number].body);
381                                               
382                                                selectedMessagesCount();
383                                        } else {
384                                                jQuery('#mailpreview-container').block({ 
385                                                        message: '<div id="loading-content"><div class="image"> </div></div>', 
386                                                        css: { 
387                                                                backgroundImage: 'url('+BASE_PATH+'modules/attach_message/images/loading.gif)', 
388                                                                backgroundRepeat: 'no-repeat',
389                                                                backgroundPosition: 'center',
390                                                                backgroundColor: 'transparent',
391                                                                width: '32px',
392                                                                height: '32px',
393                                                                border:'none' 
394                                                        },
395                                                        overlayCSS: { 
396                                                                backgroundColor: '#CCC', 
397                                                                opacity:         0.5
398                                                        } 
399                                                });
400
401                                                var offlineCase = "";
402                                               
403                                                if( !selectedFolder.id.indexOf( 'local_messages/' ) )
404                                                    offlineCase = ":offline";
405                                         
406                                                if (!selectedMessages[selectedFolder.id])
407                                                        selectedMessages[selectedFolder.id] = {};
408                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
409                                                $.ajax({
410                                                        accepts: 'text/html',
411                                                        url: BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+selectedFolder.id.replace(dashes, '.')+'/message/'+id,
412                                                        dataType: 'json',
413                                                        success: function( mail_preview ){                                                             
414                                                                if (!onceOpenedMessages[selectedFolder.id])
415                                                                        onceOpenedMessages[selectedFolder.id] = {};
416                                                                onceOpenedMessages[selectedFolder.id][message.msg_number] = jQuery.extend(true, message, mail_preview);
417
418                                                                $('#mailpreview-container').removeClass('empty-conteiner').unblock()
419                                                                .find('.message')
420                                                                .html(onceOpenedMessages[selectedFolder.id][message.msg_number].body).end()
421                                                                .find('#mailpreview-message-info').html(onceOpenedMessages[selectedFolder.id][message.msg_number].subject);
422                                                               
423                                                                selectedMessagesCount();
424                                                        }
425                                                });
426                                        }
427                                } else {
428                                        $('#mailpreview-container').addClass('empty-conteiner').unblock()
429                                        .find('.message')
430                                        .html("selecione uma mensagem para pre-visualizar").end()
431                                        .find('#mailpreview-message-info').html("");
432                                        selectedMessages[selectedFolder.id][id] = false;
433                                }
434                        },
435                        caption: '<span class="'+selectedFolder.class+'">'+selectedFolder.name+'</span>'
436                });
437                //.jqGrid('navGrid','#message_attacher_grid_pager',{edit:false,add:false,del:false});
438        }
439});
Note: See TracBrowser for help on using the repository browser.