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

source: content/v_identity.js @ 509348

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

code formatting (no code changes)

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