This is just some static backup of the original site, don't expect every link to work!

source: content/v_identity.js @ 1bc37c

ng_0.9
Last change on this file since 1bc37c was 1bc37c, checked in by rene <rene@…>, 11 years ago

added replyToSelf as module

  • Property mode set to 100644
File size: 17.2 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s):
23 * ***** END LICENSE BLOCK ***** */
24
25Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
26virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
27
28let Log = vI.setupLogging("virtualIdentity.main");
29Components.utils.import("resource://v_identity/vI_account.js", virtualIdentityExtension);
30Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension);
31Components.utils.import("resource://v_identity/vI_replyToSelf.js", virtualIdentityExtension);
32Components.utils.import("resource://v_identity/plugins/signatureSwitch.js", virtualIdentityExtension);
33
34var main = {
35    headerParser : Components.classes["@mozilla.org/messenger/headerparser;1"]
36                .getService(Components.interfaces.nsIMsgHeaderParser),
37   
38    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
39                .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
40                           
41    accountManager : Components.classes["@mozilla.org/messenger/account-manager;1"]
42            .getService(Components.interfaces.nsIMsgAccountManager),
43       
44
45    gMsgCompose : null, // to store the global gMsgCompose after MsgComposeDialog is closed
46
47    // Those variables keep pointers to original functions which might get replaced later
48    original_functions : {
49        GenericSendMessage : null,
50        FillIdentityList : null
51    },
52
53    // some pointers to the layout-elements of the extension
54    elements : {
55        init_base : function() {
56            main.elements.Area_MsgIdentityHbox = document.getElementById("virtualIdentityExtension_msgIdentityHbox");
57            main.elements.Obj_MsgIdentity = document.getElementById("msgIdentity");
58        },
59        init_rest : function() {
60            main.elements.Obj_MsgIdentityPopup = document.getElementById("msgIdentityPopup");
61            main.elements.Obj_vILogo = document.getElementById("virtualIdentityExtension_Logo");
62            main.elements.strings = document.getElementById("virtualIdentityExtension_vIdentBundle");
63        },
64        strings : null
65    },
66
67    ComposeStateListener : {
68        NotifyComposeBodyReady: function() { 
69            Log.debug("NotifyComposeBodyReady\n");
70            main.initSystemStage2();
71        },
72        NotifyComposeFieldsReady: function() { 
73            Log.debug("NotifyComposeFieldsReady\n");
74        },
75        ComposeProcessDone: function(aResult) {
76            Log.debug("StateListener reports ComposeProcessDone\n");
77            main.Cleanup(); // not really required, parallel handled by main.close
78            vI.storage.clean();
79        },
80        SaveInFolderDone: function(folderURI) { 
81            Log.debug("SaveInFolderDone\n");
82            main.Cleanup();
83            vI.storage.clean();
84        }
85    },
86       
87    replacement_functions : {
88        FillIdentityList: function(menulist) {
89            Log.debug("mod. FillIdentityList\n");
90            var accounts = queryISupportsArray(main.accountManager.accounts,
91                                     Components.interfaces.nsIMsgAccount);
92
93            // Ugly hack to work around bug 41133. :-(
94            accounts = accounts.filter(function isNonSuckyAccount(a) { return !!a.incomingServer; });
95            function sortAccounts(a, b) {
96                if (a.key == main.accountManager.defaultAccount.key)
97                return -1;
98                if (b.key == main.accountManager.defaultAccount.key)
99                return 1;
100                var aIsNews = a.incomingServer.type == "nntp";
101                var bIsNews = b.incomingServer.type == "nntp";
102                if (aIsNews && !bIsNews)
103                return 1;
104                if (bIsNews && !aIsNews)
105                return -1;
106
107                var aIsLocal = a.incomingServer.type == "none";
108                var bIsLocal = b.incomingServer.type == "none";
109                if (aIsLocal && !bIsLocal)
110                return 1;
111                if (bIsLocal && !aIsLocal)
112                return -1;
113                return 0;
114            }
115            accounts.sort(sortAccounts);
116           
117            for (var i in accounts) {
118                var server = accounts[i].incomingServer;
119                if (!server) continue;
120                // check for VirtualIdentity Account
121                try {   vI.prefroot.getBoolPref("mail.account." + accounts[i].key + ".vIdentity");
122                    continue; } catch (e) { };
123
124                var identities = queryISupportsArray(accounts[i].identities, Components.interfaces.nsIMsgIdentity);
125                for (var j in identities) {
126                    var identity = identities[j];
127                    var item = menulist.appendItem(identity.identityName, identity.key, server.prettyName);
128                    item.setAttribute("accountkey", accounts[i].key);
129                }
130            }
131        },
132       
133        GenericSendMessageInProgress : false,
134        GenericSendMessage: function (msgType) {
135            if (main.replacement_functions.GenericSendMessageInProgress) return;
136            main.replacement_functions.GenericSendMessageInProgress = true;
137           
138            // if addressCol2 is focused while sending check storage for the entered address before continuing
139            vI.storage.awOnBlur(vI.storage.focusedElement);
140
141            Log.debug("\nVIdentity_GenericSendMessage\n");
142           
143            if (msgType == Components.interfaces.nsIMsgCompDeliverMode.Now)
144              vI.addReplyToSelf();
145
146            var vid = document.getElementById("virtualIdentityExtension_msgIdentityClone").vid
147            var virtualIdentityData = document.getElementById("virtualIdentityExtension_msgIdentityClone").identityData;
148           
149            let returnValue = vI.vIaccount_prepareSendMsg(  vid, msgType, virtualIdentityData,
150                            main.accountManager.getIdentity(main.elements.Obj_MsgIdentity.value),
151                            main._getRecipients() );
152            if (returnValue.update == "abort") {
153                main.replacement_functions.GenericSendMessageInProgress = false;
154                Log.debug("sending: --------------  aborted  ---------------------------------\n")
155                return;
156            }
157            else if (returnValue.update == "takeover") {
158                    var msgIdentityCloneElem = document.getElementById("virtualIdentityExtension_msgIdentityClone");
159                    msgIdentityCloneElem.selectedMenuItem = msgIdentityCloneElem.addIdentityToCloneMenu(returnValue.storedIdentity);
160                    main.replacement_functions.GenericSendMessageInProgress = false;
161                    Log.debug("sending: --------------  aborted  ---------------------------------\n")
162                    return;
163            }
164           
165            if (vid) main.addVirtualIdentityToMsgIdentityMenu();
166           
167            // final check if eyerything is nice before we handover to the real sending...
168            if (vI.vIaccount_finalCheck(virtualIdentityData, getCurrentIdentity())) {
169                main.replacement_functions.GenericSendMessageInProgress = false;
170                main.original_functions.GenericSendMessage(msgType);
171            }
172            else    main.Cleanup();
173            main.replacement_functions.GenericSendMessageInProgress = false;
174            //          Log.debug("original_functions.GenericSendMessage done\n");
175        },
176       
177        replace_FillIdentityList : function() {
178            //~ Log.debug("replace FillIdentityList \n");
179            main.original_functions.FillIdentityList = FillIdentityList;
180            FillIdentityList = main.replacement_functions.FillIdentityList;
181        }
182    },
183
184    remove: function() {
185        window.removeEventListener('compose-window-reopen', main.reopen, true);
186        window.removeEventListener('compose-window-close', main.close, true);
187        Log.debug("end. remove Account if there.\n")
188        main.Cleanup();
189        vI.storage.clean();
190    },
191
192    _getRecipients : function(row) {
193        var recipients = [];
194        for (var row = 1; row <= top.MAX_RECIPIENTS; row ++) {
195            var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
196            if (recipientType == "addr_reply" || recipientType == "addr_followup" || 
197                main._recipientIsDoBcc(row) || awGetInputElement(row).value.match(/^\s*$/) ) continue;
198            recipients.push( { recipient: awGetInputElement(row).value, recipientType : recipientType } );
199        }
200        return recipients;
201    },
202   
203    _recipientIsDoBcc : function(row) {
204        var recipientType = awGetPopupElement(row).selectedItem.getAttribute("value");
205        if (recipientType != "addr_bcc" || !getCurrentIdentity().doBcc) return false
206
207        var doBccArray = gMsgCompose.compFields.splitRecipients(getCurrentIdentity().doBccList, false, {});
208
209        for (var index = 0; index < doBccArray.count; index++ ) {
210            if (doBccArray.StringAt(index) == awGetInputElement(row).value) {
211                Log.debug("_recipientIsDoBcc: ignoring doBcc field '" +
212                    doBccArray.StringAt(index) + "'.\n");
213                return true;
214            }
215        }       
216        return false
217    },
218
219    // initialization //
220    init: function() {
221        window.removeEventListener('load', main.init, false);
222        window.removeEventListener('compose-window-init', main.init, true);
223        if (main.elements.Area_MsgIdentityHbox) return; // init done before, (?reopen)
224        Log.debug("\ninit.\n")
225        main.unicodeConverter.charset="UTF-8";
226        if (!main.adapt_genericSendMessage()) { Log.debug("\ninit failed.\n"); return; }
227       
228        main.adapt_interface();
229        gMsgCompose.RegisterStateListener(main.ComposeStateListener);
230        document.getElementById("virtualIdentityExtension_tooltipPopupset")
231            .addTooltip(document.getElementById("virtualIdentityExtension_msgIdentityClone"), false);
232        window.addEventListener('compose-window-reopen', main.reopen, true);
233        window.addEventListener('compose-window-close', main.close, true);
234       
235        // append observer to virtualIdentityExtension_fccSwitch, because it does'n work with real identities (hidden by css)
236        document.getElementById("virtualIdentityExtension_fccSwitch").appendChild(document.getElementById("virtualIdentityExtension_msgIdentityClone_observer").cloneNode(false));
237
238        main.AccountManagerObserver.register();
239       
240        main.initSystemStage1();
241        Log.debug("init done.\n\n")
242    },
243   
244    initSystemStage1 : function() {
245        Log.debug("initSystemStage1.\n")
246        main.gMsgCompose = gMsgCompose;
247        document.getElementById("virtualIdentityExtension_msgIdentityClone").init();
248        vI.statusmenu.init();
249        Log.debug("initSystemStage1 done.\n")
250    },
251   
252    initSystemStage2 : function() {
253        Log.debug("initSystemStage2.\n")
254        vI.initReplyTo();
255        vI.storage.init();
256        vI.smartIdentity.init();
257        Log.debug("initSystemStage2 done.\n")
258    },
259   
260    close : function() {
261        main.Cleanup();
262        vI.storage.clean();
263    },
264   
265    adapt_interface : function() {
266        if (main.elements.strings) return; // only rearrange the interface once
267       
268        // initialize the pointers to extension elements
269        main.elements.init_base()
270       
271        // rearrange the positions of some elements
272        var parent_hbox = main.elements.Obj_MsgIdentity.parentNode;
273        var storage_box = document.getElementById("addresses-box");
274        var virtualIdentityExtension_autoReplyToSelfLabel = document.getElementById("virtualIdentityExtension_autoReplyToSelfLabelBox");
275       
276        storage_box.removeChild(virtualIdentityExtension_autoReplyToSelfLabel);
277        parent_hbox.appendChild(virtualIdentityExtension_autoReplyToSelfLabel);
278        storage_box.removeChild(main.elements.Area_MsgIdentityHbox);
279        parent_hbox.appendChild(main.elements.Area_MsgIdentityHbox);
280
281        main.elements.Obj_MsgIdentity.setAttribute("hidden", "true");
282        main.elements.Obj_MsgIdentity.previousSibling.setAttribute("control", "virtualIdentityExtension_msgIdentityClone");
283       
284        var access_label = parent_hbox.getElementsByAttribute( "control", "msgIdentity" )[0];
285        if (access_label) access_label.setAttribute("control", "virtualIdentityExtension_msgIdentityClone");
286       
287        // initialize the pointers to extension elements (initialize those earlier might brake the interface)
288        main.elements.init_rest(); 
289    },
290   
291    adapt_genericSendMessage : function() {
292        if (main.original_functions.GenericSendMessage) return true; // only initialize this once
293        Log.debug("adapt GenericSendMessage\n");
294        main.original_functions.GenericSendMessage = GenericSendMessage;
295        GenericSendMessage = main.replacement_functions.GenericSendMessage;
296        return true;
297    },
298   
299    reopen: function() {
300        vI.clearDebugOutput();
301        Log.debug("composeDialog reopened. (msgType " + gMsgCompose.type + ")\n")
302       
303        // clean all elements
304        document.getElementById("virtualIdentityExtension_msgIdentityClone").clean();
305        Log.debug("everything cleaned.\n")
306       
307        // now (re)init the elements
308        main.initSystemStage1();
309       
310        // stateListener only works in reply-cases
311        // so activate stage2 in reply-cases trough StateListener
312        // in other cases directly
313        var msgComposeType = Components.interfaces.nsIMsgCompType;
314        switch (gMsgCompose.type) {
315            case msgComposeType.New:
316            case msgComposeType.NewsPost:
317            case msgComposeType.MailToUrl:
318            case msgComposeType.Draft:
319            case msgComposeType.Template:
320            case msgComposeType.ForwardAsAttachment:
321            case msgComposeType.ForwardInline:
322                main.initSystemStage2(); break;
323            case msgComposeType.Reply:
324            case msgComposeType.ReplyAll:
325            case msgComposeType.ReplyToGroup:
326            case msgComposeType.ReplyToSender:
327            case msgComposeType.ReplyToSenderAndGroup:
328            case msgComposeType.ReplyWithTemplate:
329            case msgComposeType.ReplyToList:
330                gMsgCompose.RegisterStateListener(main.ComposeStateListener);
331        }
332        Log.debug("reopen done.\n")
333    },
334   
335    tempStorage: { BaseIdentity : null, NewIdentity : null },
336
337    __setSelectedIdentity : function(menuItem) {
338        main.elements.Obj_MsgIdentity.selectedItem = menuItem;
339        main.elements.Obj_MsgIdentity.setAttribute("label", menuItem.getAttribute("label"));
340        main.elements.Obj_MsgIdentity.setAttribute("accountname", menuItem.getAttribute("accountname"));
341        main.elements.Obj_MsgIdentity.setAttribute("value", menuItem.getAttribute("value"));
342    },
343
344    // sets the values of the dropdown-menu to the ones of the newly created account
345    addVirtualIdentityToMsgIdentityMenu : function()
346    {
347        main.tempStorage.BaseIdentity = main.elements.Obj_MsgIdentity.selectedItem;
348        main.tempStorage.NewIdentity = document.createElement("menuitem");
349        main.tempStorage.NewIdentity.className = "identity-popup-item";
350       
351        // set the account name in the choosen menu item
352        main.tempStorage.NewIdentity.setAttribute("label", vI.get_vIaccount().defaultIdentity.identityName);
353        main.tempStorage.NewIdentity.setAttribute("accountname", " - " +  vI.get_vIaccount().incomingServer.prettyName);
354        main.tempStorage.NewIdentity.setAttribute("accountkey", vI.get_vIaccount().key);
355        main.tempStorage.NewIdentity.setAttribute("value", vI.get_vIaccount().defaultIdentity.key);
356       
357        main.elements.Obj_MsgIdentityPopup.appendChild(main.tempStorage.NewIdentity);
358        main.__setSelectedIdentity(main.tempStorage.NewIdentity);
359    },
360   
361    removeVirtualIdentityFromMsgIdentityMenu : function()
362    {
363        if (!main.tempStorage.BaseIdentity) return; // don't try to remove Item twice
364        try {   // might not exist anymore (window closed), so just try to remove it
365            document.getElementById("msgIdentity").firstChild.removeChild(main.tempStorage.NewIdentity);
366            main.__setSelectedIdentity(main.tempStorage.BaseIdentity);
367        } catch (e) { };
368        main.tempStorage.NewIdentity = null;
369        main.tempStorage.BaseIdentity = null;
370    },
371
372    prepareAccount : function() {
373        main.Cleanup(); // just to be sure that nothing is left (maybe last time sending was irregularily stopped)
374        vI.vIaccount_createAccount(document.getElementById("virtualIdentityExtension_msgIdentityClone").identityData,
375                                 main.accountManager.getIdentity(main.elements.Obj_MsgIdentity.value));
376        main.addVirtualIdentityToMsgIdentityMenu();
377    },
378
379    Cleanup : function() {
380        main.removeVirtualIdentityFromMsgIdentityMenu();
381        vI.vIaccount_removeUsedVIAccount();
382    },
383   
384    //  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
385    AccountManagerObserver : {
386        _uninstall : false,
387        observe : function(subject, topic, data) {
388            if (topic == "am-smtpChanges") {
389                Log.debug("smtp changes observed\n");
390                var virtualIdentityExtension_msgIdentityClone = document.getElementById("virtualIdentityExtension_msgIdentityClone");
391                document.getAnonymousElementByAttribute(virtualIdentityExtension_msgIdentityClone, "class", "smtpServerListHbox").refresh();
392            }
393            if (topic == "am-acceptChanges") {
394                Log.debug("account changes observed\n");
395                document.getElementById("virtualIdentityExtension_msgIdentityClone").clean();
396                document.getElementById("virtualIdentityExtension_msgIdentityClone").init();
397            }
398        },
399        register : function() {
400            var obsService = Components.classes["@mozilla.org/observer-service;1"].
401                getService(Components.interfaces.nsIObserverService)
402            obsService.addObserver(this, "am-smtpChanges", false);
403            obsService.addObserver(this, "am-acceptChanges", false);
404        },
405        unregister : function() {
406            var obsService = Components.classes["@mozilla.org/observer-service;1"].
407                getService(Components.interfaces.nsIObserverService)
408            obsService.removeObserver(this, "am-smtpChanges");
409            obsService.removeObserver(this, "am-acceptChanges");
410        }
411    }
412}
413
414
415main.replacement_functions.replace_FillIdentityList();
416window.addEventListener('compose-window-init', main.init, true);
417
418window.addEventListener("unload", function(e) { main.AccountManagerObserver.unregister(); try {vI.statusmenu.removeObserver();} catch (ex) { } }, false);
419vI.main = main;
420}});
Note: See TracBrowser for help on using the repository browser.