source: trunk/expressoMail1_2/js/local_messages.js @ 670

Revision 670, 18.2 KB checked in by eduardoalex, 15 years ago (diff)

Ticket #413

Line 
1/**
2 * @author diogenes
3 */
4
5        function local_messages() {
6                this.dbGears = null;
7                this.localServer = null;
8                this.store = null;
9                this.fileSubmitter = null;
10        }
11
12        local_messages.prototype.init_local_messages = function(){
13                if(this.dbGears == null)
14                        this.dbGears = google.gears.factory.create('beta.database');
15                if(this.localServer==null)
16                        this.localServer = google.gears.factory.create('beta.localserver');
17                if(this.store==null)
18                        this.store = this.localServer.createStore('test-store');
19                if(this.fileSubmitter == null)
20                        this.fileSubmitter = this.store.createFileSubmitter();
21                       
22                this.dbGears.open('database-test');
23                this.dbGears.execute('create table if not exists folder (folder text,uid_usuario int,unique(folder,uid_usuario))');
24                this.dbGears.execute('create table if not exists mail' +
25                ' (mail blob,original_id int,original_folder text,header blob,timestamp int,uid_usuario int,unseen int,id_folder int,' +
26                ' ffrom text, subject text, fto text, cc text, body text, size int,unique (original_id,original_folder,uid_usuario))');
27                this.dbGears.execute('create table if not exists anexo' +
28                ' (id_mail int,nome_anexo text,url text,pid int)');
29
30                //some people that used old version of local messages could not have the size column. If it's the first version
31                //with local messages you're using in expresso, this part of code can be removed
32                try {
33                        this.dbGears.execute('alter table mail add column size int');
34                }catch(Exception) {
35                       
36                }
37                var rs = this.dbGears.execute('select rowid,header from mail where size is null');
38                while(rs.isValidRow()) {
39                        var temp = connector.unserialize(rs.field(1));
40                       
41                        this.dbGears.execute('update mail set size='+temp.Size+' where rowid='+rs.field(0));
42                        rs.next();
43                }
44                //end of temporary code
45        }
46       
47        local_messages.prototype.drop_tables = function() {
48                this.init_local_messages();
49                var rs = this.dbGears.execute('select url from anexo');
50                while(rs.isValidRow()) {
51                        this.store.remove(rs.field(0));
52                        rs.next();
53                }
54                this.dbGears.execute('drop table folder');
55                this.dbGears.execute('drop table mail');
56                this.dbGears.execute('drop table anexo');
57                this.finalize();
58        }
59       
60        local_messages.prototype.insert_mail = function(msg_info,msg_header,anexos,folder) {
61
62                try {
63                        this.init_local_messages();
64                        var unseen = 0;
65                        var login = msg_info.login;
66                        var original_id = msg_info.msg_number;
67                        var original_folder = msg_info.msg_folder;
68                       
69                        //This fields needs to be separeted to search.
70                        var from = connector.serialize(msg_info.from);
71                        var subject = msg_info.subject;
72                        var body = msg_info.body;
73                        var to = connector.serialize(msg_info.toaddress2);
74                        var cc = connector.serialize(msg_info.cc);
75                        var size = msg_header.Size;
76       
77                        //do not duplicate this information
78                        msg_info.from = null;
79                        msg_info.subject = null;
80                        msg_info.body = null;
81                        msg_info.to = null;
82                        msg_info.cc = null;
83                        msg_header.Size=null;
84                       
85                        //If the mail was archieved in the same date the user received it, the date cames with the time.
86                        //here I solved it
87                        if(msg_header.udate.indexOf(":")!=-1) {
88                                msg_header.udate = msg_header.aux_date;
89                        }
90                       
91                        /**
92                         * The importance attribute can be empty, and javascript consider as null causing nullpointer.
93                         */
94                        if((msg_header.Importance == null) ||  (msg_header.Importance == ""))
95                                msg_header.Importance = "Normal";
96                       
97                        msg_header.aux_date = null;
98                       
99                        var mail = connector.serialize(msg_info);
100                        var header = connector.serialize(msg_header);
101       
102                        var timestamp = msg_info.timestamp;
103                        var id_folder;
104       
105                        if((folder==null) || (folder=="local_root"))
106                                folder = "Inbox";
107                        else
108                                folder = folder.substr(6);//take off the word "local_"
109                       
110                        var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
111                       
112                        if(rs.isValidRow())
113                                id_folder=rs.field(0);
114                        else {
115                                this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",["Inbox",account_id]);
116                                id_folder = this.dbGears.lastInsertRowId;
117                        }
118                       
119                        if(msg_info.Unseen=="U")
120                                unseen = 1;
121                        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]);
122                        var call_back = function() {
123                        }
124                        this.store.capture(msg_info.url_export_file,call_back);
125                        var id_mail = this.dbGears.lastInsertRowId;
126       
127                        this.insert_attachments(id_mail,anexos);
128                        this.finalize();
129                        return true;
130                } catch (error) {
131                        this.finalize();
132                        return false;
133                }
134
135
136        }
137       
138        local_messages.prototype.get_local_mail = function(id_mail) {
139                this.init_local_messages();
140                var rs = this.dbGears.execute("select mail.rowid,mail.mail,mail.ffrom,mail.subject,mail.body,mail.fto,mail.cc,folder.folder from mail inner join folder on mail.id_folder=folder.rowid  where mail.rowid="+id_mail);
141                var retorno = null;
142                if(rs.isValidRow()) {
143                         retorno = rs.field(1);
144                }
145                retorno = connector.unserialize(retorno);
146               
147                retorno['from'] = connector.unserialize(rs.field(2));
148                retorno['subject'] = rs.field(3);
149                retorno['body'] = rs.field(4);
150                retorno['to'] = connector.unserialize(rs.field(5));
151                retorno['cc'] = connector.unserialize(rs.field(6));
152               
153                retorno['local_message'] = true;
154                retorno['msg_folder'] = "local_"+rs.field(7); //Now it's a local folder
155                retorno['msg_number'] = rs.field(0); //the message number is the rowid
156                this.finalize();
157                return retorno;
158        }
159
160        local_messages.prototype.insert_attachments = function(id_msg,anexos) {
161                //insert_mail already close and open gears.
162                for (var i = 0; i < anexos.length; i++) {
163                        this.dbGears.execute("insert into anexo (id_mail,nome_anexo,url,pid) values (?,?,?,?)", [id_msg, anexos[i]['name'],anexos[i]['url'],anexos[i]['pid']]);
164                        this.save_anexos(anexos[i]['url']);
165                }
166        }
167
168        local_messages.prototype.save_anexos = function (url) {
169                //insert_mail already close and open gears.
170                var call_back = function(url,success,captureId) {
171                                //alert("Capturado: " + url);
172                        }
173                //alert(url);
174                this.store.capture(url,call_back);
175        }
176
177        local_messages.prototype.get_local_range_msgs = function(folder,msg_range_begin,emails_per_page,sort,sort_reverse,search) {
178                this.init_local_messages();
179                var retorno = new Array();
180                msg_range_begin--;
181               
182                filter = " ";
183                if(search=="FLAGGED") {
184                        filter = "and (header like '%\"Flagged\";s:1:\"F%' or header like '%\"Importance\";s:5:\"High%') ";
185                }
186                if(search=="UNSEEN") {
187                        filter = "and unseen = 1 ";
188                }
189                if(search=="SEEN") {
190                        filter = "and unseen = 0 ";
191                }
192                if (search=="ANSWERED") {
193                        filter = "and header like '%\"Answered\";s:1:\"A%' ";
194                }
195                sql = 'select rowid,header,size,timestamp,unseen from (';
196                sql += 'select mail.rowid as rowid,mail.header as header,mail.size as size,mail.timestamp as timestamp,mail.unseen as unseen,ltrim(ltrim(substr(UPPER(ffrom),21,length(ffrom)),\':\'),\'"\') as order_from,mail.subject from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario=? and folder.folder=? and lower(mail.ffrom) not like lower(?) ';
197                sql += filter;
198                sql += 'union ';
199                sql += 'select mail.rowid as rowid,mail.header as header,mail.size as size,mail.timestamp as timestamp,mail.unseen as unseen,ltrim(ltrim(substr(UPPER(fto),7,length(fto)),\':\'),\'"\') as order_from,mail.subject from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario=? and folder.folder=? and lower(mail.ffrom) like lower(?) ';
200                sql += filter;
201                sql += ') order by '
202               
203                if(sort == 'SORTFROM') {
204                        sql += 'order_from ';
205                }
206                if(sort == 'SORTARRIVAL') {
207                        sql += 'timestamp ';
208                }
209                if(sort == 'SORTSIZE') {
210                        sql += 'size ';
211                }
212                if(sort == 'SORTSUBJECT') {
213                        sql += 'UPPER(subject) ';
214                }
215
216
217                sql+= sort_reverse==0?"ASC ":"DESC ";
218                sql +='limit ?,? ';
219
220
221                var rs = this.dbGears.execute(sql,[account_id,folder,'%'+Element("user_email").value+'%',account_id,folder,'%'+Element("user_email").value+'%',msg_range_begin,emails_per_page]);
222                var cont = 0;
223               
224                var rs3 = this.dbGears.execute('select count(*) from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario=? and folder.folder=?'+filter,[account_id,folder]);
225                               
226                while (rs.isValidRow()) {
227                        //var email = rs.field(1);
228                        var head = rs.field(1);
229                        var codigoMail = rs.field(0);
230                        var rs2 = this.dbGears.execute('select count(*) from anexo where id_mail = '+codigoMail);
231                        var head_unserialized = connector.unserialize(head);
232                        head_unserialized.Size = rs.field(2);
233                        if(rs.field(4)==1)
234                                head_unserialized.Unseen = 'U';         
235                       
236                        //var email_unserialized = connector.unserialize(email);
237                        retorno[cont] = head_unserialized;
238                        retorno[cont]['msg_number'] = codigoMail;
239                       
240                        cont++;
241                        rs.next();
242                }
243                retorno['num_msgs'] = rs3.field(0);
244                rs3.close();
245                rs.close();
246                if(cont>0)
247                        rs2.close();
248                this.finalize();
249                return retorno;
250        }
251       
252        local_messages.prototype.get_url_anexo = function(msg_number,pid) {
253                this.init_local_messages();
254
255                var retorno;
256                var rs = this.dbGears.execute("select url from anexo where id_mail="+msg_number+" and pid = '"+pid+"'");
257                retorno = rs.field(0)
258                this.finalize();
259               
260                return retorno;
261        }
262
263        local_messages.prototype.getInputFileFromAnexo = function (element,url) {
264                this.init_local_messages();
265                this.fileSubmitter.setFileInputElement(element,url);
266                this.finalize();
267        }
268
269        local_messages.prototype.finalize = function() {
270                this.dbGears.close();
271                this.dbGears = null;
272        }
273
274        local_messages.prototype.delete_msgs = function(msgs_number,border_ID) {
275                this.init_local_messages();
276                var rs = this.dbGears.execute("select url from anexo where id_mail in ("+msgs_number+")");
277                while(rs.isValidRow()) {
278                        this.store.remove(rs.field(0));
279                        rs.next();
280                }
281                this.dbGears.execute("delete from anexo where id_mail in ("+msgs_number+")");
282                this.dbGears.execute("delete from mail where rowid in ("+msgs_number+")");
283                this.finalize();
284                if (msgs_number.length == 1)
285                        write_msg(get_lang("The message was deleted."));
286                else
287                        write_msg(get_lang("The messages were deleted."));
288               
289                mail_msg = Element("tbody_box");
290
291                try {
292                        msgs_exploded = msgs_number.split(",");
293                }catch(error) {
294                        msgs_exploded = new Array();
295                        msgs_exploded[0] = msgs_number;
296                }
297                var msg_to_delete;
298                for (var i=0; i<msgs_exploded.length; i++){
299                        msg_to_delete = Element(msgs_exploded[i]);
300                        if (msg_to_delete){
301                                if ( (msg_to_delete.style.backgroundColor != '') && (preferences.use_shortcuts == '1') )
302                                        select_msg('null', 'down');
303                                mail_msg.removeChild(msg_to_delete);
304                        }
305                }
306                Element('chk_box_select_all_messages').checked = false;
307                if (border_ID != 'null')
308                        delete_border(border_ID,'false');
309               
310        }
311       
312        local_messages.prototype.get_source_msg = function(id_msg) {
313                this.init_local_messages();
314                var rs = this.dbGears.execute("select mail from mail where rowid="+id_msg);
315
316
317                mail = connector.unserialize(rs.field(0));             
318                download_local_attachment(mail.url_export_file)
319
320                this.finalize();
321        }
322       
323        local_messages.prototype.set_messages_flag = function(msgs_number, flag) {
324                this.init_local_messages();
325                var msgs_to_set;
326                if (msgs_number == 'get_selected_messages') {
327                        var msgs_to_set = get_selected_messages();
328                        msgs_to_set= msgs_to_set.split(",");
329                }
330                else { //Just one message
331                        msgs_to_set = new Array();
332                        msgs_to_set[0] = msgs_number;
333                }
334                for (var i in msgs_to_set) {
335               
336                        var rs = this.dbGears.execute("select header,unseen from mail where rowid=" + msgs_to_set[i]);
337                        header = connector.unserialize(rs.field(0));
338                        unseen = rs.field(1);
339                        if (flag == "unseen") {
340                                set_msg_as_unread(msgs_to_set[i]);
341                                header["Unseen"] = "U";
342                                unseen = 1;
343                        }
344                        else
345                                if (flag == "flagged") {
346                                        set_msg_as_flagged(msgs_to_set[i]);
347                                        header["Flagged"] = "F";
348                                }
349                                else
350                                        if (flag == "unflagged")
351                                                if (header["Importance"].indexOf("High") != -1)
352                                                        write_msg(get_lang("At least one of selected message cant be marked as normal"));
353                                                else {
354                                                        set_msg_as_unflagged(msgs_to_set[i]);
355                                                        header["Flagged"] = "N";
356                                                }
357                                        else
358                                                if (flag == "seen") {
359                                                        header["Unseen"] = "N";
360                                                        set_msg_as_read(msgs_to_set[i],true);
361                                                        unseen = 0;
362                                                }
363                        rs.close();
364                       
365                        if(Element("check_box_message_" + msgs_to_set[i]))
366                                Element("check_box_message_" + msgs_to_set[i]).checked = false;
367
368                        this.dbGears.execute("update mail set header='"+connector.serialize(header)+"',unseen="+unseen+" where rowid="+msgs_to_set[i]);                 
369                }
370                if(Element('chk_box_select_all_messages'))
371                        Element('chk_box_select_all_messages').checked = false;
372                this.finalize();
373
374        }
375       
376        local_messages.prototype.get_unseen_msgs_number = function() {
377                this.init_local_messages();
378                var rs = this.dbGears.execute("select count(*) from mail where unseen=1");
379                var retorno = rs.field(0);
380                rs.close();
381                this.finalize();
382                return retorno;
383        }
384
385        local_messages.prototype.create_folder = function(folder) {
386
387                if (folder.indexOf("local_") != -1)
388                        return false; //can't create folder with string local_
389
390                this.init_local_messages();
391                try {
392                        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",[folder,account_id]);
393                } catch (error) {
394                        this.finalize();
395                        throw error;
396                        return false;
397                }
398                this.finalize();
399                return true;
400        }
401
402        local_messages.prototype.list_local_folders = function(folder) {
403                this.init_local_messages();
404                var retorno = new Array();
405                rs = this.dbGears.execute("select folder.folder,sum(mail.unseen) from folder left join mail on "+
406                                "folder.rowid=mail.id_folder where folder.uid_usuario=? group by folder.folder",[account_id]);
407                while(rs.isValidRow()) {
408                        var temp = new Array();
409                        temp[0] = rs.field(0);
410                        temp[1] = rs.field(1);
411                        retorno.push(temp);
412                        rs.next();
413                }
414               
415                rs.close();
416                this.finalize();
417                return retorno;
418        }
419
420        local_messages.prototype.rename_folder = function(folder,old_folder) {
421                if (folder.indexOf("local_") != -1)
422                        return false; //can't create folder with string local_
423                this.init_local_messages();
424                try {
425                        this.dbGears.execute("update folder set folder=? where folder=? and uid_usuario=?",[folder,old_folder,account_id]);
426                } catch (error) {
427                        this.finalize();
428                        return false;
429                }
430                this.finalize();
431                return true;
432        }
433       
434        local_messages.prototype.remove_folder = function(folder) {
435                this.init_local_messages();
436                var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
437                var folder_id = rs.field(0);
438                rs.close();
439                this.dbGears.execute("delete from folder where rowid=?",[folder_id]);
440                rs = this.dbGears.execute("select rowid,mail from mail where id_folder=?",[folder_id]);
441                while(rs.isValidRow()) {
442                        var rs2 = this.dbGears.execute("select url from anexo where id_mail=?",[rs.field(0)]);
443                        while(rs2.isValidRow()) {
444                                this.store.remove(rs2.field(0));
445                                rs2.next();
446                        }
447                        rs2.close();
448                        this.dbGears.execute("delete from anexo where id_mail=?",[rs.field(0)]);
449                        var mail = connector.unserialize(rs.field(1));
450                        this.store.remove(mail.url_export_file);
451                        rs.next();
452                }
453                rs.close();
454                this.dbGears.execute("delete from mail where id_folder=?",[folder_id]);
455                this.finalize();
456        }
457
458        local_messages.prototype.move_messages = function(new_folder,msgs_number) {
459                this.init_local_messages();
460                var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[new_folder,account_id]);
461                var id_folder = rs.field(0);
462                rs.close();
463                this.dbGears.execute("update mail set id_folder="+id_folder+" where rowid in ("+msgs_number.toString()+")"); //usando statement nï¿œo tava funcionando quando tinha mais de um email...
464                this.finalize();
465        }
466       
467        local_messages.prototype.search = function(folders,filter) {
468                this.init_local_messages();
469                var filters = filter.replace(/##/g," ");
470                filters = filters.replace(/^ +| +$/g,"");
471                filters = filters.split("<=>");
472                var friendly_filters = new Array();
473                if (filters[0].indexOf('ALL') != -1) { //all filters...
474                        friendly_filters.push("SUBJECT");
475                        friendly_filters.push(filters[1]);
476                        friendly_filters.push("BODY");
477                        friendly_filters.push(filters[1]);
478                        friendly_filters.push("FROM");
479                        friendly_filters.push(filters[1]);
480                        friendly_filters.push("TO");
481                        friendly_filters.push(filters[1]);
482                        friendly_filters.push("CC");
483                        friendly_filters.push(filters[1]);                     
484                }
485                else {
486                        friendly_filters[0] = filters[0];
487                        for (var i in filters) {
488                                if (i != 0) {
489                                        var temp = filters[i].split(" ");
490                                        friendly_filters.push(temp[0]);
491                                        friendly_filters.push(temp[1]);
492                                }
493                        }
494                }
495                var sql = "select mail.header,folder.folder,mail.rowid,size from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario="+account_id + " and folder.folder in (";
496                for(var fnum in folders) {
497                        sql+="'"+folders[fnum]+"'";
498                        if(fnum<folders.length-1)
499                                sql+=",";
500                }
501                sql += ") and (";
502                for (var z=0;z<friendly_filters.length-1;z++) {
503                        if(z%2==0) {
504                                if (z != 0) {
505                                        if (filters[0].indexOf('ALL') != -1)
506                                                sql += " or";
507                                        else
508                                                sql += " and";
509                                }
510                                sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z])+" like '%"+friendly_filters[z+1]+"%'";
511                        }
512                }
513                sql += ")";
514                var rs = this.dbGears.execute(sql);
515                var retorno = "";
516                while(rs.isValidRow()) {
517                        var header = connector.unserialize(rs.field(0));
518                        retorno+="##"+"local_"+rs.field(1)+"--"+header["from"]["name"]+"--"+header["subject"]+"--"+header["udate"]+"--"+this.aux_convert_size(rs.field(3))+"--"+header["Unseen"]+header["Recent"]+header["Flagged"]+header["Draft"]+"--"+rs.field(2)+"##";
519                        rs.next();
520                }
521
522                this.finalize();
523                return retorno==""?false:retorno;
524
525        }
526       
527        local_messages.prototype.aux_convert_size = function(size) {
528                var tmp = Math.floor(size/1024);
529                if(tmp >= 1){
530                        return tmp + " kb";     
531                }else{
532                        return size + " b";     
533                }
534               
535        }
536       
537        local_messages.prototype.aux_convert_filter_field = function(filter) {
538                if((filter=="SUBJECT ") || (filter=="SUBJECT"))
539                        return "subject";
540                else if((filter=="BODY ") || (filter=="BODY"))
541                        return "body";
542                else if((filter=="FROM ") || (filter=="FROM"))
543                        return "ffrom";
544                else if((filter=="TO ") || (filter=="TO"))
545                        return "fto";
546                else if((filter=="CC ") || (filter=="CC"))
547                        return "cc";
548        }
549       
550        local_messages.prototype.has_local_mails = function() {
551                this.init_local_messages();
552                var rs = this.dbGears.execute("select rowid from folder limit 0,1");
553                var retorno;
554                if(rs.isValidRow())
555                        retorno = true;
556                else
557                        retorno = false;
558                this.finalize();
559                return retorno;
560        }
561       
562        var expresso_local_messages;
563        expresso_local_messages = new local_messages();
Note: See TracBrowser for help on using the repository browser.