/**
* @author diogenes
*/
function local_messages() {
this.dbGears = null;
this.localServer = null;
this.store = null;
this.fileSubmitter = null;
}
local_messages.prototype.init_local_messages = function(){
if(this.dbGears == null)
this.dbGears = google.gears.factory.create('beta.database');
if(this.localServer==null)
this.localServer = google.gears.factory.create('beta.localserver');
if(this.store==null)
this.store = this.localServer.createStore('test-store');
if(this.fileSubmitter == null)
this.fileSubmitter = this.store.createFileSubmitter();
this.dbGears.open('database-test');
this.dbGears.execute('create table if not exists folder (folder text,uid_usuario int,unique(folder,uid_usuario))');
this.dbGears.execute('create table if not exists mail' +
' (mail blob,original_id int,original_folder text,header blob,timestamp int,uid_usuario int,unseen int,id_folder int,' +
' ffrom text, subject text, fto text, cc text, body text, size int,unique (original_id,original_folder,uid_usuario))');
this.dbGears.execute('create table if not exists anexo' +
' (id_mail int,nome_anexo text,url text,pid int)');
//some people that used old version of local messages could not have the size column. If it's the first version
//with local messages you're using in expresso, this part of code can be removed
try {
this.dbGears.execute('alter table mail add column size int');
}catch(Exception) {
}
var rs = this.dbGears.execute('select rowid,header from mail where size is null');
while(rs.isValidRow()) {
var temp = connector.unserialize(rs.field(1));
this.dbGears.execute('update mail set size='+temp.Size+' where rowid='+rs.field(0));
rs.next();
}
//end of temporary code
}
local_messages.prototype.drop_tables = function() {
this.init_local_messages();
var rs = this.dbGears.execute('select url from anexo');
while(rs.isValidRow()) {
this.store.remove(rs.field(0));
rs.next();
}
this.dbGears.execute('drop table folder');
this.dbGears.execute('drop table mail');
this.dbGears.execute('drop table anexo');
this.finalize();
}
local_messages.prototype.insert_mail = function(msg_info,msg_header,anexos,folder) {
try {
this.init_local_messages();
var unseen = 0;
var login = msg_info.login;
var original_id = msg_info.msg_number;
var original_folder = msg_info.msg_folder;
//This fields needs to be separeted to search.
var from = connector.serialize(msg_info.from);
var subject = msg_info.subject;
var body = msg_info.body;
var to = connector.serialize(msg_info.toaddress2);
var cc = connector.serialize(msg_info.cc);
var size = msg_header.Size;
//do not duplicate this information
msg_info.from = null;
msg_info.subject = null;
msg_info.body = null;
msg_info.to = null;
msg_info.cc = null;
msg_header.Size=null;
//If the mail was archieved in the same date the user received it, the date cames with the time.
//here I solved it
if(msg_header.udate.indexOf(":")!=-1) {
msg_header.udate = msg_header.aux_date;
}
/**
* The importance attribute can be empty, and javascript consider as null causing nullpointer.
*/
if((msg_header.Importance == null) || (msg_header.Importance == ""))
msg_header.Importance = "Normal";
msg_header.aux_date = null;
var mail = connector.serialize(msg_info);
var header = connector.serialize(msg_header);
var timestamp = msg_info.timestamp;
var id_folder;
if((folder==null) || (folder=="local_root"))
folder = "Inbox";
else
folder = folder.substr(6);//take off the word "local_"
var rs = this.dbGears.execute("select rowid from folder where folder=? and uid_usuario=?",[folder,account_id]);
if(rs.isValidRow())
id_folder=rs.field(0);
else {
this.dbGears.execute("insert into folder (folder,uid_usuario) values (?,?)",["Inbox",account_id]);
id_folder = this.dbGears.lastInsertRowId;
}
if(msg_info.Unseen=="U")
unseen = 1;
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]);
var call_back = function() {
}
this.store.capture(msg_info.url_export_file,call_back);
var id_mail = this.dbGears.lastInsertRowId;
this.insert_attachments(id_mail,anexos);
this.finalize();
return true;
} catch (error) {
this.finalize();
return false;
}
}
local_messages.prototype.get_local_mail = function(id_mail) {
this.init_local_messages();
var rs = this.dbGears.execute("select mail.rowid,mail.mail,mail.ffrom,mail.subject,mail.body,mail.fto,mail.cc,folder.folder from mail inner join folder on mail.id_folder=folder.rowid where mail.rowid="+id_mail);
var retorno = null;
if(rs.isValidRow()) {
retorno = rs.field(1);
}
retorno = connector.unserialize(retorno);
retorno['from'] = connector.unserialize(rs.field(2));
retorno['subject'] = rs.field(3);
retorno['body'] = rs.field(4);
//Codigo que as imagens embutidas em emails (com multipart/related ou multipart/mixed) sejam corretamente mostradas em emails arquivados. Os links do
//tipo "./inc/show_embedded_attach.php?msg_folder=[folder]&msg_num=[msg_num]&msg_part=[part]"
//são substituidos pelos links dos anexos capturados pelo gears.
var thumbs= retorno.thumbs;
var anexos= retorno.array_attach;
for (i in anexos)
{
nomeArquivo = anexos[i]['name'].substring(0,anexos[i]['name'].length - 4);
if(nomeArquivo.match('jpg')||anexos[i]['name'].match('gif')||anexos[i]['name'].match('png'))
{
var er_imagens = new RegExp("\\.\\/inc\\/show_embedded_attach.php\\?msg_folder=[\\w/]+\\&msg_num=[0-9]+\\&msg_part="+anexos[i]['pid']);
var Result_imagens = er_imagens.exec(retorno['body']);
retorno['body'] = retorno['body'].replace(Result_imagens,anexos[i]['url']);
if(thumbs && thumbs[i]){
er_imagens = new RegExp("\\.\\/inc\\/show_thumbs.php\\?file_type=image\\/[\\w]+\\&msg_num=[0-9]+\\&msg_folder=[\\w/%]+\\&msg_part="+anexos[i]['pid']);
Result_imagens = er_imagens.exec(thumbs[i]);
thumbs[i] = thumbs[i].replace(Result_imagens,"'"+anexos[i]['url']+"'");
er_imagens = new RegExp("\\.\\/inc\\/show_img.php\\?msg_num=[0-9]+\\&msg_folder=[\\w/%]+\\&msg_part="+anexos[i]['pid']);
Result_imagens = er_imagens.exec(thumbs[i]);
thumbs[i] = thumbs[i].replace(Result_imagens,"'"+anexos[i]['url']+"'");
thumbs[i] = thumbs[i].replace(/
0)
rs2.close();
this.finalize();
return retorno;
}
local_messages.prototype.get_url_anexo = function(msg_number,pid) {
this.init_local_messages();
var retorno;
var rs = this.dbGears.execute("select url from anexo where id_mail="+msg_number+" and pid = '"+pid+"'");
retorno = rs.field(0)
this.finalize();
return retorno;
}
local_messages.prototype.getInputFileFromAnexo = function (element,url) {
this.init_local_messages();
this.fileSubmitter.setFileInputElement(element,url);
this.finalize();
}
local_messages.prototype.finalize = function() {
this.dbGears.close();
this.dbGears = null;
}
local_messages.prototype.delete_msgs = function(msgs_number,border_ID) {
this.init_local_messages();
var rs = this.dbGears.execute("select url from anexo where id_mail in ("+msgs_number+")");
while(rs.isValidRow()) {
this.store.remove(rs.field(0));
rs.next();
}
this.dbGears.execute("delete from anexo where id_mail in ("+msgs_number+")");
this.dbGears.execute("delete from mail where rowid in ("+msgs_number+")");
this.finalize();
if (msgs_number.length == 1)
write_msg(get_lang("The message was deleted."));
else
write_msg(get_lang("The messages were deleted."));
mail_msg = Element("tbody_box");
try {
msgs_exploded = msgs_number.split(",");
}catch(error) {
msgs_exploded = new Array();
msgs_exploded[0] = msgs_number;
}
var msg_to_delete;
for (var i=0; i");
var friendly_filters = new Array();
if (filters[0].indexOf('ALL') != -1) { //all filters...
friendly_filters.push("SUBJECT");
friendly_filters.push(filters[1]);
friendly_filters.push("BODY");
friendly_filters.push(filters[1]);
friendly_filters.push("FROM");
friendly_filters.push(filters[1]);
friendly_filters.push("TO");
friendly_filters.push(filters[1]);
friendly_filters.push("CC");
friendly_filters.push(filters[1]);
}
else {
friendly_filters[0] = filters[0];
for (var i in filters) {
if (i != 0) {
var temp = filters[i].split(" ");
friendly_filters.push(temp[0]);
friendly_filters.push(temp[1]);
}
}
}
var sql = "select mail.header,folder.folder,mail.rowid,size from mail inner join folder on mail.id_folder=folder.rowid where mail.uid_usuario="+account_id + " and folder.folder in (";
for(var fnum in folders) {
sql+="'"+folders[fnum]+"'";
if(fnum= 1){
return tmp + " kb";
}else{
return size + " b";
}
}
local_messages.prototype.aux_convert_filter_field = function(filter) {
if((filter=="SUBJECT ") || (filter=="SUBJECT"))
return "subject";
else if((filter=="BODY ") || (filter=="BODY"))
return "body";
else if((filter=="FROM ") || (filter=="FROM"))
return "ffrom";
else if((filter=="TO ") || (filter=="TO"))
return "fto";
else if((filter=="CC ") || (filter=="CC"))
return "cc";
}
local_messages.prototype.has_local_mails = function() {
this.init_local_messages();
var rs = this.dbGears.execute("select rowid from folder limit 0,1");
var retorno;
if(rs.isValidRow())
retorno = true;
else
retorno = false;
this.finalize();
return retorno;
}
//Por Bruno Costa(bruno.vieira-costa@serpro.gov.br - Essa função é um AJAX simples que serve apenas para pegar o fonte de uma msg local (no formato RFC 822).
local_messages.prototype.get_src = function(url){
AJAX = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
AJAX = new XMLHttpRequest();
if (AJAX.overrideMimeType) {
AJAX.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
AJAX = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
AJAX = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!AJAX) {
alert('ERRO :(Seu navegador não suporta a aplicação usada neste site');
return false;
}
AJAX.onreadystatechange = function() {
if (AJAX.readyState == 4) {
AJAX.src=AJAX.responseText;
if (AJAX.status == 200) {
return AJAX.responseText;
} else {
return false;
}
}
}
AJAX.open('get', url, false);
AJAX.send(null);
return AJAX.responseText;
};
//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
//para que elas sejam inseridas no imap pela função imap_functions.unarchive_mail.
local_messages.prototype.unarchive_msgs = function (folder,new_folder,msgs_number){
if(!new_folder)
new_folder='INBOX';
this.init_local_messages();
// alert(folder+new_folder+msgs_number);
var handler_unarchive = function(data)
{
if(data.error == '')
write_msg(get_lang('All messages are successfully unarchived'));
else
alert(data.error);
}
if(msgs_number =='selected' || !msgs_number)
{
msgs_number = get_selected_messages()
if (!msgs_number){
write_msg(get_lang('No selected message.'));
return;
}
var rs = this.dbGears.execute("select mail,timestamp from mail where rowid in ("+msgs_number+")");
var source="";
var timestamp="";
while(rs.isValidRow()) {
mail=connector.unserialize(rs.field(0));
source_tmp=escape(this.get_src(mail.url_export_file));
source+="#@#@#@"+source_tmp;
timestamp+="#@#@#@"+rs.field(1);
rs.next();
}
rs.close();
this.finalize();
}
else
{
var rs = this.dbGears.execute("select mail,timestamp from mail where rowid="+msgs_number);
mail=connector.unserialize(rs.field(0));
var source ="";
source = this.get_src(mail.url_export_file);
timestamp=rs.field(1);
rs.close();
this.finalize();
}
params="&folder="+new_folder+"&source="+source+"×tamp="+timestamp;
cExecute ("$this.imap_functions.unarchive_mail&", handler_unarchive, params);
}
local_messages.prototype.download_all_local_attachments = function(folder,id){
this.init_local_messages();
var rs = this.dbGears.execute("select mail from mail where rowid="+id);
var tmp = connector.unserialize(rs.field(0));
rs.close();
this.finalize();
source = this.get_src(tmp.url_export_file);
source = escape(source);
var handler_source = function(data){
download_attachments(null, null, data, null,null,'anexos.zip');
}
cExecute("$this.imap_functions.download_all_local_attachments",handler_source,"source="+source);
}
/*************************************************************************/
/* Funcao usada para exportar mensagens arquivadas localmente.
* Rommel de Brito Cysne (rommel.cysne@serpro.gov.br)
* em 22/12/2008.
*/
local_messages.prototype.local_messages_to_export = function(){
if (openTab.type[currentTab] > 1){
var msgs_to_export_id = currentTab.substring(0,currentTab.length-2,currentTab);
}else{
var msgs_to_export_id = get_selected_messages();
}
var handler_local_mesgs_to_export = function(data){
download_attachments(null, null, data, null,null,'mensagens.zip');
}
if(msgs_to_export_id){
this.init_local_messages();
var l_msg = "t";
var mesgs ="";
var subjects ="";
var rs = this.dbGears.execute("select mail,subject from mail where rowid in ("+msgs_to_export_id+")");
while(rs.isValidRow()){
mail = connector.unserialize(rs.field(0));
src = this.get_src(mail.url_export_file);
subject = rs.field(1);
mesgs += src;
mesgs += "@@";
subjects += subject;
subjects += "@@";
rs.next();
}
rs.close();
this.finalize();
mesgs = escape(mesgs);
subjects = escape(subjects);
params = "subjects="+subjects+"&mesgs="+mesgs+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export_id;
cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
}
return true;
}
local_messages.prototype.get_all_local_folder_messages= function(folder_name){
var mesgs = new Array();
var subjects = new Array();
var hoje = new Date();
var msgs_to_export = new Array();
var l_msg="t";
this.init_local_messages();
var query = "select mail,subject,mail.rowid from mail inner join folder on (mail.id_folder=folder.rowid) where folder.folder='" + folder_name + "'";
var rs = this.dbGears.execute(" "+query)
var handler_local_mesgs_to_export = function(data){
//alert("data - " + data + " - tipo - " + typeof(data));
download_attachments(null, null, data, null,null,'mensagens.zip');
}
var j=0;
while (rs.isValidRow()){
msgs_to_export[j]=rs.field(2)
mail = connector.unserialize(rs.field(0));
msg=this.get_src(mail.url_export_file);
subject = rs.field(1);
mesgs += msg;
mesgs += "@@";
subjects += subject;
subjects += "@@";
rs.next();
j++;
}
rs.close();
this.finalize();
source = escape(mesgs);
subjects = escape(subjects);
params = "folder="+folder_name+"&subjects="+subjects+"&mesgs="+source+"&l_msg="+l_msg+"&msgs_to_export="+msgs_to_export;
cExecute ("$this.exporteml.makeAll&", handler_local_mesgs_to_export, params);
}
/*************************************************************************/
var expresso_local_messages;
expresso_local_messages = new local_messages();