source: sandbox/expressoMail1_2/MailArchiver/2.2/expressoMail1_2/js/mail_archiver.js @ 4658

Revision 4658, 21.2 KB checked in by fernando-alberto, 13 years ago (diff)

Ticket #1269 - Desenvolvimento da nova solucao de arquivamento local MailArchiver?, api JavaScript?

  • Property svn:eol-style set to native
Line 
1/*
2 * Mail Archive JS API
3 *
4 * This JavaScript file is the core to use MailArchiver embeded at Expresso suite.
5 * It contains all the resources used to handle local messages stored at the brand
6 * new solution Mail Archiver (a embeded application server running at client side).
7 *
8 * This feature is a replacement for Google Gears(obsolete by now), used by
9 * Expresso to store local messages at user workstation hard disk.
10 *
11 * @author Fernando Wendt [fernando-alberto.wendt@serpro.gov.br]
12 *
13 * @status under development
14 */
15
16var sessid = 'sessionId';
17
18function IterateIt(){
19    var deph = 0;
20    var returnstr = "";
21
22    for (i in arguments[0]){
23      if((arguments[0][i]) && (arguments[0][i].visited == null)){
24          arguments[0][i].visited = true;
25
26          if(typeof(arguments[0][i]) == 'object'){
27            returnstr += '+ Property "' + i + '"[object ' + deph + ']\n<br>';
28            //returnstr += IterateIt(arguments[0][i]);
29            deph++;
30          }
31      }
32    else returnstr += 'Property "' + i + '" -> ' + arguments[0][i] + ' [' + typeof(i) + ']\n<br>';
33    }
34    return (returnstr);
35}
36
37function dump(arr,level) {
38        var dumped_text = "";
39        if(!level) level = 0;
40       
41        //The padding given at the beginning of the line.
42        var level_padding = "";
43        for(var j=0;j<level+1;j++) level_padding += "    ";
44       
45        if(typeof(arr) == 'object') { //Array/Hashes/Objects
46                for(var item in arr) {
47                        var value = arr[item];
48                       
49                        if(typeof(value) == 'object') { //If it is an array,
50                                dumped_text += level_padding + "'" + item + "' ...\n<br>";
51                                dumped_text += dump(value,level+1);
52                        } else {
53                                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n<br>";
54                        }
55                }
56        } else { //Stings/Chars/Numbers etc.
57                dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
58        }
59        return dumped_text;
60}
61
62//Main object structure: object property data definition
63function MailArchiver() {
64    this.enabled = null;
65    this.interval = 500;
66    this.timer = null;
67    this.counter = 0;
68    this.message_list = new Array();
69    this.total_messages = 0;
70    this.messages_processed = 0;
71    this.messages_fail = 0;
72    this.folder_origin = null;
73    this.folder_destination = null;
74    this.folders = null;
75    this.currentfolder = 'local_root';
76    this.drawdata = null;
77    this.onprocess = false;
78}
79
80//Invoked at some possible MA crash issue
81MailArchiver.prototype.resetObject = function(){
82    expresso_mail_archive.message_list = new Array();
83    expresso_mail_archive.total_messages = 0;
84    expresso_mail_archive.messages_processed = 0;
85    expresso_mail_archive.messages_fail = 0;
86    expresso_mail_archive.folder_origin = null;
87    expresso_mail_archive.folder_destination = null;
88    expresso_mail_archive.folder = null;
89}
90
91/*SystemCheck method: test if MailArchive is installed and/or running at user workstation
92*Try to get a instance of ArchiveServices object - the handler of services provided by
93*the MailArchive services provider interface, from user workstation.
94*/
95MailArchiver.prototype.SystemCheck = function(){
96    expresso_mail_archive.enabled = ((ArchiveServices) ? true : false);
97}
98
99//Turns on the listener timer to check services availability
100MailArchiver.prototype.ActivateStatusListener = function(obj){
101    if (document.getElementById('mail_archiver_retry'))
102        tem_tag = true;
103    else
104        tem_tag = false;
105   
106    try{
107        if (obj.enabled){
108            obj.interval = 500; //set default timer to 1ms (imediate lauching)
109            draw_footer_box(get_current_folder());
110            obj.getServicesStatus(obj);
111        }
112        else{
113            throw "this is not enabled: " + obj;
114            window.alert('Nope: obj.enabled is not true...');
115        }
116    }
117    catch (e){
118        window.alert('ActivateStatusListener error: ' + e);
119    }
120}
121
122//Turns off the service status listener, at a crash issue
123MailArchiver.prototype.DeactivateStatusListener = function(obj){
124    window.clearInterval(obj.timer);
125    obj.enabled = null;
126    obj.timer=null;
127    obj.interval = 500;
128    ArchiveServices = null;
129    connector.purgeCache();
130   
131    draw_footer_box(get_current_folder());
132    auto_refresh();
133
134    if(document.getElementById('mail_archiver_retry')){
135        document.getElementById('mail_archiver_retry').parentNode.removeChild(document.getElementById('mail_archiver_retry'));
136    }
137    else{
138        //to do, by now, means nothing
139    }
140}
141
142//ServiceStatus callback OK
143MailArchiver.prototype.getServicesStatusOK = function(serviceData){
144    if ((serviceData.getReturn() == "STARTED") || (serviceData.getReturn() == "RUNNING")){
145        //If there is no timer activated to services check interval, set it up.
146        if(expresso_mail_archive.enabled){
147           if(expresso_mail_archive.timer == null){
148                expresso_mail_archive.interval = 5000;
149                expresso_mail_archive.timer = window.setInterval(expresso_mail_archive.getServicesStatus, expresso_mail_archive.interval);
150           }
151        }
152        else{
153            window.clearInterval(expresso_mail_archive.timer);
154            write_msg(get_lang('Your preferences are setting to use local messages, but Mail Archiver does not seems to be running or installed at this workstation. By now, we are turning off this feature. Check it out!'),true);
155        }
156    }
157    else{
158        expresso_mail_archive.enabled = false;
159        window.clearInterval(expresso_mail_archive.timer);
160        write_msg(get_lang('Your preferences are setting to use local messages, but Mail Archiver does not seems to be running or installed at this workstation. By now, we are turning off this feature. Check it out!'),true);
161    }
162}
163
164//Dettach resources handler
165MailArchiver.prototype.DeactivateResources = function(obj){   
166    if(obj.timer)
167        window.clearInterval(obj.timer);
168    write_msg(get_lang('3Mail Archiver is not responding. There is some communicating issue hang it up. Some services may not work properly. Check it out!'));
169    obj.DeactivateStatusListener(obj);
170    return;
171}
172
173//Services Status Fail callback
174MailArchiver.prototype.getServicesStatusFailure = function(serviceData){
175    window.alert('getServicesStatusFailure feature: ' + serviceData);
176}
177
178//Service Status handler
179MailArchiver.prototype.getServicesStatus = function(obj){
180    try{
181        if(ArchiveServices){
182            try{
183                ArchiveServices.getState(expresso_mail_archive.getServicesStatusOK, expresso_mail_archive.getServicesStatusFailure, "true");
184            }catch (e){
185                throw "Service failure status: getState";
186            }
187        }
188        else {
189            throw "No ArchiveServices object present. Sorry, but leaving now...";
190        }
191    }catch (e){
192        window.alert('getServiceStatus exception:' + e);
193    }
194    expresso_mail_archive.counter = expresso_mail_archive.counter +1;
195}
196
197/*Restart method: re-initializes all the Mail Archive structure
198 **/
199MailArchiver.prototype.Restart = function(obj){
200    window.alert('Trying reboot...');
201
202    obj.SystemCheck();
203    obj.ActivateStatusListener(obj);
204    //tree_folders.getNodeById('local_root')._refresh();
205    auto_refresh();
206}
207
208/*Startup method: initializes all the Mail Archive structure to work so far as possible
209 *Looks like the old 'gears_init', from Gears
210 **/
211MailArchiver.prototype.Startup = function(){
212    this.SystemCheck();
213}
214
215MailArchiver.prototype.CreateMessageList = function(msg_list){
216    if((msg_list != null) && (msg_list != "") && (msg_list != " ")){
217        if (expresso_mail_archive.message_list.length == 0){
218            //Get all the messages ids by pass at msgs_id to "message_list" object array propertie - if more than one exists
219            if(msg_list.indexOf(',') != -1){
220                var tmp_list = msg_list.split(',');
221                for(var i=0; i < tmp_list.length; i++){
222                    expresso_mail_archive.message_list.push(tmp_list[i]);
223                }
224            }
225            //Push message list to process the only one
226            else expresso_mail_archive.message_list.push(msg_list);
227        }
228    }
229    //msg_list is corrupted. aborting population
230    else expresso_mail_archive.message_list = new Array();
231}
232
233//Archive Operation
234MailArchiver.prototype.Archive = function(source_folder,destination_folder,msgs_id){
235    window.alert('tentando arquivar a mensagem [' + msgs_id + '], do folder ['+source_folder+'] para a pasta destino ['+destination_folder+']');
236    try{
237        document.getElementById('main_title').innerHTML = get_lang("Starting to archive messages");
238        expresso_mail_archive.CreateMessageList(msgs_id);
239
240        if((expresso_mail_archive.message_list.length > 0) && (expresso_mail_archive.message_list[0] != '')){
241
242            //Sets the message counter
243            expresso_mail_archive.total_messages = expresso_mail_archive.message_list.length;
244           
245            //Sets the folders properties: destination and origin
246            expresso_mail_archive.folder_origin = source_folder;
247            window.alert('substr(0,5) = ' + destination_folder.substr(0,5));
248            if(destination_folder.substr(0,5) == 'local')
249                expresso_mail_archive.folder_destination = destination_folder.substr(6,destination_folder.length);
250            else
251                expresso_mail_archive.folder_destination = destination_folder;
252           
253            window.alert('destination_folder = ' + expresso_mail_archive.folder_destination);
254
255            var arch_handler = function(data){
256                //Store the message source from Ajax request by now (string data)
257                var js_var = new String(data);
258                try{
259                    //Archive services needs session id, message source and destination folder
260                    document.getElementById('main_title').innerHTML = get_lang("Archiving message on folder") + " " + expresso_mail_archive.folder_destination +"...";
261                    ArchiveServices.archive(expresso_mail_archive.getArchiveOperationOK, expresso_mail_archive.getArchiveOperationFailure, sessid, data ,expresso_mail_archive.folder_destination);
262                }
263                catch(e){
264                    window.alert('ArchiveServices.archive eror: ' + e);
265                }
266            }
267           
268            document.getElementById('main_title').innerHTML = get_lang("Archiving messages " + expresso_mail_archive.messages_processed + " of " + expresso_mail_archive.message_list.length);
269            cExecute("$this.exporteml.js_source_var",arch_handler,"folder="+url_decode(source_folder)+"&msgs_to_export="+expresso_mail_archive.message_list[0]);
270        }
271        else throw('Ops. Message list stack is empty!');
272    }
273    catch(e){
274        window.alert('Archive error: ' + e);
275    }
276}
277
278//Archive callback OK
279MailArchiver.prototype.getArchiveOperationOK = function(status_message){
280    expresso_mail_archive.messages_processed++;
281    if(expresso_mail_archive.message_list.length > 1){
282       document.getElementById('main_title').innerHTML = get_lang("Message " + expresso_mail_archive.messages_processed + " of " + expresso_mail_archive.total_messages + " successfully archived.");
283       expresso_mail_archive.message_list.shift();
284       expresso_mail_archive.Archive(expresso_mail_archive.folder_origin, expresso_mail_archive.folder_destination, expresso_mail_archive.message_list);
285    }
286    else{
287        document.getElementById('main_title').innerHTML = get_lang("All done. End of archive messages operation.");
288        expresso_mail_archive.resetObject();
289        window.setTimeout("eval('document.getElementById(\"main_title\").innerHTML =\"Expresso Mail\"')",3000);
290    }
291}
292//Archive callback Fail
293MailArchiver.prototype.getArchiveOperationFailure = function(error_message){
294    window.alert('Hi! getArchiveOperationFailure comes with ' + error_message.getReturn());
295    window.setTimeout("eval('document.getElementById(\"main_title\").innerHTML =\"Expresso Mail\"')",3000);
296}
297
298//getFolderList Operation
299MailArchiver.prototype.getFoldersList = function(basefolder){   
300    try{
301        ArchiveServices.listFolders(expresso_mail_archive.getFoldersListOperationOK, expresso_mail_archive.getFoldersListOperationFailure, sessid, basefolder);
302    }
303    catch (e){
304        window.alert('Ops...List folders fails at:\n' + e.description);
305    }
306}
307
308//getFolderList callback OK
309MailArchiver.prototype.getFoldersListOperationOK = function(folderlist){
310    //Internal variable used to map all XML data return from WS invokated
311    var lfolders = new Array();
312   
313    //Mapping XML data to a handler data structure
314    if(folderlist.getReturn().length > 0){
315        var lfolders = new Array();
316        for(i=0; i<folderlist.getReturn().length; i++){
317            (folderlist.getReturn()[i].getFolderCount() > 0 ) ? folderChild = 1 : folderChild = 0;
318
319            //Store folder data at this format: {folder name, number of messages contained, folder has child nodes, folder id, folder parent id, folder full path}
320            //var folderData = new Array(folderlist.getReturn()[i].getName(), folderlist.getReturn()[i].getMessageCount(), folderChild, folderlist.getReturn()[i].getId(), folderlist.getReturn()[i].getParentId(), folderlist.getReturn()[i].getPath());
321            var folderData = {name: folderlist.getReturn()[i].getName(), messages: folderlist.getReturn()[i].getMessageCount(), haschild: folderChild, id: folderlist.getReturn()[i].getId(), parentid: folderlist.getReturn()[i].getParentId(), path: folderlist.getReturn()[i].getPath()};
322            lfolders.push(folderData);
323        }
324
325        //Sets folders property at main object
326        expresso_mail_archive.folders = lfolders;
327       
328        if(expresso_mail_archive.folders[0]["parentid"] == "")
329            expresso_mail_archive.currentfolder = 'local_root';
330        else
331            expresso_mail_archive.currentfolder = expresso_mail_archive.folders[0]["parentid"];
332       
333        //Folders dumping :)
334        /*var strFolders = '---';
335        for (var w=0; w < expresso_mail_archive.folders.length; w++){
336            strFolders += '\nFolder ' + w + ' -->';
337            for (x in expresso_mail_archive.folders[w]){
338                strFolders += '\n----------' + x + ':= ' + expresso_mail_archive.folders[w][x];
339            }
340            strFolders += '\n<---';
341        }
342        strFolders += '\n---';
343        alert(lfolders.length + ' folders mapeados, com default = ' + expresso_mail_archive.currentfolder + '\nfolders list:\n\n' + strFolders);
344        */
345
346        //If something UI related have been flagged, handle it
347        if (expresso_mail_archive.drawdata){
348            expresso_mail_archive.drawFolderTree();
349        }
350    }
351}
352
353//getFolderList callback Fail
354MailArchiver.prototype.getFoldersListOperationFailure = function(error, http_msg){
355    window.alert('List folders mistake:' + error + '\nhttp_error = ' + http_msg);
356}
357
358//drawFolderTree operation, if requested to
359MailArchiver.prototype.drawFolderTree = function(){
360    var localBaseName  = 'local_';
361    var objectTree = expresso_mail_archive.drawdata.treeObject;
362    var evalobjectTree = eval(expresso_mail_archive.drawdata.treeName);
363   
364    //Add nodes to tree
365    if(expresso_mail_archive.folders.length > 0){
366        for(i=0; i<expresso_mail_archive.folders.length; i++){
367            var folder_caption;
368           
369            //Special folders treatment: Inbox, Outbox, Drafts, Sent and Trash folders
370            if((expresso_mail_archive.folders[i]["name"] == 'Inbox') || (expresso_mail_archive.folders[i]["name"] == 'Outbox') || (expresso_mail_archive.folders[i]["name"] == 'Drafts') || (expresso_mail_archive.folders[i]["name"] == 'Sent') || (expresso_mail_archive.folders[i]["name"] == 'Trash')){
371                folder_caption = get_lang(expresso_mail_archive.folders[i]["name"]);
372            }
373            else{
374                folder_caption = expresso_mail_archive.folders[i]["name"];
375            }
376           
377            var n_demo = new dNode({id: localBaseName + expresso_mail_archive.folders[i]["id"], caption: folder_caption, onClick: "change_folder('"+ localBaseName + expresso_mail_archive.folders[i]["id"] +"','"+ localBaseName + expresso_mail_archive.folders[i]["id"]+"', '" + expresso_mail_archive.drawdata.treeName + "')", plusSign:expresso_mail_archive.folders[i]["haschild"]});
378           
379            //Adjust the id node names
380            if(expresso_mail_archive.currentfolder.substr(0,5) != 'local'){
381                evalobjectTree.add(n_demo, localBaseName + expresso_mail_archive.currentfolder);
382            }
383            else{
384                evalobjectTree.add(n_demo,expresso_mail_archive.currentfolder);
385            }
386        }
387    }
388}
389
390//getFaultInfo operation
391MailArchiver.prototype.getFaultInfo = function(){
392    try{
393        ArchiveServices.getFaultInfo(expresso_mail_archive.getFaultInfoOperationOK, expresso_mail_archive.getFaultInfoOperationFailure, sessid);
394    }   
395    catch(e){
396        write_msg(get_lang('getFaultInfo invoke fails = ' + e),true);
397    }
398}
399
400//getFaultInfo callback OK
401MailArchiver.prototype.getFaultInfoOperationOK = function(faultinfo){
402    try{
403        write_msg(get_lang('MailArchiver remote service reports the following error:' + faultinfo.getReturn().getSoapFaultString(), true));
404    } catch(e){
405        write_msg(get_lang('Ops! It was not possible to capture service error data.', true));
406    }
407}
408
409//getFaultInfo callback Fail
410MailArchiver.prototype.getFaultInfoOperationFailure = function(errorCode, errorDesc){
411    try{
412        write_msg(get_lang('SoapFault capture fails at:' + errorCode + ' | ' + errorDesc, true));
413    } catch(e){
414        write_msg(get_lang('Service error mapping', true));
415    }   
416}
417
418//createFolder operation
419MailArchiver.prototype.createFolder = function(parentFolder, folderName){
420    try{
421        ArchiveServices.createFolder(expresso_mail_archive.createFolderOperationOK, expresso_mail_archive.createFolderOperationFailure, sessid, parentFolder, folderName);
422    }
423    catch (e){
424        window.alert('Ops...create folder fails at:\n' + e);
425    }
426   
427}
428
429//createFolder callback OK
430MailArchiver.prototype.createFolderOperationOK = function (folderObject){
431    draw_tree_local_folders();
432    ttreeBox.update_folder();   
433}
434
435//createFolder callback Fail
436MailArchiver.prototype.createFolderOperationFailure = function (message){
437    window.alert('Folder creation fails...\n->' + message.getReturn());
438}
439
440//deleteFolder operation
441MailArchiver.prototype.deleteFolder = function(folderName){
442    try{
443        ArchiveServices.deleteFolder(expresso_mail_archive.deleteFolderOperationOK, expresso_mail_archive.deleteFolderOperationFailure, sessid, folderName, true);
444    }
445    catch (e){
446        window.alert('Ops...delete folder fails at:\n' + e);
447    }
448   
449}
450
451//deleteFolder callback OK
452MailArchiver.prototype.deleteFolderOperationOK = function (folderObject){
453    var fo = IterateIt(folderObject);
454    write_msg(get_lang("The folder " + expresso_mail_archive.drawdata.folderName + " was successfully removed"));
455    draw_tree_local_folders();
456    ttreeBox.update_folder();   
457}
458
459//deleteFolder callback Fail
460MailArchiver.prototype.deleteFolderOperationFailure = function (message){
461    window.alert('Folder deletion fails...\n->' + message.getReturn());
462}
463
464//renameFolder operation
465MailArchiver.prototype.renameFolder = function(folderId, newFolderName){
466    try{
467        ArchiveServices.renameFolder(expresso_mail_archive.renameFolderOperationOK, expresso_mail_archive.renameFolderOperationFailure, sessid, folderId, newFolderName);
468    }
469    catch (e){
470        window.alert('Ops...renaming folder fails at:\n' + e);
471    }
472   
473}
474
475//renameFolder callback OK
476MailArchiver.prototype.renameFolderOperationOK = function (returnService){
477    var evalobjectTree = eval(expresso_mail_archive.drawdata.treeName);
478    evalobjectTree.update_folder();
479}
480
481//renameFolder callback Fail
482MailArchiver.prototype.renameFolderOperationFailure = function (ServiceFault){
483    window.alert('Folder rename fails...\n->' + ServiceFault.getReturn());
484    alert(get_lang("cannot rename folder. try other folder name"));
485}
486
487//getFolderInfo operation
488MailArchiver.prototype.getFolderInfo = function (folderId){
489    try{
490        ArchiveServices.getFolderInfo(expresso_mail_archive.getFolderInfoOperationOK, expresso_mail_archive.getFolderInfoOperationFailure, sessid, folderId);
491    }
492    catch (e){
493        window.alert('Ops...getFolderInfo fails at:\n' + e);
494    }     
495}
496
497//getFolderInfo callback OK
498MailArchiver.prototype.getFolderInfoOperationOK = function(returnService){
499   var folder_info = {id : returnService.getReturn().getId(), name : returnService.getReturn().getName(), parent : returnService.getReturn().getParentId(), numfolders: returnService.getReturn().getFolderCount(), nummessages: returnService.getReturn().getMessageCount()};
500   expresso_mail_archive.folder = folder_info;
501}
502
503//getFolderInfo callback Fail
504MailArchiver.prototype.getFolderInfoOperationFailure = function (ServiceFault){
505    window.alert('getFolderInfo service fails...\n->' + ServiceFault.getReturn());
506}
507
508//listMessages operation
509MailArchiver.prototype.listMessages = function(listQuery){
510    try{
511        ///ArchiveServices.listMessages()
512    }
513    catch (e){
514        window.alert('Ops...listMessages fails at:\n' + e);
515    }
516}
517
518//listMessages callback OK
519MailArchiver.prototype.listMessagesOperationOK = function(returnService){
520   
521}
522
523//listMessages callback Fail
524MailArchiver.prototype.listMessagesOperationFailure = function(serviceFault){
525   
526}
527
528/*
529 *The all pourpose JavaScript variable, used by all related functionalityes at
530 *Expresso Mail to handle this object at user gui.
531 */
532
533var expresso_mail_archive;
534expresso_mail_archive = new MailArchiver();
Note: See TracBrowser for help on using the repository browser.