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

Revision 5172, 70.2 KB checked in by wmerlotto, 13 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus. Ultimas sincronizacoes...

RevLine 
[670]1/**
2 * @author diogenes
3 */
4
[3286]5function local_messages() {
6    this.dbGears = null;
7    this.localServer = null;
8    this.store = null;
[3841]9    this.filterSerch = "";
[4796]10    this.sortType = "";
[3286]11}
[1622]12
[3286]13function charOrdA (a, b){
[4793]14    var primeiro = a[0].toLowerCase();
15    var segundo = b[0].toLowerCase();
16    if (primeiro > segundo) return 1;
17    if (primeiro < segundo) return -1;
[3286]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}
[1622]27
28
[3286]29function HeaderFlags()
30{
31    this.Answered = 0;
32    //this.Draft = 0;
33    this.Flagged = 0;
34    this.Recent = 0;
35}
[1622]36
[3286]37HeaderFlags.prototype.getAnswered = function()
38{
39    return this.Answered;
40}
[1622]41
[3286]42HeaderFlags.prototype.setAnswered = function(answered)
43{
44    this.Answered = answered;
45}
[1622]46
[3286]47//HeaderFlags.prototype.getDraft = function()
48//{
49//    return this.Draft;
50//}
[1622]51
[3286]52HeaderFlags.prototype.setDraft = function(draft)
53{
54    this.Draft = draft;
55}
[1622]56
[3286]57HeaderFlags.prototype.getFlagged = function()
58{
59    return this.Flagged;
60}
[1622]61
[3286]62HeaderFlags.prototype.setFlagged = function(flagged)
63{
64    this.Flagged = flagged;
65}
[1622]66
[3286]67HeaderFlags.prototype.getRecent = function()
68{
69    return this.Recent;
70}
[1622]71
[3286]72HeaderFlags.prototype.setRecent = function(recent)
73{
74    this.Recent = recent;
75}
[1622]76
[3286]77function FlagsParser(headerObj)
78{
79    this.Header = headerObj;
80}
[1622]81
[3286]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    }
[1622]93
[3286]94    flags = new HeaderFlags();
[1622]95
[3286]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    }
[1622]104
[3286]105    if (tmp.Flagged && tmp.Flagged.match(/^F$/)){
106        flags.setFlagged(1);
107    }
[1622]108
[3286]109    if (tmp.Forwarded && tmp.Forwarded.match(/^F$/)){
110        flags.setAnswered(1);
111    //flags.setDraft(1);
112    }
[1622]113
[3286]114    if (tmp.Recent && tmp.Recent.match(/^R$/)){
115        flags.setRecent(1);
116    }
117
118    return flags;
119
120}
[4796]121
[3286]122local_messages.prototype.installGears = function (){
[5134]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"
[3286]135        else
136        return false;
[5134]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;
[3286]145}
[1982]146
[3286]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}
[1982]157
[3286]158local_messages.prototype.init_local_messages = function(){ //starts only database operations
[1518]159               
[3286]160    if(this.dbGears==null || this.localServer==null || this.store == null)
161        this.create_objects();
[1982]162               
[3286]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) {
[3735]171                                if(new Date().getTime()-start_trying>10000) { //too much time trying, throw an exception
[1595]172                                        throw ex;
[3286]173        }
174    }
[1518]175                }
[1982]176                       
[3286]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,' +
[5134]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))');
[3286]182    this.dbGears.execute('create table if not exists anexo' +
[5134]183        ' (id_mail int,nome_anexo text,url text,pid int, contentType text)');
[3286]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)');
[3291]188    this.dbGears.execute('create INDEX if not exists idx_folder ON folder(uid_usuario,folder)');
[670]189
[3286]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');
[5134]194    }
195    catch(Exception) {
[670]196                       
[3286]197    }
[5134]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
[3286]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));
[670]213                       
[3286]214        this.dbGears.execute('update mail set size='+temp.Size+' where rowid='+rs.field(0));
215        rs.next();
216    }
217    //end of temporary code
[1622]218
[3286]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');
[1622]230
[3286]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();
[1622]238
[3286]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));
[1622]243
[3286]244            rs.next();
245        }
246        this.dbGears.execute('commit transaction');
[1622]247
[3286]248    //tmp = null;
[1622]249
[3286]250    }catch(Exception) {
251        this.dbGears.execute('rollback transaction');
252    }
[1622]253
[3286]254}
[670]255       
[3286]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}
[670]268       
[5134]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
[3286]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;
[670]648                       
[3286]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;
[670]656       
[3286]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        }
[670]669                       
[3286]670        /**
[670]671                         * The importance attribute can be empty, and javascript consider as null causing nullpointer.
672                         */
[3286]673        if((msg_header.Importance == null) ||  (msg_header.Importance == ""))
674            msg_header.Importance = "Normal";
[670]675                       
[3286]676        msg_header.aux_date = null;
[670]677                       
[3286]678        var mail = connector.serialize(msg_info);
679        var header = connector.serialize(msg_header);
[670]680       
[3286]681        var timestamp = msg_info.timestamp;
682        var id_folder;
[670]683       
[3286]684        if((folder==null) || (folder=="local_root"))
685            folder = "Inbox";
686        else
687            folder = folder.substr(6);//take off the word "local_"
[670]688                       
[3286]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        }
[670]696                       
[3286]697        if(msg_info.Unseen=="U")
698            unseen = 1;
[1622]699
[3286]700        //parse header
701        parser = new FlagsParser(msg_header);
702        flags = parser.parse();
[1622]703
[3286]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;
[670]711       
[3286]712        this.insert_attachments(id_mail,anexos);
713        this.finalize();
714        return true;
715    } catch (error) {
716        this.finalize();
717        return false;
718    }
[670]719
720
[3286]721}
[670]722       
[3286]723/**
[1969]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         */
[3286]729local_messages.prototype.parse_id_mail = function(id_mail) {
730    if (this.isInt(id_mail))
731        return false;
[1969]732               
[3286]733    var matches = id_mail.match(/(.+)(_[a-zA-Z0-9]+)/);
734    return matches;
735}
[1969]736       
[3286]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}
[1969]742       
[3286]743local_messages.prototype.get_local_mail = function(id_mail) {
744    this.init_local_messages();
[1969]745
[3286]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    }
[1969]752               
[3286]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);
[1000]759
[3286]760    //alert('tipo retorno.source: ' + typeof(retorno.source));
[1035]761
[3286]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);
[1035]767
[3286]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]"
[3872]778        //são substituidos pelos links dos anexos capturados pelo gears.
[1035]779
[3286]780        var thumbs= retorno.thumbs;
781        var anexos= retorno.array_attach;
782        for (i in anexos)
783        {
[3355]784            if(anexos[i]['url'] && anexos[i]['url'].match(/((jpg)|(jpeg)|(png)|(gif)|(bmp))/gi))
[3286]785            {
[5134]786                var er_imagens = new RegExp("\\.\\/get_archive.php\\?msgFolder=[\\w/]+\\&msgNumber=[0-9]+\\&indexPart="+(anexos[i]['pid']-1));
[3286]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]){
[5134]790                    er_imagens = new RegExp("\\.\\/inc\\/get_archive.php\\?&&msgFolder=[\\w/%]+\\msgNumber=[0-9]+\\&indexPart=0."+(anexos[i]['pid']-1)+"&image=thumbnail");
[3286]791                    Result_imagens = er_imagens.exec(thumbs[i]);
792                    thumbs[i] = thumbs[i].replace(Result_imagens,"'"+anexos[i]['url']+"'");
[5134]793                    er_imagens = new RegExp("\\.\\/inc\\/get_archive.php\\?&msgFolder=[\\w/%]+\\msgNumber=[0-9]+\\&indexPart=0."+(anexos[i]['pid']-1)+"&image=true");
[3286]794                    Result_imagens = er_imagens.exec(thumbs[i]);
[3502]795                    thumbs[i] = thumbs[i].replace(Result_imagens,anexos[i]['url']);
[3286]796                    thumbs[i] = thumbs[i].replace(/<IMG/i,'<img width="120"');
797                }
798            }
799        }
[1000]800
[3286]801        retorno['to'] = connector.unserialize(rs.field(5));
802        retorno['cc'] = connector.unserialize(rs.field(6));
[1035]803
[3286]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
[1035]807
[3286]808    }
[1035]809
[3286]810    rs.close();
811    this.finalize();
812    return retorno;
813}
[670]814
[3286]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}
[670]822
[3286]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}
[670]831
[3286]832local_messages.prototype.strip_tags = function (str) {
833    return str.replace(/<\/?[^>]+>/gi, '');
834}
[1806]835
[3286]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) {
[1806]837
[3286]838    this.init_local_messages();
839    var retorno = new Array();
840    msg_range_begin--;
[670]841               
[3301]842    mail_filter = " ";
[3286]843    if(search=="FLAGGED") {
[3301]844        mail_filter = "and (header like '%\"Flagged\";s:1:\"F%' or header like '%\"Importance\";s:5:\"High%') ";
[3286]845    }
846    if(search=="UNSEEN") {
[3301]847        mail_filter = "and unseen = 1 ";
[3286]848    }
849    if(search=="SEEN") {
[3301]850        mail_filter = "and unseen = 0 ";
[3286]851    }
852    if (search=="ANSWERED") {
[3301]853        mail_filter = "and header like '%\"Answered\";s:1:\"A%' ";
[3286]854    }
[670]855               
[3373]856        sql = 'select mail.rowid as rowid,mail.header as header,mail.size as size,' +
[3512]857    'mail.timestamp as timestamp,mail.unseen as unseen,mail.body as body, mail.mail as mail, ' +
[3373]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 ' +
[5134]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=? ' +
[3572]871    mail_filter + ' order by ';
[1938]872               
[3286]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    }
[670]885
886
[3286]887    sql+= sort_reverse==0?"ASC ":"DESC ";
888    sql +='limit ?,? ';
[670]889
890
[5134]891    var rs = this.dbGears.execute(sql,['%'+Element("user_email").value+'%',account_id,folder,true,msg_range_begin,emails_per_page]);
[3286]892    var cont = 0;
[670]893               
[5134]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]);
[670]895                               
[3286]896    while (rs.isValidRow()) {
897        //var email = rs.field(1);
898        var head = rs.field(1);
899        var codigoMail = rs.field(0);
[3512]900        var mail = rs.field(6);
[1752]901
[3286]902        var msg_body = rs.field(5);//recebe o conteudo da coluna "body" do banco de dados;
[1752]903
[3286]904        var rs2 = this.dbGears.execute('select count(*) from anexo where id_mail = '+codigoMail);
905        var head_unserialized = connector.unserialize(head);
[3512]906        var mail_unserialized = connector.unserialize(mail);
907
908      head_unserialized.Size = rs.field(2);
[3286]909        if(rs.field(4)==1)
910            head_unserialized.Unseen = 'U';
[670]911                       
[1752]912
[4310]913        head_unserialized.subject=(head_unserialized.subject==null)?"":unescape(head_unserialized.subject);
[1752]914
[3286]915        //var email_unserialized = connector.unserialize(email);
916        retorno[cont] = head_unserialized;
917        retorno[cont]['msg_number'] = codigoMail;
[3512]918        retorno[cont]['msg_day'] = mail_unserialized.msg_day;
919        retorno[cont]['msg_hour'] = mail_unserialized.msg_hour;
[3286]920        //declaracao do array() para receber o body de cada mensagem encontrada na busca sql realizada;
[3236]921
[3286]922        retorno[cont]['msg_sample'] = new Array();
923            retorno[cont]['msg_sample']['body'] = "";
[1752]924
[5134]925
[3286]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}
[670]937       
[3286]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    }
[1969]944               
[3286]945    var retorno;
946    var rs = this.dbGears.execute("select url from anexo where id_mail="+msg_number+" and pid = '"+pid+"'");
[5134]947    retorno = rs.field(0);
[3286]948    this.finalize();
[670]949               
[3286]950    return retorno;
951}
[670]952
[3286]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}
[670]959
[3286]960local_messages.prototype.finalize = function() {
[5134]961    if(this.dbGears)
[3286]962    this.dbGears.close();
963    this.dbGears = null;
964}
[670]965
[5134]966local_messages.prototype.remove_msgs = function(msgs_number)
967{
[3286]968    this.init_local_messages();
[5134]969         
[3286]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();
[5134]978}
[670]979               
[5134]980local_messages.prototype.delete_msgs = function(msgs_number,border_ID) {
[670]981
[5134]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");   
[3286]993    try {
994        msgs_exploded = msgs_number.split(",");
995    }catch(error) {
996        msgs_exploded = new Array();
997        msgs_exploded[0] = msgs_number;
998    }
[5134]999        this.previous = 0;
[3286]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');
[5134]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               
[3286]1019            mail_msg.removeChild(msg_to_delete);
[5134]1020                Element('tot_m').innerHTML = parseInt(Element('tot_m').innerHTML) - 1;
[3286]1021        }
[5134]1022        }
1023        if (msgs_exploded.length == 1){
1024        write_msg(get_lang("The message was deleted."));
[3286]1025    }
[5134]1026    else
1027        write_msg(get_lang("The messages were deleted."));
[3286]1028    Element('chk_box_select_all_messages').checked = false;
[670]1029               
[5134]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        }
[3286]1035}
[670]1036       
[3286]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);
[670]1040
1041
[3286]1042    mail = connector.unserialize(rs.field(0));
1043    download_local_attachment(mail.url_export_file)
[670]1044
[3286]1045    this.finalize();
1046}
[670]1047       
[1969]1048       
1049       
[3286]1050local_messages.prototype.set_messages_flag = function(msgs_number, flag) {
1051    this.init_local_messages();
[3806]1052        var no_errors = true;
[5134]1053    var msgs_to_set;
[3806]1054        var one_message = false;
[3286]1055    if (msgs_number == 'get_selected_messages') {
[5134]1056                var msgs_to_set = get_selected_messages();
1057                msgs_to_set= msgs_to_set.split(",");
[3286]1058    }
[5134]1059    else { //Just one message
[4852]1060            one_message = true;
[5134]1061                msgs_to_set = new Array();
1062                msgs_to_set[0] = msgs_number;
[3286]1063    }
1064    for (var i in msgs_to_set) {
[1969]1065                       
[3286]1066        var matches = '';//Messages comming from other tabs.
[5134]1067        if(matches = this.parse_id_mail(msgs_to_set[i])) {
[3286]1068            msgs_to_set[i] = matches[1];
1069        }
[1969]1070                       
[4563]1071        var rs = this.dbGears.execute("select header,unseen,mail,flagged,answered from mail where rowid=" + msgs_to_set[i]);
[3286]1072        header = connector.unserialize(rs.field(0));
[3716]1073        var mail = connector.unserialize(rs.field(2));
[3286]1074        unseen = rs.field(1);
[4724]1075        flagged = rs.field(3);
[4563]1076        answered = rs.field(4);
[3286]1077        switch(flag) {
1078            case "unseen":
[5134]1079                        set_msg_as_unread(msgs_to_set[i]);
[3716]1080                        header["Unseen"] = "U";
1081                        mail["Unseen"] = "U";
1082                        mail["header"]["Unseen"] = "U";
1083                        unseen = 1;
1084                        break;
[3286]1085            case "flagged":
[5134]1086                        set_msg_as_flagged(msgs_to_set[i]);
[3716]1087                        header["Flagged"] = "F";
1088                        mail["Flagged"] = "F";
1089                        mail["header"]["Flagged"] = "F";
[4724]1090                        flagged = 1;
[3716]1091                        break;
[3286]1092            case "unflagged":
[3806]1093                        if (header["Importance"].indexOf("High") != -1)
1094                                no_errors = false;
[3716]1095                        else {
[5134]1096                            set_msg_as_unflagged(msgs_to_set[i]);
[3716]1097                            header["Flagged"] = "N";
1098                                mail["Flagged"] = "N";
1099                                mail["header"]["Flagged"] = "N";
1100                        }
[4724]1101                        flagged = 0;
[3286]1102                break;
1103            case "seen":
[3716]1104                        header["Unseen"] = "N";
1105                        mail["Unseen"] = "N";
1106                        mail["header"]["Unseen"] = "N";
[5134]1107                        set_msg_as_read(msgs_to_set[i],true);
[3716]1108                        unseen = 0;
1109                        break;
[3286]1110            case "answered":
[3716]1111                        header["Draft"]="";
1112                        mail["Draft"] = "";
1113                        mail["header"]["Draft"] = "";
1114                        header["Answered"]="A";
1115                        mail["Answered"] = "A";
1116                        mail["header"]["Answered"] = "A";
1117                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/answered.gif title=Respondida>';
[4724]1118                        answered = 1;
[3286]1119                break;
1120            case "forwarded":
[3716]1121                        header["Draft"]="X";
1122                        mail["Draft"] = "X";
1123                        mail["header"]["Draft"] = "X";
1124                        header["Answered"]="A";
1125                        mail["Answered"] = "A";
1126                        mail["header"]["Answered"] = "A";
1127                        Element("td_message_answered_"+msgs_to_set[i]).innerHTML = '<img src=templates/default/images/forwarded.gif title=Encaminhada>';
[4724]1128                        answered = 1;
[3716]1129                        break;
[3286]1130        }
[1121]1131               
[3286]1132        rs.close();
[670]1133                       
[5134]1134        if(Element("check_box_message_" + msgs_to_set[i]))
1135            Element("check_box_message_" + msgs_to_set[i]).checked = false;
[4724]1136        var smail=connector.serialize(mail);
1137        smail =smail.replace(/([^'])'([^'])('?)/g,"$1''$2$3$3");
[4792]1138        try{
1139            this.dbGears.execute("update mail set mail='"+smail+"',header='"+connector.serialize(header)+
1140                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1141                " where rowid="+msgs_to_set[i]);
1142        }catch(e){
1143            this.dbGears.execute("update mail set header='"+connector.serialize(header)+
1144                "',unseen="+unseen+",flagged="+flagged+",answered="+answered+
1145                " where rowid="+msgs_to_set[i]);
1146        }
[3286]1147    }
1148    if(Element('chk_box_select_all_messages'))
1149        Element('chk_box_select_all_messages').checked = false;
1150    this.finalize();
[3806]1151        if (!no_errors) {
1152                if(one_message)
1153                        write_msg(get_lang("this message cant be marked as normal"));
1154                else
1155                        write_msg(get_lang("At least one of selected message cant be marked as normal"));
1156                return false;
1157        }
1158        return true;
[670]1159
[3286]1160}
[670]1161       
[3806]1162local_messages.prototype.set_message_flag = function(msg_number,flag,func_after_flag_change) {
1163    no_errors = this.set_messages_flag(msg_number,flag);
1164        if(no_errors && func_after_flag_change)
1165                func_after_flag_change(true);
[3286]1166}
[1121]1167       
[3286]1168local_messages.prototype.get_unseen_msgs_number = function() {
1169    this.init_local_messages();
1170    var rs = this.dbGears.execute("select count(*) from mail where unseen=1");
1171    var retorno = rs.field(0);
1172    rs.close();
1173    this.finalize();
1174    return retorno;
1175}
[670]1176
[3286]1177local_messages.prototype.create_folder = function(folder) {
[670]1178
[3286]1179    if (folder.indexOf("local_") != -1)
1180        return false; //can't create folder with string local_
[670]1181
[3286]1182    this.init_local_messages();
1183    try {
1184        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",[folder,account_id]);
1185    } catch (error) {
1186        this.finalize();
1187        return false;
1188    }
1189    this.finalize();
1190    return true;
1191}
[670]1192
[3286]1193local_messages.prototype.list_local_folders = function(folder) {
1194    this.init_local_messages();
1195    var retorno = new Array();
1196    var retorno_defaults = new Array();
1197    rs = this.dbGears.execute("select folder,rowid from folder where uid_usuario=?",[account_id]);
1198//    rs = this.dbGears.execute("select folder.folder,sum(mail.unseen) from folder left join mail on "+
1199//      "folder.rowid=mail.id_folder where folder.uid_usuario=? group by folder.folder",[account_id]);
1200    var achouInbox = false,achouSent = false ,achouSentConf = false,achouTrash = false,achouDrafts = false;
1201    while(rs.isValidRow()) {
1202        var temp = new Array();
[4827]1203        if (rs.field(0).indexOf('/') == 0){
1204               var rs1 = this.dbGears.execute('update folder set folder=? where rowid=?',[rs.field(0).slice(1),rs.field(1)]);
1205               temp[0] = rs.field(0).slice(1);
1206               rs1.close();
1207       }else{
1208           temp[0] = rs.field(0);
1209       }
1210
[3286]1211        var rs2 = this.dbGears.execute("select count(*) from mail where id_folder=? and unseen=1",[rs.field(1)]);
1212         rs2.field(0)? temp[1] = rs2.field(0):temp[1]=0;
[1938]1213
[3286]1214        var rs3 = this.dbGears.execute("select * from folder where folder like ? limit 1",[temp[0]+"/%"]);
1215        if(rs3.isValidRow())
1216            temp[2] = 1;
1217        else
1218            temp[2] = 0;
1219
[5134]1220        if(sentfolder ==  preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") || preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") == trashfolder || preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,"") == draftsfolder)
[3286]1221            achouSentConf= true;
1222
1223        switch (temp[0]) {
1224            case 'Inbox':
1225                retorno_defaults[0] = temp;
1226                achouInbox = true;
1227                break;
1228            case sentfolder :
1229                retorno_defaults[1] = temp;
1230                achouSent = true;
1231                break;
1232            case trashfolder:
1233                retorno_defaults[3] = temp;
1234                achouTrash = true;
1235                break;
1236            case draftsfolder:
1237                retorno_defaults[4] = temp;
1238                achouDrafts = true;
1239                break;
[5134]1240            case preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""):
[3286]1241                retorno_defaults[2] = temp;
1242                achouSentConf = true;
1243                break;
1244            default:
1245                retorno.push(temp);
[670]1246        }
1247
[3286]1248        rs.next();
1249    }
[1666]1250
[3286]1251    rs.close();
1252    this.finalize();
[1666]1253
[3365]1254    if(preferences.auto_create_local=='0' || (achouInbox && achouSent && achouSentConf && achouTrash && achouDrafts)){
[3286]1255        var retorno_final = retorno_defaults.concat(retorno.sort(charOrdA));
1256        return retorno_final;
1257    }else{
1258        if(!achouInbox)
1259            this.create_folder('Inbox');
1260        if(!achouSent)
1261            this.create_folder(sentfolder);
1262        if(!achouTrash)
1263            this.create_folder(trashfolder);
1264        if(!achouDrafts)
1265            this.create_folder(draftsfolder);
1266        if(!achouSentConf)
[5134]1267            this.create_folder(preferences.save_in_folder.replace("INBOX" + cyrus_delimiter,""));
[3286]1268        return this.list_local_folders();
1269    }
1270
1271}
1272local_messages.prototype.rename_folder = function(folder,old_folder) {
1273    if (folder.indexOf("local_") != -1)
1274        return false; //can't create folder with string local_
1275    this.init_local_messages();
1276    if (old_folder.indexOf("/") != "-1") {
1277        final_pos = old_folder.lastIndexOf("/");
1278        folder = old_folder.substr(0, final_pos) + "/" + folder;
1279    }
1280    try {
1281        this.dbGears.execute("update folder set folder=? where folder=? and uid_usuario=?",[folder,old_folder,account_id]);
1282    } catch (error) {
1283        this.finalize();
1284        return false;
1285    }
1286    rs = this.dbGears.execute("select folder from folder where folder like ? and uid_usuario=?",[old_folder+'/%',account_id]);
1287    while(rs.isValidRow()) {
1288        folder_tmp = rs.field(0);
1289        folder_new = folder_tmp.replace(old_folder,folder);
1290        this.dbGears.execute("update folder set folder=? where folder=?",[folder_new,folder_tmp]);
1291        rs.next();
1292    }
1293
1294
1295    this.finalize();
1296    return true;
1297}
[670]1298       
[3286]1299local_messages.prototype.remove_folder = function(folder) {
1300    this.init_local_messages();
1301    var rs = this.dbGears.execute("select count(rowid) from folder where folder like ? and uid_usuario=?",[folder+"/%",account_id]);
1302    var sons = rs.field(0);
1303    rs.close();
[1666]1304
[3286]1305    if(sons == 0){
[3735]1306                var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
1307                var folder_id = rs.field(0);
1308                rs.close();
1309                this.dbGears.execute("delete from folder where rowid=?",[folder_id]);
1310                rs = this.dbGears.execute("select rowid,mail from mail where id_folder=?",[folder_id]);
1311                while(rs.isValidRow()) {
1312                    var rs2 = this.dbGears.execute("select url from anexo where id_mail=?",[rs.field(0)]);
1313                    while(rs2.isValidRow()) {
1314                        this.store.remove(rs2.field(0));
1315                        rs2.next();
1316                    }
1317                    rs2.close();
1318                    this.dbGears.execute("delete from anexo where id_mail=?",[rs.field(0)]);
1319                    var mail = connector.unserialize(rs.field(1));
1320                    this.store.remove(mail.url_export_file);
1321                    rs.next();
1322                }
1323                rs.close();
1324                this.dbGears.execute("delete from mail where id_folder=?",[folder_id]);
1325                this.finalize();
1326                return true;
[3286]1327    }else  {
[3735]1328                this.finalize();
1329                return false;
[3286]1330    }
[670]1331
[3286]1332}
[1666]1333
[3286]1334local_messages.prototype.move_messages = function(new_folder,msgs_number) {
[5134]1335   
1336        if(!msgs_number)
1337                msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1338       
[3286]1339    this.init_local_messages();
1340    var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[new_folder,account_id]);
1341    var id_folder = rs.field(0);
1342    rs.close();
[3872]1343    this.dbGears.execute("update mail set id_folder="+id_folder+" where rowid in ("+msgs_number.toString()+")"); //usando statement não tava funcionando quando tinha mais de um email...
[3286]1344    this.finalize();
1345}
[3841]1346
1347local_messages.prototype.setFilter = function(sFilter)
1348{
1349        this.filterSerch = sFilter;
1350}
1351
1352local_messages.prototype.getFilter = function()
1353{
1354        return this.filterSerch;
1355}
1356
[4796]1357local_messages.prototype.setSortType = function (sortType){
1358    this.sortType = sortType;
1359}
1360
1361local_messages.prototype.getSortType = function (){
1362    if (this.sortType == "")
1363    {
1364        return 'SORTDATE';
1365    }
1366    return this.sortType;
1367}
1368
[3286]1369local_messages.prototype.search = function(folders,sFilter) {
1370    this.init_local_messages();
[3841]1371    this.setFilter(sFilter);
[3286]1372    var filters = sFilter.replace(/^##|##$/g,"").split('##');
1373    var friendly_filters = new Array();
[1622]1374
[3286]1375    if (sFilter.indexOf('ALL') != -1) { //all filters...
1376        filters[0] = sFilter.replace(/##/g,"");
1377        tmp = filters[0].split("<=>");
[1622]1378
[3286]1379        searchKey = new Array();
1380        searchKey.push("SUBJECT");
1381        searchKey.push(tmp[1]);
1382        friendly_filters.push(searchKey);
[1622]1383
[3286]1384        searchKey = new Array();
1385        searchKey.push("BODY");
1386        searchKey.push(tmp[1]);
1387        friendly_filters.push(searchKey);
[1622]1388
[3286]1389        searchKey = new Array();
1390        searchKey.push("FROM");
1391        searchKey.push(tmp[1]);
1392        friendly_filters.push(searchKey);
[1622]1393
[3286]1394        searchKey = new Array();
1395        searchKey.push("TO");
1396        searchKey.push(tmp[1]);
1397        friendly_filters.push(searchKey);
[1622]1398
[3286]1399        searchKey = new Array();
1400        searchKey.push("CC");
1401        searchKey.push(tmp[1]);
1402        friendly_filters.push(searchKey);
1403    }
1404    else {
1405        for (var i=0; i<filters.length; i++)
1406        {
1407            if (filters[i] != ""){
1408                //tmp[0] = tmp[0].replace(/^\s+|\s+$/g,"");
1409                //tmp[1] = tmp[1].replace(/^\s+|\s+$/g,"");
1410                friendly_filters.push(filters[i].split("<=>"));
1411            }
1412        }
1413    }
[5134]1414    var sql = "select mail.header,folder.folder,mail.rowid,size from mail inner join folder on mail.id_folder=folder.rowid where visible=? and mail.uid_usuario="+account_id + " and folder.folder in (";
[3286]1415    for(var fnum in folders) {
1416        sql+="'"+folders[fnum]+"'";
1417        if(fnum<folders.length-1)
1418            sql+=",";
1419    }
1420    sql += ") and (";
1421    for (var z=0;z<friendly_filters.length;z++) {
1422        if (z != 0) {
1423            if (sFilter.indexOf('ALL') != -1)
1424                sql += " or";
1425            else
1426                sql += " and";
1427        }
1428        var cond = friendly_filters[z][0].replace(/^\s+|\s+$/g,"");
1429        if (cond == "SINCE" || cond == "BEFORE" | cond == "ON"){
[1622]1430
[3380]1431            tmpDate = friendly_filters[z][1].replace(/\%2F/g,"/").split('/');
[1622]1432
[3286]1433            // Date = url_decode(friendly_filters[z][1]);
1434            sql+=" mail.timestamp " + this.aux_convert_filter_field(friendly_filters[z][0], tmpDate);
1435        }
1436        else if (!friendly_filters[z][1])
1437        {
1438            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0]);
1439        }
1440        else
1441        {
[4883]1442            sql+=" mail."+this.aux_convert_filter_field(friendly_filters[z][0])+" like '%"+url_decode_s(friendly_filters[z][1])+"%'";
[3286]1443        }
1444    }
1445    sql += ")";
[4796]1446
1447    // Sort
1448    if (this.getSortType().match('^SORTDATE.*')){
1449        sql += " order by mail.timestamp";
1450    }
1451    else if (this.getSortType().match('^SORTWHO.*')){
1452        sql += " order by mail.ffrom";
1453    }
1454    else if (this.getSortType().match('^SORTSUBJECT.*')){
1455        sql += " order by mail.subject";
1456    }
1457    else if (this.getSortType().match('^SORTSIZE.*')){
1458        sql += " order by mail.size";
1459    }
1460    else if (this.getSortType().match('^SORTBOX.*')){
1461        sql += " order by folder.folder";
1462    }
1463
1464    sql += this.getSortType().match('^.*_REVERSE$') ? ' asc' : ' desc';
1465
[5134]1466    var rs = this.dbGears.execute(sql,[true]);
[3841]1467    var retorno = [];
1468    var numRec = 0;
1469   
1470    while( rs.isValidRow() )
1471    {
1472                var header                      = connector.unserialize( rs.field(0) );
1473                var date_formated       = ( header["udate"] ).toString();
1474                /*
1475                 * Antigamente o udate vinha com o formato de data e foi alterado para vir o timestamp.
[3722]1476                 * Nesse caso, e-mails arquivados anteriormente usamos o udate, caso contrario, usamos o smalldate,
[3960]1477                 * pois o udate agora vem como timestamp
1478                 * verifica tambem no caso de mensagens antigas que nao exista o smalldate
1479                 * definir
1480                */
[3841]1481                if( !date_formated.match(/\d{2}\/\d{2}\/\d{4}/) )
1482                {
[3960]1483                    if ( (typeof(header["smalldate"]) != "undefined") && (!header["smalldate"].match(/\d{2}\:\d{2}/) ) ){
1484                            date_formated = header["smalldate"];
1485                    }else{
1486                            var day = new Date();
1487                            day.setTime(header["udate"] * 1000);
1488                            aux_dia = day.getDate() < 10 ? '0' + day.getDate() : day.getDate();
1489                            aux_mes = day.getMonth()+1; // array start with '0..11'
1490                            aux_mes = aux_mes < 10 ? '0' + aux_mes : aux_mes;
1491                            date_formated = aux_dia + '/' +  aux_mes + '/' + day.getFullYear();
1492                    }
1493                }
[3841]1494
1495                retorno[ numRec++ ] =
1496                {
1497                        'from'          : header["from"]["name"],
[4356]1498                        'subject'       : unescape(header["subject"]),
[3841]1499                        'udate'         : date_formated,
[3846]1500                        'size'          : rs.field(3),
[3841]1501                        'flag'          : header["Unseen"]+header["Recent"]+header["Flagged"]+header["Draft"],
1502                        'boxname'       : "local_"+rs.field(1),
1503                        'uid'           : rs.field(2)
1504                }
1505
[3722]1506                rs.next();
[3286]1507    }
[670]1508
[3286]1509    this.finalize();
[670]1510
[3841]1511    return ( retorno.length > 0 ) ? retorno : false ;
[3286]1512}
[670]1513       
[3286]1514local_messages.prototype.aux_convert_size = function(size) {
1515    var tmp = Math.floor(size/1024);
1516    if(tmp >= 1){
1517        return tmp + " kb";
1518    }else{
1519        return size + " b";
1520    }
[670]1521               
[3286]1522}
[670]1523       
[3841]1524local_messages.prototype.aux_convert_filter_field = function(filter,date)
1525{
1526        var dateObj;
1527   
1528        if (typeof date != 'undefined')
1529    {
1530        dateObj = new Date(date[2],date[1]-1,date[0]);
[3286]1531    }
[1622]1532
[3286]1533    if((filter=="SUBJECT ") || (filter=="SUBJECT"))
1534        return "subject";
1535    else if((filter=="BODY ") || (filter=="BODY"))
1536        return "body";
1537    else if((filter=="FROM ") || (filter=="FROM"))
1538        return "ffrom";
1539    else if((filter=="TO ") || (filter=="TO"))
1540        return "fto";
1541    else if((filter=="CC ") || (filter=="CC"))
1542        return "cc";
1543    else if (filter.replace(/^\s+|\s+$/g,"") == "SINCE"){
1544        dateObj.setHours(0, 0, 0, 0);
1545        return ">= " + dateObj.getTime().toString(10).substr(0, 10);
1546    }
1547    else if (filter.replace(/^\s+|\s+$/g,"") == "BEFORE"){
1548        dateObj.setHours(23, 59, 59, 999);
1549        return "<= " + dateObj.getTime().toString(10).substr(0, 10);
1550    }
1551    else if (filter.replace(/^\s+|\s+$/g,"") == "ON"){
1552        dateObj.setHours(0, 0, 0, 0);
1553        var ts1 = dateObj.getTime().toString(10).substr(0, 10);
1554        dateObj.setHours(23, 59, 59, 999);
1555        var ts2 = dateObj.getTime().toString(10).substr(0, 10);
1556        return ">= " + ts1 + ") and (timestamp <= " + ts2;
1557    }
1558    else if (filter.replace(/^\s+|\s+$/g,"") == "FLAGGED")
1559        return "flagged = 1";
1560    else if (filter.replace(/^\s+|\s+$/g,"") == "UNFLAGGED")
1561        return "flagged = 0";
1562    else if (filter.replace(/^\s+|\s+$/g,"") == "UNSEEN")
1563        return "unseen = 1";
1564    else if (filter.replace(/^\s+|\s+$/g,"") == "SEEN")
1565        return "unseen = 0";
1566    else if (filter.replace(/^\s+|\s+$/g,"") == "ANSWERED")
1567        return "answered = 1";
1568    else if (filter.replace(/^\s+|\s+$/g,"") == "UNANSWERED")
1569        return "answered = 0";
1570    else if (filter.replace(/^\s+|\s+$/g,"") == "RECENT")
1571        return "recent = 1";
1572    else if (filter.replace(/^\s+|\s+$/g,"") == "OLD")
1573        return "recent = 0";
[1622]1574
[3286]1575}
[670]1576       
[3286]1577local_messages.prototype.has_local_mails = function() {
1578    this.init_local_messages();
1579    var rs = this.dbGears.execute("select rowid from folder limit 0,1");
1580    var retorno;
1581    if(rs.isValidRow())
1582        retorno = true;
1583    else
1584        retorno = false;
1585    this.finalize();
1586    return retorno;
1587}
1588
1589//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Simple AJAX function used to get the RFC822 email source.
1590local_messages.prototype.get_src = function(url){
1591    AJAX = false;
1592    if (window.XMLHttpRequest) { // Mozilla, Safari,...
1593        AJAX = new XMLHttpRequest();
1594        if (AJAX.overrideMimeType) {
1595            AJAX.overrideMimeType('text/xml');
[670]1596        }
[3286]1597    } else if (window.ActiveXObject) { // IE
1598        try {
1599            AJAX = new ActiveXObject("Msxml2.XMLHTTP");
1600        } catch (e) {
1601            try {
1602                AJAX = new ActiveXObject("Microsoft.XMLHTTP");
1603            } catch (e) {}
1604        }
1605    }
[1000]1606
[3286]1607    if (!AJAX) {
[3872]1608        alert('ERRO :(Seu navegador não suporta a aplicação usada neste site');
[3286]1609        return false;
1610    }
[1000]1611
[3286]1612    AJAX.onreadystatechange = function() {
1613        if (AJAX.readyState == 4) {
1614            AJAX.src=AJAX.responseText;
1615            if (AJAX.status == 200) {
1616                return AJAX.responseText;
1617            } else {
1618                return false;
1619            }
1620        }
1621    }
[1000]1622
[5134]1623    AJAX.open('get', encodeURI(url), false);
[3286]1624    AJAX.send(null);
1625    return AJAX.responseText;
1626};
[1000]1627
[3286]1628//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Dessarquiva msgs locais pegando o codigo fonte das mesmas e mandando via POST para o servidor
[3872]1629//para que elas sejam inseridas no imap pela função  imap_functions.unarchive_mail.
[5134]1630    local_messages.prototype.unarchive_msgs = function (folder,new_folder,msgs_number){
[1000]1631
[3286]1632    this.init_local_messages();
[3788]1633
[5134]1634        // se a aba estiver aberta e selecionada, apenas a msg da aba é movida
1635        if(currentTab.toString().indexOf("_r") != -1)
[3788]1636            msgs_number = currentTab.toString().substr(0,currentTab.toString().indexOf("_r"));
1637       
[5172]1638        if( msgs_number =='selected' || !msgs_number ){
1639                if (currentTab != 0 && currentTab.indexOf("search_")  >= 0)
1640                        msgs_number = get_selected_messages_search();
1641                else
[5134]1642            msgs_number = get_selected_messages();
[5172]1643                }
[5134]1644        if( !msgs_number )
1645            return write_msg(get_lang('No selected message.'));
1646
1647        document.getElementById("overlay").style.visibility = "";
1648
1649        var rs = this.dbGears.execute("select mail,timestamp from mail where rowid in (" + msgs_number + ")");
1650
1651        var source = [], flags = [], timestamp = [];
[3911]1652               
[3872]1653                while(rs.isValidRow()) {
[5134]1654
1655            var mail = connector.unserialize(rs.field(0));
1656
1657            flags.push( mail["Answered"]+":"+mail["Draft"]+":"+mail["Flagged"]+":"+mail["Unseen"] );
1658            source.push( escape( mail.msg_source || this.get_src( mail.url_export_file ) ) );
1659            timestamp.push( rs.field(1) );
1660
[3872]1661                        rs.next();
1662                }
[5134]1663
[3872]1664                rs.close();
1665                this.finalize();
1666
[5134]1667        write_msg( "Desarquivando " + source.length + " mensagens... ", true );
1668
1669        var sep = "#@#@#@";
1670
1671        var params = "&folder=" + ( new_folder || 'INBOX' ) +
1672                     "&source=" + source.join(sep) +
1673                     "&timestamp=" + timestamp.join(sep) +
1674                     "&flags=" + flags.join(sep);
1675
1676        cExecute ("$this.imap_functions.unarchive_mail&", function(data){
1677
1678            clean_msg();
1679            document.getElementById("overlay").style.visibility = "hidden";
1680            write_msg( get_lang( data.error || 'All messages are successfully unarchived' ) );
1681
1682        }, params);
1683       
1684        update_menu();
[3286]1685    }
[1000]1686
[3286]1687local_messages.prototype.get_msg_date = function (original_id, is_local){
[1000]1688
[3286]1689    this.init_local_messages();
[1035]1690
[3286]1691    if (typeof(is_local) == 'undefined')
1692    {
1693        is_local = false;
1694    }
[1340]1695
[3286]1696    var rs;
[1340]1697
[3286]1698    if (is_local)
1699    {
1700        rs = this.dbGears.execute("select mail from mail where rowid="+original_id);
[1035]1701    }
[3286]1702    else
1703    {
1704        rs = this.dbGears.execute("select mail from mail where original_id="+original_id);
1705    }
1706    var tmp = connector.unserialize(rs.field(0));
1707    var ret = new Array();
1708    ret.fulldate = tmp.fulldate.substr(0,16);
1709    ret.smalldate = tmp.msg_day;
1710    ret.msg_day = tmp.msg_day;
1711    ret.msg_hour = tmp.msg_day;
[5134]1712
[3286]1713    rs.close();
1714    this.finalize();
1715    return ret;
1716}
[1035]1717
[3286]1718
1719local_messages.prototype.download_all_local_attachments = function(folder,id){
1720    this.init_local_messages();
1721    var rs = this.dbGears.execute("select mail from mail where rowid="+id);
1722    var tmp = connector.unserialize(rs.field(0));
1723    rs.close();
1724    this.finalize();
[3307]1725    tmp.msg_source?source = tmp.msg_source:source = this.get_src(tmp.url_export_file);
1726    //source = this.get_src(tmp.url_export_file);
[3286]1727    source = escape(source);
1728    var handler_source = function(data){
1729        download_attachments(null, null, data, null,null,'anexos.zip');
[1000]1730    }
[3286]1731    cExecute("$this.imap_functions.download_all_local_attachments",handler_source,"source="+source);
1732}
[1000]1733
[3286]1734/*************************************************************************/
[1000]1735/* Funcao usada para exportar mensagens arquivadas localmente.
1736 * Rommel de Brito Cysne (rommel.cysne@serpro.gov.br)
1737 * em 22/12/2008.
1738 */
[3286]1739local_messages.prototype.local_messages_to_export = function(){
[1000]1740
[3286]1741    if (openTab.type[currentTab] > 1){
1742        var msgs_to_export_id = currentTab.substring(0,currentTab.length-2,currentTab);
1743    }else{
1744        var msgs_to_export_id = get_selected_messages();
[1000]1745    }
[4760]1746    var flag = true;
[3286]1747    var handler_local_mesgs_to_export = function(data){
[5134]1748                        var filename = 'mensagens.zip';
1749
1750                        if (data.match(/\.eml$/gi)) {
1751                                fn_regex = /[^\/]*\.eml$/i;
1752                                filename = fn_regex.exec(data);
1753                        }
1754
[4760]1755        document.getElementById('lertOverlay').style.display='none';
1756        document.getElementById('lertContainer').style.display='none';
1757        document.getElementById('lertContainer').innerHTML = '';
1758        flag = false;
[5134]1759
1760                        download_attachments(null, null, data, null, null, filename);
[3286]1761    }
[4760]1762
1763        var cancel = new LertButton(get_lang('cancel'), function(){flag=false;connector.cancelRequest();});
1764     var titulo = '<b>' + get_lang('Warning') + '!</b>';
1765     var message = get_lang("Exporting selected messages, this can take some time.");
1766        var multConfirm = new Lert(
1767                titulo,
1768                message,
1769                [cancel],
1770                {
1771                        defaultButton:cancel,
1772                        icon:'js/lert/images/dialog-help.gif'
1773                });
1774        multConfirm.display();
1775
1776        var timeOut = function(){
1777            if(flag){
1778                document.getElementById('lertOverlay').style.display='none';
1779                document.getElementById('lertContainer').style.display='none';
1780                document.getElementById('lertContainer').innerHTML = '';
1781                connector.cancelRequest();
1782                write_msg(get_lang('Error exporting messages, try again latter'));
1783                }
1784
1785        }
1786        window.setTimeout(timeOut,300000);
1787
[3286]1788    if(msgs_to_export_id){
1789        this.init_local_messages();
1790        var l_msg = "t";
1791        var mesgs ="";
1792        var subjects ="";
1793        var rs = this.dbGears.execute("select mail,subject from mail where rowid in ("+msgs_to_export_id+")");
1794        while(rs.isValidRow()){
1795            mail = connector.unserialize(rs.field(0));
1796            mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1797            subject = rs.field(1);
1798            mesgs += src;
1799            mesgs += "@@";
1800            subjects += subject;
1801            subjects += "@@";
1802            rs.next();
1803        }
1804        rs.close();
1805        this.finalize();
1806        mesgs = escape(mesgs);
1807        subjects = escape(subjects);
1808        params = "subjects="+subjects+"&mesgs="+mesgs+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export_id;
1809        cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1810    }
1811    return true;
1812}
[1000]1813
[3286]1814local_messages.prototype.get_all_local_folder_messages= function(folder_name){
[1000]1815
1816
[3286]1817    var mesgs = new Array();
1818    var subjects = new Array();
1819    var hoje = new Date();
1820    var msgs_to_export = new Array();
1821    var l_msg="t";
[1000]1822
[3286]1823    this.init_local_messages();
1824    var query = "select mail,subject,mail.rowid from mail inner join folder on (mail.id_folder=folder.rowid) where folder.folder='" + folder_name + "'";
[1000]1825
[3286]1826    var rs = this.dbGears.execute(" "+query)
[1000]1827
[3286]1828    var handler_local_mesgs_to_export = function(data){
1829        //alert("data - " + data + " - tipo - " + typeof(data));
1830        download_attachments(null, null, data, null,null,'mensagens.zip');
1831    }
1832    var j=0;
1833    while (rs.isValidRow()){
1834        msgs_to_export[j]=rs.field(2)
1835        mail = connector.unserialize(rs.field(0));
1836        mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1837        subject = rs.field(1);
[3307]1838        mesgs += src;
[3286]1839        mesgs += "@@";
1840        subjects += subject;
1841        subjects += "@@";
1842        rs.next();
1843        j++;
[1000]1844
[3286]1845    }
1846    rs.close();
1847    this.finalize();
1848    source = escape(mesgs);
1849    subjects = escape(subjects);
1850    params = "folder="+folder_name+"&subjects="+subjects+"&mesgs="+source+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export;
1851    cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
[1000]1852         
1853
[3286]1854}
[1000]1855
1856
[3286]1857/*************************************************************************/
[1000]1858
[670]1859       
[1121]1860/******************************************************************
1861                                        Offline Part
1862 ******************************************************************/
1863
[3286]1864local_messages.prototype.is_offline_installed = function() {
1865    this.init_local_messages();
1866    var check = this.localServer.openManagedStore('expresso-offline');
1867    this.finalize();
1868    if(check==null)
1869        return false;
1870    else
1871        return true;
[1121]1872               
[3286]1873}
1874local_messages.prototype.update_offline = function(redirect) {
1875    this.init_local_messages();
1876    var managedStore = this.localServer.openManagedStore('expresso-offline');
[1121]1877
[3286]1878    if(managedStore!=null){
[1121]1879                       
[3286]1880        managedStore.oncomplete = function(details){
1881            if(redirect!=null)
1882                location.href=redirect;
1883        }
[1121]1884                       
[3286]1885        managedStore.checkForUpdate();
1886    } else if(redirect!=null) {
1887        location.href=redirect;
1888    }
1889    this.finalize();
1890}
1891       
1892local_messages.prototype.uninstall_offline = function() {
1893    if (!window.google || !google.gears) {
1894        temp = confirm(document.getElementById('lang_gears_redirect').value);
1895        if (temp) {
1896            expresso_local_messages.installGears();
[1121]1897        }
[3286]1898        return;
1899
1900    }
1901    this.init_local_messages();
1902    this.localServer.removeManagedStore('expresso-offline');
1903    alert(document.getElementById('lang_offline_uninstalled').value);
1904    //this.dbGears.execute('drop table user');
1905    //this.dbGears.execute('drop table queue');
1906    //this.dbGears.execute('drop table attachments_queue');
1907    this.finalize();
1908}
[1121]1909       
[5134]1910local_messages.prototype.as_trash = function(){//verifica se o usuario tem a pasta lixeira no arquivamento local
1911        this.init_local_messages();
1912    var rs = this.dbGears.execute("select folder from folder where uid_usuario="+account_id+" and folder = \"Trash\"");
1913        var check = rs.isValidRow();
1914        this.finalize();
1915    if(check)
1916                return true;
1917        else
1918                return false;
1919}
1920
[3286]1921local_messages.prototype.get_folders_to_sync = function() {//Precisa ter visibilidade ao array de linguagens.
1922    this.init_local_messages();
1923    var rs = this.dbGears.execute("select id_folder,folder_name from folders_sync where uid_usuario="+account_id);
1924    var retorno = new Array();
1925    while(rs.isValidRow()) {
1926        temp = new Array();
1927        temp[0] = rs.field(0);
[5134]1928        if(temp[0]=='INBOX' + cyrus_delimiter + 'Drafts' ||temp[0]=='INBOX' + cyrus_delimiter + 'Trash' || temp[0]=='INBOX' + cyrus_delimiter + 'Sent') {
[3286]1929            temp[1] = array_lang[rs.field(1).toLowerCase()];
[1121]1930        }
[3286]1931        else {
1932            temp[1] = rs.field(1);
1933        }
1934                       
1935        retorno.push(temp);
1936        rs.next();
1937    }
1938    this.finalize();
1939    return retorno;
1940}
[1121]1941       
[3286]1942local_messages.prototype.install_offline = function(urlOffline,urlIcone,uid_usuario,login,pass,redirect) {
1943    if (!window.google || !google.gears) {
1944            expresso_local_messages.installGears();
1945        return;
1946    }
[1121]1947               
[3286]1948    if(pass.length>0) {
1949        only_spaces = true;
1950        for(cont=0;cont<pass.length;cont++) {
1951            if(pass.charAt(cont)!=" ")
1952                only_spaces = false;
1953        }
1954        if(only_spaces) {
1955            alert(document.getElementById('lang_only_spaces_not_allowed').value);
1956            return false;
1957        }
1958    }
[1121]1959
[3286]1960    modal('loading');
1961    var desktop = google.gears.factory.create('beta.desktop');
1962    desktop.createShortcut('ExpressoMail Offline',
1963        urlOffline,
[1121]1964                {'32x32': urlIcone},
[3286]1965        'ExpressoMail Offline');
[1121]1966
1967
[3286]1968    this.init_local_messages();
[1121]1969
[3286]1970    //user with offline needs to have at least the folder Inbox already created.
1971    tmp_rs = this.dbGears.execute("select rowid from folder where folder='Inbox' and uid_usuario=?",[uid_usuario]);
1972    if(!tmp_rs.isValidRow())
1973        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",['Inbox',uid_usuario]);
[1121]1974
[3286]1975    this.localServer.removeManagedStore('expresso-offline');
[1121]1976       
[3286]1977    var managedStore = this.localServer.createManagedStore('expresso-offline');
1978    managedStore.manifestUrl = 'js/manifest';
[1121]1979
[3286]1980    managedStore.onerror = function (error) {
1981        alert(error);
1982    }
[1121]1983               
[3286]1984    managedStore.oncomplete = function(details) {
1985        if (close_lightbox_div) {
1986            close_lightbox();
1987            close_lightbox_div = false;
1988            alert(document.getElementById('lang_offline_installed').value);
1989            location.href=redirect;
1990        }
1991    }
[1121]1992
[3286]1993    //create structure to user in db
1994    this.dbGears.execute('create table if not exists user (uid_usuario int,login text,pass text, logged int,unique(uid_usuario))');
1995    this.dbGears.execute('create table if not exists queue (ffrom text, fto text, cc text, cco text,'+
1996        'subject text, conf_receipt int, important int,body text,sent int,user int)');
1997    this.dbGears.execute('create table if not exists attachments_queue ('+
1998        'id_queue int, url_attach text)');
1999    this.dbGears.execute('create table if not exists sent_problems (' +
2000        'id_queue int,message text)');
[1121]2001               
[3286]2002    //d = new Date();
[1121]2003               
[3286]2004    try {
2005        var rs = this.dbGears.execute("select uid_usuario from user where uid_usuario=?",[uid_usuario]);
2006        if(!rs.isValidRow())
2007            this.dbGears.execute("insert into user (uid_usuario,login,pass) values (?,?,?)",[uid_usuario,login,pass]);
2008        else
2009            this.dbGears.execute("update user set pass=? where uid_usuario=?",[pass,uid_usuario]);
2010    } catch (error) {
2011        this.finalize();
2012        alert(error);
2013        return false;
2014    }
2015    managedStore.checkForUpdate();
2016    this.capt_url('controller.php?action=$this.db_functions.get_dropdown_contacts_to_cache');
[3469]2017        setTimeout(function(){
2018        managedStore.complete();
2019    }, 60000);
[3286]2020    this.finalize();
2021}
[1121]2022       
[3286]2023/**
[1121]2024         * Return all users in an array following the structure below.
2025         *
2026         * key: uid
2027         * value: user login
2028         */
[3286]2029local_messages.prototype.get_all_users = function() {
2030    this.init_local_messages();
2031    var users = new Array();
2032    var rs = this.dbGears.execute("select uid_usuario,login from user");
2033    while(rs.isValidRow()) {
2034        users[rs.field(0)] = rs.field(1);
2035        rs.next();
2036    }
2037    this.finalize();
2038    return users;
2039}
2040       
2041local_messages.prototype.set_as_logged = function(uid_usuario,pass,bypass) {
2042    this.init_local_messages();
2043    if (!bypass) {
2044        var rs = this.dbGears.execute("select pass from user where uid_usuario=?", [uid_usuario]);
2045        if (!rs.isValidRow() || (pass != rs.field(0) && pass != MD5(rs.field(0)))) {
2046            this.finalize();
2047            return false;
[1121]2048        }
[3286]2049    }
2050    d = new Date();
[1121]2051
[3286]2052    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2053    this.dbGears.execute("update user set logged=? where uid_usuario=?",[d.getTime(),uid_usuario]); //Login just in one...
2054    this.finalize();
2055    return true;
2056}
[1121]2057       
[3286]2058local_messages.prototype.unset_as_logged = function() {
2059    this.init_local_messages();
2060    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2061    this.finalize();
2062}
[1121]2063       
[3286]2064local_messages.prototype.user_logged = function() {
2065    this.init_local_messages();
2066    var user_logged = new Array();
2067    var rs = this.dbGears.execute("select uid_usuario,logged from user where logged is not null");
2068    if(!rs.isValidRow()) {
2069        this.finalize();
2070        return null;
2071    }
2072    user_logged[0] = rs.field(0);
2073    user_logged[1] = rs.field(1);
2074    this.finalize();
2075    return user_logged;
2076}
[1121]2077       
[3286]2078local_messages.prototype.send_to_queue = function (form) {
2079    this.init_local_messages();
2080    var mail_values = new Array();
[1121]2081               
[3286]2082    for (var i=0;i<form.length;i++) {
2083        if (form.elements[i].name != '') { //I.E made me to do that...
2084            if(form.elements[i].name=='folder' || form.elements[i].name=='msg_id' || form.elements[i].name=='' || form.elements[i].name==null)
2085                continue;
2086            else if (form.elements[i].name == 'input_return_receipt' )
2087                mail_values['conf_receipt'] = form.elements[i].checked ? 1 : 0;
2088            else if(form.elements[i].name == 'input_important_message')
2089                mail_values['important'] = form.elements[i].checked ? 1 : 0;
2090            else
2091            if (form.elements[i].name == 'body')
2092                mail_values['body'] = form.elements[i].value;
2093            else
2094            if (form.elements[i].name == 'input_from')
2095                mail_values['ffrom'] = form.elements[i].value;
2096            else
2097            if (form.elements[i].name == 'input_to')
2098                mail_values['fto'] = form.elements[i].value;
2099            else
2100            if (form.elements[i].name == 'input_cc')
2101                mail_values['cc'] = form.elements[i].value;
2102            else
2103            if (form.elements[i].name == 'input_cco')
2104                mail_values['cco'] = form.elements[i].value;
2105            else
2106            if (form.elements[i].name == 'input_subject')
2107                mail_values['subject'] = form.elements[i].value;
2108        }
2109    }
2110    //mail_values['fto'] = input_to;
2111    //mail_values['cc'] = input_cc;
2112    //mail_values['cco'] = input_cco;
2113    //mail_values['subject'] = input_subject;
2114    //mail_values['conf_receipt'] = input_return_receipt;
2115    //mail_values['important'] = input_important_message;
[1121]2116               
[3286]2117    try {
2118        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]);
2119        this.send_attach_to_queue(this.dbGears.lastInsertRowId,form);
2120    }catch(error) {
2121        alert(error);
2122        return get_lang('Error sending a mail to queue. Verify if you have installed ExpressoMail Offline');
2123    }
2124    this.finalize();
2125    return true;
2126}
[1121]2127       
[3286]2128local_messages.prototype.send_attach_to_queue = function(id_queue,form) {
[1121]2129               
[3286]2130    for(i=0;i<form.elements.length;i++) {
[1121]2131                       
[3286]2132        if(form.elements[i].name.indexOf("file_")!=-1) {
2133            var tmp_input = form.elements[i];
2134            var d = new Date();
2135            var url_local = 'local_attachs/'+d.getTime();
2136            this.store.captureFile(tmp_input, url_local);
2137            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,url_local]);
[1121]2138        }
[3286]2139        else if(form.elements[i].name.indexOf("offline_forward_")!=-1){
2140            //alert();
2141            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,form.elements[i].value]);
2142        }
2143    }
2144}
[1121]2145
2146       
[3286]2147local_messages.prototype.get_num_msgs_to_send = function() {
2148    this.init_local_messages();
[1121]2149
[3286]2150    var rs = this.dbGears.execute("select count(*) from queue where user=? and sent=0",[account_id]);
2151    var to_return = rs.field(0);
[1121]2152
[3286]2153    this.finalize();
2154    return to_return;
2155}
[1121]2156       
[3286]2157local_messages.prototype.set_problem_on_sent = function(rowid_message,msg) {
2158    this.init_local_messages();
2159    this.dbGears.execute("update queue set sent = 2 where rowid=?",[rowid_message]);
2160    this.dbGears.execute("insert into sent_problems (id_queue,message) values (?,?)"[rowid_message,msg]);
2161    this.finalize();
2162}
[1121]2163       
[3286]2164local_messages.prototype.set_as_sent = function(rowid_message) {
2165    this.init_local_messages();
2166    this.dbGears.execute("update queue set sent = 1 where rowid=?",[rowid_message]);
2167    this.finalize();
2168}
[1121]2169       
[3286]2170local_messages.prototype.get_form_msg_to_send = function() {
2171    this.init_local_messages();
2172    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]);
2173    if(!rs.isValidRow())
2174        return false;
[1121]2175               
[3286]2176    var form = document.createElement('form');
2177    form.method = 'POST';
2178    form.name = 'form_queue_'+rs.field(8);
2179    form.style.display = 'none';
[1121]2180                form.onsubmit = function(){return false;}
[3286]2181    if(!is_ie)
2182        form.enctype="multipart/form-data";
2183    else
2184        form.encoding="multipart/form-data";
[1121]2185               
[3286]2186    var ffrom = document.createElement('TEXTAREA');
2187    ffrom.name = "input_from";
2188    ffrom.value = rs.field(0);
2189    form.appendChild(ffrom);
[1121]2190               
[3286]2191    var fto = document.createElement('TEXTAREA');
2192    fto.name = "input_to";
2193    fto.value = rs.field(1);
2194    form.appendChild(fto);
[1121]2195               
[3286]2196    var cc = document.createElement('TEXTAREA');
2197    cc.name = "input_cc";
2198    cc.value = rs.field(2);
2199    form.appendChild(cc);
[1121]2200
[3286]2201    var cco = document.createElement('TEXTAREA');
2202    cco.name = "input_cco";
2203    cco.value = rs.field(3);
2204    form.appendChild(cco);
[1121]2205               
[3286]2206    var subject = document.createElement('TEXTAREA');
2207    subject.name = "input_subject";
2208    subject.value = rs.field(4);
2209    form.appendChild(subject);
[1121]2210               
[3286]2211    var folder = document.createElement('input');
2212    folder.name='folder';
2213    folder.value=preferences.save_in_folder;
2214    form.appendChild(folder);
[1121]2215               
[3286]2216    if (rs.field(5) == 1) {
2217        var conf_receipt = document.createElement('input');
2218        conf_receipt.type='text';
2219        conf_receipt.name = "input_return_receipt";
2220        conf_receipt.value = 'on';
2221        form.appendChild(conf_receipt);
2222    }
[1121]2223               
[3286]2224    if (rs.field(6) == 1) {
2225        var important = document.createElement('input');
2226        important.type='text';
2227        important.name = "input_important_message";
2228        important.value = 'on';
2229        form.appendChild(important);
2230    }
[1121]2231               
[3286]2232    var body = document.createElement('TEXTAREA');
2233    body.name = "body";
2234    body.value = rs.field(7);
2235    form.appendChild(body);
[1121]2236               
[3286]2237    var rowid = document.createElement('input');
2238    rowid.type = 'hidden';
2239    rowid.name = 'rowid';
2240    rowid.value = rs.field(8);
2241    form.appendChild(rowid);
[1121]2242               
[3286]2243    //Mounting the attachs
2244    var divFiles = document.createElement("div");
2245    divFiles.id = 'divFiles_queue_'+rs.field(8);
[1121]2246               
[3286]2247    form.appendChild(divFiles);
[1121]2248               
[3286]2249    document.getElementById('forms_queue').appendChild(form);
[1121]2250
[3286]2251    var is_local_forward = false;
2252    try {
[1121]2253                       
[3286]2254        var rs_attach = this.dbGears.execute('select url_attach from attachments_queue where id_queue=?', [rs.field(8)]);
2255        while (rs_attach.isValidRow()) {
2256            if(rs_attach.field(0).indexOf('../tmpLclAtt/')==-1) {
2257                tmp_field = addForwardedFile('queue_' + rs.field(8), this.store.getCapturedFileName(rs_attach.field(0)), 'nothing');
2258            }
2259            else {
2260                var tempNomeArquivo = rs_attach.field(0).split("/");
2261                var nomeArquivo = tempNomeArquivo[tempNomeArquivo.length-1];
[3872]2262                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.
[3286]2263                is_local_forward = true;
2264                tmp_field = addForwardedFile('queue_' + rs.field(8), nomeArquivo, 'nothing');
2265            }
2266            fileSubmitter = this.store.createFileSubmitter();
2267            fileSubmitter.setFileInputElement(tmp_field,rs_attach.field(0));
2268            //          alert(form.innerHTML);
2269            //  div.appendChild(tmp_field);
2270            rs_attach.next();
2271        }
[1121]2272                       
[3286]2273        if(is_local_forward) {
2274            var is_lcl_fw = document.createElement('input');
2275            is_lcl_fw.type = 'hidden';
2276            is_lcl_fw.name = 'is_local_forward';
2277            is_lcl_fw.value = "1";
2278            form.appendChild(is_lcl_fw);
2279        }
[1121]2280                               
[3286]2281    }
2282    catch(exception) {
2283        alert(exception);
2284    }
[1121]2285               
[3286]2286    this.finalize();
2287    return form;
2288}
[1121]2289
[3286]2290var expresso_local_messages;
2291expresso_local_messages = new local_messages();
[3405]2292//expresso_local_messages.create_objects();
Note: See TracBrowser for help on using the repository browser.