source: trunk/expressoMail1_2/js/mail_sync.js @ 1518

Revision 1518, 12.3 KB checked in by eduardoalex, 15 years ago (diff)

Ticket #656 - funcionalidade de arquivamento programado no expressoMail

Line 
1/**
2 * @author diogenes
3 */
4        function mail_sync() {
5                this.dbGears = null;
6                this.localServer = null;
7                this.store = null;
8                this.folders = new Array();
9                this.messages = null;
10                this.attachs = null;
11                this.url_attachs = null;
12                this.main_title = null;
13        }
14       
15        mail_sync.prototype.open_conn = function(){
16                var db_in_other_use = true;
17                while (db_in_other_use) {
18                        try {
19                                this.dbGears.open('database-test');
20                                db_in_other_use = false;
21                        }
22                        catch (ex) {
23                                db_in_other_use=true;
24                        }
25                }
26        }
27       
28        mail_sync.prototype.start_sync = function() {
29                if(this.folders.length!=0) {
30                        //Já está sincronizando...
31                        return;
32                }
33                this.main_title = document.getElementById('main_title').innerHTML;
34                this.dbGears = google.gears.factory.create('beta.database');
35                this.localServer = google.gears.factory.create('beta.localserver');
36                this.store = this.localServer.createStore('test-store');       
37                this.messages = null;
38                this.attachs = null;
39                this.url_attachs = null;
40               
41                this.open_conn();
42
43                var rs = this.dbGears.execute("select id_folder,folder_name from folders_sync where uid_usuario=?",[account_id]);
44                document.getElementById('main_title').innerHTML = get_lang("Creating folders structure");
45                while(rs.isValidRow()) {
46                        var temp = new Array();
47                        temp[0] = rs.field(0);
48                        temp[1] = rs.field(1);
49                        temp[2] = null;
50                        var rs2 = this.dbGears.execute("select mail.original_id from mail inner join folder on mail.id_folder=folder.rowid where folder.folder = ? and mail.uid_usuario=?",[temp[1]==get_lang('Inbox')?'Inbox':temp[1],account_id]);
51                        while(rs2.isValidRow()) {
52                                if(temp[2]==null)
53                                        temp[2]=rs2.field(0)+",";
54                                else
55                                        temp[2]+=rs2.field(0)+",";
56                                rs2.next();
57                        }
58                        this.folders.push(temp);
59                       
60                       
61                        //Criando estrutura de pastas...
62                        var folders_to_check = temp[0].split("/");//Todas as pastas tem ao menos INBOX/
63                        if (folders_to_check.length == 1)
64                                var actual_check = "Inbox";
65                        else {
66                                folders_to_check = folders_to_check.slice(1);
67                                var actual_check = folders_to_check[0];
68                        }
69                        for (var i in folders_to_check) {
70
71                                var rs2 = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?", [actual_check, account_id]);
72                               
73                                if (!rs2.isValidRow()) {
74                                        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)", [actual_check, account_id]);
75                                        ttreeBox.update_folder();
76                                }
77                                if(i+1<folders_to_check.length)
78                                        actual_check += "/"+folders_to_check[parseInt(i)+1];
79                        }
80
81                        rs.next();
82                }
83                this.dbGears.close();
84                this.syncronize_folders();
85        }
86       
87        mail_sync.prototype.syncronize_folders = function() {
88                if (this.folders.length == 0) {
89                        document.getElementById('main_title').innerHTML = get_lang("Deleting downloadeds msgs...");
90                        expresso_mail_sync.remove_archived_mails();
91                        return;
92                }
93                var folder_to_sync = this.folders.pop();
94                folder_to_sync[1] = folder_to_sync[0].toUpperCase()=="INBOX"?"Inbox":folder_to_sync[1];
95               
96                var start_sync_mails = function(data) {
97                        expresso_mail_sync.messages=data;
98                        document.getElementById('main_title').innerHTML = get_lang("Auto archiving")+" "+lang_folder(folder_to_sync[1])+": 0 / "+data.length;
99
100                        expresso_mail_sync.syncronize_mails(folder_to_sync[1]);
101                }
102                document.getElementById('main_title').innerHTML = get_lang("Starting to sync folder ")+lang_folder(folder_to_sync[1]);
103                cExecute("$this.imap_functions.msgs_to_archive&folder=" + folder_to_sync[0]+"&mails="+folder_to_sync[2] , start_sync_mails);
104        }
105       
106        mail_sync.prototype.syncronize_mails = function(folder_dest) {
107                if (expresso_mail_sync.messages == null || expresso_mail_sync.messages.length == 0) {
108                        expresso_mail_sync.syncronize_folders();
109                        return;
110                }
111               
112                msg_to_sync = expresso_mail_sync.messages.pop();
113               
114                //refresh loading
115                var value_to_change = document.getElementById('main_title').innerHTML.match(/\d+ \//);
116                value_to_change += "";
117                var new_value = value_to_change.replace(" /","");
118                new_value = parseInt(new_value) + 1;
119                document.getElementById('main_title').innerHTML = document.getElementById('main_title').innerHTML.replace(value_to_change,new_value+" /");
120               
121                msg_to_sync = connector.unserialize(msg_to_sync);
122                var source_msg = new Array();
123                source_msg['url'] = msg_to_sync.url_export_file;
124               
125                if (typeof(msg_to_sync['array_attach'])=='object'&&(msg_to_sync['array_attach'] instanceof Array))
126                        expresso_mail_sync.attachs = msg_to_sync['array_attach'].slice();
127                else
128                        expresso_mail_sync.attachs = new Array();
129                expresso_mail_sync.attachs.push(source_msg);
130                expresso_mail_sync.download_attachs(msg_to_sync,folder_dest);
131        }
132       
133        mail_sync.prototype.download_attachs = function(msg,folder_dest) {
134                if (expresso_mail_sync.attachs == null || expresso_mail_sync.attachs.length == 0) {
135                        expresso_mail_sync.insert_mail(msg, folder_dest);
136                        return;
137                }
138               
139                attach_to_capt = expresso_mail_sync.attachs.pop();
140               
141                var call_back = function(url,success,captureId) {
142                        //TODO: Tratar se houver erro ao baixar anexo...
143                        expresso_mail_sync.download_attachs(msg,folder_dest);
144                }
145                expresso_mail_sync.store.capture(attach_to_capt['url'],call_back);
146        }
147       
148        mail_sync.prototype.insert_mail = function(msg,folder) {
149               
150                try {
151                //      document.getElementById('div_menu_c3').innerHTML = document.getElementById('div_menu_c3').innerHTML.replace(/(\d+) de/,(((int)"$1")+1)+" de");
152//                      document.getElementById('div_menu_c3').innerHTML += expresso_mail_sync.messages.length + "restantes";
153                       
154                        expresso_mail_sync.open_conn();
155                       
156                        var msg_info = msg;
157                        var msg_header = msg['header'];
158                        var anexos = msg['array_attach'];
159                       
160                       
161                        var unseen = 0;
162                        var login = msg_info.login;
163                        var original_id = msg_info.msg_number;
164                        var original_folder = msg_info.msg_folder;
165                       
166                        //Os campos abaixo precisam estar isolados para busca de mensagens em cima deles.
167                        var from = connector.serialize(msg_info.from);
168                        var subject = msg_info.subject;
169                        var body = msg_info.body;
170                        var to = connector.serialize(msg_info.toaddress2);
171                        var cc = connector.serialize(msg_info.cc);
172                        var size = msg_header.Size;
173       
174                        //Zero os campos que foram isolados para não ter informações duplicadas
175                        msg_info.from = null;
176                        msg_info.subject = null;
177                        msg_info.body = null;
178                        msg_info.to = null;
179                        msg_info.cc = null;
180                        msg_header.Size=null;
181                       
182                        //A data no header pode vir como horário ao invés de data, caso o usuário tenha arquivado no mesmo
183                        //dia que recebeu a msg. Para esses casos, usar a data aux que vem com o dia.
184                        if(msg_header.udate.indexOf(":")!=-1) {
185                                msg_header.udate = msg_header.aux_date;
186                        }
187                       
188                        /**
189                         * The importance attribute can be empty, and javascript consider as null causing nullpointer.
190                         */
191                        if((msg_header.Importance == null) ||  (msg_header.Importance == ""))
192                                msg_header.Importance = "Normal";
193                       
194                        msg_header.aux_date = null; //esse dado não é mais preciso no email.
195                       
196                        var mail = connector.serialize(msg_info);
197                        var header = connector.serialize(msg_header);
198       
199                        var timestamp = msg_info.timestamp;
200                        var id_folder;
201                       
202                        var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?", [folder, account_id]);
203                        id_folder = rs.field(0);
204       
205                       
206                        if(msg_info.Unseen=="U")
207                                unseen = 1;
208                        this.dbGears.execute("insert into mail (mail,original_id,original_folder,header,timestamp,uid_usuario,unseen,id_folder,ffrom,subject,fto,cc,body,size) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[mail,original_id,original_folder,header,timestamp,login,unseen,id_folder,from,subject,to,cc,body,size]);
209                       
210                        //Preenche os anexos.
211                        var id_mail = this.dbGears.lastInsertRowId;
212
213                        for (var i = 0; i < anexos.length; i++) {
214                                this.dbGears.execute("insert into anexo (id_mail,nome_anexo,url,pid) values (?,?,?,?)", [id_mail, anexos[i]['name'],anexos[i]['url'],anexos[i]['pid']]);
215                        }
216                       
217                        if(preferences.keep_after_auto_archiving!=1)
218                                this.dbGears.execute("insert into msgs_to_remove (id_msg,folder,uid_usuario) values (?,?,?)",[original_id,original_folder,account_id]);
219                       
220                       
221                } catch (error) {
222                        //TODO: O que fazer se der erro ao baixar um email?
223                }
224                this.dbGears.close();
225                this.syncronize_mails(folder);
226        }
227       
228        mail_sync.prototype.remove_archived_mails = function() {
229               
230                expresso_mail_sync.open_conn();
231
232                var rs = this.dbGears.execute("select distinct(folder) from msgs_to_remove where uid_usuario=?",[account_id]);
233                if(rs.isValidRow()) {
234                        var folder_to_remove_msgs = rs.field(0);
235                        var rs2 = this.dbGears.execute("select id_msg from msgs_to_remove where folder=? and uid_usuario=?",[folder_to_remove_msgs,account_id]);
236                       
237                        var msgs = null;
238                        while(rs2.isValidRow()) {
239                                if(msgs==null)
240                                        msgs = rs2.field(0);
241                                else
242                                        msgs += ","+rs2.field(0);
243                                rs2.next();
244                        }
245                       
246                       
247                        var handler_delete_msgs = function(data){
248                                if (current_folder == data.folder) {
249                                        mail_msg = Element("tbody_box");
250                                        var msg_to_delete;
251                                        for (var i = 0; i < data.msgs_number.length; i++) {
252                                                msg_to_delete = Element(data.msgs_number[i]);
253                                                if (msg_to_delete) {
254                                                        mail_msg.removeChild(msg_to_delete);
255                                                }
256                                        }
257                                        Element('tot_m').innerHTML = parseInt(Element('tot_m').innerHTML) - data.msgs_number.length;
258                                }
259                                refresh();
260                                expresso_mail_sync.remove_archived_mails();
261                        }
262                       
263                        cExecute ("$this.imap_functions.delete_msgs&folder="+folder_to_remove_msgs+"&msgs_number="+msgs, handler_delete_msgs);
264                        this.dbGears.execute("delete from msgs_to_remove where folder=? and uid_usuario=?",[folder_to_remove_msgs,account_id]);
265                        this.dbGears.close();
266                       
267                }
268                else {
269                        this.dbGears.close();
270                        document.getElementById('main_title').innerHTML = get_lang("End of auto download messages");
271                        window.setTimeout("eval('document.getElementById(\"main_title\").innerHTML =expresso_mail_sync.main_title')",3000);
272                }
273               
274        }
275       
276        mail_sync.prototype.configure_sync = function(folders,formul) {
277                this.dbGears = google.gears.factory.create('beta.database');
278                this.localServer = google.gears.factory.create('beta.localserver');
279                this.store = this.localServer.createStore('test-store');       
280                this.dbGears.open('database-test');
281                this.dbGears.execute("delete from folders_sync where uid_usuario=?",[account_id]);
282                for (var i=0;i<folders.length;i++) {
283                        var pos = folders[i].value.indexOf("/");
284                        if(pos=="-1")
285                                var folder_name = folders[i].text;
286                        else
287                                var folder_name = folders[i].value.substr(pos+1);
288                        this.dbGears.execute("insert into folders_sync (id_folder,folder_name,uid_usuario) values (?,?,?)",[folders[i].value,folder_name,account_id]);
289                }
290                this.dbGears.close();
291                formul.submit();
292        }
293       
294        mail_sync.prototype.fill_combos_of_folders = function(combo_sync) {
295                var folders = expresso_local_messages.get_folders_to_sync();
296
297                for(var i=0;i<folders.length;i++) {
298                        var option = document.createElement('option');
299                        option.value = folders[i][0];
300                        if (folders[i][1].indexOf("/") != "-1") {
301                                final_pos = folders[i][1].lastIndexOf("/");
302                                option.text =folders[i][1].substr(final_pos+1);
303                        }
304                        else
305                                option.text = folders[i][1];
306                        try {
307                                combo_sync.add(option,null);
308                        }catch (ex) {// I.E
309                                combo_sync.add(option);
310                        }
311
312                }
313        }
314       
315        mail_sync.prototype.add_folder = function (select_sync_folders,select_available_folders)
316        {
317                var count_available_folders = select_available_folders.length;
318                var count_sync_folders = select_sync_folders.options.length;
319                var new_options = '';
320               
321                for (i = 0 ; i < count_available_folders ; i++)
322                {
323                        if (select_available_folders.options[i].selected)
324                        {
325                                if(document.all)
326                                {
327                                        if ( (select_sync_folders.innerHTML.indexOf('value='+select_available_folders.options[i].value)) == '-1' )
328                                        {
329                                                new_options +=  '<option value='
330                                                                        + select_available_folders.options[i].value
331                                                                        + '>'
332                                                                        + select_available_folders.options[i].text
333                                                                        + '</option>';
334                                        }
335                                }
336                                else
337                                {
338                                        if ( (select_sync_folders.innerHTML.indexOf('value="'+select_available_folders.options[i].value+'"')) == '-1' )
339                                        {
340                                                new_options +=  '<option value='
341                                                                        + select_available_folders.options[i].value
342                                                                        + '>'
343                                                                        + select_available_folders.options[i].text
344                                                                        + '</option>';
345                                        }
346                                }
347                        }
348                }
349       
350                if (new_options != '')
351                {
352                        select_sync_folders.innerHTML = '&nbsp;' + new_options + select_sync_folders.innerHTML;
353                        select_sync_folders.outerHTML = select_sync_folders.outerHTML;
354                }
355        }
356       
357        mail_sync.prototype.remove_folder = function(select_sync_folders)
358        {
359                for(var i = 0;i < select_sync_folders.options.length; i++)
360                        if(select_sync_folders.options[i].selected)
361                                select_sync_folders.options[i--] = null;
362        }
363       
364        var expresso_mail_sync;
365        expresso_mail_sync = new mail_sync();
366       
Note: See TracBrowser for help on using the repository browser.