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

Revision 5134, 70.1 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus, do modulo ExpressoMail?.

Line 
1/**
2 * @author diogenes
3 */
4
5function local_messages() {
6    this.dbGears = null;
7    this.localServer = null;
8    this.store = null;
9    this.filterSerch = "";
10    this.sortType = "";
11}
12
13function charOrdA (a, b){
14    var primeiro = a[0].toLowerCase();
15    var segundo = b[0].toLowerCase();
16    if (primeiro > segundo) return 1;
17    if (primeiro < segundo) return -1;
18    return 0;
19}
20function charOrdD(a, b){
21    a = a[0].toLowerCase();
22    b = b[0].toLowerCase();
23    if (a<b) return 1;
24    if (a>b) return -1;
25    return 0;
26}
27
28
29function HeaderFlags()
30{
31    this.Answered = 0;
32    //this.Draft = 0;
33    this.Flagged = 0;
34    this.Recent = 0;
35}
36
37HeaderFlags.prototype.getAnswered = function()
38{
39    return this.Answered;
40}
41
42HeaderFlags.prototype.setAnswered = function(answered)
43{
44    this.Answered = answered;
45}
46
47//HeaderFlags.prototype.getDraft = function()
48//{
49//    return this.Draft;
50//}
51
52HeaderFlags.prototype.setDraft = function(draft)
53{
54    this.Draft = draft;
55}
56
57HeaderFlags.prototype.getFlagged = function()
58{
59    return this.Flagged;
60}
61
62HeaderFlags.prototype.setFlagged = function(flagged)
63{
64    this.Flagged = flagged;
65}
66
67HeaderFlags.prototype.getRecent = function()
68{
69    return this.Recent;
70}
71
72HeaderFlags.prototype.setRecent = function(recent)
73{
74    this.Recent = recent;
75}
76
77function FlagsParser(headerObj)
78{
79    this.Header = headerObj;
80}
81
82FlagsParser.prototype.parse = function()
83{
84    var tmp = null;
85    if (typeof this.Header == 'string')
86    {
87        tmp = connector.unserialize(this.Header);
88    }
89    else
90    {
91        tmp = this.Header;
92    }
93
94    flags = new HeaderFlags();
95
96    if (tmp.Answered && tmp.Answered.match(/^A$/))
97    {
98        flags.setAnswered(1);
99    //if (tmp.Draft && tmp.Draft.match(/^X$/))
100    //{
101    //    flags.setDraft(1);
102    //}
103    }
104
105    if (tmp.Flagged && tmp.Flagged.match(/^F$/)){
106        flags.setFlagged(1);
107    }
108
109    if (tmp.Forwarded && tmp.Forwarded.match(/^F$/)){
110        flags.setAnswered(1);
111    //flags.setDraft(1);
112    }
113
114    if (tmp.Recent && tmp.Recent.match(/^R$/)){
115        flags.setRecent(1);
116    }
117
118    return flags;
119
120}
121
122local_messages.prototype.installGears = function (){
123   
124    var ua = navigator.userAgent.toLowerCase(); // captura o userAgent
125//     alert( parseFloat(ua.substring(ua.indexOf("firefox") + 8))  );
126    var is_ff = ( ua.indexOf("linux") != -1 || ua.indexOf("windows") != -1) &&
127                  ua.indexOf("mozilla") != -1 &&
128                ( ua.indexOf("firefox") != -1 && parseFloat(ua.substring(ua.indexOf("firefox") + 8)) <= 3.6 );
129
130    if ( is_ff )
131      ext = "xpi";
132    else
133    if( typeof is_ie !== "undefined" && is_ie )
134      ext = "exe"
135        else
136        return false;
137     
138    var confirmation = confirm(get_lang("To use local messages you have to install google gears. Would you like to install it now?"));
139
140    if ( confirmation && typeof(preferences.googlegears_url) != 'undefined' )
141            location.href = preferences.googlegears_url + "/gears." + ext;
142
143
144    return false;
145}
146
147local_messages.prototype.create_objects = function() {
148    if(window.google){
149        if (this.dbGears == null)
150            this.dbGears = google.gears.factory.create('beta.database');
151        if(this.localServer == null)
152            this.localServer = google.gears.factory.create('beta.localserver');
153        if(this.store == null)
154            this.store = this.localServer.createStore('test-store');
155    }
156}
157
158local_messages.prototype.init_local_messages = function(){ //starts only database operations
159               
160    if(this.dbGears==null || this.localServer==null || this.store == null)
161        this.create_objects();
162               
163    var db_in_other_use = true;
164    var start_trying = new Date().getTime();
165    while (db_in_other_use) {
166        try {
167            this.dbGears.open('database-test');
168            db_in_other_use = false;
169        }
170        catch (ex) {
171                                if(new Date().getTime()-start_trying>10000) { //too much time trying, throw an exception
172                                        throw ex;
173        }
174    }
175                }
176                       
177    //          this.dbGears.open('database-test');
178    this.dbGears.execute('create table if not exists folder (folder text,uid_usuario int,unique(folder,uid_usuario))');
179    this.dbGears.execute('create table if not exists mail' +
180        ' (mail blob,original_id int,original_folder text,header blob,timestamp int,uid_usuario int,unseen int,id_folder int,' +
181        ' ffrom text, subject text, fto text, cc text, body text, size int, visible bool default true, unique (original_id,original_folder,uid_usuario,id_folder))');
182    this.dbGears.execute('create table if not exists anexo' +
183        ' (id_mail int,nome_anexo text,url text,pid int, contentType text)');
184    this.dbGears.execute('create table if not exists folders_sync' +
185        ' (id_folder text,folder_name text,uid_usuario int)');
186    this.dbGears.execute('create table if not exists msgs_to_remove (id_msg int,folder text,uid_usuario int)');
187    this.dbGears.execute('create index if not exists idx_user3 on mail (id_folder,uid_usuario,timestamp)');
188    this.dbGears.execute('create INDEX if not exists idx_folder ON folder(uid_usuario,folder)');
189
190    //some people that used old version of local messages could not have the size column. If it's the first version
191    //with local messages you're using in expresso, this part of code can be removed
192    try {
193        this.dbGears.execute('alter table mail add column size int');
194    }
195    catch(Exception) {
196                       
197    }
198    try {
199        this.dbGears.execute('alter table mail add column visible bool default true');
200    }
201    catch(Exception) {
202    }
203    try {
204        this.dbGears.execute('alter table anexo add column contentType text');
205    }
206    catch(Exception) {
207    }
208
209
210    var rs = this.dbGears.execute('select rowid,header from mail where size is null');
211    while(rs.isValidRow()) {
212        var temp = connector.unserialize(rs.field(1));
213                       
214        this.dbGears.execute('update mail set size='+temp.Size+' where rowid='+rs.field(0));
215        rs.next();
216    }
217    //end of temporary code
218
219    try {
220        this.dbGears.execute('begin transaction');
221        this.dbGears.execute('alter table mail add column answered int');
222        //this.dbGears.execute('alter table mail add column draft int');
223        this.dbGears.execute('alter table mail add column flagged int');
224        this.dbGears.execute('alter table mail add column recent int');
225        //this.dbGears.execute('commit transaction');
226        //transaction_ended = true;
227        //if (transaction_ended){
228        rs = null;
229        rs = this.dbGears.execute('select rowid,header from mail');
230
231        // Popular os valores das novas colunas.
232        var tmp = null;
233        //this.dbGears.execute('begin transaction');
234        while(rs.isValidRow()) {
235            //tmp = connector.unserialize(rs.field(1));
236            parser = new FlagsParser(rs.field(1));
237            flags = parser.parse();
238
239            this.dbGears.execute('update mail set answered='+flags.getAnswered()+
240                ',flagged='+flags.getFlagged()+',recent='+flags.getRecent()+
241                //',draft='+flags.getDraft()+' where rowid='+rs.field(0));
242                ' where rowid='+rs.field(0));
243
244            rs.next();
245        }
246        this.dbGears.execute('commit transaction');
247
248    //tmp = null;
249
250    }catch(Exception) {
251        this.dbGears.execute('rollback transaction');
252    }
253
254}
255       
256local_messages.prototype.drop_tables = function() {
257    this.init_local_messages();
258    var rs = this.dbGears.execute('select url from anexo');
259    while(rs.isValidRow()) {
260        this.store.remove(rs.field(0));
261        rs.next();
262    }
263    this.dbGears.execute('drop table folder');
264    this.dbGears.execute('drop table mail');
265    this.dbGears.execute('drop table anexo');
266    this.finalize();
267}
268       
269sync = { length: 0, fails: [], success: [], mails: {}, archived: [] };
270
271local_messages.prototype.insert_mails = function( msgs_info, folder, complete ){
272 
273    sync.length += msgs_info.length;
274   
275    write_msg( ( sync.archived.length ?  sync.archived.length + " mensagens ja arquivadas anteriormente, " : "" )
276              + "Preparando o arquivamento de "+sync.length+ " mensagens...", true );
277
278    for( var i = 0; i < msgs_info.length; i++ )
279    {     
280        var original = url = DEFAULT_URL + "$this.exporteml.export_eml.raw&folder=" + msgs_info[i].msg_folder
281        + "&msgs_to_export=" + msgs_info[i].msg_number;
282
283        msgs_info[i].url_export_file = url;
284        msgs_info[i].dest_folder = folder;
285
286        for( var ii = 0; ii < msgs_info[i].array_attach.length; ii++ )
287        {
288            var anexo = msgs_info[i].array_attach[ii];
289
290            anexo.url = "inc/get_archive.php?msgFolder=" + msgs_info[i].msg_folder + "&msgNumber=" + msgs_info[i].msg_number + "&indexPart=" + anexo.pid;
291
292            msgs_info[i].array_attach[ii] = anexo;
293
294            sync.mails[ anexo.url ] = url;
295
296            url = anexo.url;
297        }
298
299        sync.mails[ original ] = parseInt( this.store_mail( msgs_info[i] ) );
300
301        this.capture( url, complete );
302    }
303   
304    write_msg( ( sync.archived.length ?  sync.archived.length + " mensagens ja arquivadas anteriormente, " : "" )
305              + "arquivando " + sync.length + " mensagens...", true );
306}
307
308local_messages.prototype.checkArchived = function( msgsNumber, folder ){
309   
310    var levels = [], newtree = [];
311   
312    for( var i = 0; i < oldtree.length; i++ ){
313     
314      var element = oldtree[i];
315     
316      var current = element.parent, hierarchy = [];
317     
318      while( !levels[ current.id ] )
319      {
320          levels[ current.id ] = [];
321         
322          hierarchy.push( current.id );
323
324          for( var ii = 0; ii < hierarchy.length; ii++ )
325            levels[ hierarchy[ii] ].push( 0 );
326
327          current = current.parent;
328      }
329     
330      var parent = newtree;
331         
332      for( var ii = 0; ii < levels[ element.parent ].length; ii++ )
333            parent = parent[ levels[element.parent][ii] ];
334     
335      parent[ levels[ element.id ] = parent.length ] = element;
336    }
337}
338
339local_messages.prototype.checkArchived = function( msgsNumber, folder ){
340   
341    var isArray = false;
342 
343    if( msgsNumber.join ){
344        isArray = true;
345        msgsNumber = msgsNumber.join(",");
346    }
347
348    var archived = this.isArchived( msgsNumber, folder );
349   
350    if( !archived )
351        return( isArray ? msgsNumber.split(",") : msgsNumber );
352
353    msgsNumber = "," + msgsNumber;
354   
355    for( var i = 0; i < archived.length; i++ ){
356        sync.archived[ sync.archived.length ] = archived[i];
357        msgsNumber = msgsNumber.replace( "," + archived[i], "" );
358    }
359   
360    if( !msgsNumber )
361        this.cleanup();
362
363    return( isArray ? msgsNumber.substr(1).split(",") :
364                    ( msgsNumber ? msgsNumber.substr(1) : msgsNumber ));
365}
366
367local_messages.prototype.isArchiving = function( msgsNumber, folder ){
368    return this.isArchived( msgsNumber, folder, true );
369}
370
371local_messages.prototype.isArchived = function( msgsNumber, folder, archiving ){
372 
373    if( msgsNumber.join )
374        msgsNumber = msgsNumber.join(",");
375   
376    folder = this.get_folder_id( folder );
377   
378    var archived = [];
379 
380  try{
381      this.init_local_messages();
382
383      var sql = "select original_id from mail where id_folder = ? and original_id IN ("+msgsNumber+")" + ( archiving ? " and visible = ?" : "" );
384      var params = archiving ? [ folder, false ]: [ folder ];
385     
386      if(folder != false){
387                for( var rs = this.dbGears.execute(sql, params); rs.isValidRow() || rs.close(); rs.next() ){
388                        archived[ archived.length ] = rs.field(0);
389                }
390        }
391    }
392    catch( error ){
393                //Removido alert pois o método
394                //é usado quando move mensagens entre pastas
395 //     alert( error );
396      return( false );
397    }
398    finally{
399      this.finalize();
400    }
401   
402    return( archived.length ? archived : false );
403}
404
405local_messages.prototype.capture = function( uri, complete ){
406
407    var _this = this;
408
409    var callback = function( url, ok ){
410
411        //check if its a chained attachment url.
412        if( typeof sync.mails[url] === "string" )
413        {
414            var content = _this.get_src( url );
415
416            //if its successful, continue to capture the chain
417            if( ok = ok || content )
418                return _this.capture( sync.mails[url], complete );
419
420            //If it's not, don't need to continue loading the attachments.
421            //Just break the chain, search the last one chained (the message url) and finalize the process
422            while( sync.mails[url].length )
423                    url = sync.mails[url];
424        }
425
426        sync[ ok ? 'success' : 'fails' ].push( sync.mails[url] );
427
428        sync.length--;
429
430        if( sync.length )
431            return write_msg( ( sync.archived.length ?  sync.archived.length + " mensagens ja arquivadas anteriormente, " : "" )
432                              + "arquivando " + sync.length + " mensagens...", true );
433
434        clean_msg();
435        write_msg( ( sync.success.length ? "Foram arquivadas corretamente " + sync.success.length + " mensagens" : "Nenhuma mensagem arquivada" )
436                 + ( sync.archived.length ? ", " + sync.archived.length + " mensagens ja arquivadas anteriormente" : "" )
437                 + ( sync.fails.length ? ", " + sync.fails.length + " falharam" : "" ) + "." );
438
439        _this.update_mails( sync.success, sync.fails, complete );
440    }
441
442    try{
443        this.init_local_messages();
444        this.store.capture( uri, callback );
445    }
446    catch( error ){
447        console && console.log(error);
448    }
449    finally{
450        this.finalize();
451    }
452}
453
454local_messages.prototype.store_mail = function( msg_info ){
455
456    var id_mail = false;
457 
458    try {
459
460            var id_folder = this.get_folder_id( msg_info.dest_folder );
461     
462            this.init_local_messages();
463
464            //This fields needs to be separeted to search.
465            var msg_header = msg_info.header;
466            var anexos = msg_info.array_attach;
467            var login = msg_info.login;
468            var original_id = msg_info.msg_number;
469            var original_folder = msg_info.msg_folder;
470            var subject = msg_info.subject;
471            var body = msg_info.body;
472            var timestamp = msg_info.timestamp;
473            var size = msg_header.Size;
474            var from = connector.serialize(msg_info.from);
475            var to = connector.serialize(msg_info.toaddress2);
476            var cc = connector.serialize(msg_info.cc);
477            var unseen = (msg_info.Unseen == "U" )? 1 : 0;
478
479            //If the mail was archieved in the same date the user received it, the date cames with the time.
480            //here I solved it
481            msg_header.udate = (String(msg_header.udate).indexOf(":")==-1)? msg_header.udate : msg_header.aux_date;
482            // The importance attribute can be empty, and javascript consider as null causing nullpointer.
483            msg_header.Importance = msg_header.Importance || "Normal";
484
485            //do not duplicate this information
486            msg_info.from = null;
487            msg_info.subject = null;
488            msg_info.body = null;
489            msg_info.to = null;
490            msg_info.cc = null;
491            msg_header.Size=null;
492            msg_header.aux_date = null;
493
494            var mail = connector.serialize(msg_info);
495            var header = connector.serialize(msg_header);
496
497            //parse header
498            var parser = new FlagsParser(msg_header);
499            var flags = parser.parse();
500
501            this.dbGears.execute("insert into mail (mail,original_id,original_folder,header,timestamp,uid_usuario,unseen,id_folder,ffrom,subject,fto,cc,body,size,answered,flagged,recent, visible) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
502                                                   [mail,original_id,original_folder,header,timestamp,login,unseen,id_folder,from,subject,to,cc,body,size,flags.getAnswered(),flags.getFlagged(),flags.getRecent(), false]);
503
504            id_mail = this.dbGears.lastInsertRowId;
505
506            //insert_mail already close and open gears.
507            for (var i = 0; i < anexos.length; i++)
508                this.dbGears.execute("insert into anexo (id_mail,nome_anexo,url,pid) values (?,?,?,?)",
509                                                        [id_mail, anexos[i]['name'],anexos[i]['url'],anexos[i]['pid']]);
510    }
511    catch (error) {
512        return( false );
513    }
514    finally{
515        this.finalize();
516    }
517
518    return( id_mail );
519}
520
521local_messages.prototype.get_folder_id = function( folder ){
522
523    var id_folder;
524   
525    folder = ( folder && folder != "local_root" )? folder.substr(6) : "Inbox";
526 
527    try
528    {
529        this.init_local_messages();
530
531        var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
532
533        if(rs.isValidRow())
534              id_folder = rs.field(0);
535        else {
536              this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",["Inbox",account_id]);
537              id_folder = this.dbGears.lastInsertRowId;
538        }
539       
540        rs.close();
541    }
542    catch( error ){
543        return( false );
544    }
545    finally{
546        this.finalize();
547    }
548
549    return( id_folder );
550}
551
552local_messages.prototype.update_mails = function( success, fails, callback ){
553    try
554    {           
555      this.init_local_messages();
556     
557      this.dbGears.execute('update mail set visible=? where rowid IN (' + success.join(",") + ')',[ true ]);
558
559      var sql = 'select url, contentType from anexo where id_mail = ' +success;
560
561      for( var rs = this.dbGears.execute(sql); rs.isValidRow() || rs.close(); rs.next() )
562      {
563                var url = rs.field(0), contentType = rs.field(1);
564                var blob = this.store.getAsBlob( url );
565         
566                this.store.captureBlob( blob, url + "&image=thumbnail", "image/jpeg" );
567                this.store.captureBlob( blob, url + "&image=true", "image/jpeg" );
568      }
569    }
570    catch (error) {
571                status = false;
572    }
573    finally{
574                this.finalize();
575    }
576   
577    if( callback )
578                callback( success, fails );
579                this.cleanup();
580   
581    return( status );
582}
583
584local_messages.prototype.cleanup = function(){
585
586  try{
587    this.init_local_messages();
588   
589    this.dbGears.execute('delete from mail where visible=?', [ false ]);
590   
591    sync.success = [], sync.fails = [], sync.archived = [], sync.mails = {};
592  }
593  catch(error){
594    return( false );
595  }
596  finally{
597    this.finalize();
598  }
599 
600  return( true );
601}
602
603
604
605local_messages.prototype.select_mail = function( columns, rowIds ){
606 
607    try
608    {
609        this.init_local_messages();
610       
611        if( rowIds.join )
612            rowIds = rowIds.join( "," );
613       
614        if( columns.join )
615            columns = columns.join( "," );
616
617        var sql = 'select '+columns+' from mail where rowid IN (' + rowIds + ')';
618       
619        var result = [];
620
621        for( var i = 0, rs = this.dbGears.execute(sql); rs.isValidRow() || rs.close() || delete ii; rs.next( i++ ) )
622
623            for( ii = 0, result[i] = {}; ii < rs.fieldCount(); ii++ )
624
625                  result[i][ rs.fieldName( ii ) ] = rs.field( ii );
626
627    }
628    catch (error) {
629        status = false;
630    }
631    finally{
632        this.finalize();
633    }
634 
635    if( result.length === 1 )
636        result = result[0];
637   
638    return( result );
639}
640
641local_messages.prototype.insert_mail = function(msg_info,msg_header,anexos,folder) {
642    try {
643        this.init_local_messages();
644        var unseen = 0;
645        var login = msg_info.login;
646        var original_id = msg_info.msg_number;
647        var original_folder = msg_info.msg_folder;
648                       
649        //This fields needs to be separeted to search.
650        var from = connector.serialize(msg_info.from);
651        var subject = msg_info.subject;
652        var body = msg_info.body;
653        var to = connector.serialize(msg_info.toaddress2);
654        var cc = connector.serialize(msg_info.cc);
655        var size = msg_header.Size;
656       
657        //do not duplicate this information
658        msg_info.from = null;
659        msg_info.subject = null;
660        msg_info.body = null;
661        msg_info.to = null;
662        msg_info.cc = null;
663        msg_header.Size=null;
664        //If the mail was archieved in the same date the user received it, the date cames with the time.
665        //here I solved it
666        if(msg_header.udate.indexOf(":")!=-1) {
667            msg_header.udate = msg_header.aux_date;
668        }
669                       
670        /**
671                         * The importance attribute can be empty, and javascript consider as null causing nullpointer.
672                         */
673        if((msg_header.Importance == null) ||  (msg_header.Importance == ""))
674            msg_header.Importance = "Normal";
675                       
676        msg_header.aux_date = null;
677                       
678        var mail = connector.serialize(msg_info);
679        var header = connector.serialize(msg_header);
680       
681        var timestamp = msg_info.timestamp;
682        var id_folder;
683       
684        if((folder==null) || (folder=="local_root"))
685            folder = "Inbox";
686        else
687            folder = folder.substr(6);//take off the word "local_"
688                       
689        var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
690        if(rs.isValidRow())
691            id_folder=rs.field(0);
692        else {
693            this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",["Inbox",account_id]);
694            id_folder = this.dbGears.lastInsertRowId;
695        }
696                       
697        if(msg_info.Unseen=="U")
698            unseen = 1;
699
700        //parse header
701        parser = new FlagsParser(msg_header);
702        flags = parser.parse();
703
704        //insere o e-mail
705        //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]);
706        this.dbGears.execute("insert into mail (mail,original_id,original_folder,header,timestamp,uid_usuario,unseen,id_folder,ffrom,subject,fto,cc,body,size,answered,flagged,recent) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[mail,original_id,original_folder,header,timestamp,login,unseen,id_folder,from,subject,to,cc,body,size,flags.getAnswered(),flags.getFlagged(),flags.getRecent()]);
707        var call_back = function() {
708        }
709        this.store.capture(msg_info.url_export_file,call_back);
710        var id_mail = this.dbGears.lastInsertRowId;
711       
712        this.insert_attachments(id_mail,anexos);
713        this.finalize();
714        return true;
715    } catch (error) {
716        this.finalize();
717        return false;
718    }
719
720
721}
722       
723/**
724         * check if ID is no from main tab, if it's from main returns false, else
725         * returns an array with all string in position 0, the mail id in position 1
726         * and the part of string relative to tab in position 2
727         * @param {Object} id_mail
728         */
729local_messages.prototype.parse_id_mail = function(id_mail) {
730    if (this.isInt(id_mail))
731        return false;
732               
733    var matches = id_mail.match(/(.+)(_[a-zA-Z0-9]+)/);
734    return matches;
735}
736       
737local_messages.prototype.isInt = function(x) {
738    var y=parseInt(x);
739    if (isNaN(y)) return false;
740    return x==y && x.toString()==y.toString();
741}
742       
743local_messages.prototype.get_local_mail = function(id_mail) {
744    this.init_local_messages();
745
746    var plus_id = '';
747    var matches = '';
748    if(matches = this.parse_id_mail(id_mail)) { //Mails coming from other tab.
749        id_mail = matches[1];
750        plus_id = matches[2];
751    }
752               
753    var rs = this.dbGears.execute("select mail.rowid,mail.mail,mail.ffrom,mail.subject,mail.body,mail.fto,mail.cc,folder.folder,mail.original_id from mail inner join folder on mail.id_folder=folder.rowid  where mail.rowid="+id_mail);
754    var retorno = null;
755    if(rs.isValidRow()) {
756        retorno = rs.field(1);
757    }
758    retorno = connector.unserialize(retorno);
759
760    //alert('tipo retorno.source: ' + typeof(retorno.source));
761
762    if (typeof(retorno.source) == 'string')
763    {
764        retorno.msg_number=rs.field(0)+plus_id;
765        retorno.original_ID=rs.field(8);
766        retorno.msg_folder=rs.field(7);
767
768    //alert('tipo retorno: '+typeof(retorno))
769    //show_msg(retorno);
770    }
771    else
772    {
773        retorno['from'] = connector.unserialize(rs.field(2));
774        retorno['subject'] = rs.field(3);
775        retorno['body'] = rs.field(4);
776        //Codigo que as imagens embutidas em emails (com multipart/related ou multipart/mixed) sejam corretamente mostradas em emails arquivados. Os links do
777        //tipo "./inc/show_embedded_attach.php?msg_folder=[folder]&msg_num=[msg_num]&msg_part=[part]"
778        //são substituidos pelos links dos anexos capturados pelo gears.
779
780        var thumbs= retorno.thumbs;
781        var anexos= retorno.array_attach;
782        for (i in anexos)
783        {
784            if(anexos[i]['url'] && anexos[i]['url'].match(/((jpg)|(jpeg)|(png)|(gif)|(bmp))/gi))
785            {
786                var er_imagens = new RegExp("\\.\\/get_archive.php\\?msgFolder=[\\w/]+\\&msgNumber=[0-9]+\\&indexPart="+(anexos[i]['pid']-1));
787                var Result_imagens = er_imagens.exec(retorno['body']);
788                retorno['body'] = retorno['body'].replace(Result_imagens,anexos[i]['url']);
789                if(thumbs && thumbs[i]){
790                    er_imagens = new RegExp("\\.\\/inc\\/get_archive.php\\?&&msgFolder=[\\w/%]+\\msgNumber=[0-9]+\\&indexPart=0."+(anexos[i]['pid']-1)+"&image=thumbnail");
791                    Result_imagens = er_imagens.exec(thumbs[i]);
792                    thumbs[i] = thumbs[i].replace(Result_imagens,"'"+anexos[i]['url']+"'");
793                    er_imagens = new RegExp("\\.\\/inc\\/get_archive.php\\?&msgFolder=[\\w/%]+\\msgNumber=[0-9]+\\&indexPart=0."+(anexos[i]['pid']-1)+"&image=true");
794                    Result_imagens = er_imagens.exec(thumbs[i]);
795                    thumbs[i] = thumbs[i].replace(Result_imagens,anexos[i]['url']);
796                    thumbs[i] = thumbs[i].replace(/<IMG/i,'<img width="120"');
797                }
798            }
799        }
800
801        retorno['to'] = connector.unserialize(rs.field(5));
802        retorno['cc'] = connector.unserialize(rs.field(6));
803
804        retorno['local_message'] = true;
805        retorno['msg_folder'] = "local_"+rs.field(7); //Now it's a local folder
806        retorno['msg_number'] = rs.field(0)+plus_id; //the message number is the rowid
807
808    }
809
810    rs.close();
811    this.finalize();
812    return retorno;
813}
814
815local_messages.prototype.insert_attachments = function(id_msg,anexos) {
816    //insert_mail already close and open gears.
817    for (var i = 0; i < anexos.length; i++) {
818        this.dbGears.execute("insert into anexo (id_mail,nome_anexo,url,pid) values (?,?,?,?)", [id_msg, anexos[i]['name'],anexos[i]['url'],anexos[i]['pid']]);
819        this.capt_url(anexos[i]['url']);
820    }
821}
822
823local_messages.prototype.capt_url = function (url) {
824    //insert_mail already close and open gears.
825    var call_back = function(url,success,captureId) {
826    //alert("Capturado: " + url);
827    }
828    //alert(url);
829    this.store.capture(url,call_back);
830}
831
832local_messages.prototype.strip_tags = function (str) {
833    return str.replace(/<\/?[^>]+>/gi, '');
834}
835
836local_messages.prototype.get_local_range_msgs = function(folder,msg_range_begin,emails_per_page,sort,sort_reverse,search,preview_msg_subject,preview_msg_tip) {
837
838    this.init_local_messages();
839    var retorno = new Array();
840    msg_range_begin--;
841               
842    mail_filter = " ";
843    if(search=="FLAGGED") {
844        mail_filter = "and (header like '%\"Flagged\";s:1:\"F%' or header like '%\"Importance\";s:5:\"High%') ";
845    }
846    if(search=="UNSEEN") {
847        mail_filter = "and unseen = 1 ";
848    }
849    if(search=="SEEN") {
850        mail_filter = "and unseen = 0 ";
851    }
852    if (search=="ANSWERED") {
853        mail_filter = "and header like '%\"Answered\";s:1:\"A%' ";
854    }
855               
856        sql = 'select mail.rowid as rowid,mail.header as header,mail.size as size,' +
857    'mail.timestamp as timestamp,mail.unseen as unseen,mail.body as body, mail.mail as mail, ' +
858    'case when lower(mail.ffrom) like ? then ' +
859    'case when ltrim(ltrim(substr(UPPER(fto),7,length(fto)),\':\'),\'"\') like \'5:%\' then ' +
860    'substr(ltrim(ltrim(substr(UPPER(fto),7,length(fto)),\':\'),\'"\'),17) ' +
861    'else ' +
862    'ltrim(ltrim(substr(UPPER(fto),7,length(fto)),\':\'),\'"\') ' +
863    'end ' +
864    'else ' +
865    'case when ltrim(ltrim(substr(UPPER(ffrom),21,length(ffrom)),\':\'),\'"\')  like \'5:%\' then ' +
866    'substr(ltrim(ltrim(substr(UPPER(ffrom),21,length(ffrom)),\':\'),\'"\'),17) ' +
867    'else ' +
868    'ltrim(ltrim(substr(UPPER(ffrom),21,length(ffrom)),\':\'),\'"\') ' +
869    'end ' +
870    'end as order_from,mail.subject from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario=? and folder.folder=? and mail.visible=? ' +
871    mail_filter + ' order by ';
872               
873    if(sort == 'SORTFROM') {
874        sql += 'order_from ';
875    }
876    if(sort == 'SORTARRIVAL') {
877        sql += 'timestamp ';
878    }
879    if(sort == 'SORTSIZE') {
880        sql += 'size ';
881    }
882    if(sort == 'SORTSUBJECT') {
883        sql += 'UPPER(subject) ';
884    }
885
886
887    sql+= sort_reverse==0?"ASC ":"DESC ";
888    sql +='limit ?,? ';
889
890
891    var rs = this.dbGears.execute(sql,['%'+Element("user_email").value+'%',account_id,folder,true,msg_range_begin,emails_per_page]);
892    var cont = 0;
893               
894    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=? and mail.visible=?'+mail_filter,[account_id,folder,true]);
895                               
896    while (rs.isValidRow()) {
897        //var email = rs.field(1);
898        var head = rs.field(1);
899        var codigoMail = rs.field(0);
900        var mail = rs.field(6);
901
902        var msg_body = rs.field(5);//recebe o conteudo da coluna "body" do banco de dados;
903
904        var rs2 = this.dbGears.execute('select count(*) from anexo where id_mail = '+codigoMail);
905        var head_unserialized = connector.unserialize(head);
906        var mail_unserialized = connector.unserialize(mail);
907
908      head_unserialized.Size = rs.field(2);
909        if(rs.field(4)==1)
910            head_unserialized.Unseen = 'U';
911                       
912
913        head_unserialized.subject=(head_unserialized.subject==null)?"":unescape(head_unserialized.subject);
914
915        //var email_unserialized = connector.unserialize(email);
916        retorno[cont] = head_unserialized;
917        retorno[cont]['msg_number'] = codigoMail;
918        retorno[cont]['msg_day'] = mail_unserialized.msg_day;
919        retorno[cont]['msg_hour'] = mail_unserialized.msg_hour;
920        //declaracao do array() para receber o body de cada mensagem encontrada na busca sql realizada;
921
922        retorno[cont]['msg_sample'] = new Array();
923            retorno[cont]['msg_sample']['body'] = "";
924
925
926        cont++;
927        rs.next();
928    }
929    retorno['num_msgs'] = rs3.field(0);
930    rs3.close();
931    rs.close();
932    if(cont>0)
933        rs2.close();
934    this.finalize();
935    return retorno;
936}
937       
938local_messages.prototype.get_url_anexo = function(msg_number,pid) {
939    this.init_local_messages();
940    var matches = '';
941    if(matches = this.parse_id_mail(msg_number)) {
942        msg_number = matches[1];
943    }
944               
945    var retorno;
946    var rs = this.dbGears.execute("select url from anexo where id_mail="+msg_number+" and pid = '"+pid+"'");
947    retorno = rs.field(0);
948    this.finalize();
949               
950    return retorno;
951}
952
953local_messages.prototype.getInputFileFromAnexo = function (element,url) {
954    this.init_local_messages();
955    fileSubmitter = this.store.createFileSubmitter();
956    fileSubmitter.setFileInputElement(element,url);
957    this.finalize();
958}
959
960local_messages.prototype.finalize = function() {
961    if(this.dbGears)
962    this.dbGears.close();
963    this.dbGears = null;
964}
965
966local_messages.prototype.remove_msgs = function(msgs_number)
967{
968    this.init_local_messages();
969         
970    var rs = this.dbGears.execute("select url from anexo where id_mail in ("+msgs_number+")");
971    while(rs.isValidRow()) {
972        this.store.remove(rs.field(0));
973        rs.next();
974    }
975    this.dbGears.execute("delete from anexo where id_mail in ("+msgs_number+")");
976    this.dbGears.execute("delete from mail where rowid in ("+msgs_number+")");
977    this.finalize();
978}
979               
980local_messages.prototype.delete_msgs = function(msgs_number,border_ID) {
981
982        if(!msgs_number)
983                msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
984   
985        if(msgs_number === ""){
986                 write_msg(get_lang('No selected message.'));
987                 return;
988        }
989
990    this.remove_msgs( msgs_number );
991       
992    mail_msg = Element("tbody_box");   
993    try {
994        msgs_exploded = msgs_number.split(",");
995    }catch(error) {
996        msgs_exploded = new Array();
997        msgs_exploded[0] = msgs_number;
998    }
999        this.previous = 0;
1000    var msg_to_delete;
1001    for (var i=0; i<msgs_exploded.length; i++){
1002        msg_to_delete = Element(msgs_exploded[i]);
1003        if (msg_to_delete){
1004            if ( (msg_to_delete.style.backgroundColor != '') && (preferences.use_shortcuts == '1') )
1005                select_msg('null', 'down');
1006            if (parseInt(preferences.delete_and_show_previous_message) && msg_to_delete && currentTab.toString().indexOf("_r") > 0)
1007                for(var ii=0; ii < mail_msg.rows.length; ii++){
1008                        if(mail_msg.rows[ii] === msg_to_delete){
1009                                if(ii == 0){
1010                                        break;
1011                                }else{
1012                                        this.previous = mail_msg.rows[(ii - 1)].attributes[0];
1013                                        this.previous = parseInt(this.previous.value);
1014                                        break;
1015                                }
1016                        }
1017                }
1018               
1019            mail_msg.removeChild(msg_to_delete);
1020                Element('tot_m').innerHTML = parseInt(Element('tot_m').innerHTML) - 1;
1021        }
1022        }
1023        if (msgs_exploded.length == 1){
1024        write_msg(get_lang("The message was deleted."));
1025    }
1026    else
1027        write_msg(get_lang("The messages were deleted."));
1028    Element('chk_box_select_all_messages').checked = false;
1029               
1030         if (parseInt(preferences.delete_and_show_previous_message) && msg_to_delete && this.previous){
1031                proxy_mensagens.get_msg(this.previous, folder, true, show_msg);
1032        }else if(currentTab != 0){
1033                delete_border(currentTab,'false');
1034        }
1035}
1036       
1037local_messages.prototype.get_source_msg = function(id_msg) {
1038    this.init_local_messages();
1039    var rs = this.dbGears.execute("select mail from mail where rowid="+id_msg);
1040
1041
1042    mail = connector.unserialize(rs.field(0));
1043    download_local_attachment(mail.url_export_file)
1044
1045    this.finalize();
1046}
1047       
1048       
1049       
1050local_messages.prototype.set_messages_flag = function(msgs_number, flag) {
1051    this.init_local_messages();
1052        var no_errors = true;
1053    var msgs_to_set;
1054        var one_message = false;
1055    if (msgs_number == 'get_selected_messages') {
1056                var msgs_to_set = get_selected_messages();
1057                msgs_to_set= msgs_to_set.split(",");
1058    }
1059    else { //Just one message
1060            one_message = true;
1061                msgs_to_set = new Array();
1062                msgs_to_set[0] = msgs_number;
1063    }
1064    for (var i in msgs_to_set) {
1065                       
1066        var matches = '';//Messages comming from other tabs.
1067        if(matches = this.parse_id_mail(msgs_to_set[i])) {
1068            msgs_to_set[i] = matches[1];
1069        }
1070                       
1071        var rs = this.dbGears.execute("select header,unseen,mail,flagged,answered from mail where rowid=" + msgs_to_set[i]);
1072        header = connector.unserialize(rs.field(0));
1073        var mail = connector.unserialize(rs.field(2));
1074        unseen = rs.field(1);
1075        flagged = rs.field(3);
1076        answered = rs.field(4);
1077        switch(flag) {
1078            case "unseen":
1079                        set_msg_as_unread(msgs_to_set[i]);
1080                        header["Unseen"] = "U";
1081                        mail["Unseen"] = "U";
1082                        mail["header"]["Unseen"] = "U";
1083                        unseen = 1;
1084                        break;
1085            case "flagged":
1086                        set_msg_as_flagged(msgs_to_set[i]);
1087                        header["Flagged"] = "F";
1088                        mail["Flagged"] = "F";
1089                        mail["header"]["Flagged"] = "F";
1090                        flagged = 1;
1091                        break;
1092            case "unflagged":
1093                        if (header["Importance"].indexOf("High") != -1)
1094                                no_errors = false;
1095                        else {
1096                            set_msg_as_unflagged(msgs_to_set[i]);
1097                            header["Flagged"] = "N";
1098                                mail["Flagged"] = "N";
1099                                mail["header"]["Flagged"] = "N";
1100                        }
1101                        flagged = 0;
1102                break;
1103            case "seen":
1104                        header["Unseen"] = "N";
1105                        mail["Unseen"] = "N";
1106                        mail["header"]["Unseen"] = "N";
1107                        set_msg_as_read(msgs_to_set[i],true);
1108                        unseen = 0;
1109                        break;
1110            case "answered":
1111                        header["Draft"]="";
1112                        mail["Draft"] = "";
1113                        mail["header"]["Draft"] = "";
1114                        header["Answered"]="A";
1115                        mail["Answered"] = "A";
1116                        mail["header"]["Answered"] = "A";
1117                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/answered.gif title=Respondida>';
1118                        answered = 1;
1119                break;
1120            case "forwarded":
1121                        header["Draft"]="X";
1122                        mail["Draft"] = "X";
1123                        mail["header"]["Draft"] = "X";
1124                        header["Answered"]="A";
1125                        mail["Answered"] = "A";
1126                        mail["header"]["Answered"] = "A";
1127                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/forwarded.gif title=Encaminhada>';
1128                        answered = 1;
1129                        break;
1130        }
1131               
1132        rs.close();
1133                       
1134        if(Element("check_box_message_" + msgs_to_set[i]))
1135            Element("check_box_message_" + msgs_to_set[i]).checked = false;
1136        var smail=connector.serialize(mail);
1137        smail =smail.replace(/([^'])'([^'])('?)/g,"$1''$2$3$3");
1138        try{
1139            this.dbGears.execute("update mail set mail='"+smail+"',header='"+connector.serialize(header)+
1140                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1141                " where rowid="+msgs_to_set[i]);
1142        }catch(e){
1143            this.dbGears.execute("update mail set header='"+connector.serialize(header)+
1144                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1145                " where rowid="+msgs_to_set[i]);
1146        }
1147    }
1148    if(Element('chk_box_select_all_messages'))
1149        Element('chk_box_select_all_messages').checked = false;
1150    this.finalize();
1151        if (!no_errors) {
1152                if(one_message)
1153                        write_msg(get_lang("this message cant be marked as normal"));
1154                else
1155                        write_msg(get_lang("At least one of selected message cant be marked as normal"));
1156                return false;
1157        }
1158        return true;
1159
1160}
1161       
1162local_messages.prototype.set_message_flag = function(msg_number,flag,func_after_flag_change) {
1163    no_errors = this.set_messages_flag(msg_number,flag);
1164        if(no_errors && func_after_flag_change)
1165                func_after_flag_change(true);
1166}
1167       
1168local_messages.prototype.get_unseen_msgs_number = function() {
1169    this.init_local_messages();
1170    var rs = this.dbGears.execute("select count(*) from mail where unseen=1");
1171    var retorno = rs.field(0);
1172    rs.close();
1173    this.finalize();
1174    return retorno;
1175}
1176
1177local_messages.prototype.create_folder = function(folder) {
1178
1179    if (folder.indexOf("local_") != -1)
1180        return false; //can't create folder with string local_
1181
1182    this.init_local_messages();
1183    try {
1184        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",[folder,account_id]);
1185    } catch (error) {
1186        this.finalize();
1187        return false;
1188    }
1189    this.finalize();
1190    return true;
1191}
1192
1193local_messages.prototype.list_local_folders = function(folder) {
1194    this.init_local_messages();
1195    var retorno = new Array();
1196    var retorno_defaults = new Array();
1197    rs = this.dbGears.execute("select folder,rowid from folder where uid_usuario=?",[account_id]);
1198//    rs = this.dbGears.execute("select folder.folder,sum(mail.unseen) from folder left join mail on "+
1199//      "folder.rowid=mail.id_folder where folder.uid_usuario=? group by folder.folder",[account_id]);
1200    var achouInbox = false,achouSent = false ,achouSentConf = false,achouTrash = false,achouDrafts = false;
1201    while(rs.isValidRow()) {
1202        var temp = new Array();
1203        if (rs.field(0).indexOf('/') == 0){
1204               var rs1 = this.dbGears.execute('update folder set folder=? where rowid=?',[rs.field(0).slice(1),rs.field(1)]);
1205               temp[0] = rs.field(0).slice(1);
1206               rs1.close();
1207       }else{
1208           temp[0] = rs.field(0);
1209       }
1210
1211        var rs2 = this.dbGears.execute("select count(*) from mail where id_folder=? and unseen=1",[rs.field(1)]);
1212         rs2.field(0)? temp[1] = rs2.field(0):temp[1]=0;
1213
1214        var rs3 = this.dbGears.execute("select * from folder where folder like ? limit 1",[temp[0]+"/%"]);
1215        if(rs3.isValidRow())
1216            temp[2] = 1;
1217        else
1218            temp[2] = 0;
1219
1220        if(sentfolder ==  preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") || preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") == trashfolder || preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") == draftsfolder)
1221            achouSentConf= true;
1222
1223        switch (temp[0]) {
1224            case 'Inbox':
1225                retorno_defaults[0] = temp;
1226                achouInbox = true;
1227                break;
1228            case sentfolder :
1229                retorno_defaults[1] = temp;
1230                achouSent = true;
1231                break;
1232            case trashfolder:
1233                retorno_defaults[3] = temp;
1234                achouTrash = true;
1235                break;
1236            case draftsfolder:
1237                retorno_defaults[4] = temp;
1238                achouDrafts = true;
1239                break;
1240            case preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""):
1241                retorno_defaults[2] = temp;
1242                achouSentConf = true;
1243                break;
1244            default:
1245                retorno.push(temp);
1246        }
1247
1248        rs.next();
1249    }
1250
1251    rs.close();
1252    this.finalize();
1253
1254    if(preferences.auto_create_local=='0' || (achouInbox && achouSent && achouSentConf && achouTrash && achouDrafts)){
1255        var retorno_final = retorno_defaults.concat(retorno.sort(charOrdA));
1256        return retorno_final;
1257    }else{
1258        if(!achouInbox)
1259            this.create_folder('Inbox');
1260        if(!achouSent)
1261            this.create_folder(sentfolder);
1262        if(!achouTrash)
1263            this.create_folder(trashfolder);
1264        if(!achouDrafts)
1265            this.create_folder(draftsfolder);
1266        if(!achouSentConf)
1267            this.create_folder(preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""));
1268        return this.list_local_folders();
1269    }
1270
1271}
1272local_messages.prototype.rename_folder = function(folder,old_folder) {
1273    if (folder.indexOf("local_") != -1)
1274        return false; //can't create folder with string local_
1275    this.init_local_messages();
1276    if (old_folder.indexOf("/") != "-1") {
1277        final_pos = old_folder.lastIndexOf("/");
1278        folder = old_folder.substr(0, final_pos) + "/" + folder;
1279    }
1280    try {
1281        this.dbGears.execute("update folder set folder=? where folder=? and uid_usuario=?",[folder,old_folder,account_id]);
1282    } catch (error) {
1283        this.finalize();
1284        return false;
1285    }
1286    rs = this.dbGears.execute("select folder from folder where folder like ? and uid_usuario=?",[old_folder+'/%',account_id]);
1287    while(rs.isValidRow()) {
1288        folder_tmp = rs.field(0);
1289        folder_new = folder_tmp.replace(old_folder,folder);
1290        this.dbGears.execute("update folder set folder=? where folder=?",[folder_new,folder_tmp]);
1291        rs.next();
1292    }
1293
1294
1295    this.finalize();
1296    return true;
1297}
1298       
1299local_messages.prototype.remove_folder = function(folder) {
1300    this.init_local_messages();
1301    var rs = this.dbGears.execute("select count(rowid) from folder where folder like ? and uid_usuario=?",[folder+"/%",account_id]);
1302    var sons = rs.field(0);
1303    rs.close();
1304
1305    if(sons == 0){
1306                var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
1307                var folder_id = rs.field(0);
1308                rs.close();
1309                this.dbGears.execute("delete from folder where rowid=?",[folder_id]);
1310                rs = this.dbGears.execute("select rowid,mail from mail where id_folder=?",[folder_id]);
1311                while(rs.isValidRow()) {
1312                    var rs2 = this.dbGears.execute("select url from anexo where id_mail=?",[rs.field(0)]);
1313                    while(rs2.isValidRow()) {
1314                        this.store.remove(rs2.field(0));
1315                        rs2.next();
1316                    }
1317                    rs2.close();
1318                    this.dbGears.execute("delete from anexo where id_mail=?",[rs.field(0)]);
1319                    var mail = connector.unserialize(rs.field(1));
1320                    this.store.remove(mail.url_export_file);
1321                    rs.next();
1322                }
1323                rs.close();
1324                this.dbGears.execute("delete from mail where id_folder=?",[folder_id]);
1325                this.finalize();
1326                return true;
1327    }else  {
1328                this.finalize();
1329                return false;
1330    }
1331
1332}
1333
1334local_messages.prototype.move_messages = function(new_folder,msgs_number) {
1335   
1336        if(!msgs_number)
1337                msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1338       
1339    this.init_local_messages();
1340    var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[new_folder,account_id]);
1341    var id_folder = rs.field(0);
1342    rs.close();
1343    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...
1344    this.finalize();
1345}
1346
1347local_messages.prototype.setFilter = function(sFilter)
1348{
1349        this.filterSerch = sFilter;
1350}
1351
1352local_messages.prototype.getFilter = function()
1353{
1354        return this.filterSerch;
1355}
1356
1357local_messages.prototype.setSortType = function (sortType){
1358    this.sortType = sortType;
1359}
1360
1361local_messages.prototype.getSortType = function (){
1362    if (this.sortType == "")
1363    {
1364        return 'SORTDATE';
1365    }
1366    return this.sortType;
1367}
1368
1369local_messages.prototype.search = function(folders,sFilter) {
1370    this.init_local_messages();
1371    this.setFilter(sFilter);
1372    var filters = sFilter.replace(/^##|##$/g,"").split('##');
1373    var friendly_filters = new Array();
1374
1375    if (sFilter.indexOf('ALL') != -1) { //all filters...
1376        filters[0] = sFilter.replace(/##/g,"");
1377        tmp = filters[0].split("<=>");
1378
1379        searchKey = new Array();
1380        searchKey.push("SUBJECT");
1381        searchKey.push(tmp[1]);
1382        friendly_filters.push(searchKey);
1383
1384        searchKey = new Array();
1385        searchKey.push("BODY");
1386        searchKey.push(tmp[1]);
1387        friendly_filters.push(searchKey);
1388
1389        searchKey = new Array();
1390        searchKey.push("FROM");
1391        searchKey.push(tmp[1]);
1392        friendly_filters.push(searchKey);
1393
1394        searchKey = new Array();
1395        searchKey.push("TO");
1396        searchKey.push(tmp[1]);
1397        friendly_filters.push(searchKey);
1398
1399        searchKey = new Array();
1400        searchKey.push("CC");
1401        searchKey.push(tmp[1]);
1402        friendly_filters.push(searchKey);
1403    }
1404    else {
1405        for (var i=0; i<filters.length; i++)
1406        {
1407            if (filters[i] != ""){
1408                //tmp[0] = tmp[0].replace(/^\s+|\s+$/g,"");
1409                //tmp[1] = tmp[1].replace(/^\s+|\s+$/g,"");
1410                friendly_filters.push(filters[i].split("<=>"));
1411            }
1412        }
1413    }
1414    var sql = "select mail.header,folder.folder,mail.rowid,size from mail inner join folder on mail.id_folder=folder.rowid where visible=? and mail.uid_usuario="+account_id + " and folder.folder in (";
1415    for(var fnum in folders) {
1416        sql+="'"+folders[fnum]+"'";
1417        if(fnum<folders.length-1)
1418            sql+=",";
1419    }
1420    sql += ") and (";
1421    for (var z=0;z<friendly_filters.length;z++) {
1422        if (z != 0) {
1423            if (sFilter.indexOf('ALL') != -1)
1424                sql += " or";
1425            else
1426                sql += " and";
1427        }
1428        var cond = friendly_filters[z][0].replace(/^\s+|\s+$/g,"");
1429        if (cond == "SINCE" || cond == "BEFORE" | cond == "ON"){
1430
1431            tmpDate = friendly_filters[z][1].replace(/\%2F/g,"/").split('/');
1432
1433            // Date = url_decode(friendly_filters[z][1]);
1434            sql+=" mail.timestamp " + this.aux_convert_filter_field(friendly_filters[z][0], tmpDate);
1435        }
1436        else if (!friendly_filters[z][1])
1437        {
1438            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0]);
1439        }
1440        else
1441        {
1442            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0])+" like '%"+url_decode_s(friendly_filters[z][1])+"%'";
1443        }
1444    }
1445    sql += ")";
1446
1447    // Sort
1448    if (this.getSortType().match('^SORTDATE.*')){
1449        sql += " order by mail.timestamp";
1450    }
1451    else if (this.getSortType().match('^SORTWHO.*')){
1452        sql += " order by mail.ffrom";
1453    }
1454    else if (this.getSortType().match('^SORTSUBJECT.*')){
1455        sql += " order by mail.subject";
1456    }
1457    else if (this.getSortType().match('^SORTSIZE.*')){
1458        sql += " order by mail.size";
1459    }
1460    else if (this.getSortType().match('^SORTBOX.*')){
1461        sql += " order by folder.folder";
1462    }
1463
1464    sql += this.getSortType().match('^.*_REVERSE$') ? ' asc' : ' desc';
1465
1466    var rs = this.dbGears.execute(sql,[true]);
1467    var retorno = [];
1468    var numRec = 0;
1469   
1470    while( rs.isValidRow() )
1471    {
1472                var header                      = connector.unserialize( rs.field(0) );
1473                var date_formated       = ( header["udate"] ).toString();
1474                /*
1475                 * Antigamente o udate vinha com o formato de data e foi alterado para vir o timestamp.
1476                 * Nesse caso, e-mails arquivados anteriormente usamos o udate, caso contrario, usamos o smalldate,
1477                 * pois o udate agora vem como timestamp
1478                 * verifica tambem no caso de mensagens antigas que nao exista o smalldate
1479                 * definir
1480                */
1481                if( !date_formated.match(/\d{2}\/\d{2}\/\d{4}/) )
1482                {
1483                    if ( (typeof(header["smalldate"]) != "undefined") && (!header["smalldate"].match(/\d{2}\:\d{2}/) ) ){
1484                            date_formated = header["smalldate"];
1485                    }else{
1486                            var day = new Date();
1487                            day.setTime(header["udate"] * 1000);
1488                            aux_dia = day.getDate() < 10 ? '0' + day.getDate() : day.getDate();
1489                            aux_mes = day.getMonth()+1; // array start with '0..11'
1490                            aux_mes = aux_mes < 10 ? '0' + aux_mes : aux_mes;
1491                            date_formated = aux_dia + '/' +  aux_mes + '/' + day.getFullYear();
1492                    }
1493                }
1494
1495                retorno[ numRec++ ] =
1496                {
1497                        'from'          : header["from"]["name"],
1498                        'subject'       : unescape(header["subject"]),
1499                        'udate'         : date_formated,
1500                        'size'          : rs.field(3),
1501                        'flag'          : header["Unseen"]+header["Recent"]+header["Flagged"]+header["Draft"],
1502                        'boxname'       : "local_"+rs.field(1),
1503                        'uid'           : rs.field(2)
1504                }
1505
1506                rs.next();
1507    }
1508
1509    this.finalize();
1510
1511    return ( retorno.length > 0 ) ? retorno : false ;
1512}
1513       
1514local_messages.prototype.aux_convert_size = function(size) {
1515    var tmp = Math.floor(size/1024);
1516    if(tmp >= 1){
1517        return tmp + " kb";
1518    }else{
1519        return size + " b";
1520    }
1521               
1522}
1523       
1524local_messages.prototype.aux_convert_filter_field = function(filter,date)
1525{
1526        var dateObj;
1527   
1528        if (typeof date != 'undefined')
1529    {
1530        dateObj = new Date(date[2],date[1]-1,date[0]);
1531    }
1532
1533    if((filter=="SUBJECT ") || (filter=="SUBJECT"))
1534        return "subject";
1535    else if((filter=="BODY ") || (filter=="BODY"))
1536        return "body";
1537    else if((filter=="FROM ") || (filter=="FROM"))
1538        return "ffrom";
1539    else if((filter=="TO ") || (filter=="TO"))
1540        return "fto";
1541    else if((filter=="CC ") || (filter=="CC"))
1542        return "cc";
1543    else if (filter.replace(/^\s+|\s+$/g,"") == "SINCE"){
1544        dateObj.setHours(0, 0, 0, 0);
1545        return ">= " + dateObj.getTime().toString(10).substr(0, 10);
1546    }
1547    else if (filter.replace(/^\s+|\s+$/g,"") == "BEFORE"){
1548        dateObj.setHours(23, 59, 59, 999);
1549        return "<= " + dateObj.getTime().toString(10).substr(0, 10);
1550    }
1551    else if (filter.replace(/^\s+|\s+$/g,"") == "ON"){
1552        dateObj.setHours(0, 0, 0, 0);
1553        var ts1 = dateObj.getTime().toString(10).substr(0, 10);
1554        dateObj.setHours(23, 59, 59, 999);
1555        var ts2 = dateObj.getTime().toString(10).substr(0, 10);
1556        return ">= " + ts1 + ") and (timestamp <= " + ts2;
1557    }
1558    else if (filter.replace(/^\s+|\s+$/g,"") == "FLAGGED")
1559        return "flagged = 1";
1560    else if (filter.replace(/^\s+|\s+$/g,"") == "UNFLAGGED")
1561        return "flagged = 0";
1562    else if (filter.replace(/^\s+|\s+$/g,"") == "UNSEEN")
1563        return "unseen = 1";
1564    else if (filter.replace(/^\s+|\s+$/g,"") == "SEEN")
1565        return "unseen = 0";
1566    else if (filter.replace(/^\s+|\s+$/g,"") == "ANSWERED")
1567        return "answered = 1";
1568    else if (filter.replace(/^\s+|\s+$/g,"") == "UNANSWERED")
1569        return "answered = 0";
1570    else if (filter.replace(/^\s+|\s+$/g,"") == "RECENT")
1571        return "recent = 1";
1572    else if (filter.replace(/^\s+|\s+$/g,"") == "OLD")
1573        return "recent = 0";
1574
1575}
1576       
1577local_messages.prototype.has_local_mails = function() {
1578    this.init_local_messages();
1579    var rs = this.dbGears.execute("select rowid from folder limit 0,1");
1580    var retorno;
1581    if(rs.isValidRow())
1582        retorno = true;
1583    else
1584        retorno = false;
1585    this.finalize();
1586    return retorno;
1587}
1588
1589//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Simple AJAX function used to get the RFC822 email source.
1590local_messages.prototype.get_src = function(url){
1591    AJAX = false;
1592    if (window.XMLHttpRequest) { // Mozilla, Safari,...
1593        AJAX = new XMLHttpRequest();
1594        if (AJAX.overrideMimeType) {
1595            AJAX.overrideMimeType('text/xml');
1596        }
1597    } else if (window.ActiveXObject) { // IE
1598        try {
1599            AJAX = new ActiveXObject("Msxml2.XMLHTTP");
1600        } catch (e) {
1601            try {
1602                AJAX = new ActiveXObject("Microsoft.XMLHTTP");
1603            } catch (e) {}
1604        }
1605    }
1606
1607    if (!AJAX) {
1608        alert('ERRO :(Seu navegador não suporta a aplicação usada neste site');
1609        return false;
1610    }
1611
1612    AJAX.onreadystatechange = function() {
1613        if (AJAX.readyState == 4) {
1614            AJAX.src=AJAX.responseText;
1615            if (AJAX.status == 200) {
1616                return AJAX.responseText;
1617            } else {
1618                return false;
1619            }
1620        }
1621    }
1622
1623    AJAX.open('get', encodeURI(url), false);
1624    AJAX.send(null);
1625    return AJAX.responseText;
1626};
1627
1628//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Dessarquiva msgs locais pegando o codigo fonte das mesmas e mandando via POST para o servidor
1629//para que elas sejam inseridas no imap pela função  imap_functions.unarchive_mail.
1630    local_messages.prototype.unarchive_msgs = function (folder,new_folder,msgs_number){
1631
1632    this.init_local_messages();
1633
1634        // se a aba estiver aberta e selecionada, apenas a msg da aba é movida
1635        if(currentTab.toString().indexOf("_r") != -1)
1636            msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1637       
1638        if( msgs_number =='selected' || !msgs_number )
1639            msgs_number = get_selected_messages();
1640
1641        if( !msgs_number )
1642            return write_msg(get_lang('No selected message.'));
1643
1644        document.getElementById("overlay").style.visibility = "";
1645
1646        var rs = this.dbGears.execute("select mail,timestamp from mail where rowid in (" + msgs_number + ")");
1647
1648        var source = [], flags = [], timestamp = [];
1649               
1650                while(rs.isValidRow()) {
1651
1652            var mail = connector.unserialize(rs.field(0));
1653
1654            flags.push( mail["Answered"]+":"+mail["Draft"]+":"+mail["Flagged"]+":"+mail["Unseen"] );
1655            source.push( escape( mail.msg_source || this.get_src( mail.url_export_file ) ) );
1656            timestamp.push( rs.field(1) );
1657
1658                        rs.next();
1659                }
1660
1661                rs.close();
1662                this.finalize();
1663
1664        write_msg( "Desarquivando " + source.length + " mensagens... ", true );
1665
1666        var sep = "#@#@#@";
1667
1668        var params = "&folder=" + ( new_folder || 'INBOX' ) +
1669                     "&source=" + source.join(sep) +
1670                     "&timestamp=" + timestamp.join(sep) +
1671                     "&flags=" + flags.join(sep);
1672
1673        cExecute ("$this.imap_functions.unarchive_mail&", function(data){
1674
1675            clean_msg();
1676            document.getElementById("overlay").style.visibility = "hidden";
1677            write_msg( get_lang( data.error || 'All messages are successfully unarchived' ) );
1678
1679        }, params);
1680       
1681        update_menu();
1682    }
1683
1684local_messages.prototype.get_msg_date = function (original_id, is_local){
1685
1686    this.init_local_messages();
1687
1688    if (typeof(is_local) == 'undefined')
1689    {
1690        is_local = false;
1691    }
1692
1693    var rs;
1694
1695    if (is_local)
1696    {
1697        rs = this.dbGears.execute("select mail from mail where rowid="+original_id);
1698    }
1699    else
1700    {
1701        rs = this.dbGears.execute("select mail from mail where original_id="+original_id);
1702    }
1703    var tmp = connector.unserialize(rs.field(0));
1704    var ret = new Array();
1705    ret.fulldate = tmp.fulldate.substr(0,16);
1706    ret.smalldate = tmp.msg_day;
1707    ret.msg_day = tmp.msg_day;
1708    ret.msg_hour = tmp.msg_day;
1709
1710    rs.close();
1711    this.finalize();
1712    return ret;
1713}
1714
1715
1716local_messages.prototype.download_all_local_attachments = function(folder,id){
1717    this.init_local_messages();
1718    var rs = this.dbGears.execute("select mail from mail where rowid="+id);
1719    var tmp = connector.unserialize(rs.field(0));
1720    rs.close();
1721    this.finalize();
1722    tmp.msg_source?source = tmp.msg_source:source = this.get_src(tmp.url_export_file);
1723    //source = this.get_src(tmp.url_export_file);
1724    source = escape(source);
1725    var handler_source = function(data){
1726        download_attachments(null, null, data, null,null,'anexos.zip');
1727    }
1728    cExecute("$this.imap_functions.download_all_local_attachments",handler_source,"source="+source);
1729}
1730
1731/*************************************************************************/
1732/* Funcao usada para exportar mensagens arquivadas localmente.
1733 * Rommel de Brito Cysne (rommel.cysne@serpro.gov.br)
1734 * em 22/12/2008.
1735 */
1736local_messages.prototype.local_messages_to_export = function(){
1737
1738    if (openTab.type[currentTab] > 1){
1739        var msgs_to_export_id = currentTab.substring(0,currentTab.length-2,currentTab);
1740    }else{
1741        var msgs_to_export_id = get_selected_messages();
1742    }
1743    var flag = true;
1744    var handler_local_mesgs_to_export = function(data){
1745                        var filename = 'mensagens.zip';
1746
1747                        if (data.match(/\.eml$/gi)) {
1748                                fn_regex = /[^\/]*\.eml$/i;
1749                                filename = fn_regex.exec(data);
1750                        }
1751
1752        document.getElementById('lertOverlay').style.display='none';
1753        document.getElementById('lertContainer').style.display='none';
1754        document.getElementById('lertContainer').innerHTML = '';
1755        flag = false;
1756
1757                        download_attachments(null, null, data, null, null, filename);
1758    }
1759
1760        var cancel = new LertButton(get_lang('cancel'), function(){flag=false;connector.cancelRequest();});
1761     var titulo = '<b>' + get_lang('Warning') + '!</b>';
1762     var message = get_lang("Exporting selected messages, this can take some time.");
1763        var multConfirm = new Lert(
1764                titulo,
1765                message,
1766                [cancel],
1767                {
1768                        defaultButton:cancel,
1769                        icon:'js/lert/images/dialog-help.gif'
1770                });
1771        multConfirm.display();
1772
1773        var timeOut = function(){
1774            if(flag){
1775                document.getElementById('lertOverlay').style.display='none';
1776                document.getElementById('lertContainer').style.display='none';
1777                document.getElementById('lertContainer').innerHTML = '';
1778                connector.cancelRequest();
1779                write_msg(get_lang('Error exporting messages, try again latter'));
1780                }
1781
1782        }
1783        window.setTimeout(timeOut,300000);
1784
1785    if(msgs_to_export_id){
1786        this.init_local_messages();
1787        var l_msg = "t";
1788        var mesgs ="";
1789        var subjects ="";
1790        var rs = this.dbGears.execute("select mail,subject from mail where rowid in ("+msgs_to_export_id+")");
1791        while(rs.isValidRow()){
1792            mail = connector.unserialize(rs.field(0));
1793            mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1794            subject = rs.field(1);
1795            mesgs += src;
1796            mesgs += "@@";
1797            subjects += subject;
1798            subjects += "@@";
1799            rs.next();
1800        }
1801        rs.close();
1802        this.finalize();
1803        mesgs = escape(mesgs);
1804        subjects = escape(subjects);
1805        params = "subjects="+subjects+"&mesgs="+mesgs+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export_id;
1806        cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1807    }
1808    return true;
1809}
1810
1811local_messages.prototype.get_all_local_folder_messages= function(folder_name){
1812
1813
1814    var mesgs = new Array();
1815    var subjects = new Array();
1816    var hoje = new Date();
1817    var msgs_to_export = new Array();
1818    var l_msg="t";
1819
1820    this.init_local_messages();
1821    var query = "select mail,subject,mail.rowid from mail inner join folder on (mail.id_folder=folder.rowid) where folder.folder='" + folder_name + "'";
1822
1823    var rs = this.dbGears.execute(" "+query)
1824
1825    var handler_local_mesgs_to_export = function(data){
1826        //alert("data - " + data + " - tipo - " + typeof(data));
1827        download_attachments(null, null, data, null,null,'mensagens.zip');
1828    }
1829    var j=0;
1830    while (rs.isValidRow()){
1831        msgs_to_export[j]=rs.field(2)
1832        mail = connector.unserialize(rs.field(0));
1833        mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1834        subject = rs.field(1);
1835        mesgs += src;
1836        mesgs += "@@";
1837        subjects += subject;
1838        subjects += "@@";
1839        rs.next();
1840        j++;
1841
1842    }
1843    rs.close();
1844    this.finalize();
1845    source = escape(mesgs);
1846    subjects = escape(subjects);
1847    params = "folder="+folder_name+"&subjects="+subjects+"&mesgs="+source+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export;
1848    cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1849         
1850
1851}
1852
1853
1854/*************************************************************************/
1855
1856       
1857/******************************************************************
1858                                        Offline Part
1859 ******************************************************************/
1860
1861local_messages.prototype.is_offline_installed = function() {
1862    this.init_local_messages();
1863    var check = this.localServer.openManagedStore('expresso-offline');
1864    this.finalize();
1865    if(check==null)
1866        return false;
1867    else
1868        return true;
1869               
1870}
1871local_messages.prototype.update_offline = function(redirect) {
1872    this.init_local_messages();
1873    var managedStore = this.localServer.openManagedStore('expresso-offline');
1874
1875    if(managedStore!=null){
1876                       
1877        managedStore.oncomplete = function(details){
1878            if(redirect!=null)
1879                location.href=redirect;
1880        }
1881                       
1882        managedStore.checkForUpdate();
1883    } else if(redirect!=null) {
1884        location.href=redirect;
1885    }
1886    this.finalize();
1887}
1888       
1889local_messages.prototype.uninstall_offline = function() {
1890    if (!window.google || !google.gears) {
1891        temp = confirm(document.getElementById('lang_gears_redirect').value);
1892        if (temp) {
1893            expresso_local_messages.installGears();
1894        }
1895        return;
1896
1897    }
1898    this.init_local_messages();
1899    this.localServer.removeManagedStore('expresso-offline');
1900    alert(document.getElementById('lang_offline_uninstalled').value);
1901    //this.dbGears.execute('drop table user');
1902    //this.dbGears.execute('drop table queue');
1903    //this.dbGears.execute('drop table attachments_queue');
1904    this.finalize();
1905}
1906       
1907local_messages.prototype.as_trash = function(){//verifica se o usuario tem a pasta lixeira no arquivamento local
1908        this.init_local_messages();
1909    var rs = this.dbGears.execute("select folder from folder where uid_usuario="+account_id+" and folder = \"Trash\"");
1910        var check = rs.isValidRow();
1911        this.finalize();
1912    if(check)
1913                return true;
1914        else
1915                return false;
1916}
1917
1918local_messages.prototype.get_folders_to_sync = function() {//Precisa ter visibilidade ao array de linguagens.
1919    this.init_local_messages();
1920    var rs = this.dbGears.execute("select id_folder,folder_name from folders_sync where uid_usuario="+account_id);
1921    var retorno = new Array();
1922    while(rs.isValidRow()) {
1923        temp = new Array();
1924        temp[0] = rs.field(0);
1925        if(temp[0]=='INBOX' + cyrus_delimiter + 'Drafts' ||temp[0]=='INBOX' + cyrus_delimiter + 'Trash' || temp[0]=='INBOX' + cyrus_delimiter + 'Sent') {
1926            temp[1] = array_lang[rs.field(1).toLowerCase()];
1927        }
1928        else {
1929            temp[1] = rs.field(1);
1930        }
1931                       
1932        retorno.push(temp);
1933        rs.next();
1934    }
1935    this.finalize();
1936    return retorno;
1937}
1938       
1939local_messages.prototype.install_offline = function(urlOffline,urlIcone,uid_usuario,login,pass,redirect) {
1940    if (!window.google || !google.gears) {
1941            expresso_local_messages.installGears();
1942        return;
1943    }
1944               
1945    if(pass.length>0) {
1946        only_spaces = true;
1947        for(cont=0;cont<pass.length;cont++) {
1948            if(pass.charAt(cont)!=" ")
1949                only_spaces = false;
1950        }
1951        if(only_spaces) {
1952            alert(document.getElementById('lang_only_spaces_not_allowed').value);
1953            return false;
1954        }
1955    }
1956
1957    modal('loading');
1958    var desktop = google.gears.factory.create('beta.desktop');
1959    desktop.createShortcut('ExpressoMail Offline',
1960        urlOffline,
1961                {'32x32': urlIcone},
1962        'ExpressoMail Offline');
1963
1964
1965    this.init_local_messages();
1966
1967    //user with offline needs to have at least the folder Inbox already created.
1968    tmp_rs = this.dbGears.execute("select rowid from folder where folder='Inbox' and uid_usuario=?",[uid_usuario]);
1969    if(!tmp_rs.isValidRow())
1970        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",['Inbox',uid_usuario]);
1971
1972    this.localServer.removeManagedStore('expresso-offline');
1973       
1974    var managedStore = this.localServer.createManagedStore('expresso-offline');
1975    managedStore.manifestUrl = 'js/manifest';
1976
1977    managedStore.onerror = function (error) {
1978        alert(error);
1979    }
1980               
1981    managedStore.oncomplete = function(details) {
1982        if (close_lightbox_div) {
1983            close_lightbox();
1984            close_lightbox_div = false;
1985            alert(document.getElementById('lang_offline_installed').value);
1986            location.href=redirect;
1987        }
1988    }
1989
1990    //create structure to user in db
1991    this.dbGears.execute('create table if not exists user (uid_usuario int,login text,pass text, logged int,unique(uid_usuario))');
1992    this.dbGears.execute('create table if not exists queue (ffrom text, fto text, cc text, cco text,'+
1993        'subject text, conf_receipt int, important int,body text,sent int,user int)');
1994    this.dbGears.execute('create table if not exists attachments_queue ('+
1995        'id_queue int, url_attach text)');
1996    this.dbGears.execute('create table if not exists sent_problems (' +
1997        'id_queue int,message text)');
1998               
1999    //d = new Date();
2000               
2001    try {
2002        var rs = this.dbGears.execute("select uid_usuario from user where uid_usuario=?",[uid_usuario]);
2003        if(!rs.isValidRow())
2004            this.dbGears.execute("insert into user (uid_usuario,login,pass) values (?,?,?)",[uid_usuario,login,pass]);
2005        else
2006            this.dbGears.execute("update user set pass=? where uid_usuario=?",[pass,uid_usuario]);
2007    } catch (error) {
2008        this.finalize();
2009        alert(error);
2010        return false;
2011    }
2012    managedStore.checkForUpdate();
2013    this.capt_url('controller.php?action=$this.db_functions.get_dropdown_contacts_to_cache');
2014        setTimeout(function(){
2015        managedStore.complete();
2016    }, 60000);
2017    this.finalize();
2018}
2019       
2020/**
2021         * Return all users in an array following the structure below.
2022         *
2023         * key: uid
2024         * value: user login
2025         */
2026local_messages.prototype.get_all_users = function() {
2027    this.init_local_messages();
2028    var users = new Array();
2029    var rs = this.dbGears.execute("select uid_usuario,login from user");
2030    while(rs.isValidRow()) {
2031        users[rs.field(0)] = rs.field(1);
2032        rs.next();
2033    }
2034    this.finalize();
2035    return users;
2036}
2037       
2038local_messages.prototype.set_as_logged = function(uid_usuario,pass,bypass) {
2039    this.init_local_messages();
2040    if (!bypass) {
2041        var rs = this.dbGears.execute("select pass from user where uid_usuario=?", [uid_usuario]);
2042        if (!rs.isValidRow() || (pass != rs.field(0) && pass != MD5(rs.field(0)))) {
2043            this.finalize();
2044            return false;
2045        }
2046    }
2047    d = new Date();
2048
2049    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2050    this.dbGears.execute("update user set logged=? where uid_usuario=?",[d.getTime(),uid_usuario]); //Login just in one...
2051    this.finalize();
2052    return true;
2053}
2054       
2055local_messages.prototype.unset_as_logged = function() {
2056    this.init_local_messages();
2057    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2058    this.finalize();
2059}
2060       
2061local_messages.prototype.user_logged = function() {
2062    this.init_local_messages();
2063    var user_logged = new Array();
2064    var rs = this.dbGears.execute("select uid_usuario,logged from user where logged is not null");
2065    if(!rs.isValidRow()) {
2066        this.finalize();
2067        return null;
2068    }
2069    user_logged[0] = rs.field(0);
2070    user_logged[1] = rs.field(1);
2071    this.finalize();
2072    return user_logged;
2073}
2074       
2075local_messages.prototype.send_to_queue = function (form) {
2076    this.init_local_messages();
2077    var mail_values = new Array();
2078               
2079    for (var i=0;i<form.length;i++) {
2080        if (form.elements[i].name != '') { //I.E made me to do that...
2081            if(form.elements[i].name=='folder' || form.elements[i].name=='msg_id' || form.elements[i].name=='' || form.elements[i].name==null)
2082                continue;
2083            else if (form.elements[i].name == 'input_return_receipt' )
2084                mail_values['conf_receipt'] = form.elements[i].checked ? 1 : 0;
2085            else if(form.elements[i].name == 'input_important_message')
2086                mail_values['important'] = form.elements[i].checked ? 1 : 0;
2087            else
2088            if (form.elements[i].name == 'body')
2089                mail_values['body'] = form.elements[i].value;
2090            else
2091            if (form.elements[i].name == 'input_from')
2092                mail_values['ffrom'] = form.elements[i].value;
2093            else
2094            if (form.elements[i].name == 'input_to')
2095                mail_values['fto'] = form.elements[i].value;
2096            else
2097            if (form.elements[i].name == 'input_cc')
2098                mail_values['cc'] = form.elements[i].value;
2099            else
2100            if (form.elements[i].name == 'input_cco')
2101                mail_values['cco'] = form.elements[i].value;
2102            else
2103            if (form.elements[i].name == 'input_subject')
2104                mail_values['subject'] = form.elements[i].value;
2105        }
2106    }
2107    //mail_values['fto'] = input_to;
2108    //mail_values['cc'] = input_cc;
2109    //mail_values['cco'] = input_cco;
2110    //mail_values['subject'] = input_subject;
2111    //mail_values['conf_receipt'] = input_return_receipt;
2112    //mail_values['important'] = input_important_message;
2113               
2114    try {
2115        this.dbGears.execute("insert into queue (ffrom,fto,cc,cco,subject,conf_receipt,important,body,sent,user) values (?,?,?,?,?,?,?,?,0,?)", [mail_values['ffrom'], mail_values['fto'], mail_values['cc'], mail_values['cco'], mail_values['subject'], mail_values['conf_receipt'], mail_values['important'], mail_values['body'], account_id]);
2116        this.send_attach_to_queue(this.dbGears.lastInsertRowId,form);
2117    }catch(error) {
2118        alert(error);
2119        return get_lang('Error sending a mail to queue. Verify if you have installed ExpressoMail Offline');
2120    }
2121    this.finalize();
2122    return true;
2123}
2124       
2125local_messages.prototype.send_attach_to_queue = function(id_queue,form) {
2126               
2127    for(i=0;i<form.elements.length;i++) {
2128                       
2129        if(form.elements[i].name.indexOf("file_")!=-1) {
2130            var tmp_input = form.elements[i];
2131            var d = new Date();
2132            var url_local = 'local_attachs/'+d.getTime();
2133            this.store.captureFile(tmp_input, url_local);
2134            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,url_local]);
2135        }
2136        else if(form.elements[i].name.indexOf("offline_forward_")!=-1){
2137            //alert();
2138            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,form.elements[i].value]);
2139        }
2140    }
2141}
2142
2143       
2144local_messages.prototype.get_num_msgs_to_send = function() {
2145    this.init_local_messages();
2146
2147    var rs = this.dbGears.execute("select count(*) from queue where user=? and sent=0",[account_id]);
2148    var to_return = rs.field(0);
2149
2150    this.finalize();
2151    return to_return;
2152}
2153       
2154local_messages.prototype.set_problem_on_sent = function(rowid_message,msg) {
2155    this.init_local_messages();
2156    this.dbGears.execute("update queue set sent = 2 where rowid=?",[rowid_message]);
2157    this.dbGears.execute("insert into sent_problems (id_queue,message) values (?,?)"[rowid_message,msg]);
2158    this.finalize();
2159}
2160       
2161local_messages.prototype.set_as_sent = function(rowid_message) {
2162    this.init_local_messages();
2163    this.dbGears.execute("update queue set sent = 1 where rowid=?",[rowid_message]);
2164    this.finalize();
2165}
2166       
2167local_messages.prototype.get_form_msg_to_send = function() {
2168    this.init_local_messages();
2169    var rs = this.dbGears.execute('select ffrom,fto,cc,cco,subject,conf_receipt,important,body,rowid from queue where sent=0 and user = ? limit 0,1',[account_id]);
2170    if(!rs.isValidRow())
2171        return false;
2172               
2173    var form = document.createElement('form');
2174    form.method = 'POST';
2175    form.name = 'form_queue_'+rs.field(8);
2176    form.style.display = 'none';
2177                form.onsubmit = function(){return false;}
2178    if(!is_ie)
2179        form.enctype="multipart/form-data";
2180    else
2181        form.encoding="multipart/form-data";
2182               
2183    var ffrom = document.createElement('TEXTAREA');
2184    ffrom.name = "input_from";
2185    ffrom.value = rs.field(0);
2186    form.appendChild(ffrom);
2187               
2188    var fto = document.createElement('TEXTAREA');
2189    fto.name = "input_to";
2190    fto.value = rs.field(1);
2191    form.appendChild(fto);
2192               
2193    var cc = document.createElement('TEXTAREA');
2194    cc.name = "input_cc";
2195    cc.value = rs.field(2);
2196    form.appendChild(cc);
2197
2198    var cco = document.createElement('TEXTAREA');
2199    cco.name = "input_cco";
2200    cco.value = rs.field(3);
2201    form.appendChild(cco);
2202               
2203    var subject = document.createElement('TEXTAREA');
2204    subject.name = "input_subject";
2205    subject.value = rs.field(4);
2206    form.appendChild(subject);
2207               
2208    var folder = document.createElement('input');
2209    folder.name='folder';
2210    folder.value=preferences.save_in_folder;
2211    form.appendChild(folder);
2212               
2213    if (rs.field(5) == 1) {
2214        var conf_receipt = document.createElement('input');
2215        conf_receipt.type='text';
2216        conf_receipt.name = "input_return_receipt";
2217        conf_receipt.value = 'on';
2218        form.appendChild(conf_receipt);
2219    }
2220               
2221    if (rs.field(6) == 1) {
2222        var important = document.createElement('input');
2223        important.type='text';
2224        important.name = "input_important_message";
2225        important.value = 'on';
2226        form.appendChild(important);
2227    }
2228               
2229    var body = document.createElement('TEXTAREA');
2230    body.name = "body";
2231    body.value = rs.field(7);
2232    form.appendChild(body);
2233               
2234    var rowid = document.createElement('input');
2235    rowid.type = 'hidden';
2236    rowid.name = 'rowid';
2237    rowid.value = rs.field(8);
2238    form.appendChild(rowid);
2239               
2240    //Mounting the attachs
2241    var divFiles = document.createElement("div");
2242    divFiles.id = 'divFiles_queue_'+rs.field(8);
2243               
2244    form.appendChild(divFiles);
2245               
2246    document.getElementById('forms_queue').appendChild(form);
2247
2248    var is_local_forward = false;
2249    try {
2250                       
2251        var rs_attach = this.dbGears.execute('select url_attach from attachments_queue where id_queue=?', [rs.field(8)]);
2252        while (rs_attach.isValidRow()) {
2253            if(rs_attach.field(0).indexOf('../tmpLclAtt/')==-1) {
2254                tmp_field = addForwardedFile('queue_' + rs.field(8), this.store.getCapturedFileName(rs_attach.field(0)), 'nothing');
2255            }
2256            else {
2257                var tempNomeArquivo = rs_attach.field(0).split("/");
2258                var nomeArquivo = tempNomeArquivo[tempNomeArquivo.length-1];
2259                nomeArquivo = nomeArquivo.substring(0,nomeArquivo.length - 4); //Anexos no gears sᅵo todos com extensᅵo .php. tenho que tirar a extensᅵo para ficar o nome real do arquivo.
2260                is_local_forward = true;
2261                tmp_field = addForwardedFile('queue_' + rs.field(8), nomeArquivo, 'nothing');
2262            }
2263            fileSubmitter = this.store.createFileSubmitter();
2264            fileSubmitter.setFileInputElement(tmp_field,rs_attach.field(0));
2265            //          alert(form.innerHTML);
2266            //  div.appendChild(tmp_field);
2267            rs_attach.next();
2268        }
2269                       
2270        if(is_local_forward) {
2271            var is_lcl_fw = document.createElement('input');
2272            is_lcl_fw.type = 'hidden';
2273            is_lcl_fw.name = 'is_local_forward';
2274            is_lcl_fw.value = "1";
2275            form.appendChild(is_lcl_fw);
2276        }
2277                               
2278    }
2279    catch(exception) {
2280        alert(exception);
2281    }
2282               
2283    this.finalize();
2284    return form;
2285}
2286
2287var expresso_local_messages;
2288expresso_local_messages = new local_messages();
2289//expresso_local_messages.create_objects();
Note: See TracBrowser for help on using the repository browser.