source: branches/2.5/expressoMail1_2/js/local_messages.js @ 7426

Revision 7426, 71.5 KB checked in by thiago, 11 years ago (diff)

Ticket #3088 - Validação na aba de pesquisas de mensagens locais.

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