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

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

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

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       
[5134]1638        if( msgs_number =='selected' || !msgs_number )
1639            msgs_number = get_selected_messages();
1640
1641        if( !msgs_number )
1642            return write_msg(get_lang('No selected message.'));
1643
1644        document.getElementById("overlay").style.visibility = "";
1645
1646        var rs = this.dbGears.execute("select mail,timestamp from mail where rowid in (" + msgs_number + ")");
1647
1648        var source = [], flags = [], timestamp = [];
[3911]1649               
[3872]1650                while(rs.isValidRow()) {
[5134]1651
1652            var mail = connector.unserialize(rs.field(0));
1653
1654            flags.push( mail["Answered"]+":"+mail["Draft"]+":"+mail["Flagged"]+":"+mail["Unseen"] );
1655            source.push( escape( mail.msg_source || this.get_src( mail.url_export_file ) ) );
1656            timestamp.push( rs.field(1) );
1657
[3872]1658                        rs.next();
1659                }
[5134]1660
[3872]1661                rs.close();
1662                this.finalize();
1663
[5134]1664        write_msg( "Desarquivando " + source.length + " mensagens... ", true );
1665
1666        var sep = "#@#@#@";
1667
1668        var params = "&folder=" + ( new_folder || 'INBOX' ) +
1669                     "&source=" + source.join(sep) +
1670                     "&timestamp=" + timestamp.join(sep) +
1671                     "&flags=" + flags.join(sep);
1672
1673        cExecute ("$this.imap_functions.unarchive_mail&", function(data){
1674
1675            clean_msg();
1676            document.getElementById("overlay").style.visibility = "hidden";
1677            write_msg( get_lang( data.error || 'All messages are successfully unarchived' ) );
1678
1679        }, params);
1680       
1681        update_menu();
[3286]1682    }
[1000]1683
[3286]1684local_messages.prototype.get_msg_date = function (original_id, is_local){
[1000]1685
[3286]1686    this.init_local_messages();
[1035]1687
[3286]1688    if (typeof(is_local) == 'undefined')
1689    {
1690        is_local = false;
1691    }
[1340]1692
[3286]1693    var rs;
[1340]1694
[3286]1695    if (is_local)
1696    {
1697        rs = this.dbGears.execute("select mail from mail where rowid="+original_id);
[1035]1698    }
[3286]1699    else
1700    {
1701        rs = this.dbGears.execute("select mail from mail where original_id="+original_id);
1702    }
1703    var tmp = connector.unserialize(rs.field(0));
1704    var ret = new Array();
1705    ret.fulldate = tmp.fulldate.substr(0,16);
1706    ret.smalldate = tmp.msg_day;
1707    ret.msg_day = tmp.msg_day;
1708    ret.msg_hour = tmp.msg_day;
[5134]1709
[3286]1710    rs.close();
1711    this.finalize();
1712    return ret;
1713}
[1035]1714
[3286]1715
1716local_messages.prototype.download_all_local_attachments = function(folder,id){
1717    this.init_local_messages();
1718    var rs = this.dbGears.execute("select mail from mail where rowid="+id);
1719    var tmp = connector.unserialize(rs.field(0));
1720    rs.close();
1721    this.finalize();
[3307]1722    tmp.msg_source?source = tmp.msg_source:source = this.get_src(tmp.url_export_file);
1723    //source = this.get_src(tmp.url_export_file);
[3286]1724    source = escape(source);
1725    var handler_source = function(data){
1726        download_attachments(null, null, data, null,null,'anexos.zip');
[1000]1727    }
[3286]1728    cExecute("$this.imap_functions.download_all_local_attachments",handler_source,"source="+source);
1729}
[1000]1730
[3286]1731/*************************************************************************/
[1000]1732/* Funcao usada para exportar mensagens arquivadas localmente.
1733 * Rommel de Brito Cysne (rommel.cysne@serpro.gov.br)
1734 * em 22/12/2008.
1735 */
[3286]1736local_messages.prototype.local_messages_to_export = function(){
[1000]1737
[3286]1738    if (openTab.type[currentTab] > 1){
1739        var msgs_to_export_id = currentTab.substring(0,currentTab.length-2,currentTab);
1740    }else{
1741        var msgs_to_export_id = get_selected_messages();
[1000]1742    }
[4760]1743    var flag = true;
[3286]1744    var handler_local_mesgs_to_export = function(data){
[5134]1745                        var filename = 'mensagens.zip';
1746
1747                        if (data.match(/\.eml$/gi)) {
1748                                fn_regex = /[^\/]*\.eml$/i;
1749                                filename = fn_regex.exec(data);
1750                        }
1751
[4760]1752        document.getElementById('lertOverlay').style.display='none';
1753        document.getElementById('lertContainer').style.display='none';
1754        document.getElementById('lertContainer').innerHTML = '';
1755        flag = false;
[5134]1756
1757                        download_attachments(null, null, data, null, null, filename);
[3286]1758    }
[4760]1759
1760        var cancel = new LertButton(get_lang('cancel'), function(){flag=false;connector.cancelRequest();});
1761     var titulo = '<b>' + get_lang('Warning') + '!</b>';
1762     var message = get_lang("Exporting selected messages, this can take some time.");
1763        var multConfirm = new Lert(
1764                titulo,
1765                message,
1766                [cancel],
1767                {
1768                        defaultButton:cancel,
1769                        icon:'js/lert/images/dialog-help.gif'
1770                });
1771        multConfirm.display();
1772
1773        var timeOut = function(){
1774            if(flag){
1775                document.getElementById('lertOverlay').style.display='none';
1776                document.getElementById('lertContainer').style.display='none';
1777                document.getElementById('lertContainer').innerHTML = '';
1778                connector.cancelRequest();
1779                write_msg(get_lang('Error exporting messages, try again latter'));
1780                }
1781
1782        }
1783        window.setTimeout(timeOut,300000);
1784
[3286]1785    if(msgs_to_export_id){
1786        this.init_local_messages();
1787        var l_msg = "t";
1788        var mesgs ="";
1789        var subjects ="";
1790        var rs = this.dbGears.execute("select mail,subject from mail where rowid in ("+msgs_to_export_id+")");
1791        while(rs.isValidRow()){
1792            mail = connector.unserialize(rs.field(0));
1793            mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1794            subject = rs.field(1);
1795            mesgs += src;
1796            mesgs += "@@";
1797            subjects += subject;
1798            subjects += "@@";
1799            rs.next();
1800        }
1801        rs.close();
1802        this.finalize();
1803        mesgs = escape(mesgs);
1804        subjects = escape(subjects);
1805        params = "subjects="+subjects+"&mesgs="+mesgs+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export_id;
1806        cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
1807    }
1808    return true;
1809}
[1000]1810
[3286]1811local_messages.prototype.get_all_local_folder_messages= function(folder_name){
[1000]1812
1813
[3286]1814    var mesgs = new Array();
1815    var subjects = new Array();
1816    var hoje = new Date();
1817    var msgs_to_export = new Array();
1818    var l_msg="t";
[1000]1819
[3286]1820    this.init_local_messages();
1821    var query = "select mail,subject,mail.rowid from mail inner join folder on (mail.id_folder=folder.rowid) where folder.folder='" + folder_name + "'";
[1000]1822
[3286]1823    var rs = this.dbGears.execute(" "+query)
[1000]1824
[3286]1825    var handler_local_mesgs_to_export = function(data){
1826        //alert("data - " + data + " - tipo - " + typeof(data));
1827        download_attachments(null, null, data, null,null,'mensagens.zip');
1828    }
1829    var j=0;
1830    while (rs.isValidRow()){
1831        msgs_to_export[j]=rs.field(2)
1832        mail = connector.unserialize(rs.field(0));
1833        mail.msg_source?src = mail.msg_source:src = this.get_src(mail.url_export_file);
1834        subject = rs.field(1);
[3307]1835        mesgs += src;
[3286]1836        mesgs += "@@";
1837        subjects += subject;
1838        subjects += "@@";
1839        rs.next();
1840        j++;
[1000]1841
[3286]1842    }
1843    rs.close();
1844    this.finalize();
1845    source = escape(mesgs);
1846    subjects = escape(subjects);
1847    params = "folder="+folder_name+"&subjects="+subjects+"&mesgs="+source+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export;
1848    cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
[1000]1849         
1850
[3286]1851}
[1000]1852
1853
[3286]1854/*************************************************************************/
[1000]1855
[670]1856       
[1121]1857/******************************************************************
1858                                        Offline Part
1859 ******************************************************************/
1860
[3286]1861local_messages.prototype.is_offline_installed = function() {
1862    this.init_local_messages();
1863    var check = this.localServer.openManagedStore('expresso-offline');
1864    this.finalize();
1865    if(check==null)
1866        return false;
1867    else
1868        return true;
[1121]1869               
[3286]1870}
1871local_messages.prototype.update_offline = function(redirect) {
1872    this.init_local_messages();
1873    var managedStore = this.localServer.openManagedStore('expresso-offline');
[1121]1874
[3286]1875    if(managedStore!=null){
[1121]1876                       
[3286]1877        managedStore.oncomplete = function(details){
1878            if(redirect!=null)
1879                location.href=redirect;
1880        }
[1121]1881                       
[3286]1882        managedStore.checkForUpdate();
1883    } else if(redirect!=null) {
1884        location.href=redirect;
1885    }
1886    this.finalize();
1887}
1888       
1889local_messages.prototype.uninstall_offline = function() {
1890    if (!window.google || !google.gears) {
1891        temp = confirm(document.getElementById('lang_gears_redirect').value);
1892        if (temp) {
1893            expresso_local_messages.installGears();
[1121]1894        }
[3286]1895        return;
1896
1897    }
1898    this.init_local_messages();
1899    this.localServer.removeManagedStore('expresso-offline');
1900    alert(document.getElementById('lang_offline_uninstalled').value);
1901    //this.dbGears.execute('drop table user');
1902    //this.dbGears.execute('drop table queue');
1903    //this.dbGears.execute('drop table attachments_queue');
1904    this.finalize();
1905}
[1121]1906       
[5134]1907local_messages.prototype.as_trash = function(){//verifica se o usuario tem a pasta lixeira no arquivamento local
1908        this.init_local_messages();
1909    var rs = this.dbGears.execute("select folder from folder where uid_usuario="+account_id+" and folder = \"Trash\"");
1910        var check = rs.isValidRow();
1911        this.finalize();
1912    if(check)
1913                return true;
1914        else
1915                return false;
1916}
1917
[3286]1918local_messages.prototype.get_folders_to_sync = function() {//Precisa ter visibilidade ao array de linguagens.
1919    this.init_local_messages();
1920    var rs = this.dbGears.execute("select id_folder,folder_name from folders_sync where uid_usuario="+account_id);
1921    var retorno = new Array();
1922    while(rs.isValidRow()) {
1923        temp = new Array();
1924        temp[0] = rs.field(0);
[5134]1925        if(temp[0]=='INBOX' + cyrus_delimiter + 'Drafts' ||temp[0]=='INBOX' + cyrus_delimiter + 'Trash' || temp[0]=='INBOX' + cyrus_delimiter + 'Sent') {
[3286]1926            temp[1] = array_lang[rs.field(1).toLowerCase()];
[1121]1927        }
[3286]1928        else {
1929            temp[1] = rs.field(1);
1930        }
1931                       
1932        retorno.push(temp);
1933        rs.next();
1934    }
1935    this.finalize();
1936    return retorno;
1937}
[1121]1938       
[3286]1939local_messages.prototype.install_offline = function(urlOffline,urlIcone,uid_usuario,login,pass,redirect) {
1940    if (!window.google || !google.gears) {
1941            expresso_local_messages.installGears();
1942        return;
1943    }
[1121]1944               
[3286]1945    if(pass.length>0) {
1946        only_spaces = true;
1947        for(cont=0;cont<pass.length;cont++) {
1948            if(pass.charAt(cont)!=" ")
1949                only_spaces = false;
1950        }
1951        if(only_spaces) {
1952            alert(document.getElementById('lang_only_spaces_not_allowed').value);
1953            return false;
1954        }
1955    }
[1121]1956
[3286]1957    modal('loading');
1958    var desktop = google.gears.factory.create('beta.desktop');
1959    desktop.createShortcut('ExpressoMail Offline',
1960        urlOffline,
[1121]1961                {'32x32': urlIcone},
[3286]1962        'ExpressoMail Offline');
[1121]1963
1964
[3286]1965    this.init_local_messages();
[1121]1966
[3286]1967    //user with offline needs to have at least the folder Inbox already created.
1968    tmp_rs = this.dbGears.execute("select rowid from folder where folder='Inbox' and uid_usuario=?",[uid_usuario]);
1969    if(!tmp_rs.isValidRow())
1970        this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",['Inbox',uid_usuario]);
[1121]1971
[3286]1972    this.localServer.removeManagedStore('expresso-offline');
[1121]1973       
[3286]1974    var managedStore = this.localServer.createManagedStore('expresso-offline');
1975    managedStore.manifestUrl = 'js/manifest';
[1121]1976
[3286]1977    managedStore.onerror = function (error) {
1978        alert(error);
1979    }
[1121]1980               
[3286]1981    managedStore.oncomplete = function(details) {
1982        if (close_lightbox_div) {
1983            close_lightbox();
1984            close_lightbox_div = false;
1985            alert(document.getElementById('lang_offline_installed').value);
1986            location.href=redirect;
1987        }
1988    }
[1121]1989
[3286]1990    //create structure to user in db
1991    this.dbGears.execute('create table if not exists user (uid_usuario int,login text,pass text, logged int,unique(uid_usuario))');
1992    this.dbGears.execute('create table if not exists queue (ffrom text, fto text, cc text, cco text,'+
1993        'subject text, conf_receipt int, important int,body text,sent int,user int)');
1994    this.dbGears.execute('create table if not exists attachments_queue ('+
1995        'id_queue int, url_attach text)');
1996    this.dbGears.execute('create table if not exists sent_problems (' +
1997        'id_queue int,message text)');
[1121]1998               
[3286]1999    //d = new Date();
[1121]2000               
[3286]2001    try {
2002        var rs = this.dbGears.execute("select uid_usuario from user where uid_usuario=?",[uid_usuario]);
2003        if(!rs.isValidRow())
2004            this.dbGears.execute("insert into user (uid_usuario,login,pass) values (?,?,?)",[uid_usuario,login,pass]);
2005        else
2006            this.dbGears.execute("update user set pass=? where uid_usuario=?",[pass,uid_usuario]);
2007    } catch (error) {
2008        this.finalize();
2009        alert(error);
2010        return false;
2011    }
2012    managedStore.checkForUpdate();
2013    this.capt_url('controller.php?action=$this.db_functions.get_dropdown_contacts_to_cache');
[3469]2014        setTimeout(function(){
2015        managedStore.complete();
2016    }, 60000);
[3286]2017    this.finalize();
2018}
[1121]2019       
[3286]2020/**
[1121]2021         * Return all users in an array following the structure below.
2022         *
2023         * key: uid
2024         * value: user login
2025         */
[3286]2026local_messages.prototype.get_all_users = function() {
2027    this.init_local_messages();
2028    var users = new Array();
2029    var rs = this.dbGears.execute("select uid_usuario,login from user");
2030    while(rs.isValidRow()) {
2031        users[rs.field(0)] = rs.field(1);
2032        rs.next();
2033    }
2034    this.finalize();
2035    return users;
2036}
2037       
2038local_messages.prototype.set_as_logged = function(uid_usuario,pass,bypass) {
2039    this.init_local_messages();
2040    if (!bypass) {
2041        var rs = this.dbGears.execute("select pass from user where uid_usuario=?", [uid_usuario]);
2042        if (!rs.isValidRow() || (pass != rs.field(0) && pass != MD5(rs.field(0)))) {
2043            this.finalize();
2044            return false;
[1121]2045        }
[3286]2046    }
2047    d = new Date();
[1121]2048
[3286]2049    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2050    this.dbGears.execute("update user set logged=? where uid_usuario=?",[d.getTime(),uid_usuario]); //Login just in one...
2051    this.finalize();
2052    return true;
2053}
[1121]2054       
[3286]2055local_messages.prototype.unset_as_logged = function() {
2056    this.init_local_messages();
2057    this.dbGears.execute("update user set logged=null"); //Logoff in everybody
2058    this.finalize();
2059}
[1121]2060       
[3286]2061local_messages.prototype.user_logged = function() {
2062    this.init_local_messages();
2063    var user_logged = new Array();
2064    var rs = this.dbGears.execute("select uid_usuario,logged from user where logged is not null");
2065    if(!rs.isValidRow()) {
2066        this.finalize();
2067        return null;
2068    }
2069    user_logged[0] = rs.field(0);
2070    user_logged[1] = rs.field(1);
2071    this.finalize();
2072    return user_logged;
2073}
[1121]2074       
[3286]2075local_messages.prototype.send_to_queue = function (form) {
2076    this.init_local_messages();
2077    var mail_values = new Array();
[1121]2078               
[3286]2079    for (var i=0;i<form.length;i++) {
2080        if (form.elements[i].name != '') { //I.E made me to do that...
2081            if(form.elements[i].name=='folder' || form.elements[i].name=='msg_id' || form.elements[i].name=='' || form.elements[i].name==null)
2082                continue;
2083            else if (form.elements[i].name == 'input_return_receipt' )
2084                mail_values['conf_receipt'] = form.elements[i].checked ? 1 : 0;
2085            else if(form.elements[i].name == 'input_important_message')
2086                mail_values['important'] = form.elements[i].checked ? 1 : 0;
2087            else
2088            if (form.elements[i].name == 'body')
2089                mail_values['body'] = form.elements[i].value;
2090            else
2091            if (form.elements[i].name == 'input_from')
2092                mail_values['ffrom'] = form.elements[i].value;
2093            else
2094            if (form.elements[i].name == 'input_to')
2095                mail_values['fto'] = form.elements[i].value;
2096            else
2097            if (form.elements[i].name == 'input_cc')
2098                mail_values['cc'] = form.elements[i].value;
2099            else
2100            if (form.elements[i].name == 'input_cco')
2101                mail_values['cco'] = form.elements[i].value;
2102            else
2103            if (form.elements[i].name == 'input_subject')
2104                mail_values['subject'] = form.elements[i].value;
2105        }
2106    }
2107    //mail_values['fto'] = input_to;
2108    //mail_values['cc'] = input_cc;
2109    //mail_values['cco'] = input_cco;
2110    //mail_values['subject'] = input_subject;
2111    //mail_values['conf_receipt'] = input_return_receipt;
2112    //mail_values['important'] = input_important_message;
[1121]2113               
[3286]2114    try {
2115        this.dbGears.execute("insert into queue (ffrom,fto,cc,cco,subject,conf_receipt,important,body,sent,user) values (?,?,?,?,?,?,?,?,0,?)", [mail_values['ffrom'], mail_values['fto'], mail_values['cc'], mail_values['cco'], mail_values['subject'], mail_values['conf_receipt'], mail_values['important'], mail_values['body'], account_id]);
2116        this.send_attach_to_queue(this.dbGears.lastInsertRowId,form);
2117    }catch(error) {
2118        alert(error);
2119        return get_lang('Error sending a mail to queue. Verify if you have installed ExpressoMail Offline');
2120    }
2121    this.finalize();
2122    return true;
2123}
[1121]2124       
[3286]2125local_messages.prototype.send_attach_to_queue = function(id_queue,form) {
[1121]2126               
[3286]2127    for(i=0;i<form.elements.length;i++) {
[1121]2128                       
[3286]2129        if(form.elements[i].name.indexOf("file_")!=-1) {
2130            var tmp_input = form.elements[i];
2131            var d = new Date();
2132            var url_local = 'local_attachs/'+d.getTime();
2133            this.store.captureFile(tmp_input, url_local);
2134            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,url_local]);
[1121]2135        }
[3286]2136        else if(form.elements[i].name.indexOf("offline_forward_")!=-1){
2137            //alert();
2138            this.dbGears.execute("insert into attachments_queue (id_queue,url_attach) values (?,?)",[id_queue,form.elements[i].value]);
2139        }
2140    }
2141}
[1121]2142
2143       
[3286]2144local_messages.prototype.get_num_msgs_to_send = function() {
2145    this.init_local_messages();
[1121]2146
[3286]2147    var rs = this.dbGears.execute("select count(*) from queue where user=? and sent=0",[account_id]);
2148    var to_return = rs.field(0);
[1121]2149
[3286]2150    this.finalize();
2151    return to_return;
2152}
[1121]2153       
[3286]2154local_messages.prototype.set_problem_on_sent = function(rowid_message,msg) {
2155    this.init_local_messages();
2156    this.dbGears.execute("update queue set sent = 2 where rowid=?",[rowid_message]);
2157    this.dbGears.execute("insert into sent_problems (id_queue,message) values (?,?)"[rowid_message,msg]);
2158    this.finalize();
2159}
[1121]2160       
[3286]2161local_messages.prototype.set_as_sent = function(rowid_message) {
2162    this.init_local_messages();
2163    this.dbGears.execute("update queue set sent = 1 where rowid=?",[rowid_message]);
2164    this.finalize();
2165}
[1121]2166       
[3286]2167local_messages.prototype.get_form_msg_to_send = function() {
2168    this.init_local_messages();
2169    var rs = this.dbGears.execute('select ffrom,fto,cc,cco,subject,conf_receipt,important,body,rowid from queue where sent=0 and user = ? limit 0,1',[account_id]);
2170    if(!rs.isValidRow())
2171        return false;
[1121]2172               
[3286]2173    var form = document.createElement('form');
2174    form.method = 'POST';
2175    form.name = 'form_queue_'+rs.field(8);
2176    form.style.display = 'none';
[1121]2177                form.onsubmit = function(){return false;}
[3286]2178    if(!is_ie)
2179        form.enctype="multipart/form-data";
2180    else
2181        form.encoding="multipart/form-data";
[1121]2182               
[3286]2183    var ffrom = document.createElement('TEXTAREA');
2184    ffrom.name = "input_from";
2185    ffrom.value = rs.field(0);
2186    form.appendChild(ffrom);
[1121]2187               
[3286]2188    var fto = document.createElement('TEXTAREA');
2189    fto.name = "input_to";
2190    fto.value = rs.field(1);
2191    form.appendChild(fto);
[1121]2192               
[3286]2193    var cc = document.createElement('TEXTAREA');
2194    cc.name = "input_cc";
2195    cc.value = rs.field(2);
2196    form.appendChild(cc);
[1121]2197
[3286]2198    var cco = document.createElement('TEXTAREA');
2199    cco.name = "input_cco";
2200    cco.value = rs.field(3);
2201    form.appendChild(cco);
[1121]2202               
[3286]2203    var subject = document.createElement('TEXTAREA');
2204    subject.name = "input_subject";
2205    subject.value = rs.field(4);
2206    form.appendChild(subject);
[1121]2207               
[3286]2208    var folder = document.createElement('input');
2209    folder.name='folder';
2210    folder.value=preferences.save_in_folder;
2211    form.appendChild(folder);
[1121]2212               
[3286]2213    if (rs.field(5) == 1) {
2214        var conf_receipt = document.createElement('input');
2215        conf_receipt.type='text';
2216        conf_receipt.name = "input_return_receipt";
2217        conf_receipt.value = 'on';
2218        form.appendChild(conf_receipt);
2219    }
[1121]2220               
[3286]2221    if (rs.field(6) == 1) {
2222        var important = document.createElement('input');
2223        important.type='text';
2224        important.name = "input_important_message";
2225        important.value = 'on';
2226        form.appendChild(important);
2227    }
[1121]2228               
[3286]2229    var body = document.createElement('TEXTAREA');
2230    body.name = "body";
2231    body.value = rs.field(7);
2232    form.appendChild(body);
[1121]2233               
[3286]2234    var rowid = document.createElement('input');
2235    rowid.type = 'hidden';
2236    rowid.name = 'rowid';
2237    rowid.value = rs.field(8);
2238    form.appendChild(rowid);
[1121]2239               
[3286]2240    //Mounting the attachs
2241    var divFiles = document.createElement("div");
2242    divFiles.id = 'divFiles_queue_'+rs.field(8);
[1121]2243               
[3286]2244    form.appendChild(divFiles);
[1121]2245               
[3286]2246    document.getElementById('forms_queue').appendChild(form);
[1121]2247
[3286]2248    var is_local_forward = false;
2249    try {
[1121]2250                       
[3286]2251        var rs_attach = this.dbGears.execute('select url_attach from attachments_queue where id_queue=?', [rs.field(8)]);
2252        while (rs_attach.isValidRow()) {
2253            if(rs_attach.field(0).indexOf('../tmpLclAtt/')==-1) {
2254                tmp_field = addForwardedFile('queue_' + rs.field(8), this.store.getCapturedFileName(rs_attach.field(0)), 'nothing');
2255            }
2256            else {
2257                var tempNomeArquivo = rs_attach.field(0).split("/");
2258                var nomeArquivo = tempNomeArquivo[tempNomeArquivo.length-1];
[3872]2259                nomeArquivo = nomeArquivo.substring(0,nomeArquivo.length - 4); //Anexos no gears sᅵo todos com extensᅵo .php. tenho que tirar a extensᅵo para ficar o nome real do arquivo.
[3286]2260                is_local_forward = true;
2261                tmp_field = addForwardedFile('queue_' + rs.field(8), nomeArquivo, 'nothing');
2262            }
2263            fileSubmitter = this.store.createFileSubmitter();
2264            fileSubmitter.setFileInputElement(tmp_field,rs_attach.field(0));
2265            //          alert(form.innerHTML);
2266            //  div.appendChild(tmp_field);
2267            rs_attach.next();
2268        }
[1121]2269                       
[3286]2270        if(is_local_forward) {
2271            var is_lcl_fw = document.createElement('input');
2272            is_lcl_fw.type = 'hidden';
2273            is_lcl_fw.name = 'is_local_forward';
2274            is_lcl_fw.value = "1";
2275            form.appendChild(is_lcl_fw);
2276        }
[1121]2277                               
[3286]2278    }
2279    catch(exception) {
2280        alert(exception);
2281    }
[1121]2282               
[3286]2283    this.finalize();
2284    return form;
2285}
[1121]2286
[3286]2287var expresso_local_messages;
2288expresso_local_messages = new local_messages();
[3405]2289//expresso_local_messages.create_objects();
Note: See TracBrowser for help on using the repository browser.