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

Revision 5172, 12.5 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus. Ultimas sincronizacoes...

Line 
1
2// $.storage = new $.store();
3
4isOffline = /[A-z0-9-_\/\.]*:offline\?(.*)/;
5breakParams = /[&=]/;
6dots = /\./gi;
7dashes = /\//gi;
8flags = [ 'Recent', 'Unseen',  'Answered',  'Draft',  'Deleted', 'Flagged' ];
9
10$.ajaxPrefilter(function( options, originalOptions, jqXHR ){
11
12      var offlineAction = isOffline.exec( options.url );
13
14      if( offlineAction )
15      {
16          offlineAction = offlineAction[1] || "";
17       
18          jqXHR.abort();
19
20          var params = {};
21         
22          if( offlineAction )
23              offlineAction +=  options.data ? "&" +  options.data : "";
24
25          offlineAction = offlineAction.split( breakParams );
26
27          for( var i = 0; i < offlineAction.length; )
28              params[ offlineAction[i++] ] = offlineAction[i++];
29
30          rest = params["q"].split("/");
31
32          if( !(rest.length % 2) )
33              var id = rest.pop();
34
35          var concept = rest.pop();
36
37          for( var i = 0; i < rest.length; )
38            params[ rest[i++] ] = rest[ i++ ];
39
40          switch( concept )
41          {
42            case "message":
43            {
44                if( id ){
45                    var mail = expresso_local_messages.get_local_mail( id );
46                    mail.eml = expresso_local_messages.get_src( mail.url_export_file );
47
48                    ( options.success || options.complete )( mail );
49                    return;
50                }
51
52                var msgs = expresso_local_messages.get_local_range_msgs( params["folder"].replace(dots, "/").replace("local_messages/", ""),
53                                                                          params["rows"] * ( params["page"] - 1 ) + 1,
54                                                                          params["rows"], "SORTARRIVAL", (params["sord"] == "desc"),
55                                                                          "ALL", 1, 1 );
56
57                for( var i = 0; i < msgs.length; i++ )
58                {
59                      msgs[i].size = msgs[i].Size;
60                      msgs[i].timestamp = msgs[i].udate * 1000;
61                      msgs[i].flags = [];
62
63                      for( var ii = 0; ii < flags.length; ii++ )
64                          if( f = $.trim( msgs[i][ flags[ii] ] ) )
65                              msgs[i].flags[ msgs[i].flags.length ] =  f;
66
67                      msgs[i].flags = msgs[i].flags.join(',');
68                }
69
70                ( options.success || options.complete )( { "rows": msgs,
71                                                           "records": msgs.length,
72                                                           "page": params["page"],
73                                                           "total": Math.ceil( msgs.num_msgs / params["rows"] ) } );
74            }
75          }
76      }
77});
78
79var BASE_PATH = '../prototype/';
80//BASE_PATH = '../';
81//encontra os pais de todas as pastas e cria uma nova estrutura adicionando os filhos a um array no atributo 'children' do respectivo pai
82unorphanize = function(root, element) {
83        var ok = false;
84        for (var i=0; i<root.length; i++) {
85                if (root[i].id == element.parentFolder) {
86                        element.children = new Array();
87                        root[i].children.push(element);
88                        return true;
89                } else if (ok = unorphanize(root[i].children, element)) {
90                        break;
91                }
92        }
93
94        return ok;
95}
96
97/* --- helpers --- */
98bytes2Size = function(bytes) {
99        var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
100        if (bytes == 0) return 'n/a';
101        var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
102        var size = (i<2) ? Math.round((bytes / Math.pow(1024, i))) : Math.round((bytes / Math.pow(1024, i)) * 100)/100;
103        return  size + ' ' + sizes[i];
104}
105
106flags2Class = function(cellvalue) {
107        var flags_enum = cellvalue.split(',');
108        var classes = '';
109        for (var i=0; i<flags_enum.length; i++){
110                classes += '<span class="icon-'+flags_enum[i].toLowerCase()+'"> </span>';
111        }
112        return classes;
113}
114
115date2Time = function (timestamp) {
116        var date = new Date();
117        if ((date.getTime() - timestamp) < (24*60*60*1000)) {
118                return '<span class="timable" title="'+timestamp+'"> </span>';
119        } else {
120                date = new Date(timestamp);
121                var b = date.toISOString().split("T")[0].split("-");
122                var c = b[2] + "/" + b[1] + "/" + b[0];
123                return '<span class="datable">' + c + '</span>';
124        }
125}
126
127changeTabIndex = function (elements) {
128//      jQuery('#foldertree').attr('tabIndex', '1').focus();
129}
130
131
132selectedMessagesCount = function() {
133        var byte_size = 0, total_messages = 0;
134        for (var folder in selectedMessages) {
135                for (var message in selectedMessages[folder]) {
136                        if (selectedMessages[folder][message]) {
137                                byte_size += parseInt(onceOpenedMessages[folder][message].size);
138                                total_messages++;
139                        }
140                }
141        }
142        $("#selected_messages_number").html(total_messages).next().html(bytes2Size(byte_size));
143
144        return total_messages;
145}
146
147      function dump(arr,level) {
148              var dumped_text = "";
149              if(!level) level = 0;
150
151              //The padding given at the beginning of the line.
152              var level_padding = "";
153              for(var j=0;j<level+1;j++) level_padding += "    ";
154
155              if(typeof(arr) == 'object') { //Array/Hashes/Objects
156                      for(var item in arr) {
157                              var value = arr[item];
158
159                              if(typeof(value) == 'object') { //If it is an array,
160                                      dumped_text += level_padding + "'" + item + "' ...\n";
161                                      dumped_text += dump(value,level+1);
162                              } else {
163                                      dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
164                              }
165                      }
166              } else { //Stings/Chars/Numbers etc.
167                      dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
168              }
169              return dumped_text;
170      }
171
172var msgAttacherGrid = $("#message_attacher_grid"), msgsTotal = $("#selected_messages_number");
173var lastLoadedMessages = [];
174var onceOpenedMessages = [];
175var selectedMessages   = {};
176var selectedFolder     = {};
177
178function adaptOffline( data )
179{
180    if( preferences.use_local_messages == 1 || expresso_offline )
181    {
182        var folders = expresso_local_messages.list_local_folders();
183       
184        var stripParents = /^(.*)\/([^\/]*)/;
185
186        $.each( folders, function( i, folder ){
187               
188                  if(typeof(folder) == 'undefined')  return;
189                 
190              var id = 'local_messages/' + folder[0];
191
192              var parts = stripParents.exec( id );
193         
194              data[data.length] = { 'id' : id,
195                                    'commonName' : parts[2],
196                                    'parentFolder' : parts[1] };
197        });
198    }
199
200    return( data );
201}
202
203/* --- jQuery handlers --- */
204
205jQuery('#buttons-container .button').button();
206
207jQuery.ajax({
208        url: BASE_PATH + "REST.php?q=folder",
209        dataType: 'json',
210
211        success: function( data ){
212
213                data = adaptOffline( data );
214
215                var tree1 = new Array();
216                var tree2 = new Array();
217                var tree3 = new Array();
218                for (var i=0; i<data.length; i++) {
219
220                        if (/^INBOX/.test(data[i].id)) {
221                                if (!unorphanize(tree1, data[i])) {
222                                        data[i].children = new Array();
223                                        tree1.push(data[i]);
224                                }
225                        }
226                        else if (/^user/.test(data[i].id)) {
227                                if (!unorphanize(tree2, data[i])) {
228                                        data[i].children = new Array();
229                                        tree2.push(data[i]);
230                                }
231                        }
232                        else if (/^local_messages/.test(data[i].id)) {
233                                if (!unorphanize(tree3, data[i])) {
234                                        data[i].children = new Array();
235                                        tree3.push(data[i]);
236                                }
237                        }
238                       
239                }
240
241                var firstFolder = jQuery("#foldertree-container")
242                .removeClass('empty-conteiner')
243                .html(BASE_PATH + 'app/templates/foldertree.ejs', {folders: [tree1, tree2, tree3]})
244                .find("#foldertree").treeview()
245                .click(function(event){
246                        //request new selected folder messages
247                        var target = $(event.target);
248
249                        if( target.is('.collapsable-hitarea, .expandable-hitarea, .lastCollapsable, .lastExpandable, .treeview') )
250                            return;
251
252                        if( !target.attr('id') )
253                            target = target.parent();
254
255            if (target.attr('id') == "foldertree") return;
256                       
257                        var targetId = target.attr('id');
258                        var child = target.find('.folder');
259             
260                        $('.filetree span.folder.selected').removeClass('selected');
261                        if(!target.is('#foldertree > .expandable, #foldertree > .collapsable'))
262                                $(target).children('.folder').addClass('selected');
263                       
264                        selectedFolder = {
265                            id: targetId,
266                            name: child.attr('title'),
267                            class: child.attr('class')
268                        };
269
270                        var grid = $("#message_attacher_grid"), offlineCase = "";
271                       
272                        if( !targetId.indexOf( 'local_messages/' ) )
273                            offlineCase = ":offline";
274                       
275
276                        grid.jqGrid('setGridParam',{url:BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+targetId.replace(dashes, '.')+'/message'})
277                            .trigger("reloadGrid")
278                            .jqGrid('setCaption', '<span class="'+child.attr('class')+'">'+child.attr('title')+'</span>');
279                })
280                .find('span:first-child');
281
282                selectedFolder = {
283                        id: firstFolder.parent().attr('id'),
284                        name: firstFolder.attr('title'),
285                        class: firstFolder.attr('class')
286                };
287
288                //jqgrid
289                jQuery("#mailgrid-container")
290                .removeClass('empty-conteiner')
291                .html(BASE_PATH + 'app/templates/messagegrid.ejs', {data: {}})
292                .find("#message_attacher_grid")
293                .jqGrid({
294                        url:BASE_PATH + 'REST.php?q=folder/INBOX/message',
295                        datatype: "json",
296                        mtype: 'GET',
297                        colNames:['#', ' ', 'De', 'Assunto', 'Data', 'Tamanho'],
298                        colModel:[
299                                {name:'msg_number',index:'msg_number', width:45, hidden:true, sortable:false},
300                                {name:'flags',index:'msg_number', width:40, sortable:false, formatter:flags2Class},
301                                {name:'from.name',index:'msg_number', width:130, sortable:false},
302                                {name:'subject',index:'subject', width:250, sortable:false},
303                                {name:'timestamp',index:'timestamp', width:65, align:"center", sortable:false, formatter:date2Time},
304                                {name:'size',index:'size', width:50, align:"right", sortable:false, formatter:bytes2Size}
305                        ],
306                        jsonReader : {
307                                  root:"rows",
308                                  page: "page",
309                                  total: "total",
310                                  records: "records",
311                                  repeatitems: false,
312                                  id: "0"
313                        },
314                        rowNum:10,
315                        rowList:[10,25,50],
316                        pager: '#message_attacher_grid_pager',
317                        sortname: 'id',
318                        viewrecords: true,
319                        sortorder: "desc",
320                        multiselect: true,
321                        autowidth: true,
322                        loadComplete: function(data) {
323                                lastLoadedMessages = data.rows;
324                               
325                                // aplica o contador
326                                jQuery('.timable').each(function (i) {
327                                        jQuery(this).countdown({
328                                                since: new Date(parseInt(this.title)),
329                                                significant: 1,
330                                                layout: 'h&aacute; {d<}{dn} {dl} {d>}{h<}{hn} {hl} {h>}{m<}{mn} {ml} {m>}{s<}{sn} {sl}{s>}',
331                                                description: ' atr&aacute;s'
332                                        });
333                                });
334
335                                // reconstrói a seleção das mensagens mesmo depois da mudança de pasta
336                                if (selectedMessages[selectedFolder.id]) {
337                                        for (var message in selectedMessages[selectedFolder.id]){
338                                                for (var j=0; j<data.rows.length; j++){
339                                                        if (selectedMessages[selectedFolder.id][message] && message == data.rows[j].msg_number) {
340                                                                jQuery("#message_attacher_grid").setSelection(jQuery("#message_attacher_grid").getDataIDs()[j], false);
341                                                        }
342                                                }
343                                        }
344                                }
345                                $('#cb_message_attacher_grid').css('display', 'none');
346                               
347                        },
348                        onSelectRow: function (id, selected) {
349                                if (selected) {
350                                        var message = false;
351                                        for (var i=0; i<lastLoadedMessages.length; i++){
352                                                if (lastLoadedMessages[i].msg_number == id) {
353                                                        message = lastLoadedMessages[i];
354                                                        break;
355                                                }
356                                        }
357                                       
358                                        if (onceOpenedMessages[selectedFolder.id] && onceOpenedMessages[selectedFolder.id][message.msg_number]) {
359                                                if (!selectedMessages[selectedFolder.id])
360                                                        selectedMessages[selectedFolder.id] = {};
361                                                       
362                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
363                                                $('#mailpreview-container').removeClass('empty-conteiner').html(onceOpenedMessages[selectedFolder.id][message.msg_number].body);
364                                        } else {
365                                                jQuery('#mailpreview-container').block({ 
366                                                        message: '<div id="loading-content"><div class="image"> </div></div>', 
367                                                        css: { 
368                                                                backgroundImage: 'url('+BASE_PATH+'modules/attach_message/images/loading.gif)', 
369                                                                backgroundRepeat: 'no-repeat',
370                                                                backgroundPosition: 'center',
371                                                                backgroundColor: 'transparent',
372                                                                width: '32px',
373                                                                height: '32px',
374                                                                border:'none' 
375                                                        },
376                                                        overlayCSS: { 
377                                                                backgroundColor: '#CCC', 
378                                                                opacity:         0.5
379                                                        } 
380                                                });
381
382                                                var offlineCase = "";
383                                         
384                                                if( !selectedFolder.id.indexOf( 'local_messages/' ) )
385                                                    offlineCase = ":offline";
386                                         
387                                                if (!selectedMessages[selectedFolder.id])
388                                                        selectedMessages[selectedFolder.id] = {};
389                                                selectedMessages[selectedFolder.id][message.msg_number] = true;
390                                               
391                                                $.ajax({
392                                                        accepts: 'text/html',
393                                                        url: BASE_PATH + 'REST.php'+offlineCase+'?q=folder/'+selectedFolder.id.replace('/', '.')+'/message/'+id,
394                                                        dataType: 'json',
395                                                        success: function( mail_preview ){
396                                                                if (!onceOpenedMessages[selectedFolder.id])
397                                                                        onceOpenedMessages[selectedFolder.id] = {};
398                                                                       
399                                                                onceOpenedMessages[selectedFolder.id][message.msg_number] = jQuery.extend(true, message, mail_preview);
400                                               
401                                                                $('#mailpreview-container').removeClass('empty-conteiner').unblock()
402                                                                .find('.message')
403                                                                .html(onceOpenedMessages[selectedFolder.id][message.msg_number].body).end()
404                                                                .find('#mailpreview-message-info').html(onceOpenedMessages[selectedFolder.id][message.msg_number].subject);
405                                                               
406                                                                selectedMessagesCount();
407                                                        }
408                                                });
409                                        }
410                                } else {
411                                        selectedMessages[selectedFolder.id][id] = false;
412                                }
413                                selectedMessagesCount();
414                        },
415                        caption: '<span class="'+selectedFolder.class+'">'+selectedFolder.name+'</span>'
416                });
417                //.jqGrid('navGrid','#message_attacher_grid_pager',{edit:false,add:false,del:false});
418        }
419});
Note: See TracBrowser for help on using the repository browser.