source: branches/2.4/expressoMail1_2/js/local_messages.js @ 5264

Revision 5264, 70.9 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2385 - Sem acao ao marcar flags em mensagens resultantes de pesquisa rapida

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, isSearch){
1051        if(isSearch){
1052                var id_border = currentTab.replace(/[a-zA-Z_]+/, "");
1053        }else
1054                isSearch = false;
1055    this.init_local_messages();
1056        var no_errors = true;
1057    var msgs_to_set;
1058        var one_message = false;
1059    if (msgs_number == 'get_selected_messages') {
1060                var msgs_to_set = get_selected_messages();
1061                msgs_to_set= msgs_to_set.split(",");
1062    }else if(isSearch){
1063                msgs_to_set = msgs_number.split(',');
1064        }else { //Just one message
1065            one_message = true;
1066                msgs_to_set = new Array();
1067                msgs_to_set[0] = msgs_number;
1068    }
1069    for (var i in msgs_to_set) {
1070                       
1071        var matches = '';//Messages comming from other tabs.
1072        if(matches = this.parse_id_mail(msgs_to_set[i])) {
1073            msgs_to_set[i] = matches[1];
1074        }
1075                       
1076        var rs = this.dbGears.execute("select header,unseen,mail,flagged,answered from mail where rowid=" + msgs_to_set[i]);
1077        header = connector.unserialize(rs.field(0));
1078        var mail = connector.unserialize(rs.field(2));
1079        unseen = rs.field(1);
1080        flagged = rs.field(3);
1081        answered = rs.field(4);
1082        switch(flag) {
1083            case "unseen":
1084                        if(!isSearch)
1085                                set_msg_as_unread(msgs_to_set[i]);
1086                        else
1087                                set_msg_as_unread(msgs_to_set[i]+'_s'+id_border, true);
1088                        header["Unseen"] = "U";
1089                        mail["Unseen"] = "U";
1090                        mail["header"]["Unseen"] = "U";
1091                        unseen = 1;
1092                        break;
1093            case "flagged":
1094                        if(!isSearch)
1095                                set_msg_as_flagged(msgs_to_set[i]);
1096                        else
1097                                set_msg_as_flagged(msgs_to_set[i]+'_s'+id_border, true);
1098                        header["Flagged"] = "F";
1099                        mail["Flagged"] = "F";
1100                        mail["header"]["Flagged"] = "F";
1101                        flagged = 1;
1102                        break;
1103            case "unflagged":
1104                        if (header["Importance"].indexOf("High") != -1)
1105                                no_errors = false;
1106                        else {
1107                                if(!isSearch)
1108                                        set_msg_as_unflagged(msgs_to_set[i]);
1109                                else
1110                                        set_msg_as_unflagged(msgs_to_set[i]+'_s'+id_border, true);
1111                            header["Flagged"] = "N";
1112                                mail["Flagged"] = "N";
1113                                mail["header"]["Flagged"] = "N";
1114                        }
1115                        flagged = 0;
1116                break;
1117            case "seen":
1118                        header["Unseen"] = "N";
1119                        mail["Unseen"] = "N";
1120                        mail["header"]["Unseen"] = "N";
1121                        if(!isSearch)
1122                                set_msg_as_read(msgs_to_set[i],true);
1123                        else
1124                                set_msg_as_read(msgs_to_set[i]+'_s'+id_border, true);
1125                        unseen = 0;
1126                        break;
1127            case "answered":
1128                        header["Draft"]="";
1129                        mail["Draft"] = "";
1130                        mail["header"]["Draft"] = "";
1131                        header["Answered"]="A";
1132                        mail["Answered"] = "A";
1133                        mail["header"]["Answered"] = "A";
1134                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/answered.gif title=Respondida>';
1135                        answered = 1;
1136                break;
1137            case "forwarded":
1138                        header["Draft"]="X";
1139                        mail["Draft"] = "X";
1140                        mail["header"]["Draft"] = "X";
1141                        header["Answered"]="A";
1142                        mail["Answered"] = "A";
1143                        mail["header"]["Answered"] = "A";
1144                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/forwarded.gif title=Encaminhada>';
1145                        answered = 1;
1146                        break;
1147        }
1148               
1149        rs.close();
1150                       
1151        if(Element("check_box_message_" + msgs_to_set[i]))
1152            Element("check_box_message_" + msgs_to_set[i]).checked = false;
1153        var smail=connector.serialize(mail);
1154        smail =smail.replace(/([^'])'([^'])('?)/g,"$1''$2$3$3");
1155        try{
1156            this.dbGears.execute("update mail set mail='"+smail+"',header='"+connector.serialize(header)+
1157                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1158                " where rowid="+msgs_to_set[i]);
1159        }catch(e){
1160            this.dbGears.execute("update mail set header='"+connector.serialize(header)+
1161                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1162                " where rowid="+msgs_to_set[i]);
1163        }
1164    }
1165    if(Element('chk_box_select_all_messages'))
1166        Element('chk_box_select_all_messages').checked = false;
1167    this.finalize();
1168        if (!no_errors) {
1169                if(one_message)
1170                        write_msg(get_lang("this message cant be marked as normal"));
1171                else
1172                        write_msg(get_lang("At least one of selected message cant be marked as normal"));
1173                return false;
1174        }
1175        return true;
1176
1177}
1178       
1179local_messages.prototype.set_message_flag = function(msg_number,flag,func_after_flag_change) {
1180    no_errors = this.set_messages_flag(msg_number,flag);
1181        if(no_errors && func_after_flag_change)
1182                func_after_flag_change(true);
1183}
1184       
1185local_messages.prototype.get_unseen_msgs_number = function() {
1186    this.init_local_messages();
1187    var rs = this.dbGears.execute("select count(*) from mail where unseen=1");
1188    var retorno = rs.field(0);
1189    rs.close();
1190    this.finalize();
1191    return retorno;
1192}
1193
1194local_messages.prototype.create_folder = function(folder) {
1195
1196    if (folder.indexOf("local_") != -1)
1197        return false; //can't create folder with string local_
1198
1199    this.init_local_messages();
1200    try {
1201        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",[folder,account_id]);
1202    } catch (error) {
1203        this.finalize();
1204        return false;
1205    }
1206    this.finalize();
1207    return true;
1208}
1209
1210local_messages.prototype.list_local_folders = function(folder) {
1211    this.init_local_messages();
1212    var retorno = new Array();
1213    var retorno_defaults = new Array();
1214    rs = this.dbGears.execute("select folder,rowid from folder where uid_usuario=?",[account_id]);
1215//    rs = this.dbGears.execute("select folder.folder,sum(mail.unseen) from folder left join mail on "+
1216//      "folder.rowid=mail.id_folder where folder.uid_usuario=? group by folder.folder",[account_id]);
1217    var achouInbox = false,achouSent = false ,achouSentConf = false,achouTrash = false,achouDrafts = false;
1218    while(rs.isValidRow()) {
1219        var temp = new Array();
1220        if (rs.field(0).indexOf('/') == 0){
1221               var rs1 = this.dbGears.execute('update folder set folder=? where rowid=?',[rs.field(0).slice(1),rs.field(1)]);
1222               temp[0] = rs.field(0).slice(1);
1223               rs1.close();
1224       }else{
1225           temp[0] = rs.field(0);
1226       }
1227
1228        var rs2 = this.dbGears.execute("select count(*) from mail where id_folder=? and unseen=1",[rs.field(1)]);
1229         rs2.field(0)? temp[1] = rs2.field(0):temp[1]=0;
1230
1231        var rs3 = this.dbGears.execute("select * from folder where folder like ? limit 1",[temp[0]+"/%"]);
1232        if(rs3.isValidRow())
1233            temp[2] = 1;
1234        else
1235            temp[2] = 0;
1236
1237        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)
1238            achouSentConf= true;
1239
1240        switch (temp[0]) {
1241            case 'Inbox':
1242                retorno_defaults[0] = temp;
1243                achouInbox = true;
1244                break;
1245            case sentfolder :
1246                retorno_defaults[1] = temp;
1247                achouSent = true;
1248                break;
1249            case trashfolder:
1250                retorno_defaults[3] = temp;
1251                achouTrash = true;
1252                break;
1253            case draftsfolder:
1254                retorno_defaults[4] = temp;
1255                achouDrafts = true;
1256                break;
1257            case preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""):
1258                retorno_defaults[2] = temp;
1259                achouSentConf = true;
1260                break;
1261            default:
1262                retorno.push(temp);
1263        }
1264
1265        rs.next();
1266    }
1267
1268    rs.close();
1269    this.finalize();
1270
1271    if(preferences.auto_create_local=='0' || (achouInbox && achouSent && achouSentConf && achouTrash && achouDrafts)){
1272        var retorno_final = retorno_defaults.concat(retorno.sort(charOrdA));
1273        return retorno_final;
1274    }else{
1275        if(!achouInbox)
1276            this.create_folder('Inbox');
1277        if(!achouSent)
1278            this.create_folder(sentfolder);
1279        if(!achouTrash)
1280            this.create_folder(trashfolder);
1281        if(!achouDrafts)
1282            this.create_folder(draftsfolder);
1283        if(!achouSentConf)
1284            this.create_folder(preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""));
1285        return this.list_local_folders();
1286    }
1287
1288}
1289local_messages.prototype.rename_folder = function(folder,old_folder) {
1290    if (folder.indexOf("local_") != -1)
1291        return false; //can't create folder with string local_
1292    this.init_local_messages();
1293    if (old_folder.indexOf("/") != "-1") {
1294        final_pos = old_folder.lastIndexOf("/");
1295        folder = old_folder.substr(0, final_pos) + "/" + folder;
1296    }
1297    try {
1298        this.dbGears.execute("update folder set folder=? where folder=? and uid_usuario=?",[folder,old_folder,account_id]);
1299    } catch (error) {
1300        this.finalize();
1301        return false;
1302    }
1303    rs = this.dbGears.execute("select folder from folder where folder like ? and uid_usuario=?",[old_folder+'/%',account_id]);
1304    while(rs.isValidRow()) {
1305        folder_tmp = rs.field(0);
1306        folder_new = folder_tmp.replace(old_folder,folder);
1307        this.dbGears.execute("update folder set folder=? where folder=?",[folder_new,folder_tmp]);
1308        rs.next();
1309    }
1310
1311
1312    this.finalize();
1313    return true;
1314}
1315       
1316local_messages.prototype.remove_folder = function(folder) {
1317    this.init_local_messages();
1318    var rs = this.dbGears.execute("select count(rowid) from folder where folder like ? and uid_usuario=?",[folder+"/%",account_id]);
1319    var sons = rs.field(0);
1320    rs.close();
1321
1322    if(sons == 0){
1323                var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
1324                var folder_id = rs.field(0);
1325                rs.close();
1326                this.dbGears.execute("delete from folder where rowid=?",[folder_id]);
1327                rs = this.dbGears.execute("select rowid,mail from mail where id_folder=?",[folder_id]);
1328                while(rs.isValidRow()) {
1329                    var rs2 = this.dbGears.execute("select url from anexo where id_mail=?",[rs.field(0)]);
1330                    while(rs2.isValidRow()) {
1331                        this.store.remove(rs2.field(0));
1332                        rs2.next();
1333                    }
1334                    rs2.close();
1335                    this.dbGears.execute("delete from anexo where id_mail=?",[rs.field(0)]);
1336                    var mail = connector.unserialize(rs.field(1));
1337                    this.store.remove(mail.url_export_file);
1338                    rs.next();
1339                }
1340                rs.close();
1341                this.dbGears.execute("delete from mail where id_folder=?",[folder_id]);
1342                this.finalize();
1343                return true;
1344    }else  {
1345                this.finalize();
1346                return false;
1347    }
1348
1349}
1350
1351local_messages.prototype.move_messages = function(new_folder,msgs_number) {
1352   
1353        if(!msgs_number)
1354                msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1355       
1356    this.init_local_messages();
1357    var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[new_folder,account_id]);
1358    var id_folder = rs.field(0);
1359    rs.close();
1360    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...
1361    this.finalize();
1362}
1363
1364local_messages.prototype.setFilter = function(sFilter)
1365{
1366        this.filterSerch = sFilter;
1367}
1368
1369local_messages.prototype.getFilter = function()
1370{
1371        return this.filterSerch;
1372}
1373
1374local_messages.prototype.setSortType = function (sortType){
1375    this.sortType = sortType;
1376}
1377
1378local_messages.prototype.getSortType = function (){
1379    if (this.sortType == "")
1380    {
1381        return 'SORTDATE';
1382    }
1383    return this.sortType;
1384}
1385
1386local_messages.prototype.search = function(folders,sFilter) {
1387    this.init_local_messages();
1388    this.setFilter(sFilter);
1389    var filters = sFilter.replace(/^##|##$/g,"").split('##');
1390    var friendly_filters = new Array();
1391
1392    if (sFilter.indexOf('ALL') != -1) { //all filters...
1393        filters[0] = sFilter.replace(/##/g,"");
1394        tmp = filters[0].split("<=>");
1395        if (tmp[1] == ""){
1396                var teste = document.getElementsByName(currentTab);
1397                tmp[1] = teste[0].value;
1398        }
1399        searchKey = new Array();
1400        searchKey.push("SUBJECT");
1401        searchKey.push(tmp[1]);
1402        friendly_filters.push(searchKey);
1403
1404        searchKey = new Array();
1405        searchKey.push("BODY");
1406        searchKey.push(tmp[1]);
1407        friendly_filters.push(searchKey);
1408
1409        searchKey = new Array();
1410        searchKey.push("FROM");
1411        searchKey.push(tmp[1]);
1412        friendly_filters.push(searchKey);
1413
1414        searchKey = new Array();
1415        searchKey.push("TO");
1416        searchKey.push(tmp[1]);
1417        friendly_filters.push(searchKey);
1418
1419        searchKey = new Array();
1420        searchKey.push("CC");
1421        searchKey.push(tmp[1]);
1422        friendly_filters.push(searchKey);
1423    }
1424    else {
1425        for (var i=0; i<filters.length; i++)
1426        {
1427            if (filters[i] != ""){
1428                //tmp[0] = tmp[0].replace(/^\s+|\s+$/g,"");
1429                //tmp[1] = tmp[1].replace(/^\s+|\s+$/g,"");
1430                friendly_filters.push(filters[i].split("<=>"));
1431            }
1432        }
1433    }
1434    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 (";
1435    for(var fnum in folders) {
1436        sql+="'"+folders[fnum]+"'";
1437        if(fnum<folders.length-1)
1438            sql+=",";
1439    }
1440    sql += ") and (";
1441    for (var z=0;z<friendly_filters.length;z++) {
1442        if (z != 0) {
1443            if (sFilter.indexOf('ALL') != -1)
1444                sql += " or";
1445            else
1446                sql += " and";
1447        }
1448        var cond = friendly_filters[z][0].replace(/^\s+|\s+$/g,"");
1449        if (cond == "SINCE" || cond == "BEFORE" | cond == "ON"){
1450
1451            tmpDate = friendly_filters[z][1].replace(/\%2F/g,"/").split('/');
1452
1453            // Date = url_decode(friendly_filters[z][1]);
1454            sql+=" mail.timestamp " + this.aux_convert_filter_field(friendly_filters[z][0], tmpDate);
1455        }
1456        else if (!friendly_filters[z][1])
1457        {
1458            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0]);
1459        }
1460        else
1461        {
1462            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0])+" like '%"+url_decode_s(friendly_filters[z][1])+"%'";
1463        }
1464    }
1465    sql += ")";
1466
1467    // Sort
1468    if (this.getSortType().match('^SORTDATE.*')){
1469        sql += " order by mail.timestamp";
1470    }
1471    else if (this.getSortType().match('^SORTWHO.*')){
1472        sql += " order by mail.ffrom";
1473    }
1474    else if (this.getSortType().match('^SORTSUBJECT.*')){
1475        sql += " order by mail.subject";
1476    }
1477    else if (this.getSortType().match('^SORTSIZE.*')){
1478        sql += " order by mail.size";
1479    }
1480    else if (this.getSortType().match('^SORTBOX.*')){
1481        sql += " order by folder.folder";
1482    }
1483
1484    sql += this.getSortType().match('^.*_REVERSE$') ? ' asc' : ' desc';
1485
1486    var rs = this.dbGears.execute(sql,[true]);
1487    var retorno = [];
1488    var numRec = 0;
1489   
1490    while( rs.isValidRow() )
1491    {
1492                var header                      = connector.unserialize( rs.field(0) );
1493                var date_formated       = ( header["udate"] ).toString();
1494                /*
1495                 * Antigamente o udate vinha com o formato de data e foi alterado para vir o timestamp.
1496                 * Nesse caso, e-mails arquivados anteriormente usamos o udate, caso contrario, usamos o smalldate,
1497                 * pois o udate agora vem como timestamp
1498                 * verifica tambem no caso de mensagens antigas que nao exista o smalldate
1499                 * definir
1500                */
1501                if( !date_formated.match(/\d{2}\/\d{2}\/\d{4}/) )
1502                {
1503                    if ( (typeof(header["smalldate"]) != "undefined") && (!header["smalldate"].match(/\d{2}\:\d{2}/) ) ){
1504                            date_formated = header["smalldate"];
1505                    }else{
1506                            var day = new Date();
1507                            day.setTime(header["udate"] * 1000);
1508                            aux_dia = day.getDate() < 10 ? '0' + day.getDate() : day.getDate();
1509                            aux_mes = day.getMonth()+1; // array start with '0..11'
1510                            aux_mes = aux_mes < 10 ? '0' + aux_mes : aux_mes;
1511                            date_formated = aux_dia + '/' +  aux_mes + '/' + day.getFullYear();
1512                    }
1513                }
1514
1515                retorno[ numRec++ ] =
1516                {
1517                        'from'          : header["from"]["name"],
1518                        'subject'       : unescape(header["subject"]),
1519                        'udate'         : date_formated,
1520                        'size'          : rs.field(3),
1521                        'flag'          : header["Unseen"]+header["Recent"]+header["Flagged"]+header["Draft"],
1522                        'boxname'       : "local_"+rs.field(1),
1523                        'uid'           : rs.field(2)
1524                }
1525
1526                rs.next();
1527    }
1528
1529    this.finalize();
1530
1531    return ( retorno.length > 0 ) ? retorno : false ;
1532}
1533       
1534local_messages.prototype.aux_convert_size = function(size) {
1535    var tmp = Math.floor(size/1024);
1536    if(tmp >= 1){
1537        return tmp + " kb";
1538    }else{
1539        return size + " b";
1540    }
1541               
1542}
1543       
1544local_messages.prototype.aux_convert_filter_field = function(filter,date)
1545{
1546        var dateObj;
1547   
1548        if (typeof date != 'undefined')
1549    {
1550        dateObj = new Date(date[2],date[1]-1,date[0]);
1551    }
1552
1553    if((filter=="SUBJECT ") || (filter=="SUBJECT"))
1554        return "subject";
1555    else if((filter=="BODY ") || (filter=="BODY"))
1556        return "body";
1557    else if((filter=="FROM ") || (filter=="FROM"))
1558        return "ffrom";
1559    else if((filter=="TO ") || (filter=="TO"))
1560        return "fto";
1561    else if((filter=="CC ") || (filter=="CC"))
1562        return "cc";
1563    else if (filter.replace(/^\s+|\s+$/g,"") == "SINCE"){
1564        dateObj.setHours(0, 0, 0, 0);
1565        return ">= " + dateObj.getTime().toString(10).substr(0, 10);
1566    }
1567    else if (filter.replace(/^\s+|\s+$/g,"") == "BEFORE"){
1568        dateObj.setHours(23, 59, 59, 999);
1569        return "<= " + dateObj.getTime().toString(10).substr(0, 10);
1570    }
1571    else if (filter.replace(/^\s+|\s+$/g,"") == "ON"){
1572        dateObj.setHours(0, 0, 0, 0);
1573        var ts1 = dateObj.getTime().toString(10).substr(0, 10);
1574        dateObj.setHours(23, 59, 59, 999);
1575        var ts2 = dateObj.getTime().toString(10).substr(0, 10);
1576        return ">= " + ts1 + ") and (timestamp <= " + ts2;
1577    }
1578    else if (filter.replace(/^\s+|\s+$/g,"") == "FLAGGED")
1579        return "flagged = 1";
1580    else if (filter.replace(/^\s+|\s+$/g,"") == "UNFLAGGED")
1581        return "flagged = 0";
1582    else if (filter.replace(/^\s+|\s+$/g,"") == "UNSEEN")
1583        return "unseen = 1";
1584    else if (filter.replace(/^\s+|\s+$/g,"") == "SEEN")
1585        return "unseen = 0";
1586    else if (filter.replace(/^\s+|\s+$/g,"") == "ANSWERED")
1587        return "answered = 1";
1588    else if (filter.replace(/^\s+|\s+$/g,"") == "UNANSWERED")
1589        return "answered = 0";
1590    else if (filter.replace(/^\s+|\s+$/g,"") == "RECENT")
1591        return "recent = 1";
1592    else if (filter.replace(/^\s+|\s+$/g,"") == "OLD")
1593        return "recent = 0";
1594
1595}
1596       
1597local_messages.prototype.has_local_mails = function() {
1598    this.init_local_messages();
1599    var rs = this.dbGears.execute("select rowid from folder limit 0,1");
1600    var retorno;
1601    if(rs.isValidRow())
1602        retorno = true;
1603    else
1604        retorno = false;
1605    this.finalize();
1606    return retorno;
1607}
1608
1609//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Simple AJAX function used to get the RFC822 email source.
1610local_messages.prototype.get_src = function(url){
1611    AJAX = false;
1612    if (window.XMLHttpRequest) { // Mozilla, Safari,...
1613        AJAX = new XMLHttpRequest();
1614        if (AJAX.overrideMimeType) {
1615            AJAX.overrideMimeType('text/xml');
1616        }
1617    } else if (window.ActiveXObject) { // IE
1618        try {
1619            AJAX = new ActiveXObject("Msxml2.XMLHTTP");
1620        } catch (e) {
1621            try {
1622                AJAX = new ActiveXObject("Microsoft.XMLHTTP");
1623            } catch (e) {}
1624        }
1625    }
1626
1627    if (!AJAX) {
1628        alert('ERRO :(Seu navegador não suporta a aplicação usada neste site');
1629        return false;
1630    }
1631
1632    AJAX.onreadystatechange = function() {
1633        if (AJAX.readyState == 4) {
1634            AJAX.src=AJAX.responseText;
1635            if (AJAX.status == 200) {
1636                return AJAX.responseText;
1637            } else {
1638                return false;
1639            }
1640        }
1641    }
1642
1643    AJAX.open('get', encodeURI(url), false);
1644    AJAX.send(null);
1645    return AJAX.responseText;
1646};
1647
1648//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
1649//para que elas sejam inseridas no imap pela função  imap_functions.unarchive_mail.
1650    local_messages.prototype.unarchive_msgs = function (folder,new_folder,msgs_number){
1651
1652    this.init_local_messages();
1653
1654        // se a aba estiver aberta e selecionada, apenas a msg da aba é movida
1655        if(currentTab.toString().indexOf("_r") != -1)
1656        msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1657               
1658        if(currentTab.toString().indexOf("_s") != -1)
1659                msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_s"));
1660       
1661    if( msgs_number =='selected' || !msgs_number ){
1662                if (currentTab != 0 && currentTab.indexOf("search_")  >= 0)
1663                        msgs_number = get_selected_messages_search();
1664                else
1665                        msgs_number = get_selected_messages();
1666        }
1667               
1668        if( !msgs_number )
1669            return write_msg(get_lang('No selected message.'));
1670
1671        document.getElementById("overlay").style.visibility = "";
1672
1673        var rs = this.dbGears.execute("select mail,timestamp from mail where rowid in (" + msgs_number + ")");
1674
1675        var source = [], flags = [], timestamp = [];
1676               
1677                while(rs.isValidRow()) {
1678
1679            var mail = connector.unserialize(rs.field(0));
1680
1681            flags.push( mail["Answered"]+":"+mail["Draft"]+":"+mail["Flagged"]+":"+mail["Unseen"]+":"+mail["Forwarded"] );
1682            source.push( escape( mail.msg_source || this.get_src( mail.url_export_file ) ) );
1683            timestamp.push( rs.field(1) );
1684
1685                        rs.next();
1686                }
1687
1688                rs.close();
1689                this.finalize();
1690
1691        write_msg( "Desarquivando " + source.length + " mensagens... ", true );
1692
1693        var sep = "#@#@#@";
1694
1695        var params = "&folder=" + ( new_folder || 'INBOX' ) +
1696                     "&source=" + source.join(sep) +
1697                     "&timestamp=" + timestamp.join(sep) +
1698                     "&flags=" + flags.join(sep);
1699
1700        cExecute ("$this.imap_functions.unarchive_mail&", function(data){
1701
1702            clean_msg();
1703            document.getElementById("overlay").style.visibility = "hidden";
1704            write_msg( get_lang( data.error || 'All messages are successfully unarchived' ) );
1705
1706        }, params);
1707       
1708        update_menu();
1709    }
1710
1711local_messages.prototype.get_msg_date = function (original_id, is_local){
1712
1713    this.init_local_messages();
1714
1715    if (typeof(is_local) == 'undefined')
1716    {
1717        is_local = false;
1718    }
1719
1720    var rs;
1721
1722    if (is_local)
1723    {
1724        rs = this.dbGears.execute("select mail from mail where rowid="+original_id);
1725    }
1726    else
1727    {
1728        rs = this.dbGears.execute("select mail from mail where original_id="+original_id);
1729    }
1730    var tmp = connector.unserialize(rs.field(0));
1731    var ret = new Array();
1732    ret.fulldate = tmp.fulldate.substr(0,16);
1733    ret.smalldate = tmp.msg_day;
1734    ret.msg_day = tmp.msg_day;
1735    ret.msg_hour = tmp.msg_day;
1736
1737    rs.close();
1738    this.finalize();
1739    return ret;
1740}
1741
1742
1743local_messages.prototype.download_all_local_attachments = function(folder,id){
1744    this.init_local_messages();
1745    var rs = this.dbGears.execute("select mail from mail where rowid="+id);
1746    var tmp = connector.unserialize(rs.field(0));
1747    rs.close();
1748    this.finalize();
1749    tmp.msg_source?source = tmp.msg_source:source = this.get_src(tmp.url_export_file);
1750    //source = this.get_src(tmp.url_export_file);
1751    source = escape(source);
1752    var handler_source = function(data){
1753        download_attachments(null, null, data, null,null,'anexos.zip');
1754    }
1755    cExecute("$this.imap_functions.download_all_local_attachments",handler_source,"source="+source);
1756}
1757
1758/*************************************************************************/
1759/* Funcao usada para exportar mensagens arquivadas localmente.
1760 * Rommel de Brito Cysne (rommel.cysne@serpro.gov.br)
1761 * em 22/12/2008.
1762 */
1763local_messages.prototype.local_messages_to_export = function(){
1764
1765    if (openTab.type[currentTab] > 1){
1766        var msgs_to_export_id = currentTab.substring(0,currentTab.length-2,currentTab);
1767    }else{
1768        var msgs_to_export_id = get_selected_messages();
1769    }
1770    var flag = true;
1771    var handler_local_mesgs_to_export = function(data){
1772                        var filename = 'mensagens.zip';
1773
1774                        if (data.match(/\.eml$/gi)) {
1775                                fn_regex = /[^\/]*\.eml$/i;
1776                                filename = fn_regex.exec(data);
1777                        }
1778
1779        document.getElementById('lertOverlay').style.display='none';
1780        document.getElementById('lertContainer').style.display='none';
1781        document.getElementById('lertContainer').innerHTML = '';
1782        flag = false;
1783
1784                        download_attachments(null, null, data, null, null, filename);
1785    }
1786
1787        var cancel = new LertButton(get_lang('cancel'), function(){flag=false;connector.cancelRequest();});
1788     var titulo = '<b>' + get_lang('Warning') + '!</b>';
1789     var message = get_lang("Exporting selected messages, this can take some time.");
1790        var multConfirm = new Lert(
1791                titulo,
1792                message,
1793                [cancel],
1794                {
1795                        defaultButton:cancel,
1796                        icon:'js/lert/images/dialog-help.gif'
1797                });
1798        multConfirm.display();
1799
1800        var timeOut = function(){
1801            if(flag){
1802                document.getElementById('lertOverlay').style.display='none';
1803                document.getElementById('lertContainer').style.display='none';
1804                document.getElementById('lertContainer').innerHTML = '';
1805                connector.cancelRequest();
1806                write_msg(get_lang('Error exporting messages, try again latter'));
1807                }
1808
1809        }
1810        window.setTimeout(timeOut,300000);
1811
1812    if(msgs_to_export_id){
1813        this.init_local_messages();
1814        var l_msg = "t";
1815        var mesgs ="";
1816        var subjects ="";
1817        var rs = this.dbGears.execute("select mail,subject from mail where rowid in ("+msgs_to_export_id+")");
1818        while(rs.isValidRow()){
1819            mail = connector.unserialize(rs.field(0));
1820            mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1821            subject = rs.field(1);
1822            mesgs += src;
1823            mesgs += "@@";
1824            subjects += subject;
1825            subjects += "@@";
1826            rs.next();
1827        }
1828        rs.close();
1829        this.finalize();
1830        mesgs = escape(mesgs);
1831        subjects = escape(subjects);
1832        params = "subjects="+subjects+"&mesgs="+mesgs+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export_id;
1833        cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1834    }
1835    return true;
1836}
1837
1838local_messages.prototype.get_all_local_folder_messages= function(folder_name){
1839
1840
1841    var mesgs = new Array();
1842    var subjects = new Array();
1843    var hoje = new Date();
1844    var msgs_to_export = new Array();
1845    var l_msg="t";
1846
1847    this.init_local_messages();
1848    var query = "select mail,subject,mail.rowid from mail inner join folder on (mail.id_folder=folder.rowid) where folder.folder='" + folder_name + "'";
1849
1850    var rs = this.dbGears.execute(" "+query)
1851
1852    var handler_local_mesgs_to_export = function(data){
1853        //alert("data - " + data + " - tipo - " + typeof(data));
1854        download_attachments(null, null, data, null,null,'mensagens.zip');
1855    }
1856    var j=0;
1857    while (rs.isValidRow()){
1858        msgs_to_export[j]=rs.field(2)
1859        mail = connector.unserialize(rs.field(0));
1860        mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1861        subject = rs.field(1);
1862        mesgs += src;
1863        mesgs += "@@";
1864        subjects += subject;
1865        subjects += "@@";
1866        rs.next();
1867        j++;
1868
1869    }
1870    rs.close();
1871    this.finalize();
1872    source = escape(mesgs);
1873    subjects = escape(subjects);
1874    params = "folder="+folder_name+"&subjects="+subjects+"&mesgs="+source+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export;
1875    cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1876         
1877
1878}
1879
1880
1881/*************************************************************************/
1882
1883       
1884/******************************************************************
1885                                        Offline Part
1886 ******************************************************************/
1887
1888local_messages.prototype.is_offline_installed = function() {
1889    this.init_local_messages();
1890    var check = this.localServer.openManagedStore('expresso-offline');
1891    this.finalize();
1892    if(check==null)
1893        return false;
1894    else
1895        return true;
1896               
1897}
1898local_messages.prototype.update_offline = function(redirect) {
1899    this.init_local_messages();
1900    var managedStore = this.localServer.openManagedStore('expresso-offline');
1901
1902    if(managedStore!=null){
1903                       
1904        managedStore.oncomplete = function(details){
1905            if(redirect!=null)
1906                location.href=redirect;
1907        }
1908                       
1909        managedStore.checkForUpdate();
1910    } else if(redirect!=null) {
1911        location.href=redirect;
1912    }
1913    this.finalize();
1914}
1915       
1916local_messages.prototype.uninstall_offline = function() {
1917    if (!window.google || !google.gears) {
1918        temp = confirm(document.getElementById('lang_gears_redirect').value);
1919        if (temp) {
1920            expresso_local_messages.installGears();
1921        }
1922        return;
1923
1924    }
1925    this.init_local_messages();
1926    this.localServer.removeManagedStore('expresso-offline');
1927    alert(document.getElementById('lang_offline_uninstalled').value);
1928    //this.dbGears.execute('drop table user');
1929    //this.dbGears.execute('drop table queue');
1930    //this.dbGears.execute('drop table attachments_queue');
1931    this.finalize();
1932}
1933       
1934local_messages.prototype.as_trash = function(){//verifica se o usuario tem a pasta lixeira no arquivamento local
1935        this.init_local_messages();
1936    var rs = this.dbGears.execute("select folder from folder where uid_usuario="+account_id+" and folder = \"Trash\"");
1937        var check = rs.isValidRow();
1938        this.finalize();
1939    if(check)
1940                return true;
1941        else
1942                return false;
1943}
1944
1945local_messages.prototype.get_folders_to_sync = function() {//Precisa ter visibilidade ao array de linguagens.
1946    this.init_local_messages();
1947    var rs = this.dbGears.execute("select id_folder,folder_name from folders_sync where uid_usuario="+account_id);
1948    var retorno = new Array();
1949    while(rs.isValidRow()) {
1950        temp = new Array();
1951        temp[0] = rs.field(0);
1952        if(temp[0]=='INBOX' + cyrus_delimiter + 'Drafts' ||temp[0]=='INBOX' + cyrus_delimiter + 'Trash' || temp[0]=='INBOX' + cyrus_delimiter + 'Sent') {
1953            temp[1] = array_lang[rs.field(1).toLowerCase()];
1954        }
1955        else {
1956            temp[1] = rs.field(1);
1957        }
1958                       
1959        retorno.push(temp);
1960        rs.next();
1961    }
1962    this.finalize();
1963    return retorno;
1964}
1965       
1966local_messages.prototype.install_offline = function(urlOffline,urlIcone,uid_usuario,login,pass,redirect) {
1967    if (!window.google || !google.gears) {
1968            expresso_local_messages.installGears();
1969        return;
1970    }
1971               
1972    if(pass.length>0) {
1973        only_spaces = true;
1974        for(cont=0;cont<pass.length;cont++) {
1975            if(pass.charAt(cont)!=" ")
1976                only_spaces = false;
1977        }
1978        if(only_spaces) {
1979            alert(document.getElementById('lang_only_spaces_not_allowed').value);
1980            return false;
1981        }
1982    }
1983
1984    modal('loading');
1985    var desktop = google.gears.factory.create('beta.desktop');
1986    desktop.createShortcut('ExpressoMail Offline',
1987        urlOffline,
1988                {'32x32': urlIcone},
1989        'ExpressoMail Offline');
1990
1991
1992    this.init_local_messages();
1993
1994    //user with offline needs to have at least the folder Inbox already created.
1995    tmp_rs = this.dbGears.execute("select rowid from folder where folder='Inbox' and uid_usuario=?",[uid_usuario]);
1996    if(!tmp_rs.isValidRow())
1997        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",['Inbox',uid_usuario]);
1998
1999    this.localServer.removeManagedStore('expresso-offline');
2000       
2001    var managedStore = this.localServer.createManagedStore('expresso-offline');
2002    managedStore.manifestUrl = 'js/manifest';
2003
2004    managedStore.onerror = function (error) {
2005        alert(error);
2006    }
2007               
2008    managedStore.oncomplete = function(details) {
2009        if (close_lightbox_div) {
2010            close_lightbox();
2011            close_lightbox_div = false;
2012            alert(document.getElementById('lang_offline_installed').value);
2013            location.href=redirect;
2014        }
2015    }
2016
2017    //create structure to user in db
2018    this.dbGears.execute('create table if not exists user (uid_usuario int,login text,pass text, logged int,unique(uid_usuario))');
2019    this.dbGears.execute('create table if not exists queue (ffrom text, fto text, cc text, cco text,'+
2020        'subject text, conf_receipt int, important int,body text,sent int,user int)');
2021    this.dbGears.execute('create table if not exists attachments_queue ('+
2022        'id_queue int, url_attach text)');
2023    this.dbGears.execute('create table if not exists sent_problems (' +
2024        'id_queue int,message text)');
2025               
2026    //d = new Date();
2027               
2028    try {
2029        var rs = this.dbGears.execute("select uid_usuario from user where uid_usuario=?",[uid_usuario]);
2030        if(!rs.isValidRow())
2031            this.dbGears.execute("insert into user (uid_usuario,login,pass) values (?,?,?)",[uid_usuario,login,pass]);
2032        else
2033            this.dbGears.execute("update user set pass=? where uid_usuario=?",[pass,uid_usuario]);
2034    } catch (error) {
2035        this.finalize();
2036        alert(error);
2037        return false;
2038    }
2039    managedStore.checkForUpdate();
2040    this.capt_url('controller.php?action=$this.db_functions.get_dropdown_contacts_to_cache');
2041        setTimeout(function(){
2042        managedStore.complete();
2043    }, 60000);
2044    this.finalize();
2045}
2046       
2047/**
2048         * Return all users in an array following the structure below.
2049         *
2050         * key: uid
2051         * value: user login
2052         */
2053local_messages.prototype.get_all_users = function() {
2054    this.init_local_messages();
2055    var users = new Array();
2056    var rs = this.dbGears.execute("select uid_usuario,login from user");
2057    while(rs.isValidRow()) {
2058        users[rs.field(0)] = rs.field(1);
2059        rs.next();
2060    }
2061    this.finalize();
2062    return users;
2063}
2064       
2065local_messages.prototype.set_as_logged = function(uid_usuario,pass,bypass) {
2066    this.init_local_messages();
2067    if (!bypass) {
2068        var rs = this.dbGears.execute("select pass from user where uid_usuario=?", [uid_usuario]);
2069        if (!rs.isValidRow() || (pass != rs.field(0) && pass != MD5(rs.field(0)))) {
2070            this.finalize();
2071            return false;
2072        }
2073    }
2074    d = new Date();
2075
2076    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2077    this.dbGears.execute("update user set logged=? where uid_usuario=?",[d.getTime(),uid_usuario]); //Login just in one...
2078    this.finalize();
2079    return true;
2080}
2081       
2082local_messages.prototype.unset_as_logged = function() {
2083    this.init_local_messages();
2084    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2085    this.finalize();
2086}
2087       
2088local_messages.prototype.user_logged = function() {
2089    this.init_local_messages();
2090    var user_logged = new Array();
2091    var rs = this.dbGears.execute("select uid_usuario,logged from user where logged is not null");
2092    if(!rs.isValidRow()) {
2093        this.finalize();
2094        return null;
2095    }
2096    user_logged[0] = rs.field(0);
2097    user_logged[1] = rs.field(1);
2098    this.finalize();
2099    return user_logged;
2100}
2101       
2102local_messages.prototype.send_to_queue = function (form) {
2103    this.init_local_messages();
2104    var mail_values = new Array();
2105               
2106    for (var i=0;i<form.length;i++) {
2107        if (form.elements[i].name != '') { //I.E made me to do that...
2108            if(form.elements[i].name=='folder' || form.elements[i].name=='msg_id' || form.elements[i].name=='' || form.elements[i].name==null)
2109                continue;
2110            else if (form.elements[i].name == 'input_return_receipt' )
2111                mail_values['conf_receipt'] = form.elements[i].checked ? 1 : 0;
2112            else if(form.elements[i].name == 'input_important_message')
2113                mail_values['important'] = form.elements[i].checked ? 1 : 0;
2114            else
2115            if (form.elements[i].name == 'body')
2116                mail_values['body'] = form.elements[i].value;
2117            else
2118            if (form.elements[i].name == 'input_from')
2119                mail_values['ffrom'] = form.elements[i].value;
2120            else
2121            if (form.elements[i].name == 'input_to')
2122                mail_values['fto'] = form.elements[i].value;
2123            else
2124            if (form.elements[i].name == 'input_cc')
2125                mail_values['cc'] = form.elements[i].value;
2126            else
2127            if (form.elements[i].name == 'input_cco')
2128                mail_values['cco'] = form.elements[i].value;
2129            else
2130            if (form.elements[i].name == 'input_subject')
2131                mail_values['subject'] = form.elements[i].value;
2132        }
2133    }
2134    //mail_values['fto'] = input_to;
2135    //mail_values['cc'] = input_cc;
2136    //mail_values['cco'] = input_cco;
2137    //mail_values['subject'] = input_subject;
2138    //mail_values['conf_receipt'] = input_return_receipt;
2139    //mail_values['important'] = input_important_message;
2140               
2141    try {
2142        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]);
2143        this.send_attach_to_queue(this.dbGears.lastInsertRowId,form);
2144    }catch(error) {
2145        alert(error);
2146        return get_lang('Error sending a mail to queue. Verify if you have installed ExpressoMail Offline');
2147    }
2148    this.finalize();
2149    return true;
2150}
2151       
2152local_messages.prototype.send_attach_to_queue = function(id_queue,form) {
2153               
2154    for(i=0;i<form.elements.length;i++) {
2155                       
2156        if(form.elements[i].name.indexOf("file_")!=-1) {
2157            var tmp_input = form.elements[i];
2158            var d = new Date();
2159            var url_local = 'local_attachs/'+d.getTime();
2160            this.store.captureFile(tmp_input, url_local);
2161            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,url_local]);
2162        }
2163        else if(form.elements[i].name.indexOf("offline_forward_")!=-1){
2164            //alert();
2165            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,form.elements[i].value]);
2166        }
2167    }
2168}
2169
2170       
2171local_messages.prototype.get_num_msgs_to_send = function() {
2172    this.init_local_messages();
2173
2174    var rs = this.dbGears.execute("select count(*) from queue where user=? and sent=0",[account_id]);
2175    var to_return = rs.field(0);
2176
2177    this.finalize();
2178    return to_return;
2179}
2180       
2181local_messages.prototype.set_problem_on_sent = function(rowid_message,msg) {
2182    this.init_local_messages();
2183    this.dbGears.execute("update queue set sent = 2 where rowid=?",[rowid_message]);
2184    this.dbGears.execute("insert into sent_problems (id_queue,message) values (?,?)"[rowid_message,msg]);
2185    this.finalize();
2186}
2187       
2188local_messages.prototype.set_as_sent = function(rowid_message) {
2189    this.init_local_messages();
2190    this.dbGears.execute("update queue set sent = 1 where rowid=?",[rowid_message]);
2191    this.finalize();
2192}
2193       
2194local_messages.prototype.get_form_msg_to_send = function() {
2195    this.init_local_messages();
2196    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]);
2197    if(!rs.isValidRow())
2198        return false;
2199               
2200    var form = document.createElement('form');
2201    form.method = 'POST';
2202    form.name = 'form_queue_'+rs.field(8);
2203    form.style.display = 'none';
2204                form.onsubmit = function(){return false;}
2205    if(!is_ie)
2206        form.enctype="multipart/form-data";
2207    else
2208        form.encoding="multipart/form-data";
2209               
2210    var ffrom = document.createElement('TEXTAREA');
2211    ffrom.name = "input_from";
2212    ffrom.value = rs.field(0);
2213    form.appendChild(ffrom);
2214               
2215    var fto = document.createElement('TEXTAREA');
2216    fto.name = "input_to";
2217    fto.value = rs.field(1);
2218    form.appendChild(fto);
2219               
2220    var cc = document.createElement('TEXTAREA');
2221    cc.name = "input_cc";
2222    cc.value = rs.field(2);
2223    form.appendChild(cc);
2224
2225    var cco = document.createElement('TEXTAREA');
2226    cco.name = "input_cco";
2227    cco.value = rs.field(3);
2228    form.appendChild(cco);
2229               
2230    var subject = document.createElement('TEXTAREA');
2231    subject.name = "input_subject";
2232    subject.value = rs.field(4);
2233    form.appendChild(subject);
2234               
2235    var folder = document.createElement('input');
2236    folder.name='folder';
2237    folder.value=preferences.save_in_folder;
2238    form.appendChild(folder);
2239               
2240    if (rs.field(5) == 1) {
2241        var conf_receipt = document.createElement('input');
2242        conf_receipt.type='text';
2243        conf_receipt.name = "input_return_receipt";
2244        conf_receipt.value = 'on';
2245        form.appendChild(conf_receipt);
2246    }
2247               
2248    if (rs.field(6) == 1) {
2249        var important = document.createElement('input');
2250        important.type='text';
2251        important.name = "input_important_message";
2252        important.value = 'on';
2253        form.appendChild(important);
2254    }
2255               
2256    var body = document.createElement('TEXTAREA');
2257    body.name = "body";
2258    body.value = rs.field(7);
2259    form.appendChild(body);
2260               
2261    var rowid = document.createElement('input');
2262    rowid.type = 'hidden';
2263    rowid.name = 'rowid';
2264    rowid.value = rs.field(8);
2265    form.appendChild(rowid);
2266               
2267    //Mounting the attachs
2268    var divFiles = document.createElement("div");
2269    divFiles.id = 'divFiles_queue_'+rs.field(8);
2270               
2271    form.appendChild(divFiles);
2272               
2273    document.getElementById('forms_queue').appendChild(form);
2274
2275    var is_local_forward = false;
2276    try {
2277                       
2278        var rs_attach = this.dbGears.execute('select url_attach from attachments_queue where id_queue=?', [rs.field(8)]);
2279        while (rs_attach.isValidRow()) {
2280            if(rs_attach.field(0).indexOf('../tmpLclAtt/')==-1) {
2281                tmp_field = addForwardedFile('queue_' + rs.field(8), this.store.getCapturedFileName(rs_attach.field(0)), 'nothing');
2282            }
2283            else {
2284                var tempNomeArquivo = rs_attach.field(0).split("/");
2285                var nomeArquivo = tempNomeArquivo[tempNomeArquivo.length-1];
2286                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.
2287                is_local_forward = true;
2288                tmp_field = addForwardedFile('queue_' + rs.field(8), nomeArquivo, 'nothing');
2289            }
2290            fileSubmitter = this.store.createFileSubmitter();
2291            fileSubmitter.setFileInputElement(tmp_field,rs_attach.field(0));
2292            //          alert(form.innerHTML);
2293            //  div.appendChild(tmp_field);
2294            rs_attach.next();
2295        }
2296                       
2297        if(is_local_forward) {
2298            var is_lcl_fw = document.createElement('input');
2299            is_lcl_fw.type = 'hidden';
2300            is_lcl_fw.name = 'is_local_forward';
2301            is_lcl_fw.value = "1";
2302            form.appendChild(is_lcl_fw);
2303        }
2304                               
2305    }
2306    catch(exception) {
2307        alert(exception);
2308    }
2309               
2310    this.finalize();
2311    return form;
2312}
2313
2314var expresso_local_messages;
2315expresso_local_messages = new local_messages();
2316//expresso_local_messages.create_objects();
Note: See TracBrowser for help on using the repository browser.